Changeset: 96b0ffbdf640 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=96b0ffbdf640
Added Files:
        sql/server/rel_groupings.c
        sql/server/rel_groupings.h
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/server/Makefile.ag
        sql/server/rel_exp.c
        sql/server/rel_prop.c
        sql/server/rel_prop.h
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_partition.c
        sql/test/analytics/Tests/analytics11.stable.err
        sql/test/analytics/Tests/analytics11.stable.out
Branch: grouping-analytics
Log Message:

Move groupings generation after unnesting subqueries. This should fix the 
remaining failing queries


diffs (truncated from 657 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3296,7 +3296,9 @@ sql_parse(backend *be, sql_allocator *sa
                sql_query *query = query_create(m);
                sql_rel *r = rel_semantic(query, m->sym);
 
-               if (r && (r = rel_unnest(m,r)) != NULL && (r = rel_optimizer(m, 
r, 1)) != NULL)
+               if (r)
+                       r = sql_processrelation(m, r, 1);
+               if (r)
                        sq = rel_bin(be, r);
        }
 
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -25,6 +25,7 @@
 #include "sql_datetime.h"
 #include "sql_partition.h"
 #include "rel_unnest.h"
+#include "rel_groupings.h"
 #include "rel_optimizer.h"
 #include "rel_partition.h"
 #include "rel_distribute.h"
@@ -113,23 +114,33 @@ rel_need_distinct_query(sql_rel *rel)
 }
 
 sql_rel *
