Changeset: f30ce02a6bde for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f30ce02a6bde
Modified Files:
        sql/server/rel_select.c
        sql/test/analytics/Tests/analytics10.sql
        sql/test/analytics/Tests/analytics10.stable.out
Branch: grouping-analytics
Log Message:

Delay generation of subgroups for rollup/cubes/groupingsets to after ORDER BY 
clause compilation, because ORDER BY might introduce new aggregates to be 
propagated


diffs (161 lines):

diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -4586,6 +4586,7 @@ rel_groupings(sql_query *query, sql_rel 
                                                        sql_exp *e = 
rel_group_column(query, rel, elm, selection, f);
                                                        if (!e)
                                                                return NULL;
+                                                       assert(e->type == 
e_column);
                                                        list_append(elements, 
e);
                                                        list_append(exps, e);
                                                }
@@ -4624,8 +4625,7 @@ rel_groupings(sql_query *query, sql_rel 
                                        }
                                } else if (combined_totals && (grouping->token 
== SQL_GROUPBY)) { /* the list of sets is not used in the "GROUP BY a, b, ..." 
case */
                                        if (!*sets) {
-                                               *sets = new_exp_list(sql->sa);
-                                               list_append(*sets, set_exps);
+                                               *sets = 
list_append(new_exp_list(sql->sa), set_exps);
                                        } else {
                                                list *new_set = 
list_append(new_exp_list(sql->sa), set_exps);
                                                *sets = grouping_sets ? 
list_merge(*sets, new_set, (fdup) NULL) : 
lists_cartesian_product_and_distinct(sql->sa, *sets, new_set);
@@ -6246,7 +6246,7 @@ rel_select_exp(sql_query *query, sql_rel
        mvc *sql = query->sql;
        dnode *n;
        //int aggr = 0;
-       sql_rel *inner = NULL, *group, *l;
+       sql_rel *inner = NULL, *group, *left;
        list *sets = NULL;
 
        assert(sn->s.token == SQL_SELECT);
@@ -6357,7 +6357,7 @@ rel_select_exp(sql_query *query, sql_rel
        }
 
        group = rel->l;
-       l = rel;
+       left = rel;
 
        if (sn->having) {
                inner = rel->l;
@@ -6373,8 +6373,24 @@ rel_select_exp(sql_query *query, sql_rel
                        return sql_error(sql, 02, SQLSTATE(42000) "SELECT: 
cannot compare sets with values, probably an aggregate function missing");
                rel->l = inner;
                group = inner->l;
-               l = inner;
-       }
+               left = inner;
+       }
+
+       if (rel && sn->orderby) {
+               list *obe = NULL;
+
+               set_processed(rel);
+               rel = rel_orderby(sql, rel);
+               obe = rel_order_by(query, &rel, sn->orderby, sql_orderby);
+               if (!obe)
+                       return NULL;
+               rel->r = obe;
+
+               if (!is_select(left->op)) /* if the rollup query has a having 
clause, it's no longer needed to update left*/
+                       left = rel->l;
+       }
+       if (!rel)
+               return NULL;
 
        /* ROLLUP, CUBE, GROUPING SETS cases */
        if (sets) {
@@ -6414,25 +6430,12 @@ rel_select_exp(sql_query *query, sql_rel
                        if (!unions)
                                return unions;
                }
-               l->l = unions;
+               left->l = unions;
        }
 
        if (rel && sn->distinct)
                rel = rel_distinct(rel);
 
-       if (rel && sn->orderby) {
-               list *obe = NULL;
-
-               set_processed(rel);
-               rel = rel_orderby(sql, rel);
-               obe = rel_order_by(query, &rel, sn->orderby, sql_orderby);
-               if (!obe)
-                       return NULL;
-               rel->r = obe;
-       }
-       if (!rel)
-               return NULL;
-
        if (sn->limit || sn->offset) {
                sql_subtype *lng = sql_bind_localtype("lng");
                list *exps = new_exp_list(sql->sa);
diff --git a/sql/test/analytics/Tests/analytics10.sql 
b/sql/test/analytics/Tests/analytics10.sql
--- a/sql/test/analytics/Tests/analytics10.sql
+++ b/sql/test/analytics/Tests/analytics10.sql
@@ -219,4 +219,20 @@ SELECT
 FROM tbl_ProductSales
 GROUP BY GROUPING SETS (ROLLUP(ColID), (), GROUPING SETS ((Product_Category, 
Product_Name), CUBE(ColID), ColID));
 
+SELECT
+    CAST(SUM(TotalSales) as BIGINT) AS TotalSales
+FROM tbl_ProductSales GROUP BY ROLLUP (Product_Category, ColID)
+ORDER BY SUM(TotalSales);
+
+SELECT
+    CAST(SUM(TotalSales) as BIGINT) AS TotalSales
+FROM tbl_ProductSales GROUP BY ROLLUP (Product_Category, ColID)
+HAVING SUM(TotalSales) > 600;
+
+SELECT
+    CAST(SUM(TotalSales) as BIGINT) AS TotalSales
+FROM tbl_ProductSales GROUP BY ROLLUP (Product_Category, ColID)
+HAVING SUM(TotalSales) > 600
+ORDER BY AVG(TotalSales);
+
 DROP TABLE tbl_ProductSales;
diff --git a/sql/test/analytics/Tests/analytics10.stable.out 
b/sql/test/analytics/Tests/analytics10.stable.out
--- a/sql/test/analytics/Tests/analytics10.stable.out
+++ b/sql/test/analytics/Tests/analytics10.stable.out
@@ -752,6 +752,40 @@ stdout of test 'analytics10` in director
 [ 400  ]
 [ 500  ]
 [ 100  ]
+#SELECT
+#    CAST(SUM(TotalSales) as BIGINT) AS TotalSales
+#FROM tbl_ProductSales GROUP BY ROLLUP (Product_Category, ColID)
+#ORDER BY SUM(TotalSales);
+% .L3 # table_name
+% totalsales # name
+% bigint # type
+% 4 # length
+[ 100  ]
+[ 200  ]
+[ 400  ]
+[ 500  ]
+[ 600  ]
+[ 600  ]
+[ 1200 ]
+#SELECT
+#    CAST(SUM(TotalSales) as BIGINT) AS TotalSales
+#FROM tbl_ProductSales GROUP BY ROLLUP (Product_Category, ColID)
+#HAVING SUM(TotalSales) > 600;
+% .L3 # table_name
+% totalsales # name
+% bigint # type
+% 4 # length
+[ 1200 ]
+#SELECT
+#    CAST(SUM(TotalSales) as BIGINT) AS TotalSales
+#FROM tbl_ProductSales GROUP BY ROLLUP (Product_Category, ColID)
+#HAVING SUM(TotalSales) > 600
+#ORDER BY AVG(TotalSales);
+% .L3 # table_name
+% totalsales # name
+% bigint # type
+% 4 # length
+[ 1200 ]
 #DROP TABLE tbl_ProductSales;
 
 # 11:30:14 >  
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to