Changeset: db0f3feb529a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/db0f3feb529a Modified Files: sql/server/rel_unnest.c sql/test/subquery/Tests/subquery3.test Branch: Jan2022 Log Message:
Make sure grouping expression lists don't contain function calls. Project those above diffs (93 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -2091,6 +2091,30 @@ aggrs_split_args(mvc *sql, list *aggrs, return aggrs; } +/* make sure e_func expressions don't appear on groupby expression lists */ +static sql_rel * +aggrs_split_funcs(mvc *sql, sql_rel *rel) +{ + if (!list_empty(rel->exps)) { + list *projs = NULL; + for (node *n = rel->exps->h; n;) { + node *next = n->next; + sql_exp *e = n->data; + + if (e->type == e_func || exps_find_exp(projs, e)) { + if (!projs) + projs = sa_list(sql->sa); + list_append(projs, e); + list_remove_node(rel->exps, NULL, n); + } + n = next; + } + if (!list_empty(projs)) + rel = rel_project(sql->sa, rel, list_merge(rel_projections(sql, rel, NULL, 1, 1), projs, NULL)); + } + return rel; +} + static int exps_complex(list *exps) { @@ -2113,8 +2137,8 @@ aggrs_complex(list *exps) for(node *n = exps->h; n; n = n->next) { sql_exp *e = n->data; - if (e->type == e_aggr && exps_complex(e->l)) - return 1; + if (e->type == e_func || (e->type == e_aggr && exps_complex(e->l))) + return 1; } return 0; } @@ -2130,6 +2154,7 @@ rewrite_aggregates(visitor *v, sql_rel * rel->r = aggrs_split_args(v->sql, rel->r, exps, 1); rel->exps = aggrs_split_args(v->sql, rel->exps, exps, 0); rel->l = rel_project(v->sql->sa, rel->l, exps); + rel = aggrs_split_funcs(v->sql, rel); v->changes++; return rel; } diff --git a/sql/test/subquery/Tests/subquery3.test b/sql/test/subquery/Tests/subquery3.test --- a/sql/test/subquery/Tests/subquery3.test +++ b/sql/test/subquery/Tests/subquery3.test @@ -199,6 +199,36 @@ 1 1 1 +query I nosort +SELECT + (SELECT SUM(1) OVER (PARTITION BY MAX(ColID) * col4) FROM tbl_ProductSales) +FROM another_T t1 +---- +1 +1 +1 +1 + +query I nosort +SELECT + (SELECT SUM(1) OVER (ORDER BY MAX(ColID) * col4) FROM tbl_ProductSales) +FROM another_T t1 +---- +1 +1 +1 +1 + +query I nosort +SELECT + (SELECT SUM(1) OVER (PARTITION BY MAX(ColID) * col4 ORDER BY MIN(TotalSales) * col5) FROM tbl_ProductSales) +FROM another_T t1 +---- +1 +1 +1 +1 + query R nosort SELECT (SELECT SUM(AVG(ColID + col1)) OVER (PARTITION BY SUM(ColID + col3) ORDER BY MAX(ColID) * col4 ROWS UNBOUNDED PRECEDING) FROM tbl_ProductSales GROUP BY t1.col1) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list