summaryrefslogtreecommitdiff
path: root/src/backend/foreign/foreign.c
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2022-02-24 16:11:34 +0900
committerMichael Paquier <michael@paquier.xyz>2022-02-24 16:11:34 +0900
commitfcc28178c6943d7df72b484a87fdb7e06d0c1079 (patch)
tree29d84d92aa610c56a1c1c1a4089d9e5fd201e0ba /src/backend/foreign/foreign.c
parent04e706d4238f98a98e1c0b1a02db9d4280b96f04 (diff)
Clean up and simplify code in a couple of set-returning functions
The following set-returning functions have their logic simplified, to be more consistent with other in-core areas: - pg_prepared_statement()'s tuple descriptor is now created with get_call_result_type() instead of being created from scratch, saving from some duplication with pg_proc.dat. - show_all_file_settings(), similarly, now uses get_call_result_type() to build its tuple descriptor instead of creating it from scratch. - pg_options_to_table() made use of a static routine called only once. This commit removes this internal routine to make the function easier to follow. - pg_config() was using a unique logic style, doing checks on the tuple descriptor passed down in expectedDesc, but it has no need to do so. This switches the function to use a tuplestore with a tuple descriptor retrieved from get_call_result_type(), instead. This simplifies an upcoming patch aimed at refactoring the way tuplestores are created and checked in set-returning functions, this change making sense as its own independent cleanup by shaving some code. Author: Melanie Plageman, Michael Paquier Reviewed-by: Justin Pryzby Discussion: https://postgr.es/m/CAAKRu_azyd1Z3W_r7Ou4sorTjRCs+PxeHw1CWJeXKofkE6TuZg@mail.gmail.com
Diffstat (limited to 'src/backend/foreign/foreign.c')
-rw-r--r--src/backend/foreign/foreign.c37
1 files changed, 15 insertions, 22 deletions
diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c
index d910bc2fbea..c3406c3b9d9 100644
--- a/src/backend/foreign/foreign.c
+++ b/src/backend/foreign/foreign.c
@@ -499,17 +499,19 @@ IsImportableForeignTable(const char *tablename,
/*
- * deflist_to_tuplestore - Helper function to convert DefElem list to
- * tuplestore usable in SRF.
+ * pg_options_to_table - Convert options array to name/value table
+ *
+ * This is useful to provide details for information_schema and pg_dump.
*/
-static void
-deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options)
+Datum
+pg_options_to_table(PG_FUNCTION_ARGS)
{
+ Datum array = PG_GETARG_DATUM(0);
ListCell *cell;
+ List *options;
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
TupleDesc tupdesc;
Tuplestorestate *tupstore;
- Datum values[2];
- bool nulls[2];
MemoryContext per_query_ctx;
MemoryContext oldcontext;
@@ -524,6 +526,9 @@ deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options)
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("materialize mode required, but it is not allowed in this context")));
+ options = untransformRelOptions(array);
+ rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+
per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
oldcontext = MemoryContextSwitchTo(per_query_ctx);
@@ -536,9 +541,13 @@ deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options)
rsinfo->setResult = tupstore;
rsinfo->setDesc = tupdesc;
+ MemoryContextSwitchTo(oldcontext);
+
foreach(cell, options)
{
DefElem *def = lfirst(cell);
+ Datum values[2];
+ bool nulls[2];
values[0] = CStringGetTextDatum(def->defname);
nulls[0] = false;
@@ -555,22 +564,6 @@ deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options)
tuplestore_putvalues(tupstore, tupdesc, values, nulls);
}
- MemoryContextSwitchTo(oldcontext);
-}
-
-
-/*
- * Convert options array to name/value table. Useful for information
- * schema and pg_dump.
- */
-Datum
-pg_options_to_table(PG_FUNCTION_ARGS)
-{
- Datum array = PG_GETARG_DATUM(0);
-
- deflist_to_tuplestore((ReturnSetInfo *) fcinfo->resultinfo,
- untransformRelOptions(array));
-
return (Datum) 0;
}