diff --git a/src/gausskernel/optimizer/plan/planner.cpp b/src/gausskernel/optimizer/plan/planner.cpp index d889a9307..17e83f8bf 100755 --- a/src/gausskernel/optimizer/plan/planner.cpp +++ b/src/gausskernel/optimizer/plan/planner.cpp @@ -1271,6 +1271,24 @@ static inline bool contain_system_column(Node *var_list) return result; } +static inline bool contain_placeholdervar(Node *var_list) +{ + List* vars = pull_var_clause(var_list, PVC_RECURSE_AGGREGATES, PVC_INCLUDE_PLACEHOLDERS); + ListCell* lc = NULL; + bool result = false; + + foreach (lc, vars) { + Node* var = (Node*)lfirst(lc); + if (IsA(var, PlaceHolderVar)) { + result = true; + break; + } + } + + list_free_ext(vars); + return result; +} + /* -------------------- * subquery_planner * Invokes the planner on a subquery. We recurse to here for each @@ -1833,6 +1851,10 @@ Plan* subquery_planner(PlannerGlobal* glob, Query* parse, PlannerInfo* parent_ro support_rewrite = false; break; } + if (root->parse->jointree != NULL && contain_placeholdervar(root->parse->jointree->quals)) { + support_rewrite = false; + break; + } if (!fulljoin_2_left_union_right_anti_support(root->parse)) { support_rewrite = false; break; diff --git a/src/test/regress/expected/fulljoin_rewrite.out b/src/test/regress/expected/fulljoin_rewrite.out index be1133f1a..6bd5b130b 100644 --- a/src/test/regress/expected/fulljoin_rewrite.out +++ b/src/test/regress/expected/fulljoin_rewrite.out @@ -144,6 +144,27 @@ select left(alias8.w_zip ,alias8.w_id) as alias10,true alias11,dense_rank() over drop table fulltest; drop table fulltest2; +CREATE TABLE fj_table0 ( column32 INT , column36 INT ) ; +SELECT 1 FROM fj_table0 LEFT JOIN ( SELECT 1 column29 FROM fj_table0 FULL JOIN fj_table0 AS alias0 ON FALSE ) AS alias1 ON TRUE WHERE column29 = 1 ; + ?column? +---------- +(0 rows) + +explain (costs off) SELECT 1 FROM fj_table0 LEFT JOIN ( SELECT 1 column29 FROM fj_table0 FULL JOIN fj_table0 AS alias0 ON FALSE ) AS alias1 ON TRUE WHERE column29 = 1 ; + QUERY PLAN +------------------------------------------------------ + Nested Loop Left Join + Filter: ((1) = 1) + -> Seq Scan on fj_table0 + -> Materialize + -> Merge Full Join + Join Filter: false + -> Seq Scan on fj_table0 + -> Materialize + -> Seq Scan on fj_table0 alias0 +(9 rows) + +drop table fj_table0; -- 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 diff --git a/src/test/regress/sql/fulljoin_rewrite.sql b/src/test/regress/sql/fulljoin_rewrite.sql index fba4fc22d..5a0fbc5e6 100644 --- a/src/test/regress/sql/fulljoin_rewrite.sql +++ b/src/test/regress/sql/fulljoin_rewrite.sql @@ -49,6 +49,10 @@ select left(alias8.w_zip ,alias8.w_id) as alias10,true alias11,dense_rank() over drop table fulltest; drop table fulltest2; +CREATE TABLE fj_table0 ( column32 INT , column36 INT ) ; +SELECT 1 FROM fj_table0 LEFT JOIN ( SELECT 1 column29 FROM fj_table0 FULL JOIN fj_table0 AS alias0 ON FALSE ) AS alias1 ON TRUE WHERE column29 = 1 ; +explain (costs off) SELECT 1 FROM fj_table0 LEFT JOIN ( SELECT 1 column29 FROM fj_table0 FULL JOIN fj_table0 AS alias0 ON FALSE ) AS alias1 ON TRUE WHERE column29 = 1 ; +drop table fj_table0; -- 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;