From da3875365ae938d778a15bd1928e685d3b1a44d4 Mon Sep 17 00:00:00 2001 From: chenxiaobin19 <1025221611@qq.com> Date: Wed, 23 Apr 2025 17:36:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B8=A6=E7=94=A8=E6=88=B7=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=E7=9A=84=E6=9F=A5=E8=AF=A2=E7=A6=81=E7=94=A8?= =?UTF-8?q?smp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/parser/gram.y | 1 + src/common/backend/parser/parser.cpp | 1 + .../optimizer/plan/streamwalker.cpp | 8 ++++++ src/gausskernel/runtime/executor/execQual.cpp | 1 - .../set_user_defined_variables_test.source | 14 +++------- .../set_user_defined_variables_test.source | 26 +++++++------------ 6 files changed, 22 insertions(+), 29 deletions(-) diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index dab66b56ac..36b5913316 100644 --- a/src/common/backend/parser/gram.y +++ b/src/common/backend/parser/gram.y @@ -28129,6 +28129,7 @@ a_expr: c_expr { $$ = $1; } errmsg("@var_name := expr is not yet supported in distributed database."))); #endif if (DB_IS_CMPT(B_FORMAT) && (u_sess->attr.attr_common.enable_set_variable_b_format || ENABLE_SET_VARIABLES)) { + u_sess->parser_cxt.has_equal_uservar = true; UserSetElem *n = makeNode(UserSetElem); n->name = list_make1((Node *)$1); n->val = (Expr *)$3; diff --git a/src/common/backend/parser/parser.cpp b/src/common/backend/parser/parser.cpp index d91c95c958..618eb1b5b9 100644 --- a/src/common/backend/parser/parser.cpp +++ b/src/common/backend/parser/parser.cpp @@ -70,6 +70,7 @@ static void resetForbidTruncateFlag() static void resetHasSetUservarFlag() { u_sess->parser_cxt.has_set_uservar = false; + u_sess->parser_cxt.has_equal_uservar = false; } /* diff --git a/src/gausskernel/optimizer/plan/streamwalker.cpp b/src/gausskernel/optimizer/plan/streamwalker.cpp index f85b6615d5..644df57c6a 100755 --- a/src/gausskernel/optimizer/plan/streamwalker.cpp +++ b/src/gausskernel/optimizer/plan/streamwalker.cpp @@ -450,6 +450,14 @@ static void stream_walker_query(Query* query, shipping_context *cxt) cxt->current_shippable = false; } + if (u_sess->parser_cxt.has_equal_uservar) { + /* + * turn off dop for query with set uservar, as the uservar value is + * affected by the execution order, impacting the result set. + */ + u_sess->opt_cxt.query_dop = 1; + } + /* Mark query's can_push and global_shippable flag. */ query->can_push = cxt->current_shippable; cxt->global_shippable = cxt->global_shippable && cxt->current_shippable; diff --git a/src/gausskernel/runtime/executor/execQual.cpp b/src/gausskernel/runtime/executor/execQual.cpp index bde719c9ed..e1ccc6a0ed 100644 --- a/src/gausskernel/runtime/executor/execQual.cpp +++ b/src/gausskernel/runtime/executor/execQual.cpp @@ -6724,7 +6724,6 @@ ExprState* ExecInitExprByRecursion(Expr* node, PlanState* parent) state = (ExprState*)usestate; state->evalfunc = (ExprStateEvalFunc)ExecEvalUserSetElm; usestate->instate = ExecInitExpr((Expr *)useexpr->val, parent); - u_sess->parser_cxt.has_equal_uservar = true; } break; case T_PriorExpr: state = (ExprState*)makeNode(ExprState); 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 7534a54732..9dada92c92 100644 --- a/src/test/regress/input/set_user_defined_variables_test.source +++ b/src/test/regress/input/set_user_defined_variables_test.source @@ -649,15 +649,6 @@ INSERT INTO demo VALUES ('5', 'E', '4'); INSERT INTO demo VALUES ('6', 'F', '1'); INSERT INTO demo VALUES ('7', 'G', '1'); -set query_dop = 1002; -SELECT @r , -(SELECT @r:= parent_id FROM demo WHERE id = @r) AS parent_id, -@l:= @l+ 1 AS lvl -FROM -(SELECT @r:= 5, @l:= 0) vars, -demo h -WHERE @r<> 0; -set query_dop = 1; SELECT @r , (SELECT @r:= parent_id FROM demo WHERE id = @r) AS parent_id, @l:= @l+ 1 AS lvl @@ -791,10 +782,11 @@ set enable_seqscan = false; set enable_bitmapscan = false; create table account_instance_stats(id int primary key, stat_id int); insert into account_instance_stats values(1,1),(2,1),(3,1),(4,1); +set query_dop = 1002; +explain (costs off) SELECT stat_id, @pids := id FROM account_instance_stats where id >= @pids; set @pids = 1; - SELECT stat_id, @pids := id FROM account_instance_stats where id >= @pids; - +set query_dop = 1; drop table account_instance_stats; set enable_seqscan = default; set enable_bitmapscan = default; 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 34b2265c80..e73887a4cc 100644 --- a/src/test/regress/output/set_user_defined_variables_test.source +++ b/src/test/regress/output/set_user_defined_variables_test.source @@ -1326,23 +1326,6 @@ INSERT INTO demo VALUES ('4', 'D', '2'); INSERT INTO demo VALUES ('5', 'E', '4'); INSERT INTO demo VALUES ('6', 'F', '1'); INSERT INTO demo VALUES ('7', 'G', '1'); -set query_dop = 1002; -SELECT @r , -(SELECT @r:= parent_id FROM demo WHERE id = @r) AS parent_id, -@l:= @l+ 1 AS lvl -FROM -(SELECT @r:= 5, @l:= 0) vars, -demo h -WHERE @r<> 0; - @r | parent_id | lvl -----+-----------+----- - 5 | 4 | 1 - 4 | 2 | 2 - 2 | 1 | 3 - 1 | 0 | 4 -(4 rows) - -set query_dop = 1; SELECT @r , (SELECT @r:= parent_id FROM demo WHERE id = @r) AS parent_id, @l:= @l+ 1 AS lvl @@ -1545,6 +1528,14 @@ set enable_bitmapscan = false; create table account_instance_stats(id int primary key, stat_id int); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "account_instance_stats_pkey" for table "account_instance_stats" insert into account_instance_stats values(1,1),(2,1),(3,1),(4,1); +set query_dop = 1002; +explain (costs off) SELECT stat_id, @pids := id FROM account_instance_stats where id >= @pids; + QUERY PLAN +------------------------------------------------------------------------ + Index Scan using account_instance_stats_pkey on account_instance_stats + Index Cond: (id >= @pids) +(2 rows) + set @pids = 1; SELECT stat_id, @pids := id FROM account_instance_stats where id >= @pids; stat_id | ?column? @@ -1555,6 +1546,7 @@ SELECT stat_id, @pids := id FROM account_instance_stats where id >= @pids; 1 | 4 (4 rows) +set query_dop = 1; drop table account_instance_stats; set enable_seqscan = default; set enable_bitmapscan = default; -- Gitee