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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list