diff options
Diffstat (limited to 'contrib/amcheck/verify_heapam.c')
-rw-r--r-- | contrib/amcheck/verify_heapam.c | 46 |
1 files changed, 4 insertions, 42 deletions
diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c index f996f9a5727..e5f7355dcb8 100644 --- a/contrib/amcheck/verify_heapam.c +++ b/contrib/amcheck/verify_heapam.c @@ -165,7 +165,6 @@ static bool check_tuple_visibility(HeapCheckContext *ctx); static void report_corruption(HeapCheckContext *ctx, char *msg); static void report_toast_corruption(HeapCheckContext *ctx, ToastedAttribute *ta, char *msg); -static TupleDesc verify_heapam_tupdesc(void); static FullTransactionId FullTransactionIdFromXidAndCtx(TransactionId xid, const HeapCheckContext *ctx); static void update_cached_xid_range(HeapCheckContext *ctx); @@ -214,8 +213,6 @@ Datum verify_heapam(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - MemoryContext old_context; - bool random_access; HeapCheckContext ctx; Buffer vmbuffer = InvalidBuffer; Oid relid; @@ -227,16 +224,6 @@ verify_heapam(PG_FUNCTION_ARGS) BlockNumber nblocks; const char *skip; - /* Check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - /* Check supplied arguments */ if (PG_ARGISNULL(0)) ereport(ERROR, @@ -290,15 +277,10 @@ verify_heapam(PG_FUNCTION_ARGS) */ ctx.attnum = -1; - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - old_context = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - random_access = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - ctx.tupdesc = verify_heapam_tupdesc(); - ctx.tupstore = tuplestore_begin_heap(random_access, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = ctx.tupstore; - rsinfo->setDesc = ctx.tupdesc; - MemoryContextSwitchTo(old_context); + /* Construct the tuplestore and tuple descriptor */ + SetSingleFuncCall(fcinfo, 0); + ctx.tupdesc = rsinfo->setDesc; + ctx.tupstore = rsinfo->setResult; /* Open relation, check relkind and access method */ ctx.rel = relation_open(relid, AccessShareLock); @@ -631,26 +613,6 @@ report_toast_corruption(HeapCheckContext *ctx, ToastedAttribute *ta, } /* - * Construct the TupleDesc used to report messages about corruptions found - * while scanning the heap. - */ -static TupleDesc -verify_heapam_tupdesc(void) -{ - TupleDesc tupdesc; - AttrNumber a = 0; - - tupdesc = CreateTemplateTupleDesc(HEAPCHECK_RELATION_COLS); - TupleDescInitEntry(tupdesc, ++a, "blkno", INT8OID, -1, 0); - TupleDescInitEntry(tupdesc, ++a, "offnum", INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, ++a, "attnum", INT4OID, -1, 0); - TupleDescInitEntry(tupdesc, ++a, "msg", TEXTOID, -1, 0); - Assert(a == HEAPCHECK_RELATION_COLS); - - return BlessTupleDesc(tupdesc); -} - -/* * Check for tuple header corruption. * * Some kinds of corruption make it unsafe to check the tuple attributes, for |