diff --git a/src/common/backend/nodes/nodeFuncs.cpp b/src/common/backend/nodes/nodeFuncs.cpp index e0e79ff3edb363761f2f8504e4467db3fa905c9c..0ecffd31b3c41751599d3b565408b461fe2e3982 100644 --- a/src/common/backend/nodes/nodeFuncs.cpp +++ b/src/common/backend/nodes/nodeFuncs.cpp @@ -2108,8 +2108,7 @@ bool expression_tree_walker(Node* node, bool (*walker)(), void* context) case T_PrefixKey: return p2walker(((PrefixKey*)node)->arg, context); case T_UserSetElem: { - p2walker(((UserSetElem*)node)->val, context); - return true; + return p2walker(((UserSetElem*)node)->val, context); } case T_PriorExpr: return p2walker(((PriorExpr*)node)->node, context); diff --git a/src/gausskernel/optimizer/util/clauses.cpp b/src/gausskernel/optimizer/util/clauses.cpp index d61ff1e12791ba829b9797df1e954a1a4dfc3bc6..f910103eca806f8bdad266a8c8eb0679767f7135 100644 --- a/src/gausskernel/optimizer/util/clauses.cpp +++ b/src/gausskernel/optimizer/util/clauses.cpp @@ -1191,6 +1191,9 @@ static bool contain_specified_functions_walker(Node* node, check_function_contex } else if (IsA(node, Query) && context->deep) { /* Recurse into subselects */ return query_tree_walker((Query*)node, (bool (*)())contain_specified_functions_walker, context, 0); + } else if (IsA(node, UserSetElem)) { + /* UserSetElem is volatile */ + return context->checktype == CONTAIN_VOLATILE_FUNTION; } return expression_tree_walker(node, (bool (*)())contain_specified_functions_walker, context); } 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 544038e8cc773d8532d9de949546aa0aff72091e..fe4086f7a6d43612c273711760750df41626fc71 100644 --- a/src/test/regress/input/set_user_defined_variables_test.source +++ b/src/test/regress/input/set_user_defined_variables_test.source @@ -789,8 +789,12 @@ SELECT stat_id, @pids := id FROM account_instance_stats where id >= @pids; drop table account_instance_stats; set enable_seqscan = default; set enable_bitmapscan = default; -set enable_set_variable_b_format = default; +CREATE TABLE userset_t1 (a VARCHAR(500) CHARACTER SET UTF8); +SET @num=1000; +INSERT INTO userset_t1 VALUES (CONCAT((@num:=@num+1), 'a')); + +set enable_set_variable_b_format = default; \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 19ab1926ab310ca70e23b1485714126ce27bc12b..bfe3ef55d3b9d048bb0f646dc8b8f88955f247ef 100644 --- a/src/test/regress/output/set_user_defined_variables_test.source +++ b/src/test/regress/output/set_user_defined_variables_test.source @@ -1541,6 +1541,9 @@ SELECT stat_id, @pids := id FROM account_instance_stats where id >= @pids; drop table account_instance_stats; set enable_seqscan = default; set enable_bitmapscan = default; +CREATE TABLE userset_t1 (a VARCHAR(500) CHARACTER SET UTF8); +SET @num=1000; +INSERT INTO userset_t1 VALUES (CONCAT((@num:=@num+1), 'a')); set enable_set_variable_b_format = default; \c regression drop database if exists test_set;