From 9cca28b611e5b61fd2c595a44f4919dc7d443452 Mon Sep 17 00:00:00 2001 From: yuhuanhuan <1500773557@qq.com> Date: Fri, 16 Sep 2022 09:36:24 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90debug=E3=80=91=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E7=94=A8=E6=88=B7=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/nodes/nodeFuncs.cpp | 27 +++++++++++++++++ src/common/backend/utils/misc/guc.cpp | 2 +- .../set_user_defined_variables_test.source | 11 +++++++ .../set_user_defined_variables_test.source | 29 ++++++++++++++++++- 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/common/backend/nodes/nodeFuncs.cpp b/src/common/backend/nodes/nodeFuncs.cpp index 8e93aac1a..3599ac119 100644 --- a/src/common/backend/nodes/nodeFuncs.cpp +++ b/src/common/backend/nodes/nodeFuncs.cpp @@ -235,6 +235,12 @@ Oid exprType(const Node* expr) case T_SetVariableExpr: type = ((const Const*)(((SetVariableExpr*)expr)->value))->consttype; break; + case T_UserSetElem: + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("user_defined variables cannot be set, such as @var_name := expr is not supported."))); + type = InvalidOid; /* keep compiler quiet */ + break; default: ereport(ERROR, (errcode(ERRCODE_UNRECOGNIZED_NODE_TYPE), errmsg("unrecognized node type: %d", (int)nodeTag(expr)))); @@ -863,6 +869,12 @@ Oid exprCollation(const Node* expr) case T_SetVariableExpr: coll = ((const Const*)(((SetVariableExpr*)expr)->value))->constcollid; break; + case T_UserSetElem: + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("user_defined variables cannot be set, such as @var_name := expr is not supported."))); + coll = InvalidOid; /* keep compiler quiet */ + break; default: ereport( ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("unrecognized node type: %d", (int)nodeTag(expr)))); @@ -1068,6 +1080,11 @@ void exprSetCollation(Node* expr, Oid collation) case T_SetVariableExpr: ((Const*)(((SetVariableExpr*)expr)->value))->constcollid = collation; break; + case T_UserSetElem: + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("user_defined variables cannot be set, such as @var_name := expr is not supported."))); + break; default: ereport( ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("unrecognized node type: %d", (int)nodeTag(expr)))); @@ -1906,6 +1923,11 @@ bool expression_tree_walker(Node* node, bool (*walker)(), void* context) return p2walker(((AutoIncrement*)node)->expr, context); case T_PrefixKey: return p2walker(((PrefixKey*)node)->arg, context); + case T_UserSetElem: + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("user_defined variables cannot be set, such as @var_name := expr is not supported."))); + break; default: ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("expression_tree_walker:unrecognized node type: %d", (int)nodeTag(node)))); @@ -2653,6 +2675,11 @@ Node* expression_tree_mutator(Node* node, Node* (*mutator)(Node*, void*), void* FLATCOPY(newnode, (Const *)(oldnode->value), Const, isCopy); return (Node*)newnode; } break; + case T_UserSetElem: + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("user_defined variables cannot be set, such as @var_name := expr is not supported."))); + break; default: ereport(ERROR, (errcode(ERRCODE_UNRECOGNIZED_NODE_TYPE), errmsg("unrecognized node type: %d", (int)nodeTag(node)))); diff --git a/src/common/backend/utils/misc/guc.cpp b/src/common/backend/utils/misc/guc.cpp index 4b357a600..792ca97ba 100755 --- a/src/common/backend/utils/misc/guc.cpp +++ b/src/common/backend/utils/misc/guc.cpp @@ -1085,7 +1085,7 @@ static void InitConfigureNamesBool() NULL}, #endif {{"enable_set_variable_b_format", - PGC_SIGHUP, + PGC_USERSET, NODE_ALL, INSTRUMENTS_OPTIONS, gettext_noop("enable set variable in b format."), diff --git a/src/test/regress/input/set_user_defined_variables_test.source b/src/test/regress/input/set_user_defined_variables_test.source index 2538c1905..b89d1cf1d 100644 --- a/src/test/regress/input/set_user_defined_variables_test.source +++ b/src/test/regress/input/set_user_defined_variables_test.source @@ -467,6 +467,17 @@ select @v1; set @ v1:=10; select @v1:=10; +\c test_set +show enable_set_variable_b_format; +set enable_set_variable_b_format = off; +set @v1 := 1, @v2 := 2, @v3 := @v4 := 3; + +\c test_set +show enable_set_variable_b_format; +set enable_set_variable_b_format = on; +set @v1 := 1, @v2 := 2, @v3 := @v4 := 3; +select @v1, @v2, @v3, @v4; + \c regression drop database if exists test_set; diff --git a/src/test/regress/output/set_user_defined_variables_test.source b/src/test/regress/output/set_user_defined_variables_test.source index d1d1f08fe..5273b575a 100644 --- a/src/test/regress/output/set_user_defined_variables_test.source +++ b/src/test/regress/output/set_user_defined_variables_test.source @@ -1004,7 +1004,34 @@ ERROR: syntax error at or near "@" LINE 1: set @ v1:=10; ^ select @v1:=10; -ERROR: unrecognized node type: 5014 +ERROR: user_defined variables cannot be set, such as @var_name := expr is not supported. +\c test_set +show enable_set_variable_b_format; + enable_set_variable_b_format +------------------------------ + on +(1 row) + +set enable_set_variable_b_format = off; +set @v1 := 1, @v2 := 2, @v3 := @v4 := 3; +ERROR: syntax error at or near "set @" +LINE 1: set @v1 := 1, @v2 := 2, @v3 := @v4 := 3; + ^ +\c test_set +show enable_set_variable_b_format; + enable_set_variable_b_format +------------------------------ + on +(1 row) + +set enable_set_variable_b_format = on; +set @v1 := 1, @v2 := 2, @v3 := @v4 := 3; +select @v1, @v2, @v3, @v4; + @v1 | @v2 | @v3 | @v4 +-----+-----+-----+----- + 1 | 2 | 3 | 3 +(1 row) + \c regression drop database if exists test_set; \! @abs_bindir@/gs_guc reload -Z datanode -D @abs_srcdir@/tmp_check/datanode1 -c "enable_set_variable_b_format=off" >/dev/null 2>&1