From 0ead23228466829e1b2d38b250fdf922c9ee9a35 Mon Sep 17 00:00:00 2001 From: totaj Date: Wed, 17 May 2023 12:01:52 +0800 Subject: [PATCH] Don't rewrite fulljoin when targetlist contain system column. --- build/script/aarch64_opengauss_list | 1 + .../opengauss_release_list_ubuntu_single | 1 + build/script/x86_64_opengauss_list | 1 + src/gausskernel/optimizer/plan/planner.cpp | 73 +++++++++++++------ .../regress/expected/fulljoin_rewrite.out | 11 +++ src/test/regress/sql/fulljoin_rewrite.sql | 3 + 6 files changed, 69 insertions(+), 21 deletions(-) diff --git a/build/script/aarch64_opengauss_list b/build/script/aarch64_opengauss_list index 606771d3d9..93abb91ec5 100644 --- a/build/script/aarch64_opengauss_list +++ b/build/script/aarch64_opengauss_list @@ -71,6 +71,7 @@ ./share/postgresql/extension/dolphin--1.1.sql ./share/postgresql/extension/dolphin--1.0--1.1.sql ./share/postgresql/extension/dolphin--1.1--1.0.sql +./share/postgresql/extension/openGauss_expr_dolphin.ir ./share/postgresql/extension/file_fdw--1.0.sql ./share/postgresql/extension/plpgsql.control ./share/postgresql/extension/dist_fdw.control diff --git a/build/script/opengauss_release_list_ubuntu_single b/build/script/opengauss_release_list_ubuntu_single index a536770de2..ae6f36ef1d 100644 --- a/build/script/opengauss_release_list_ubuntu_single +++ b/build/script/opengauss_release_list_ubuntu_single @@ -65,6 +65,7 @@ ./share/postgresql/extension/dolphin--1.1.sql ./share/postgresql/extension/dolphin--1.0--1.1.sql ./share/postgresql/extension/dolphin--1.1--1.0.sql +./share/postgresql/extension/openGauss_expr_dolphin.ir ./share/postgresql/extension/file_fdw--1.0.sql ./share/postgresql/extension/plpgsql.control ./share/postgresql/extension/dist_fdw.control diff --git a/build/script/x86_64_opengauss_list b/build/script/x86_64_opengauss_list index fb738d3c26..17ad1c6bc9 100644 --- a/build/script/x86_64_opengauss_list +++ b/build/script/x86_64_opengauss_list @@ -71,6 +71,7 @@ ./share/postgresql/extension/dolphin--1.1.sql ./share/postgresql/extension/dolphin--1.0--1.1.sql ./share/postgresql/extension/dolphin--1.1--1.0.sql +./share/postgresql/extension/openGauss_expr_dolphin.ir ./share/postgresql/extension/file_fdw--1.0.sql ./share/postgresql/extension/plpgsql.control ./share/postgresql/extension/dist_fdw.control diff --git a/src/gausskernel/optimizer/plan/planner.cpp b/src/gausskernel/optimizer/plan/planner.cpp index d94dc470bc..8da7176554 100755 --- a/src/gausskernel/optimizer/plan/planner.cpp +++ b/src/gausskernel/optimizer/plan/planner.cpp @@ -1221,6 +1221,25 @@ static bool has_foreign_table_in_rtable(Query* query) return false; } +static inline bool contain_system_column(Node *var_list) +{ + List* vars = pull_var_clause(var_list, PVC_RECURSE_AGGREGATES, PVC_RECURSE_PLACEHOLDERS); + ListCell* lc = NULL; + bool result = false; + + foreach (lc, vars) { + Var* var = (Var*)lfirst(lc); + + if (var->varattno < 0) { + result = true; + break; + } + } + + list_free_ext(vars); + return result; +} + /* -------------------- * subquery_planner * Invokes the planner on a subquery. We recurse to here for each @@ -1777,27 +1796,39 @@ Plan* subquery_planner(PlannerGlobal* glob, Query* parse, PlannerInfo* parent_ro #endif { bool support_rewrite = true; - if (!fulljoin_2_left_union_right_anti_support(root->parse)) - support_rewrite = false; - if (contain_volatile_functions((Node*)root->parse)) - support_rewrite = false; - contain_func_context context = - init_contain_func_context(list_make3_oid(ECEXTENSIONFUNCOID, ECHADOOPFUNCOID, RANDOMFUNCOID)); - if (contains_specified_func((Node*)root->parse, &context)) { - char* func_name = get_func_name(((FuncExpr*)linitial(context.func_exprs))->funcid); - ereport(DEBUG2, - (errmodule(MOD_OPT_REWRITE), - (errmsg("[Not rewrite full Join on true]: %s functions contained.", func_name)))); - pfree_ext(func_name); - list_free_ext(context.funcids); - context.funcids = NIL; - list_free_ext(context.func_exprs); - context.func_exprs = NIL; - support_rewrite = false; - } - if (has_foreign_table_in_rtable(root->parse)) { - support_rewrite = false; - } + do { + if (contain_system_column((Node*)root->parse->targetList)) { + support_rewrite = false; + break; + } + if (!fulljoin_2_left_union_right_anti_support(root->parse)) { + support_rewrite = false; + break; + } + if (contain_volatile_functions((Node*)root->parse)) { + support_rewrite = false; + break; + } + contain_func_context context = + init_contain_func_context(list_make3_oid(ECEXTENSIONFUNCOID, ECHADOOPFUNCOID, RANDOMFUNCOID)); + if (contains_specified_func((Node*)root->parse, &context)) { + char* func_name = get_func_name(((FuncExpr*)linitial(context.func_exprs))->funcid); + ereport(DEBUG2, + (errmodule(MOD_OPT_REWRITE), + (errmsg("[Not rewrite full Join on true]: %s functions contained.", func_name)))); + pfree_ext(func_name); + list_free_ext(context.funcids); + context.funcids = NIL; + list_free_ext(context.func_exprs); + context.func_exprs = NIL; + support_rewrite = false; + break; + } + if (has_foreign_table_in_rtable(root->parse)) { + support_rewrite = false; + break; + } + } while (0); if (support_rewrite) { reduce_inequality_fulljoins(root); DEBUG_QRW("After full join conversion"); diff --git a/src/test/regress/expected/fulljoin_rewrite.out b/src/test/regress/expected/fulljoin_rewrite.out index 4c8b4f4c6b..be1133f1a4 100644 --- a/src/test/regress/expected/fulljoin_rewrite.out +++ b/src/test/regress/expected/fulljoin_rewrite.out @@ -144,3 +144,14 @@ select left(alias8.w_zip ,alias8.w_id) as alias10,true alias11,dense_rank() over drop table fulltest; drop table fulltest2; +-- contain system column, don't rewrite full join +explain (costs off) select t1.oid from pg_class t1 full join pg_constraint t2 on t1.relname = t2.conname; + QUERY PLAN +------------------------------------------ + Hash Full Join + Hash Cond: (t1.relname = t2.conname) + -> Seq Scan on pg_class t1 + -> Hash + -> Seq Scan on pg_constraint t2 +(5 rows) + diff --git a/src/test/regress/sql/fulljoin_rewrite.sql b/src/test/regress/sql/fulljoin_rewrite.sql index 35c805e283..fba4fc22d7 100644 --- a/src/test/regress/sql/fulljoin_rewrite.sql +++ b/src/test/regress/sql/fulljoin_rewrite.sql @@ -50,3 +50,6 @@ select left(alias8.w_zip ,alias8.w_id) as alias10,true alias11,dense_rank() over drop table fulltest; drop table fulltest2; +-- contain system column, don't rewrite full join +explain (costs off) select t1.oid from pg_class t1 full join pg_constraint t2 on t1.relname = t2.conname; + -- Gitee