v1-0001-minor-refactoring-set_session_variable.no-cfbot

application/octet-stream

Filename: v1-0001-minor-refactoring-set_session_variable.no-cfbot
Type: application/octet-stream
Part: 0
Message: Re: Re: proposal: schema variables
From 91a054cfbe4e3aa34e596ca73435e8ee4547e51b Mon Sep 17 00:00:00 2001
From: jian he <jian.universality@gmail.com>
Date: Mon, 6 Jan 2025 15:29:07 +0800
Subject: [PATCH v1 1/2] minor refactoring set_session_variable

---
 src/backend/commands/session_variable.c | 28 ++++++-------------------
 1 file changed, 6 insertions(+), 22 deletions(-)

diff --git a/src/backend/commands/session_variable.c b/src/backend/commands/session_variable.c
index 00a1f371e0..9e3d13bcfd 100644
--- a/src/backend/commands/session_variable.c
+++ b/src/backend/commands/session_variable.c
@@ -210,13 +210,12 @@ setup_session_variable(SVariable svar, Oid varid)
 static void
 set_session_variable(SVariable svar, Datum value, bool isnull)
 {
-	Datum		newval;
-	SVariableData locsvar,
-			   *_svar;
-
 	Assert(svar);
 	Assert(!isnull || value == (Datum) 0);
 
+	/* free svar->value and set svar->isnull to true */
+	free_session_variable_value(svar);
+
 	/*
 	 * Use typbyval, typbylen from session variable only when they are
 	 * trustworthy (the invalidation message was not accepted for this
@@ -226,37 +225,22 @@ set_session_variable(SVariable svar, Datum value, bool isnull)
 	 * that no error can be thrown.
 	 */
 	if (!svar->is_valid)
-	{
-		setup_session_variable(&locsvar, svar->varid);
-		_svar = &locsvar;
-	}
-	else
-		_svar = svar;
+		setup_session_variable(svar, svar->varid);
 
 	if (!isnull)
 	{
 		MemoryContext oldcxt = MemoryContextSwitchTo(SVariableMemoryContext);
 
-		newval = datumCopy(value, _svar->typbyval, _svar->typlen);
+		svar->value = datumCopy(value, svar->typbyval, svar->typlen);
+		svar->isnull = isnull;
 
 		MemoryContextSwitchTo(oldcxt);
 	}
-	else
-		newval = value;
-
-	free_session_variable_value(svar);
 
 	elog(DEBUG1, "session variable \"%s.%s\" (oid:%u) has new value",
 		 get_namespace_name(get_session_variable_namespace(svar->varid)),
 		 get_session_variable_name(svar->varid),
 		 svar->varid);
-
-	/* no more error expected, so we can overwrite the old variable now */
-	if (svar != _svar)
-		memcpy(svar, _svar, sizeof(SVariableData));
-
-	svar->value = newval;
-	svar->isnull = isnull;
 }
 
 /*
-- 
2.34.1