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

Reply via email to