From f2f7e509e6a96329805ecaf30fb64ba4c7f4b0d2 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 18 Oct 2022 10:22:40 +0900 Subject: [PATCH] Rename SetSingleFuncCall() to InitMaterializedSRF() Per discussion, the existing routine name able to initialize a SRF function with materialize mode is unpopular, so rename it. Equally, the flags of this function are renamed, as of: - SRF_SINGLE_USE_EXPECTED -> MAT_SRF_USE_EXPECTED_DESC - SRF_SINGLE_BLESS -> MAT_SRF_BLESS The previous function and flags introduced in 9e98583 are kept around for compatibility purposes, so as any extension code already compiled with v15 continues to work as-is. The declarations introduced here for compatibility will be removed from HEAD in a follow-up commit. The new names have been suggested by Andres Freund and Melanie Plageman. Discussion: https://postgr.es/m/20221013194820.ciktb2sbbpw7cljm@awork3.anarazel.de Backpatch-through: 15 --- contrib/amcheck/verify_heapam.c | 2 +- contrib/dblink/dblink.c | 2 +- contrib/pageinspect/brinfuncs.c | 2 +- contrib/pageinspect/gistfuncs.c | 4 ++-- .../pg_stat_statements/pg_stat_statements.c | 2 +- contrib/pg_walinspect/pg_walinspect.c | 4 ++-- contrib/pgrowlocks/pgrowlocks.c | 2 +- contrib/postgres_fdw/connection.c | 2 +- contrib/xml2/xpath.c | 2 +- src/backend/access/transam/rmgr.c | 2 +- src/backend/access/transam/xlogprefetcher.c | 2 +- src/backend/commands/event_trigger.c | 4 ++-- src/backend/commands/extension.c | 6 ++--- src/backend/commands/prepare.c | 2 +- src/backend/foreign/foreign.c | 2 +- src/backend/replication/logical/launcher.c | 2 +- .../replication/logical/logicalfuncs.c | 2 +- src/backend/replication/logical/origin.c | 2 +- src/backend/replication/slotfuncs.c | 2 +- src/backend/replication/walsender.c | 2 +- src/backend/storage/ipc/shmem.c | 2 +- src/backend/utils/adt/datetime.c | 2 +- src/backend/utils/adt/genfile.c | 4 ++-- src/backend/utils/adt/hbafuncs.c | 4 ++-- src/backend/utils/adt/jsonfuncs.c | 9 ++++---- src/backend/utils/adt/mcxtfuncs.c | 2 +- src/backend/utils/adt/misc.c | 2 +- src/backend/utils/adt/pgstatfuncs.c | 6 ++--- src/backend/utils/adt/varlena.c | 2 +- src/backend/utils/fmgr/README | 2 +- src/backend/utils/fmgr/funcapi.c | 23 +++++++++++++------ src/backend/utils/misc/guc.c | 2 +- src/backend/utils/misc/pg_config.c | 2 +- src/backend/utils/mmgr/portalmem.c | 2 +- src/include/funcapi.h | 14 +++++++---- 35 files changed, 71 insertions(+), 57 deletions(-) diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c index e488f5e234..5919e82b16 100644 --- a/contrib/amcheck/verify_heapam.c +++ b/contrib/amcheck/verify_heapam.c @@ -278,7 +278,7 @@ verify_heapam(PG_FUNCTION_ARGS) ctx.attnum = -1; /* Construct the tuplestore and tuple descriptor */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); ctx.tupdesc = rsinfo->setDesc; ctx.tupstore = rsinfo->setResult; diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index a561d1d652..0cc339e7d5 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -1934,7 +1934,7 @@ dblink_get_notify(PG_FUNCTION_ARGS) else conn = pconn->conn; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); PQconsumeInput(conn); while ((notify = PQnotifies(conn)) != NULL) diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index 879276e6de..fbcfa18ac7 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -147,7 +147,7 @@ brin_page_items(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); indexRel = index_open(indexRelid, AccessShareLock); diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index 4943d6f75b..42d448a835 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -129,7 +129,7 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); page = get_page_from_raw(raw_page); @@ -213,7 +213,7 @@ gist_page_items(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* Open the relation */ indexRel = index_open(indexRelid, AccessShareLock); diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 14637013fa..2a8c202c14 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -1555,7 +1555,7 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("pg_stat_statements must be loaded via shared_preload_libraries"))); - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* * Check we have the expected number of output arguments. Aside from diff --git a/contrib/pg_walinspect/pg_walinspect.c b/contrib/pg_walinspect/pg_walinspect.c index 6845198430..6b6c7d46e2 100644 --- a/contrib/pg_walinspect/pg_walinspect.c +++ b/contrib/pg_walinspect/pg_walinspect.c @@ -333,7 +333,7 @@ GetWALRecordsInfo(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, Datum values[PG_GET_WAL_RECORDS_INFO_COLS]; bool nulls[PG_GET_WAL_RECORDS_INFO_COLS]; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); xlogreader = InitXLogReaderState(start_lsn); @@ -554,7 +554,7 @@ GetWalStats(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, Datum values[PG_GET_WAL_STATS_COLS]; bool nulls[PG_GET_WAL_STATS_COLS]; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); xlogreader = InitXLogReaderState(start_lsn); diff --git a/contrib/pgrowlocks/pgrowlocks.c b/contrib/pgrowlocks/pgrowlocks.c index 1d4d4965ac..c543277b7c 100644 --- a/contrib/pgrowlocks/pgrowlocks.c +++ b/contrib/pgrowlocks/pgrowlocks.c @@ -75,7 +75,7 @@ pgrowlocks(PG_FUNCTION_ARGS) AclResult aclresult; char **values; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* Access the table */ relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname)); diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index cffb6f8310..5187ea8e00 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -1668,7 +1668,7 @@ postgres_fdw_get_connections(PG_FUNCTION_ARGS) HASH_SEQ_STATUS scan; ConnCacheEntry *entry; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* If cache doesn't exist, we return no records */ if (!ConnectionHash) diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index b8ee757674..a692dc6be8 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -511,7 +511,7 @@ xpath_table(PG_FUNCTION_ARGS) PgXmlErrorContext *xmlerrcxt; volatile xmlDocPtr doctree = NULL; - SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); + InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC); /* must have at least one output column (for the pkey) */ if (rsinfo->setDesc->natts < 1) diff --git a/src/backend/access/transam/rmgr.c b/src/backend/access/transam/rmgr.c index 3b6de3aa04..6bb4de387f 100644 --- a/src/backend/access/transam/rmgr.c +++ b/src/backend/access/transam/rmgr.c @@ -145,7 +145,7 @@ pg_get_wal_resource_managers(PG_FUNCTION_ARGS) Datum values[PG_GET_RESOURCE_MANAGERS_COLS]; bool nulls[PG_GET_RESOURCE_MANAGERS_COLS] = {0}; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); for (int rmid = 0; rmid <= RM_MAX_ID; rmid++) { diff --git a/src/backend/access/transam/xlogprefetcher.c b/src/backend/access/transam/xlogprefetcher.c index 995c5e83bc..b98b3192cf 100644 --- a/src/backend/access/transam/xlogprefetcher.c +++ b/src/backend/access/transam/xlogprefetcher.c @@ -833,7 +833,7 @@ pg_stat_get_recovery_prefetch(PG_FUNCTION_ARGS) Datum values[PG_STAT_GET_RECOVERY_PREFETCH_COLS]; bool nulls[PG_STAT_GET_RECOVERY_PREFETCH_COLS]; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); for (int i = 0; i < PG_STAT_GET_RECOVERY_PREFETCH_COLS; ++i) nulls[i] = false; diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 4642527881..356aac4afc 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -1305,7 +1305,7 @@ pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS) "pg_event_trigger_dropped_objects()"))); /* Build tuplestore to hold the result rows */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); slist_foreach(iter, &(currentEventTriggerState->SQLDropList)) { @@ -1835,7 +1835,7 @@ pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS) "pg_event_trigger_ddl_commands()"))); /* Build tuplestore to hold the result rows */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); foreach(lc, currentEventTriggerState->commandList) { diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index eb4878701a..3f750d34b3 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -1941,7 +1941,7 @@ pg_available_extensions(PG_FUNCTION_ARGS) struct dirent *de; /* Build tuplestore to hold the result rows */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); location = get_extension_control_directory(); dir = AllocateDir(location); @@ -2021,7 +2021,7 @@ pg_available_extension_versions(PG_FUNCTION_ARGS) struct dirent *de; /* Build tuplestore to hold the result rows */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); location = get_extension_control_directory(); dir = AllocateDir(location); @@ -2278,7 +2278,7 @@ pg_extension_update_paths(PG_FUNCTION_ARGS) check_valid_extension_name(NameStr(*extname)); /* Build tuplestore to hold the result rows */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* Read the extension's control file */ control = read_extension_control_file(NameStr(*extname)); diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index 80738547ed..fc5c7f9d4d 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -672,7 +672,7 @@ pg_prepared_statement(PG_FUNCTION_ARGS) * We put all the tuples into a tuplestore in one scan of the hashtable. * This avoids any issue of the hashtable possibly changing between calls. */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* hash table might be uninitialized */ if (prepared_queries) diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index cf222fc3e9..e60394c7f9 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -516,7 +516,7 @@ pg_options_to_table(PG_FUNCTION_ARGS) rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; /* prepare the result set */ - SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); + InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC); foreach(cell, options) { diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index 2bdab53e19..e88e30d467 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -930,7 +930,7 @@ pg_stat_get_subscription(PG_FUNCTION_ARGS) int i; ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* Make sure we get consistent view of the workers. */ LWLockAcquire(LogicalRepWorkerLock, LW_SHARED); diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c index 6058d36e0d..dc29b6c674 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -189,7 +189,7 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin } } - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); p->tupstore = rsinfo->setResult; p->tupdesc = rsinfo->setDesc; diff --git a/src/backend/replication/logical/origin.c b/src/backend/replication/logical/origin.c index 9b0774ee3e..cd86007601 100644 --- a/src/backend/replication/logical/origin.c +++ b/src/backend/replication/logical/origin.c @@ -1487,7 +1487,7 @@ pg_show_replication_origin_status(PG_FUNCTION_ARGS) /* we want to return 0 rows if slot is set to zero */ replorigin_check_prerequisites(false, true); - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* prevent slots from being concurrently dropped */ LWLockAcquire(ReplicationOriginLock, LW_SHARED); diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c index ca945994ef..16a3527903 100644 --- a/src/backend/replication/slotfuncs.c +++ b/src/backend/replication/slotfuncs.c @@ -242,7 +242,7 @@ pg_get_replication_slots(PG_FUNCTION_ARGS) * name, which shouldn't contain anything particularly sensitive. */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); currlsn = GetXLogWriteRecPtr(); diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 66f44d25dc..269914bce2 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -3476,7 +3476,7 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) int num_standbys; int i; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* * Get the currently active synchronous standbys. This could be out of diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index c1279960cd..10be765fb7 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -543,7 +543,7 @@ pg_get_shmem_allocations(PG_FUNCTION_ARGS) Datum values[PG_GET_SHMEM_SIZES_COLS]; bool nulls[PG_GET_SHMEM_SIZES_COLS]; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); LWLockAcquire(ShmemIndexLock, LW_SHARED); diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 4c12c4d663..a3cfd54409 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -5059,7 +5059,7 @@ pg_timezone_names(PG_FUNCTION_ARGS) Interval *resInterval; struct pg_itm_in itm_in; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* initialize timezone scanning code */ tzenum = pg_tzenumerate_start(); diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index 2bf5219256..5d2679dd40 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -491,7 +491,7 @@ pg_ls_dir(PG_FUNCTION_ARGS) include_dot_dirs = PG_GETARG_BOOL(2); } - SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); + InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC); dirdesc = AllocateDir(location); if (!dirdesc) @@ -549,7 +549,7 @@ pg_ls_dir_files(FunctionCallInfo fcinfo, const char *dir, bool missing_ok) DIR *dirdesc; struct dirent *de; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* * Now walk the directory. Note that we must do this within a single SRF diff --git a/src/backend/utils/adt/hbafuncs.c b/src/backend/utils/adt/hbafuncs.c index 57c4c4e846..c336599786 100644 --- a/src/backend/utils/adt/hbafuncs.c +++ b/src/backend/utils/adt/hbafuncs.c @@ -421,7 +421,7 @@ pg_hba_file_rules(PG_FUNCTION_ARGS) * also more efficient than having to look up our current position in the * parsed list every time. */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* Fill the tuplestore */ rsi = (ReturnSetInfo *) fcinfo->resultinfo; @@ -554,7 +554,7 @@ pg_ident_file_mappings(PG_FUNCTION_ARGS) * also more efficient than having to look up our current position in the * parsed list every time. */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* Fill the tuplestore */ rsi = (ReturnSetInfo *) fcinfo->resultinfo; diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index ccc3279575..6c5886eb05 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -1923,7 +1923,7 @@ each_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, bool as_text) funcname))); rsi = (ReturnSetInfo *) fcinfo->resultinfo; - SetSingleFuncCall(fcinfo, SRF_SINGLE_BLESS); + InitMaterializedSRF(fcinfo, MAT_SRF_BLESS); tmp_cxt = AllocSetContextCreate(CurrentMemoryContext, "jsonb_each temporary cxt", @@ -2003,7 +2003,7 @@ each_worker(FunctionCallInfo fcinfo, bool as_text) rsi = (ReturnSetInfo *) fcinfo->resultinfo; - SetSingleFuncCall(fcinfo, SRF_SINGLE_BLESS); + InitMaterializedSRF(fcinfo, MAT_SRF_BLESS); state->tuple_store = rsi->setResult; state->ret_tdesc = rsi->setDesc; @@ -2166,8 +2166,7 @@ elements_worker_jsonb(FunctionCallInfo fcinfo, const char *funcname, rsi = (ReturnSetInfo *) fcinfo->resultinfo; - SetSingleFuncCall(fcinfo, - SRF_SINGLE_USE_EXPECTED | SRF_SINGLE_BLESS); + InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC | MAT_SRF_BLESS); tmp_cxt = AllocSetContextCreate(CurrentMemoryContext, "jsonb_array_elements temporary cxt", @@ -2245,7 +2244,7 @@ elements_worker(FunctionCallInfo fcinfo, const char *funcname, bool as_text) state = palloc0(sizeof(ElementsState)); sem = palloc0(sizeof(JsonSemAction)); - SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED | SRF_SINGLE_BLESS); + InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC | MAT_SRF_BLESS); rsi = (ReturnSetInfo *) fcinfo->resultinfo; state->tuple_store = rsi->setResult; state->ret_tdesc = rsi->setDesc; diff --git a/src/backend/utils/adt/mcxtfuncs.c b/src/backend/utils/adt/mcxtfuncs.c index bb7cc94024..04b7aa2a77 100644 --- a/src/backend/utils/adt/mcxtfuncs.c +++ b/src/backend/utils/adt/mcxtfuncs.c @@ -121,7 +121,7 @@ pg_get_backend_memory_contexts(PG_FUNCTION_ARGS) { ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); PutMemoryContextsStatsTupleStore(rsinfo->setResult, rsinfo->setDesc, TopMemoryContext, NULL, 0); diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index 89690be2ed..6d8fa920cd 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -208,7 +208,7 @@ pg_tablespace_databases(PG_FUNCTION_ARGS) DIR *dirdesc; struct dirent *de; - SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); + InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC); if (tablespaceOid == GLOBALTABLESPACE_OID) { diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 893690dad5..83d2cdb57c 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -481,7 +481,7 @@ pg_stat_get_progress_info(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid command name: \"%s\"", cmd))); - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* 1-based index */ for (curr_backend = 1; curr_backend <= num_backends; curr_backend++) @@ -545,7 +545,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) int pid = PG_ARGISNULL(0) ? -1 : PG_GETARG_INT32(0); ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* 1-based index */ for (curr_backend = 1; curr_backend <= num_backends; curr_backend++) @@ -1818,7 +1818,7 @@ pg_stat_get_slru(PG_FUNCTION_ARGS) int i; PgStat_SLRUStats *stats; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* request SLRU stats from the cumulative stats system */ stats = pgstat_fetch_slru(); diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 8539cef024..3732b79c21 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -4809,7 +4809,7 @@ text_to_table(PG_FUNCTION_ARGS) SplitTextOutputData tstate; tstate.astate = NULL; - SetSingleFuncCall(fcinfo, SRF_SINGLE_USE_EXPECTED); + InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC); tstate.tupstore = rsi->setResult; tstate.tupdesc = rsi->setDesc; diff --git a/src/backend/utils/fmgr/README b/src/backend/utils/fmgr/README index 9d8848106d..4b2a5df285 100644 --- a/src/backend/utils/fmgr/README +++ b/src/backend/utils/fmgr/README @@ -305,7 +305,7 @@ If available, the expected tuple descriptor is passed in ReturnSetInfo; in other contexts the expectedDesc field will be NULL. The function need not pay attention to expectedDesc, but it may be useful in special cases. -SetSingleFuncCall() is a helper function able to setup the function's +InitMaterializedSRF() is a helper function able to setup the function's ReturnSetInfo for a single call, filling in the Tuplestore and the TupleDesc with the proper configuration for Materialize mode. diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c index e82a6d5065..31f6662768 100644 --- a/src/backend/utils/fmgr/funcapi.c +++ b/src/backend/utils/fmgr/funcapi.c @@ -57,7 +57,16 @@ static TypeFuncClass get_type_func_class(Oid typid, Oid *base_typeid); /* - * SetSingleFuncCall + * Compatibility function for v15. + */ +void +SetSingleFuncCall(FunctionCallInfo fcinfo, bits32 flags) +{ + InitMaterializedSRF(fcinfo, flags); +} + +/* + * InitMaterializedSRF * * Helper function to build the state of a set-returning function used * in the context of a single call with materialize mode. This code @@ -65,15 +74,15 @@ static TypeFuncClass get_type_func_class(Oid typid, Oid *base_typeid); * the TupleDesc used with the function and stores them into the * function's ReturnSetInfo. * - * "flags" can be set to SRF_SINGLE_USE_EXPECTED, to use the tuple + * "flags" can be set to MAT_SRF_USE_EXPECTED_DESC, to use the tuple * descriptor coming from expectedDesc, which is the tuple descriptor - * expected by the caller. SRF_SINGLE_BLESS can be set to complete the + * expected by the caller. MAT_SRF_BLESS can be set to complete the * information associated to the tuple descriptor, which is necessary * in some cases where the tuple descriptor comes from a transient * RECORD datatype. */ void -SetSingleFuncCall(FunctionCallInfo fcinfo, bits32 flags) +InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags) { bool random_access; ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; @@ -88,7 +97,7 @@ SetSingleFuncCall(FunctionCallInfo fcinfo, bits32 flags) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("set-valued function called in context that cannot accept a set"))); if (!(rsinfo->allowedModes & SFRM_Materialize) || - ((flags & SRF_SINGLE_USE_EXPECTED) != 0 && rsinfo->expectedDesc == NULL)) + ((flags & MAT_SRF_USE_EXPECTED_DESC) != 0 && rsinfo->expectedDesc == NULL)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("materialize mode required, but it is not allowed in this context"))); @@ -101,7 +110,7 @@ SetSingleFuncCall(FunctionCallInfo fcinfo, bits32 flags) old_context = MemoryContextSwitchTo(per_query_ctx); /* build a tuple descriptor for our result type */ - if ((flags & SRF_SINGLE_USE_EXPECTED) != 0) + if ((flags & MAT_SRF_USE_EXPECTED_DESC) != 0) stored_tupdesc = CreateTupleDescCopy(rsinfo->expectedDesc); else { @@ -110,7 +119,7 @@ SetSingleFuncCall(FunctionCallInfo fcinfo, bits32 flags) } /* If requested, bless the tuple descriptor */ - if ((flags & SRF_SINGLE_BLESS) != 0) + if ((flags & MAT_SRF_BLESS) != 0) BlessTupleDesc(stored_tupdesc); random_access = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 328aab0771..75ac077a9d 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10476,7 +10476,7 @@ show_all_file_settings(PG_FUNCTION_ARGS) conf = ProcessConfigFileInternal(PGC_SIGHUP, false, DEBUG3); /* Build a tuplestore to return our results in */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); /* Process the results and create a tuplestore */ for (seqno = 1; conf != NULL; conf = conf->next, seqno++) diff --git a/src/backend/utils/misc/pg_config.c b/src/backend/utils/misc/pg_config.c index d9e18caf44..581965395d 100644 --- a/src/backend/utils/misc/pg_config.c +++ b/src/backend/utils/misc/pg_config.c @@ -30,7 +30,7 @@ pg_config(PG_FUNCTION_ARGS) int i = 0; /* initialize our tuplestore */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); configdata = get_configdata(my_exec_path, &configdata_len); for (i = 0; i < configdata_len; i++) diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index d549f66d4a..7409593c96 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -1139,7 +1139,7 @@ pg_cursor(PG_FUNCTION_ARGS) * We put all the tuples into a tuplestore in one scan of the hashtable. * This avoids any issue of the hashtable possibly changing between calls. */ - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); hash_seq_init(&hash_seq, PortalHashTable); while ((hentry = hash_seq_search(&hash_seq)) != NULL) diff --git a/src/include/funcapi.h b/src/include/funcapi.h index dc3d819a1c..8c47054ed5 100644 --- a/src/include/funcapi.h +++ b/src/include/funcapi.h @@ -278,7 +278,7 @@ extern Datum HeapTupleHeaderGetDatum(HeapTupleHeader tuple); * memory allocated in multi_call_memory_ctx, but holding file descriptors or * other non-memory resources open across calls is a bug. SRFs that need * such resources should not use these macros, but instead populate a - * tuplestore during a single call, as set up by SetSingleFuncCall() (see + * tuplestore during a single call, as set up by InitMaterializedSRF() (see * fmgr/README). Alternatively, set up a callback to release resources * at query shutdown, using RegisterExprContextCallback(). * @@ -287,9 +287,15 @@ extern Datum HeapTupleHeaderGetDatum(HeapTupleHeader tuple); /* from funcapi.c */ -/* flag bits for SetSingleFuncCall() */ -#define SRF_SINGLE_USE_EXPECTED 0x01 /* use expectedDesc as tupdesc */ -#define SRF_SINGLE_BLESS 0x02 /* validate tuple for SRF */ +/* flag bits for InitMaterializedSRF() */ +#define MAT_SRF_USE_EXPECTED_DESC 0x01 /* use expectedDesc as tupdesc. */ +#define MAT_SRF_BLESS 0x02 /* "Bless" a tuple descriptor with + * BlessTupleDesc(). */ +extern void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags); + +/* Compatibility declarations, for v15 */ +#define SRF_SINGLE_USE_EXPECTED MAT_SRF_USE_EXPECTED_DESC +#define SRF_SINGLE_BLESS MAT_SRF_BLESS extern void SetSingleFuncCall(FunctionCallInfo fcinfo, bits32 flags); extern FuncCallContext *init_MultiFuncCall(PG_FUNCTION_ARGS);