-sql_symbol2relation(mvc *c, symbol *sym)
+sql_processrelation(mvc *sql, sql_rel* rel, int value_based_opt)
+{
+       if (rel)
+               rel = rel_unnest(sql, rel);
+       if (rel)
+               rel = rel_generate_groupings(sql, rel);
+       if (rel)
+               rel = rel_optimizer(sql, rel, value_based_opt);
+       return rel;
+}
+
+sql_rel *
+sql_symbol2relation(mvc *sql, symbol *sym)
 {
-       sql_rel *r;
-       sql_query *query = query_create(c);
-
-       r = rel_semantic(query, sym);
-       if (r)
-               r = rel_unnest(c, r);
-       if (r)
-               r = rel_optimizer(c, r, 1);
-       if (r)
-               r = rel_distribute(c, r);
-       if (r)
-               r = rel_partition(c, r);
-       if (r && (rel_no_mitosis(r) || rel_need_distinct_query(r)))
-               c->no_mitosis = 1;
-       return r;
+       sql_rel *rel;
+       sql_query *query = query_create(sql);
+
+       rel = rel_semantic(query, sym);
+       if (rel)
+               rel = sql_processrelation(sql, rel, 1);
+       if (rel)
+               rel = rel_distribute(sql, rel);
+       if (rel)
+               rel = rel_partition(sql, rel);
+       if (rel && (rel_no_mitosis(rel) || rel_need_distinct_query(rel)))
+               sql->no_mitosis = 1;
+       return rel;
 }
 
 /*
@@ -434,12 +445,9 @@ create_table_or_view(mvc *sql, char* sna
                }
                r = rel_parse(sql, s, nt->query, m_deps);
                if (r)
-                       r = rel_unnest(sql, r);
-               if (r)
-                       r = rel_optimizer(sql, r, 0);
+                       r = sql_processrelation(sql, r, 0);
                if (r) {
                        list *id_l = rel_dependencies(sql, r);
-
                        mvc_create_dependencies(sql, id_l, nt->base.id, 
VIEW_DEPENDENCY);
                }
                sa_destroy(sql->sa);
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -55,7 +55,8 @@
 #include "bat/bat_utils.h"
 
 extern int sqlcleanup(mvc *c, int err);
-extern sql_rel *sql_symbol2relation(mvc *c, symbol *sym);
+extern sql_rel *sql_processrelation(mvc *m, sql_rel* rel, int value_based_opt);
+extern sql_rel *sql_symbol2relation(mvc *m, symbol *sym);
 
 extern BAT *mvc_bind(mvc *m, const char *sname, const char *tname, const char 
*cname, int access);
 extern BAT *mvc_bind_idxbat(mvc *m, const char *sname, const char *tname, 
const char *iname, int access);
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -447,12 +447,9 @@ create_trigger(mvc *sql, char *sname, ch
                        throw(SQL, "sql.catalog",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
                r = rel_parse(sql, s, buf, m_deps);
                if (r)
-                       r = rel_unnest(sql, r);
-               if (r)
-                       r = rel_optimizer(sql, r, 0);
+                       r = sql_processrelation(sql, r, 0);
                if (r) {
                        list *id_l = rel_dependencies(sql, r);
-
                        mvc_create_dependencies(sql, id_l, tri->base.id, 
TRIGGER_DEPENDENCY);
                }
                sa_destroy(sql->sa);
@@ -781,9 +778,7 @@ create_func(mvc *sql, char *sname, char 
                        throw(SQL, "sql.catalog",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
                r = rel_parse(sql, s, buf, m_deps);
                if (r)
-                       r = rel_unnest(sql, r);
-               if (r)
-                       r = rel_optimizer(sql, r, 0);
+                       r = sql_processrelation(sql, r, 0);
                if (r) {
                        node *n;
                        list *id_l = rel_dependencies(sql, r);
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -829,10 +829,8 @@ RAstatement(Client c, MalBlkPtr mb, MalS
                int oldvtop = c->curprg->def->vtop;
                int oldstop = c->curprg->def->stop;
 
-               if (*opt) {
-                       rel = rel_unnest(m, rel);
-                       rel = rel_optimizer(m, rel, 0);
-               }
+               if (*opt && rel)
+                       rel = sql_processrelation(m, rel, 0);
 
                if ((msg = MSinitClientPrg(c, "user", "test")) != MAL_SUCCEED) {
                        rel_destroy(rel);
@@ -955,9 +953,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
        rel = rel_read(m, *expr, &pos, refs);
        stack_pop_frame(m);
        if (rel)
-               rel = rel_unnest(m, rel);
-       if (rel)
-               rel = rel_optimizer(m, rel, 0);
+               rel = sql_processrelation(m, rel, 0);
        if (!rel || monet5_create_relational_function(m, *mod, *nme, rel, NULL, 
ops, 0) < 0)
                throw(SQL, "sql.register", SQLSTATE(42000) "Cannot register 
%s", buf);
        rel_destroy(rel);
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1040,12 +1040,12 @@ backend_create_sql_func(backend *be, sql
        if (!vararg)
                f->sql++;
        r = rel_parse(m, f->s, f->query, m_instantiate);
-       if (r) {
-               r = rel_unnest(m, r);
-               r = rel_optimizer(m, r, 0);
+       if (r)
+               r = sql_processrelation(m, r, 0);
+       if (r)
                r = rel_distribute(m, r);
+       if (r)
                r = rel_partition(m, r);
-       }
        if (r && !f->sql)       /* native function */
                return 0;
 
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3003,8 +3003,7 @@ stmt_func(backend *be, stmt *ops, const 
        p = find_prop(rel->p, PROP_REMOTE);
        if (p) 
                rel->p = prop_remove(rel->p, p);
-       rel = rel_unnest(be->mvc, rel);
-       rel = rel_optimizer(be->mvc, rel, 0);
+       rel = sql_processrelation(be->mvc, rel, 0);
        if (p) {
                p->p = rel->p;
                rel->p = p;
diff --git a/sql/server/Makefile.ag b/sql/server/Makefile.ag
--- a/sql/server/Makefile.ag
+++ b/sql/server/Makefile.ag
@@ -36,6 +36,7 @@ lib_sqlserver = {
                sql_env.c \
                sql_privileges.c \
                sql_query.c \
+               rel_groupings.c \
                rel_semantic.c \
                rel_select.c \
                rel_updates.c \
@@ -55,7 +56,7 @@ lib_sqlserver = {
                rel_psm.c \
                rel_xml.c \
                rel_dump.c \
-               rel_dump.h rel_exp.h rel_rel.h \
+               rel_dump.h rel_exp.h rel_groupings.h rel_rel.h \
                rel_unnest.h rel_optimizer.h rel_partition.h rel_distribute.h 
rel_prop.h rel_schema.h rel_select.h \
                rel_semantic.h rel_sequence.h rel_trans.h \
                rel_updates.h rel_psm.h rel_xml.h sql_atom.h sql_datetime.h \
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -622,9 +622,7 @@ exp_rel(mvc *sql, sql_rel *rel)
        if (e == NULL)
                return NULL;
        /*
-       rel = rel_unnest(sql, rel);
-       rel = rel_optimizer(sql, rel, 0);
-       rel = rel_distribute(sql, rel);
+       rel = sql_processrelation(sql, rel, 0);
        */
        e->l = rel;
        e->flag = PSM_REL;
diff --git a/sql/server/rel_groupings.c b/sql/server/rel_groupings.c
new file mode 100644
--- /dev/null
+++ b/sql/server/rel_groupings.c
@@ -0,0 +1,144 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
+ */
+
+#include "monetdb_config.h"
+
+#include "rel_groupings.h"
+#include "rel_prop.h"
+#include "rel_exp.h"
+#include "rel_rel.h"
+#include "sql_relation.h"
+#include "sql_mvc.h"
+
+sql_rel *
+rel_generate_groupings(mvc *sql, sql_rel *rel)
+{
+       if (!rel)
+               return rel;
+
+       switch (rel->op) {
+               case op_basetable:
+               case op_table:
+               case op_ddl:
+                       break;
+               case op_join:
+               case op_left:
+               case op_right:
+               case op_full:
+               case op_semi:
+               case op_anti:
+               case op_union:
+               case op_inter:
+               case op_except:
+                       rel->l = rel_generate_groupings(sql, rel->l);
+                       rel->r = rel_generate_groupings(sql, rel->r);
+                       break;
+               case op_project:
+               case op_select:
+               case op_topn:
+               case op_sample:
+                       rel->l = rel_generate_groupings(sql, rel->l);
+                       break;
+               case op_insert:
+               case op_update:
+               case op_delete:
+               case op_truncate:
+                       rel->l = rel_generate_groupings(sql, rel->l);
+                       rel->r = rel_generate_groupings(sql, rel->r);
+                       break;
+               case op_groupby: {
+                       prop *found;
+                       rel->l = rel_generate_groupings(sql, rel->l);
+
+                       /* ROLLUP, CUBE, GROUPING SETS cases */
+                       if ((found = find_prop(rel->p, PROP_GROUPINGS))) {
+                               list *sets = (list*) found->value;
+                               sql_rel *unions = NULL;
+
+                               for (node *n = sets->h ; n ; n = n->next) {
+                                       sql_rel *nrel;
+                                       list *l = (list*) n->data, *exps = 
sa_list(sql->sa), *pexps = sa_list(sql->sa);
+
+                                       l = list_flaten(l);
+                                       nrel = rel_groupby(sql, unions ? 
rel_dup(rel->l) : rel->l, l);
+
+                                       for (node *m = rel->exps->h ; m ; m = 
m->next) {
+                                               sql_exp *e = (sql_exp*) 
m->data, *ne = NULL;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to