From 3b44473f19d9de2441636a702b364c62874c8bc5 Mon Sep 17 00:00:00 2001 From: April01xxx Date: Thu, 28 Jul 2022 16:54:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSQL=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E4=B8=AD=E5=90=8C=E6=97=B6=E5=87=BA=E7=8E=B0=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=92=8C=E5=AD=90=E6=9F=A5=E8=AF=A2=E6=97=B6?= =?UTF-8?q?=E5=9B=A0=E5=AD=90=E6=9F=A5=E8=AF=A2=E8=A2=AB=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=89=A7=E8=A1=8C=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/optimizer/plan/planner.cpp | 3 ++- src/gausskernel/optimizer/util/tlist.cpp | 13 +++++++++++++ src/include/optimizer/tlist.h | 1 + src/test/regress/expected/window.out | 20 ++++++++++++++++++++ src/test/regress/sql/window.sql | 15 +++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/gausskernel/optimizer/plan/planner.cpp b/src/gausskernel/optimizer/plan/planner.cpp index 1a86b2d47..750bad35e 100755 --- a/src/gausskernel/optimizer/plan/planner.cpp +++ b/src/gausskernel/optimizer/plan/planner.cpp @@ -7144,7 +7144,8 @@ static List* make_windowInputTargetList(PlannerInfo* root, List* tlist, List* ac if (IsA(node, Var)) { if (!tlist_member(node, new_tlist)) { if (var_from_dependency_rel(parse, (Var *)node, dep_oids) || - var_from_sublink_pulluped(parse, (Var *) node)) { + var_from_sublink_pulluped(parse, (Var *) node) || + var_from_subquery_pulluped(parse, (Var *) node)) { flattenable_vars_final = lappend(flattenable_vars_final, node); } } diff --git a/src/gausskernel/optimizer/util/tlist.cpp b/src/gausskernel/optimizer/util/tlist.cpp index 6bbfb553d..25d5d1c42 100644 --- a/src/gausskernel/optimizer/util/tlist.cpp +++ b/src/gausskernel/optimizer/util/tlist.cpp @@ -710,3 +710,16 @@ bool var_from_sublink_pulluped(Query *parse, Var *var) return tbl->sublink_pull_up; } + +/* + * Check if var comes from subquery pulled up + * @in parse: the parse tree contained the vars. + * @in var: the vars need be checked. + */ +bool var_from_subquery_pulluped(Query *parse, Var *var) +{ + Index varno = var->varno; + RangeTblEntry *tbl = rt_fetch((int)varno, parse->rtable); + + return tbl->pulled_from_subquery; +} diff --git a/src/include/optimizer/tlist.h b/src/include/optimizer/tlist.h index 8e92d9e18..3b3fa9125 100644 --- a/src/include/optimizer/tlist.h +++ b/src/include/optimizer/tlist.h @@ -47,4 +47,5 @@ extern void get_tlist_group_vars_split(Query* parse, List* tlist, List** group_c extern List* get_dependency_var_list(Query* parse, List* group_cols, List* non_group_vars); extern bool var_from_dependency_rel(Query* parse, Var* var, List* dep_oids); extern bool var_from_sublink_pulluped(Query *parse, Var *var); +extern bool var_from_subquery_pulluped(Query *parse, Var *var); #endif /* TLIST_H */ diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out index 6359caa73..ed04d0f07 100644 --- a/src/test/regress/expected/window.out +++ b/src/test/regress/expected/window.out @@ -1403,3 +1403,23 @@ SELECT nth_value_def(ten) OVER (PARTITION BY four order by unique1) as No1, * 1 | 6701 | 7 | 1 | 1 | 1 | 1 | 1 | 701 | 701 | 1701 | 6701 | 2 | 3 | TXAAAA | HAAAAA | VVVVxx (10 rows) +drop table bmsql_item; +create table bmsql_item ( i_price numeric(5,2),i_data varchar(50)); +insert into bmsql_item values('1.0',1); +select + first_value(avg(alias7.alias4)) over (order by 1) alias12, + length(alias7.alias5) alias14 +from (select + bmsql_item.i_price alias4, + cast(bmsql_item.i_data as varchar(100))as alias5 + from + bmsql_item + ) alias7 +group by + alias7.alias5; + alias12 | alias14 +------------------------+--------- + 1.00000000000000000000 | 1 +(1 row) + +drop table bmsql_item; diff --git a/src/test/regress/sql/window.sql b/src/test/regress/sql/window.sql index d180816d0..21da641bc 100644 --- a/src/test/regress/sql/window.sql +++ b/src/test/regress/sql/window.sql @@ -346,3 +346,18 @@ CREATE FUNCTION nth_value_def(val anyelement, n integer = 1) RETURNS anyelement SELECT nth_value_def(ten) OVER (PARTITION BY four order by unique1) as No1, * FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten) s order by No1; +drop table bmsql_item; +create table bmsql_item ( i_price numeric(5,2),i_data varchar(50)); +insert into bmsql_item values('1.0',1); +select + first_value(avg(alias7.alias4)) over (order by 1) alias12, + length(alias7.alias5) alias14 +from (select + bmsql_item.i_price alias4, + cast(bmsql_item.i_data as varchar(100))as alias5 + from + bmsql_item + ) alias7 +group by + alias7.alias5; +drop table bmsql_item;