From 92e3a9b6359b1a9157ca12687a3ff7ee754dd231 Mon Sep 17 00:00:00 2001
From: "okbob@github.com" <okbob@github.com>
Date: Tue, 19 Jul 2022 09:45:34 +0200
Subject: [PATCH 04/13] debug func

---
 src/backend/commands/sessionvariable.c | 49 ++++++++++++++++++++++++++
 src/include/catalog/pg_proc.dat        |  7 ++++
 2 files changed, 56 insertions(+)

diff --git a/src/backend/commands/sessionvariable.c b/src/backend/commands/sessionvariable.c
index 3eed6f33dc..df1916a164 100644
--- a/src/backend/commands/sessionvariable.c
+++ b/src/backend/commands/sessionvariable.c
@@ -26,6 +26,8 @@
 #include "catalog/pg_variable.h"
 #include "commands/session_variable.h"
 #include "executor/executor.h"
+#include "executor/svariableReceiver.h"
+#include "funcapi.h"
 #include "optimizer/optimizer.h"
 #include "parser/parse_coerce.h"
 #include "parser/parse_collate.h"
@@ -1914,3 +1916,50 @@ AtEOSubXact_SessionVariable_on_xact_actions(bool isCommit, SubTransactionId mySu
 		}
 	}
 }
+
+/*
+ * pg_debug_show_used_session_variables - designed for testing
+ *
+ * returns content of session vars
+ */
+Datum
+pg_debug_show_used_session_variables(PG_FUNCTION_ARGS)
+{
+#define NUM_PG_DEBUG_SHOW_USED_SESSION_VARIABLES_ATTS 9
+
+	SetSingleFuncCall(fcinfo, 0);
+
+	if (sessionvars)
+	{
+		ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
+		HASH_SEQ_STATUS status;
+		SVariable svar;
+
+		/* Ensure so all entries in sessionvars hash table are valid */
+		sync_sessionvars_all();
+
+		hash_seq_init(&status, sessionvars);
+
+		while ((svar = (SVariable) hash_seq_search(&status)) != NULL)
+		{
+			Datum		values[NUM_PG_DEBUG_SHOW_USED_SESSION_VARIABLES_ATTS];
+			bool		nulls[NUM_PG_DEBUG_SHOW_USED_SESSION_VARIABLES_ATTS];
+
+			memset(nulls, 0, sizeof(nulls));
+
+			values[0] = ObjectIdGetDatum(svar->varid);
+			values[1] = PointerGetDatum(cstring_to_text(get_namespace_name(get_session_variable_namespace(svar->varid))));
+			values[2] = PointerGetDatum(cstring_to_text(get_session_variable_name(svar->varid)));
+			values[3] = ObjectIdGetDatum(svar->svartype->typid);
+			values[4] = PointerGetDatum(cstring_to_text(svar->svartype->typname));
+			values[5] = BoolGetDatum(svar->is_valid);
+			values[6] = BoolGetDatum(session_variable_use_valid_type(svar));
+			values[7] = BoolGetDatum(pg_variable_aclcheck(svar->varid, GetUserId(), ACL_READ) == ACLCHECK_OK);
+			values[8] = BoolGetDatum(pg_variable_aclcheck(svar->varid, GetUserId(), ACL_WRITE) == ACLCHECK_OK);
+
+			tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+		}
+	}
+
+	return (Datum) 0;
+}
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 46b6354a51..7909b3d6a8 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -11889,4 +11889,11 @@
   prorettype => 'bytea', proargtypes => 'pg_brin_minmax_multi_summary',
   prosrc => 'brin_minmax_multi_summary_send' },
 
+{ oid => '8488', descr => 'debug list of used session variables',
+  proname => 'pg_debug_show_used_session_variables', prorows => '1000', proretset => 't',
+  provolatile => 's', prorettype => 'record', proargtypes => '',
+  proallargtypes => '{oid,text,text,oid,text,bool,bool,bool,bool}',
+  proargmodes => '{o,o,o,o,o,o,o,o,o}',
+  proargnames => '{varid,schema,name,typid,typname,has_value,has_valid_value,can_read,can_write}',
+  prosrc => 'pg_debug_show_used_session_variables' },
 ]
-- 
2.37.1

