diff --git a/src/common/backend/nodes/nodeFuncs.cpp b/src/common/backend/nodes/nodeFuncs.cpp index 7602b28c4..df2188520 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)))); @@ -2654,6 +2676,11 @@ Node* expression_tree_mutator(Node* node, Node* (*mutator)(Node*, void*), void* MUTATE(newnode->value, oldnode->value, Expr*); 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 90c7325fb..bf5617eeb 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