Changeset: a013a71f93ca for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/a013a71f93ca Modified Files: sql/server/rel_optimizer.c sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.sql sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.stable.out Branch: Jun2020 Log Message:
Backported bug #7108 fix into Jun2020 diffs (89 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -4320,10 +4320,6 @@ rel_push_aggr_down(visitor *v, sql_rel * } } - u = rel_setop(v->sql->sa, ul, ur, op_union); - rel_setop_set_exps(v->sql, u, rel_projections(v->sql, ul, NULL, 1, 1)); - set_processed(u); - if (rel->r) { list *ogbe = rel->r; @@ -4331,15 +4327,27 @@ rel_push_aggr_down(visitor *v, sql_rel * for (n = ogbe->h; n; n = n->next) { sql_exp *e = n->data, *ne; + /* group by in aggreation list */ ne = exps_uses_exp( rel->exps, e); - if (!ne) - continue; - ne = list_find_exp( u->exps, ne); + if (ne) + ne = list_find_exp( ul->exps, ne); + if (!ne) { + /* e only in the ul/ur->r (group by list) */ + ne = exp_ref(v->sql, e); + list_append(ul->exps, ne); + ne = exp_ref(v->sql, e); + list_append(ur->exps, ne); + } assert(ne); ne = exp_ref(v->sql, ne); append(gbe, ne); } } + + u = rel_setop(v->sql->sa, ul, ur, op_union); + rel_setop_set_exps(v->sql, u, rel_projections(v->sql, ul, NULL, 1, 1)); + set_processed(u); + exps = new_exp_list(v->sql->sa); for (n = u->exps->h, m = rel->exps->h; n && m; n = n->next, m = m->next) { sql_exp *ne, *e = n->data, *oa = m->data; diff --git a/sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.sql b/sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.sql --- a/sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.sql +++ b/sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.sql @@ -54,4 +54,14 @@ select count(*) FROM ( FROM "myschema"."mymerge" myalias GROUP BY field1, field2) AS mycount; +-- These statements are related to the same issue +create merge table merge_table (mcol1 int, mcol2 int, mcol3 int); +create table child1 (mcol1 int, mcol2 int, mcol3 int); +insert into child1 values (1,1,1); +create table child2 (mcol1 int, mcol2 int, mcol3 int); +insert into child2 values (2,2,2); +alter table merge_table add table child1; +alter table merge_table add table child2; +select cast(sum(mcol1) as bigint), cast(sum(mcol2) as bigint) from merge_table group by mcol1, mcol2, mcol3 order by mcol1 limit 2; + rollback; diff --git a/sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.stable.out b/sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.stable.out --- a/sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.stable.out +++ b/sql/test/mergetables/Tests/mergetable_rel_push_aggr_down.stable.out @@ -80,6 +80,22 @@ stdout of test 'mergetable_rel_push_aggr % bigint # type % 1 # length [ 0 ] +#create merge table merge_table (mcol1 int, mcol2 int, mcol3 int); +#create table child1 (mcol1 int, mcol2 int, mcol3 int); +#insert into child1 values (1,1,1); +[ 1 ] +#create table child2 (mcol1 int, mcol2 int, mcol3 int); +#insert into child2 values (2,2,2); +[ 1 ] +#alter table merge_table add table child1; +#alter table merge_table add table child2; +#select cast(sum(mcol1) as bigint), cast(sum(mcol2) as bigint) from merge_table group by mcol1, mcol2, mcol3 order by mcol1 limit 2; +% .%2, .%4 # table_name +% %2, %4 # name +% bigint, bigint # type +% 1, 1 # length +[ 1, 1 ] +[ 2, 2 ] #rollback; # 12:55:05 > _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list