Fixes and cleanup of the new repack_index_swap():
* Make sure we don't crash if this function is fed a bogus OID * rename idx1, idx2 variables for clarity * tweak query against pg_class to specify reltype = 0 * CommandCounterIncrement() is probably unnecessary, removed
This commit is contained in:
parent
ee23ec8ffd
commit
f3fa2fa563
29
lib/repack.c
29
lib/repack.c
@ -1193,11 +1193,20 @@ swap_heap_or_index_files(Oid r1, Oid r2)
|
|||||||
heap_close(relRelation, RowExclusiveLock);
|
heap_close(relRelation, RowExclusiveLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fn Datum repack_index_swap(PG_FUNCTION_ARGS)
|
||||||
|
* @brief Swap out an original index on a table with the newly-created one.
|
||||||
|
*
|
||||||
|
* repack_index_swap(index)
|
||||||
|
*
|
||||||
|
* @param index Oid of the *original* index.
|
||||||
|
* @retval void
|
||||||
|
*/
|
||||||
Datum
|
Datum
|
||||||
repack_index_swap(PG_FUNCTION_ARGS)
|
repack_index_swap(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
Oid oid = PG_GETARG_OID(0);
|
Oid orig_idx_oid = PG_GETARG_OID(0);
|
||||||
Oid idx1, idx2;
|
Oid repacked_idx_oid;
|
||||||
StringInfoData str;
|
StringInfoData str;
|
||||||
SPITupleTable *tuptable;
|
SPITupleTable *tuptable;
|
||||||
TupleDesc desc;
|
TupleDesc desc;
|
||||||
@ -1209,16 +1218,22 @@ repack_index_swap(PG_FUNCTION_ARGS)
|
|||||||
/* connect to SPI manager */
|
/* connect to SPI manager */
|
||||||
repack_init();
|
repack_init();
|
||||||
|
|
||||||
idx1 = oid;
|
|
||||||
initStringInfo(&str);
|
initStringInfo(&str);
|
||||||
appendStringInfo(&str,"SELECT oid FROM pg_class WHERE relname = 'index_%u'",idx1);
|
|
||||||
|
/* Find the OID of our new index. Indexes should have a reltype of 0. */
|
||||||
|
appendStringInfo(&str, "SELECT oid FROM pg_class "
|
||||||
|
"WHERE relname = 'index_%u' AND reltype = 0",
|
||||||
|
orig_idx_oid);
|
||||||
execute(SPI_OK_SELECT, str.data);
|
execute(SPI_OK_SELECT, str.data);
|
||||||
|
if (SPI_processed != 1)
|
||||||
|
elog(ERROR, "Could not find index 'index_%u', found %d matches",
|
||||||
|
orig_idx_oid, SPI_processed);
|
||||||
|
|
||||||
tuptable = SPI_tuptable;
|
tuptable = SPI_tuptable;
|
||||||
desc = tuptable->tupdesc;
|
desc = tuptable->tupdesc;
|
||||||
tuple = tuptable->vals[0];
|
tuple = tuptable->vals[0];
|
||||||
idx2 = getoid(tuple, desc, 1);
|
repacked_idx_oid = getoid(tuple, desc, 1);
|
||||||
swap_heap_or_index_files(idx1, idx2);
|
swap_heap_or_index_files(orig_idx_oid, repacked_idx_oid);
|
||||||
CommandCounterIncrement();
|
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user