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