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

Reply via email to