Changeset: 4e9936cc28ab for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4e9936cc28ab Added Files: sql/test/analytics/Tests/analytics10.sql sql/test/analytics/Tests/analytics10.stable.err sql/test/analytics/Tests/analytics10.stable.out sql/test/analytics/Tests/analytics11.sql sql/test/analytics/Tests/analytics11.stable.err sql/test/analytics/Tests/analytics11.stable.out sql/test/analytics/Tests/analytics12.sql sql/test/analytics/Tests/analytics12.stable.err sql/test/analytics/Tests/analytics12.stable.out sql/test/analytics/Tests/analytics13.sql sql/test/analytics/Tests/analytics13.stable.err sql/test/analytics/Tests/analytics13.stable.out Modified Files: clients/mapiclient/mhelp.c 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/backends/monet5/sql_upgrades.c sql/common/sql_list.c sql/common/sql_types.c sql/common/sql_types.h sql/include/sql_list.h sql/include/sql_relation.h sql/scripts/51_sys_schema_extension.sql sql/server/Makefile.ag sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_prop.c sql/server/rel_prop.h sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_unnest.c sql/server/rel_updates.c sql/server/sql_atom.c sql/server/sql_atom.h sql/server/sql_mvc.c sql/server/sql_mvc.h sql/server/sql_parser.y sql/server/sql_partition.c sql/server/sql_scan.c sql/server/sql_semantic.c sql/server/sql_tokens.h sql/test/analytics/Tests/All sql/test/sys-schema/Tests/check_AlternateKey_uniqueness.stable.out sql/test/sys-schema/Tests/check_MaxStrLength_violations.stable.out sql/test/sys-schema/Tests/check_Not_Nullable_columns.stable.out sql/test/sys-schema/Tests/check_PrimaryKey_uniqueness.stable.out sql/test/sys-schema/Tests/geom_tables_checks.stable.out sql/test/sys-schema/Tests/netcdf_tables_checks.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out.int128 Branch: default Log Message:
Merged grouping-analytics into default diffs (truncated from 4585 to 300 lines): diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c --- a/clients/mapiclient/mhelp.c +++ b/clients/mapiclient/mhelp.c @@ -434,14 +434,14 @@ SQLhelp sqlhelp1[] = { "[ FROM from_item [',' ...] ]\n" "[ WINDOW window_definition [',' ...] ]\n" "[ WHERE condition ]\n" - "[ GROUP BY expression [',' ...] ]\n" + "[ GROUP BY group_by_element [',' ...] ]\n" "[ HAVING condition [',' ...] ]\n" "[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] [ CORRESPONDING ] select ]\n" "[ ORDER BY expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [',' ...] ]\n" "[ LIMIT { count | param } ]\n" "[ OFFSET { count | param } ]\n" "[ SAMPLE size [ SEED size ] ]", - "cte_list,expression,window_definition", + "cte_list,expression,group_by_element,window_definition", "See also https://www.monetdb.org/Documentation/SQLreference/TableExpressions"}, {"SET", "Assign a value to a variable or column", @@ -630,6 +630,12 @@ SQLhelp sqlhelp2[] = { "{ PUBLIC | authid } ", "authid", NULL}, + {"group_by_element", + NULL, + "{ expression | '(' ')' | ROLLUP '(' ident [',' ... ] ')' | CUBE '(' ident [',' ... ] ')'\n" + "| GROUPING SETS '(' group_by_element [',' ... ] ')' }", + "expression", + NULL}, {"headerlist", NULL, "'(' { ident [string] } [',' ...] ')'", 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 @@ -3306,7 +3306,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 @@ -114,23 +114,21 @@ rel_need_distinct_query(sql_rel *rel) } sql_rel * -sql_symbol2relation(mvc *c, symbol *sym) +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; } /* @@ -437,12 +435,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,7 @@ #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_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); @@ -802,9 +799,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 @@ -1190,12 +1190,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, 1); + if (r) + r = sql_processrelation(m, r, 1); + 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 @@ -3010,8 +3010,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/backends/monet5/sql_upgrades.c b/sql/backends/monet5/sql_upgrades.c --- a/sql/backends/monet5/sql_upgrades.c +++ b/sql/backends/monet5/sql_upgrades.c @@ -1959,9 +1959,7 @@ sql_update_nov2019_missing_dependencies( r = rel_parse(sql, s, relt, 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); @@ -1995,9 +1993,7 @@ sql_update_nov2019_missing_dependencies( r = rel_parse(sql, s, relt, 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); @@ -2025,9 +2021,7 @@ sql_update_nov2019_missing_dependencies( r = rel_parse(sql, s, relt, 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); @@ -2469,6 +2463,9 @@ sql_update_default(Client c, mvc *sql, c "update sys._tables set system = true where schema_id = (select id from sys.schemas where name = 'sys')" " and name = 'queue';\n"); + pos += snprintf(buf + pos, bufsize - pos, + "insert into sys.keywords values ('CUBE'), ('GROUPING'), ('ROLLUP'), ('SETS');\n"); + pos += snprintf(buf + pos, bufsize - pos, "set schema \"%s\";\n", prev_schema); assert(pos < bufsize); diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c --- a/sql/common/sql_list.c +++ b/sql/common/sql_list.c @@ -706,6 +706,18 @@ list_dup(list *l, fdup dup) return res ? list_merge(res, l, dup) : NULL; } +list * +list_flaten(list *l) +{ + list *res = list_new_(l); + for (node *n = l->h ; n ; n = n->next) { + list *ll = (list*) n->data; + for (node *m = ll->h ; m ; m = m->next) + list_append(res, m->data); + } + return res; +} + void list_hash_delete(list *l, void *data, fcmp cmp) { diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -485,7 +485,7 @@ static sql_subaggr * scale = member->scale; } /* same type as the input */ - if (r->type->eclass == EC_ANY) + if (r->type->eclass == EC_ANY && member) r = member; res = sql_create_subtype(sa, r->type, digits, scale); list_append(ares->res, res); @@ -534,19 +534,19 @@ sql_bind_aggr(sql_allocator *sa, sql_sch } sql_subaggr * -sql_bind_aggr_(sql_allocator *sa, sql_schema *s, const char *sqlaname, list *ops) +sql_bind_aggr_(sql_allocator *sa, sql_schema *s, const char *sqlaname, list *inputs, bool args) { node *n = aggrs->h; sql_subtype *type = NULL; - if (ops->h) - type = ops->h->data; + if (inputs->h) + type = inputs->h->data; while (n) { sql_func *a = n->data; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list