diff --git a/src/gausskernel/optimizer/plan/planner.cpp b/src/gausskernel/optimizer/plan/planner.cpp index 494a119cb..c9a263e21 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;