From a19e5cee635dc94c9c6e44c8863b4b770920a04b Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 18 Oct 2022 10:22:35 +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_funcs.c | 2 +- src/backend/utils/misc/pg_config.c | 2 +- src/backend/utils/mmgr/portalmem.c | 2 +- src/include/funcapi.h | 14 +++++++---- .../test_ddl_deparse/test_ddl_deparse.c | 2 +- 36 files changed, 72 insertions(+), 58 deletions(-) diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c index 83dc728011..b72a5c96d1 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 9eef417c47..9202c35847 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -1933,7 +1933,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 f4c959ecab..12a7217038 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 d0a34a3375..f15714842a 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -127,7 +127,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); @@ -211,7 +211,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 73439c0199..e5aa429995 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -1552,7 +1552,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 38fb4106da..beba4788c7 100644 --- a/contrib/pg_walinspect/pg_walinspect.c +++ b/contrib/pg_walinspect/pg_walinspect.c @@ -330,7 +330,7 @@ GetWALRecordsInfo(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, Datum values[PG_GET_WAL_RECORDS_INFO_COLS] = {0}; bool nulls[PG_GET_WAL_RECORDS_INFO_COLS] = {0}; - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); xlogreader = InitXLogReaderState(start_lsn); @@ -548,7 +548,7 @@ GetWalStats(FunctionCallInfo fcinfo, XLogRecPtr start_lsn, Datum values[PG_GET_WAL_STATS_COLS] = {0}; bool nulls[PG_GET_WAL_STATS_COLS] = {0}; - 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 939d114f02..f0c45b00db 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 1cbac4b7f6..0cf03945ee 100644 --- a/src/backend/access/transam/xlogprefetcher.c +++ b/src/backend/access/transam/xlogprefetcher.c @@ -834,7 +834,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 441f29d684..8d36b66488 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)) { @@ -1832,7 +1832,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 6b6720c690..1a62e5dac5 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -1946,7 +1946,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); @@ -2026,7 +2026,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); @@ -2281,7 +2281,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 c4b54d0547..9e29584d93 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 353e20a0cf..56fcb8edf1 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -517,7 +517,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 3bbd522724..ff57421da6 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 7fa2b2cba7..5c23178570 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -188,7 +188,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 f19b72ff35..f134e44878 100644 --- a/src/backend/replication/logical/origin.c +++ b/src/backend/replication/logical/origin.c @@ -1503,7 +1503,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 e9ba500a15..2193dcaec6 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -3459,7 +3459,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 74b6807098..8cd10ab204 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -5058,7 +5058,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 2f1e907a10..ab6f67f874 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -561,7 +561,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) @@ -619,7 +619,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 9e5794071c..cbbe44ff13 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 fd0d355789..bfc3f02a86 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -1921,7 +1921,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", @@ -2001,7 +2001,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; @@ -2164,8 +2164,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", @@ -2243,7 +2242,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 6c45fd2007..9c13251231 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 85ac3e3f04..96bffc0f2a 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -502,7 +502,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++) @@ -559,7 +559,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++) @@ -1800,7 +1800,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 1f6e090821..c5e7ee7ca2 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -4810,7 +4810,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 78eb60c3e8..7ac6f36abe 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_funcs.c b/src/backend/utils/misc/guc_funcs.c index fb763df5fe..108b3bd129 100644 --- a/src/backend/utils/misc/guc_funcs.c +++ b/src/backend/utils/misc/guc_funcs.c @@ -996,7 +996,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 3a161bdb88..c3e95346b6 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 c9709f25b2..8aed8dccaf 100644 --- a/src/include/funcapi.h +++ b/src/include/funcapi.h @@ -282,7 +282,7 @@ HeapTupleGetDatum(const HeapTupleData *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(). * @@ -291,9 +291,15 @@ HeapTupleGetDatum(const HeapTupleData *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); diff --git a/src/test/modules/test_ddl_deparse/test_ddl_deparse.c b/src/test/modules/test_ddl_deparse/test_ddl_deparse.c index 133594999b..7e9e443306 100644 --- a/src/test/modules/test_ddl_deparse/test_ddl_deparse.c +++ b/src/test/modules/test_ddl_deparse/test_ddl_deparse.c @@ -93,7 +93,7 @@ get_altertable_subcmdinfo(PG_FUNCTION_ARGS) if (cmd->type != SCT_AlterTable) elog(ERROR, "command is not ALTER TABLE"); - SetSingleFuncCall(fcinfo, 0); + InitMaterializedSRF(fcinfo, 0); if (cmd->d.alterTable.subcmds == NIL) elog(ERROR, "empty alter table subcommand list");