MonetDB: antipush - Merged with default
Changeset: b50e8e2d6f02 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/b50e8e2d6f02 Modified Files: sql/server/rel_optimizer.c sql/server/rel_unnest.c sql/test/miscellaneous/Tests/simple_plans.test Branch: antipush Log Message: Merged with default diffs (truncated from 365 to 300 lines): 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 @@ -3410,6 +3410,8 @@ stmt_func(backend *be, stmt *ops, const if ((p = find_prop(rel->p, PROP_REMOTE))) rel->p = prop_remove(rel->p, p); + /* sql_processrelation may split projections, so make sure the topmost relation only contains references */ + rel = rel_project(be->mvc->sa, rel, rel_projections(be->mvc, rel, NULL, 1, 1)); if (!(rel = sql_processrelation(be->mvc, rel, 1, 1))) return NULL; if (p) { diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -1594,51 +1594,49 @@ rel_push_count_down(visitor *v, sql_rel r && !r->exps && r->op == op_join && !(rel_is_ref(r)) && /* currently only single count aggregation is handled, no other projects or aggregation */ list_length(rel->exps) == 1 && exp_aggr_is_count(rel->exps->h->data)) { - sql_exp *nce, *oce; - sql_rel *gbl, *gbr; /* Group By */ - sql_rel *cp;/* Cross Product */ - sql_subfunc *mult; - list *args, *types; + sql_exp *nce, *oce, *cnt1 = NULL, *cnt2 = NULL; + sql_rel *gbl = NULL, *gbr = NULL; /* Group By */ + sql_rel *cp = NULL; /* Cross Product */ sql_rel *srel; oce = rel->exps->h->data; if (oce->l) /* we only handle COUNT(*) */ return rel; - args = new_exp_list(v->sql->sa); srel = r->l; { sql_subfunc *cf = sql_bind_func(v->sql, "sys", "count", sql_bind_localtype("void"), NULL, F_AGGR); - sql_exp *cnt, *e = exp_aggr(v->sql->sa, NULL, cf, need_distinct(oce), need_no_nil(oce), oce->card, 0); + sql_exp *e = exp_aggr(v->sql->sa, NULL, cf, need_distinct(oce), need_no_nil(oce), oce->card, 0); exp_label(v->sql->sa, e, ++v->sql->label); - cnt = exp_ref(v->sql, e); + cnt1 = exp_ref(v->sql, e); gbl = rel_groupby(v->sql, rel_dup(srel), NULL); set_processed(gbl); rel_groupby_add_aggr(v->sql, gbl, e); - append(args, cnt); } srel = r->r; { sql_subfunc *cf = sql_bind_func(v->sql, "sys", "count", sql_bind_localtype("void"), NULL, F_AGGR); - sql_exp *cnt, *e = exp_aggr(v->sql->sa, NULL, cf, need_distinct(oce), need_no_nil(oce), oce->card, 0); + sql_exp *e = exp_aggr(v->sql->sa, NULL, cf, need_distinct(oce), need_no_nil(oce), oce->card, 0); exp_label(v->sql->sa, e, ++v->sql->label); - cnt = exp_ref(v->sql, e); + cnt2 = exp_ref(v->sql, e); gbr = rel_groupby(v->sql, rel_dup(srel), NULL); set_processed(gbr); rel_groupby_add_aggr(v->sql, gbr, e); - append(args, cnt); } cp = rel_crossproduct(v->sql->sa, gbl, gbr, op_join); - types = sa_list(v->sql->sa); - for(node *n = args->h; n; n = n->next) - list_append(types, exp_subtype(n->data)); - mult = sql_bind_func_(v->sql, "sys", "sql_mul", types, F_FUNC); - nce = exp_op(v->sql->sa, args, mult); + if (!(nce = rel_binop_(v->sql, NULL, cnt1, cnt2, "sys", "sql_mul", card_value))) { + v->sql->session->status = 0; + v->sql->errstr[0] = '\0'; + return rel; /* error, fallback to original expression */ + } + /* because of remote plans, make sure "sql_mul" returns bigint. The cardinality is atomic, so no major performance penalty */ + if (subtype_cmp(exp_subtype(oce), exp_subtype(nce)) != 0) + nce = exp_convert(v->sql->sa, nce, exp_subtype(nce), exp_subtype(oce)); if (exp_name(oce)) exp_prop_alias(v->sql->sa, nce, oce); diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++
MonetDB: default - Make sure rel_push_count_down returns the sam...
Changeset: 96905a6ef18f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/96905a6ef18f Modified Files: sql/server/rel_optimizer.c sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test sql/test/SQLancer/Tests/sqlancer19.SQL.py sql/test/miscellaneous/Tests/simple_plans.test Branch: default Log Message: Make sure rel_push_count_down returns the same output type diffs (119 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -1594,51 +1594,49 @@ rel_push_count_down(visitor *v, sql_rel r && !r->exps && r->op == op_join && !(rel_is_ref(r)) && /* currently only single count aggregation is handled, no other projects or aggregation */ list_length(rel->exps) == 1 && exp_aggr_is_count(rel->exps->h->data)) { - sql_exp *nce, *oce; - sql_rel *gbl, *gbr; /* Group By */ - sql_rel *cp;/* Cross Product */ - sql_subfunc *mult; - list *args, *types; + sql_exp *nce, *oce, *cnt1 = NULL, *cnt2 = NULL; + sql_rel *gbl = NULL, *gbr = NULL; /* Group By */ + sql_rel *cp = NULL; /* Cross Product */ sql_rel *srel; oce = rel->exps->h->data; if (oce->l) /* we only handle COUNT(*) */ return rel; - args = new_exp_list(v->sql->sa); srel = r->l; { sql_subfunc *cf = sql_bind_func(v->sql, "sys", "count", sql_bind_localtype("void"), NULL, F_AGGR); - sql_exp *cnt, *e = exp_aggr(v->sql->sa, NULL, cf, need_distinct(oce), need_no_nil(oce), oce->card, 0); + sql_exp *e = exp_aggr(v->sql->sa, NULL, cf, need_distinct(oce), need_no_nil(oce), oce->card, 0); exp_label(v->sql->sa, e, ++v->sql->label); - cnt = exp_ref(v->sql, e); + cnt1 = exp_ref(v->sql, e); gbl = rel_groupby(v->sql, rel_dup(srel), NULL); set_processed(gbl); rel_groupby_add_aggr(v->sql, gbl, e); - append(args, cnt); } srel = r->r; { sql_subfunc *cf = sql_bind_func(v->sql, "sys", "count", sql_bind_localtype("void"), NULL, F_AGGR); - sql_exp *cnt, *e = exp_aggr(v->sql->sa, NULL, cf, need_distinct(oce), need_no_nil(oce), oce->card, 0); + sql_exp *e = exp_aggr(v->sql->sa, NULL, cf, need_distinct(oce), need_no_nil(oce), oce->card, 0); exp_label(v->sql->sa, e, ++v->sql->label); - cnt = exp_ref(v->sql, e); + cnt2 = exp_ref(v->sql, e); gbr = rel_groupby(v->sql, rel_dup(srel), NULL); set_processed(gbr); rel_groupby_add_aggr(v->sql, gbr, e); - append(args, cnt); } cp = rel_crossproduct(v->sql->sa, gbl, gbr, op_join); - types = sa_list(v->sql->sa); - for(node *n = args->h; n; n = n->next) - list_append(types, exp_subtype(n->data)); - mult = sql_bind_func_(v->sql, "sys", "sql_mul", types, F_FUNC); - nce = exp_op(v->sql->sa, args, mult); + if (!(nce = rel_binop_(v->sql, NULL, cnt1, cnt2, "sys", "sql_mul", card_value))) { + v->sql->session->status = 0; + v->sql->errstr[0] = '\0'; + return rel; /* error, fallback to original expression */ + } + /* because of remote plans, make sure "sql_mul" returns bigint. The cardinality is atomic, so no major performance penalty */ + if (subtype_cmp(exp_subtype(oce), exp_subtype(nce)) != 0) + nce = exp_convert(v->sql->sa, nce, exp_subtype(nce), exp_subtype(oce)); if (exp_name(oce)) exp_prop_alias(v->sql->sa, nce, oce); diff --git a/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test b/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test --- a/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test +++ b/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test @@ -32,6 +32,8 @@ bat.pack 5 bat.single 2 +batcalc.lng +1 querylog.define 1 sql.my_generate_series diff --git a/sql/test/SQLancer/Tests/sqlancer19.SQL.py b/sql/test/SQLancer/Tests/sqlancer19.SQL.py --- a/sql/test/SQLancer/Tests/sqlancer19.SQL.py +++ b/sql/test/SQLancer/Tests/sqlancer19.SQL.py @@ -257,11 +257,21 @@ with SQLTestCase() as cli: cli.execute("SELECT 1 FROM v7 CROSS JOIN ((SELECT 1)
MonetDB: default - Before optimizing a remote plan, make sure th...
Changeset: f07f939ed6b6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/f07f939ed6b6 Modified Files: sql/backends/monet5/sql_statement.c sql/test/SQLancer/Tests/sqlancer19.SQL.py sql/test/SQLancer/Tests/sqlancer20.SQL.py Branch: default Log Message: Before optimizing a remote plan, make sure the topmost relation only contains references diffs (60 lines): 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 @@ -3410,6 +3410,8 @@ stmt_func(backend *be, stmt *ops, const if ((p = find_prop(rel->p, PROP_REMOTE))) rel->p = prop_remove(rel->p, p); + /* sql_processrelation may split projections, so make sure the topmost relation only contains references */ + rel = rel_project(be->mvc->sa, rel, rel_projections(be->mvc, rel, NULL, 1, 1)); if (!(rel = sql_processrelation(be->mvc, rel, 1, 1))) return NULL; if (p) { diff --git a/sql/test/SQLancer/Tests/sqlancer19.SQL.py b/sql/test/SQLancer/Tests/sqlancer19.SQL.py --- a/sql/test/SQLancer/Tests/sqlancer19.SQL.py +++ b/sql/test/SQLancer/Tests/sqlancer19.SQL.py @@ -256,6 +256,12 @@ with SQLTestCase() as cli: .assertSucceeded() cli.execute("SELECT 1 FROM v7 CROSS JOIN ((SELECT 1) UNION ALL (SELECT 2)) AS sub0(c0);") \ .assertSucceeded().assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)]) +cli.execute(""" +SELECT 1 FROM (VALUES (2),(3)) x(x) FULL OUTER JOIN (SELECT rt1.c1 <= CAST(rt1.c1 AS INT) FROM rt1) AS sub0(c0) ON true WHERE sub0.c0 +UNION ALL +SELECT 1 FROM (VALUES (2),(3)) x(x) FULL OUTER JOIN (SELECT rt1.c1 <= CAST(rt1.c1 AS INT) FROM rt1) AS sub0(c0) ON true; +""").assertSucceeded() \ + .assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)]) cli.execute("ROLLBACK;") cli.execute("CREATE FUNCTION mybooludf(a bool) RETURNS BOOL RETURN a;") diff --git a/sql/test/SQLancer/Tests/sqlancer20.SQL.py b/sql/test/SQLancer/Tests/sqlancer20.SQL.py --- a/sql/test/SQLancer/Tests/sqlancer20.SQL.py +++ b/sql/test/SQLancer/Tests/sqlancer20.SQL.py @@ -10,8 +10,6 @@ with SQLTestCase() as cli: cli.connect(username="monetdb", password="monetdb") cli.execute(""" START TRANSACTION; -CREATE TABLE "t0" ("c0" INTERVAL SECOND NOT NULL, "c1" JSON); -INSERT INTO "t0" VALUES (INTERVAL '9' SECOND, '""'); CREATE TABLE "t1" ("c0" BIGINT,"c1" INTERVAL MONTH); INSERT INTO "t1" VALUES (1, INTERVAL '9' MONTH),(5, INTERVAL '6' MONTH),(5, NULL),(7, NULL),(2, INTERVAL '1' MONTH),(2, INTERVAL '1' MONTH); COMMIT; @@ -20,12 +18,6 @@ with SQLTestCase() as cli: CREATE REMOTE TABLE "rt1" ("c0" BIGINT,"c1" INTERVAL MONTH) ON 'mapi:monetdb://localhost:%s/%s/sys/t1'; COMMIT;""" % (port, db)).assertSucceeded() -cli.execute(""" -SELECT 1 FROM t0 FULL OUTER JOIN (SELECT rt1.c0 <= CAST(rt1.c0 AS INT) FROM rt1) AS sub0(c0) ON true WHERE sub0.c0 -UNION ALL -SELECT 1 FROM t0 FULL OUTER JOIN (SELECT rt1.c0 <= CAST(rt1.c0 AS INT) FROM rt1) AS sub0(c0) ON true; - """).assertSucceeded().assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)]) - # Issues related to digits and scale propagation in the sql layer cli.execute("SELECT CAST(2 AS DECIMAL) & CAST(3 AS DOUBLE) FROM t1 where t1.c0 = 1;") \ .assertSucceeded().assertDataResultMatch([(Decimal('0.002'),)]) @@ -35,6 +27,5 @@ with SQLTestCase() as cli: cli.execute(""" START TRANSACTION; DROP TABLE rt1; -DROP TABLE t0; DROP TABLE t1; COMMIT;""").assertSucceeded() ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Merged with Jul2021
Changeset: 520499049a5b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/520499049a5b Modified Files: sql/server/rel_unnest.c sql/test/BugTracker-2021/Tests/All Branch: default Log Message: Merged with Jul2021 diffs (233 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -3470,6 +3470,18 @@ rewrite_groupings(visitor *v, sql_rel *r if (list_empty(exps)) append(exps, exp_atom_bool(v->sql->sa, 1)); /* protection against empty projections */ nrel->exps = exps; + if (!list_empty(rel->r) && !list_empty(nrel->r)) { /* aliases on grouping columns, ugh */ + for (node *n = ((list*)nrel->r)->h ; n ; n = n->next) { + sql_exp *e = n->data; + const char *rname = exp_relname(e), *cname = exp_name(e); + if (rname && cname) { + n->data = exp_copy(v->sql, exps_bind_column2(rel->r, rname, cname, NULL)); + } else if (cname) { + n->data = exp_copy(v->sql, exps_bind_column(rel->r, cname, NULL, NULL, 1)); + } + } + list_hash_clear(nrel->r); + } set_processed(nrel); if (list_empty(pexps)) append(pexps, exp_atom_bool(v->sql->sa, 1)); /* protection against empty projections */ diff --git a/sql/test/BugTracker-2021/Tests/All b/sql/test/BugTracker-2021/Tests/All --- a/sql/test/BugTracker-2021/Tests/All +++ b/sql/test/BugTracker-2021/Tests/All @@ -30,3 +30,4 @@ replace-transaction-conflict.Bug-7168 merge-table-join.Bug-7172 truncate-restart.Bug-7173 remote-table-large.Bug-7178 +grouping-sets-aliases.Bug-7185 diff --git a/sql/test/BugTracker-2021/Tests/grouping-sets-aliases.Bug-7185.test b/sql/test/BugTracker-2021/Tests/grouping-sets-aliases.Bug-7185.test new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2021/Tests/grouping-sets-aliases.Bug-7185.test @@ -0,0 +1,198 @@ +statement ok +start transaction + +statement ok +create table students (course TEXT, type TEXT) + +statement ok rowcount 7 +insert into students (course, type) values ('CS', 'Bachelor'), ('CS', 'Bachelor'), ('CS', 'PhD'), ('Math', 'Masters'), ('CS', NULL), ('CS', NULL), ('Math', NULL) + +query TT nosort +select course, type from students group by grouping sets((course, type), (type)) order by 1, 2 + +NULL +NULL +NULL +Bachelor +NULL +Masters +NULL +PhD +CS +NULL +CS +Bachelor +CS +PhD +Math +NULL +Math +Masters + +query ITT nosort +select count(*), course, type from students group by grouping sets((course, type), (type)) order by 1, 2, 3 + +1 +NULL +Masters +1 +NULL +PhD +1 +CS +PhD +1 +Math +NULL +1 +Math +Masters +2 +NULL +Bachelor +2 +CS +NULL +2 +CS +Bachelor +3 +NULL +NULL + +query TITT nosort +select min(course), grouping(course), course, type from students group by grouping sets((course, type), (type)) order by 1, 2, 3, 4 + +CS +0 +CS +NULL +CS +0 +CS +Bachelor +CS +0 +CS +PhD +CS +1 +NULL +NULL +CS +1 +NULL +Bachelor +CS +1 +NULL +PhD +Math +0 +Math +NULL +Math +0 +Math +Masters +Math +1 +NULL +Masters + +query TT nosort +select course AS crs, type AS tp from students group by grouping sets((crs, tp), (tp)) order by 1, 2 + +NULL +NULL +NULL +Bachelor +NULL +Masters +NULL +PhD +CS +NULL +CS +Bachelor +CS +PhD +Math +NULL +Math +Masters + +query ITT nosort +select count(*), course AS crs, type AS tp from students group by grouping sets((crs, tp), (tp)) order by 1, 2, 3 + +1 +NULL +Masters +1 +NULL +PhD +1 +CS +PhD +1 +Math +NULL +1 +Math +Masters +2 +NULL +Bachelor +2 +CS +NULL +2 +CS +Bachelor +3 +NULL +NULL + +query TITT nosort +select min(course), grouping(course), course AS crs, type AS tp from students group by grouping sets((crs, tp), (tp)) order by 1, 2, 3, 4 + +CS +0 +CS +NULL +CS +0 +CS +Bachelor +CS +0 +CS +PhD +CS +1 +NULL +NULL +CS +1 +NULL +Bachelor +CS +1 +NULL +PhD +Math +0 +Math +NULL +Math +0 +Math +Masters +Math +1 +NULL +Masters + +statement ok +rollback + ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jul2021 - Added test and fix for bug #7185. Grouping co...
Changeset: 21359a455af5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/21359a455af5 Added Files: sql/test/BugTracker-2021/Tests/grouping-sets-aliases.Bug-7185.test Modified Files: sql/server/rel_unnest.c sql/test/BugTracker-2021/Tests/All Branch: Jul2021 Log Message: Added test and fix for bug #7185. Grouping columns may contain aliases diffs (233 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -3470,6 +3470,18 @@ rewrite_groupings(visitor *v, sql_rel *r if (list_empty(exps)) append(exps, exp_atom_bool(v->sql->sa, 1)); /* protection against empty projections */ nrel->exps = exps; + if (!list_empty(rel->r) && !list_empty(nrel->r)) { /* aliases on grouping columns, ugh */ + for (node *n = ((list*)nrel->r)->h ; n ; n = n->next) { + sql_exp *e = n->data; + const char *rname = exp_relname(e), *cname = exp_name(e); + if (rname && cname) { + n->data = exp_copy(v->sql, exps_bind_column2(rel->r, rname, cname, NULL)); + } else if (cname) { + n->data = exp_copy(v->sql, exps_bind_column(rel->r, cname, NULL, NULL, 1)); + } + } + list_hash_clear(nrel->r); + } set_processed(nrel); if (list_empty(pexps)) append(pexps, exp_atom_bool(v->sql->sa, 1)); /* protection against empty projections */ diff --git a/sql/test/BugTracker-2021/Tests/All b/sql/test/BugTracker-2021/Tests/All --- a/sql/test/BugTracker-2021/Tests/All +++ b/sql/test/BugTracker-2021/Tests/All @@ -29,3 +29,4 @@ shutdown-force.Bug-7167 merge-table-join.Bug-7172 truncate-restart.Bug-7173 remote-table-large.Bug-7178 +grouping-sets-aliases.Bug-7185 diff --git a/sql/test/BugTracker-2021/Tests/grouping-sets-aliases.Bug-7185.test b/sql/test/BugTracker-2021/Tests/grouping-sets-aliases.Bug-7185.test new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2021/Tests/grouping-sets-aliases.Bug-7185.test @@ -0,0 +1,198 @@ +statement ok +start transaction + +statement ok +create table students (course TEXT, type TEXT) + +statement ok rowcount 7 +insert into students (course, type) values ('CS', 'Bachelor'), ('CS', 'Bachelor'), ('CS', 'PhD'), ('Math', 'Masters'), ('CS', NULL), ('CS', NULL), ('Math', NULL) + +query TT nosort +select course, type from students group by grouping sets((course, type), (type)) order by 1, 2 + +NULL +NULL +NULL +Bachelor +NULL +Masters +NULL +PhD +CS +NULL +CS +Bachelor +CS +PhD +Math +NULL +Math +Masters + +query ITT nosort +select count(*), course, type from students group by grouping sets((course, type), (type)) order by 1, 2, 3 + +1 +NULL +Masters +1 +NULL +PhD +1 +CS +PhD +1 +Math +NULL +1 +Math +Masters +2 +NULL +Bachelor +2 +CS +NULL +2 +CS +Bachelor +3 +NULL +NULL + +query TITT nosort +select min(course), grouping(course), course, type from students group by grouping sets((course, type), (type)) order by 1, 2, 3, 4 + +CS +0 +CS +NULL +CS +0 +CS +Bachelor +CS +0 +CS +PhD +CS +1 +NULL +NULL +CS +1 +NULL +Bachelor +CS +1 +NULL +PhD +Math +0 +Math +NULL +Math +0 +Math +Masters +Math +1 +NULL +Masters + +query TT nosort +select course AS crs, type AS tp from students group by grouping sets((crs, tp), (tp)) order by 1, 2 + +NULL +NULL +NULL +Bachelor +NULL +Masters +NULL +PhD +CS +NULL +CS +Bachelor +CS +PhD +Math +NULL +Math +Masters + +query ITT nosort +select count(*), course AS crs, type AS tp from students group by grouping sets((crs, tp), (tp)) order by 1, 2, 3 + +1 +NULL +Masters +1 +NULL +PhD +1 +CS +PhD +1 +Math +NULL +1 +Math +Masters +2 +NULL +Bachelor +2 +CS +NULL +2 +CS +Bachelor +3 +NULL +NULL + +query TITT nosort +select min(course), grouping(course), course AS crs, type AS tp from students group by grouping sets((crs, tp), (tp)) order by 1, 2, 3, 4 + +CS +0 +CS +NULL +CS +0 +CS +Bachelor +CS +0 +CS +PhD +CS +1 +NULL +NULL +CS +1 +NULL +Bachelor +CS +1 +NULL +PhD +Math +0 +Math +NULL +Math +0 +Math +Masters +Math +1 +NULL +Masters + +statement ok +rollback + ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Issue to be looked on later. Remote relation ...
Changeset: c3b918b7a42d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/c3b918b7a42d Modified Files: sql/test/SQLancer/Tests/sqlancer20.SQL.py Branch: default Log Message: Issue to be looked on later. Remote relation gets an extra projection while optimized before generating MAL code, which causes issues later diffs (32 lines): diff --git a/sql/test/SQLancer/Tests/sqlancer20.SQL.py b/sql/test/SQLancer/Tests/sqlancer20.SQL.py --- a/sql/test/SQLancer/Tests/sqlancer20.SQL.py +++ b/sql/test/SQLancer/Tests/sqlancer20.SQL.py @@ -10,6 +10,8 @@ with SQLTestCase() as cli: cli.connect(username="monetdb", password="monetdb") cli.execute(""" START TRANSACTION; +CREATE TABLE "t0" ("c0" INTERVAL SECOND NOT NULL, "c1" JSON); +INSERT INTO "t0" VALUES (INTERVAL '9' SECOND, '""'); CREATE TABLE "t1" ("c0" BIGINT,"c1" INTERVAL MONTH); INSERT INTO "t1" VALUES (1, INTERVAL '9' MONTH),(5, INTERVAL '6' MONTH),(5, NULL),(7, NULL),(2, INTERVAL '1' MONTH),(2, INTERVAL '1' MONTH); COMMIT; @@ -18,6 +20,12 @@ with SQLTestCase() as cli: CREATE REMOTE TABLE "rt1" ("c0" BIGINT,"c1" INTERVAL MONTH) ON 'mapi:monetdb://localhost:%s/%s/sys/t1'; COMMIT;""" % (port, db)).assertSucceeded() +cli.execute(""" +SELECT 1 FROM t0 FULL OUTER JOIN (SELECT rt1.c0 <= CAST(rt1.c0 AS INT) FROM rt1) AS sub0(c0) ON true WHERE sub0.c0 +UNION ALL +SELECT 1 FROM t0 FULL OUTER JOIN (SELECT rt1.c0 <= CAST(rt1.c0 AS INT) FROM rt1) AS sub0(c0) ON true; + """).assertSucceeded().assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)]) + # Issues related to digits and scale propagation in the sql layer cli.execute("SELECT CAST(2 AS DECIMAL) & CAST(3 AS DOUBLE) FROM t1 where t1.c0 = 1;") \ .assertSucceeded().assertDataResultMatch([(Decimal('0.002'),)]) @@ -27,5 +35,6 @@ with SQLTestCase() as cli: cli.execute(""" START TRANSACTION; DROP TABLE rt1; +DROP TABLE t0; DROP TABLE t1; COMMIT;""").assertSucceeded() ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: antipush - Don't push up on single joins or selects
Changeset: 62e78c75e405 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/62e78c75e405 Modified Files: sql/server/rel_optimizer.c Branch: antipush Log Message: Don't push up on single joins or selects diffs (17 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -4807,10 +4807,10 @@ point_select_on_unique_column(sql_rel *r static sql_rel * rel_push_select_up(visitor *v, sql_rel *rel) { - if ((is_join(rel->op) || is_semi(rel->op)) && !rel_is_ref(rel)) { + if ((is_join(rel->op) || is_semi(rel->op)) && !rel_is_ref(rel) && !is_single(rel)) { sql_rel *l = rel->l, *r = rel->r; - bool can_pushup_left = is_select(l->op) && !rel_is_ref(l), -can_pushup_right = is_select(r->op) && !rel_is_ref(r) && !is_semi(rel->op); + bool can_pushup_left = is_select(l->op) && !rel_is_ref(l) && !is_single(l), +can_pushup_right = is_select(r->op) && !rel_is_ref(r) && !is_single(r) && !is_semi(rel->op); if (can_pushup_left || can_pushup_right) { if (can_pushup_left) ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: antipush - Merged with default
Changeset: 71ca7084caeb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/71ca7084caeb Modified Files: sql/server/rel_dump.c sql/server/rel_optimizer.c sql/test/BugTracker-2015/Tests/crash.Bug-3736.test sql/test/BugTracker-2015/Tests/large_join.Bug-3809.test sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.test sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-1join-query.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-1join-view.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-query.test sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-view.test sql/test/SQLancer/Tests/sqlancer17.test sql/test/astro/Tests/astro.test sql/test/miscellaneous/Tests/simple_plans.test sql/test/miscellaneous/Tests/unique_keys.test tools/monetdbe/monetdbe.c Branch: antipush Log Message: Merged with default diffs (truncated from 3048 to 300 lines): diff --git a/sql/ChangeLog b/sql/ChangeLog --- a/sql/ChangeLog +++ b/sql/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog file for sql # This file is updated with Maddlog +* Tue Oct 12 2021 Pedro Ferreira +- Many improvements were done for REMOTE table plans. As a consequence, + master or slave servers from this feature release are not compatible + with older releases. + * Tue Sep 7 2021 Sjoerd Mullender - The view sys.ids has been changed to give more information about the objects in the system. In particular, there is an extra column diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -241,7 +241,9 @@ exp_print(mvc *sql, stream *fout, sql_ex break; case e_cmp: if (e->flag == cmp_in || e->flag == cmp_notin) { - exp_print(sql, fout, e->l, depth, refs, 0, 0); + mnstr_printf(fout, "("); + exp_print(sql, fout, e->l, depth+1, refs, 0, 0); + mnstr_printf(fout, ")"); if (is_anti(e)) mnstr_printf(fout, " !"); cmp_print(sql, fout, e->flag); @@ -258,30 +260,41 @@ exp_print(mvc *sql, stream *fout, sql_ex exps_print(sql, fout, e->l, depth, refs, 0, 1); if (is_anti(e)) mnstr_printf(fout, " !"); - mnstr_printf(fout, " FILTER \"%s\" ", dump_escape_ident(sql->ta, f->func->base.name)); + mnstr_printf(fout, " FILTER \"%s\".\"%s\"", + f->func->s?dump_escape_ident(sql->ta, f->func->s->base.name):"sys", + dump_escape_ident(sql->ta, f->func->base.name)); exps_print(sql, fout, e->r, depth, refs, 0, 1); } else if (e->f) { + mnstr_printf(fout, "("); exp_print(sql, fout, e->r, depth+1, refs, 0, 0); + mnstr_printf(fout, ")"); if (is_anti(e)) mnstr_printf(fout, " !"); - cmp_print(sql, fout, swap_compare(range2lcompare(e->flag)) ); + cmp_print(sql, fout, swap_compare(range2lcompare(e->flag))); + mnstr_printf(fout, "("); exp_print(sql, fout, e->l, depth+1, refs, 0, 0); + mnstr_printf(fout, ")"); if (is_anti(e)) mnstr_printf(fout, " !"); - cmp_print(sql, fout, range2rcompare(e->flag) ); + cmp_print(sql, fout, range2rcompare(e->flag)); + mnstr_printf(fout, "("); exp_print(sql, fout, e->f, depth+1, refs, 0, 0); - mnstr_printf(fout, " BETWEEN "); + mnstr_printf(fout, ")"); if (is_symmetric(e)) - mnstr_printf(fout, " SYM "); + mnstr_printf(fout, " SYM"); } else { + mnstr_printf(fout, "("); exp_print(sql, fout, e->l, depth+1, refs, 0, 0); + mnstr_printf(fout, ")"); if (is_anti(e)) mnstr_printf(fout, " !"); if (is_semantics(e)) mnstr_printf(fout, " *"); cmp_print(sql, fout, e->flag); + mnstr_printf(fout, "("); exp_print(sql, fout, e->r, depth+1, refs,
MonetDB: dict - merged with default
Changeset: ca240942cc9d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/ca240942cc9d Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql_statement.c sql/include/sql_catalog.h sql/storage/bat/bat_storage.c Branch: dict Log Message: merged with default diffs (truncated from 5196 to 300 lines): diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -71,9 +71,6 @@ %bcond_without fits %endif -%{!?__python3: %global __python3 /usr/bin/python3} -%{!?python3_sitelib: %global python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")} - Name: %{name} Version: %{version} Release: %{release} @@ -98,7 +95,7 @@ BuildRequires: hardlink BuildRequires: cmake3 >= 3.12 BuildRequires: gcc BuildRequires: bison -BuildRequires: /usr/bin/python3 +BuildRequires: python3-devel %if %{?rhel:1}%{!?rhel:0} # RH 7 (and for readline also 8) BuildRequires: bzip2-devel @@ -682,7 +679,6 @@ package. You probably don't need this, Summary: MonetDB - Monet Database Management System Group: Applications/Databases Requires: %{name}-client-tests = %{version}-%{release} -Requires: /usr/bin/python3 BuildArch: noarch %description testing-python @@ -842,6 +838,15 @@ else /usr/bin/hardlink -cv %{buildroot}%{_datadir}/selinux fi +# update shebang lines for Python scripts +%if %{?py3_shebang_fix:1}%{!?py3_shebang_fix:0} +# Fedora has py3_shebang_fix macro +%{py3_shebang_fix} %{buildroot}%{_bindir}/*.py +%else +# EPEL does not, but we can use the script directly +/usr/bin/pathfix.py -pni "%{__python3} -s" %{buildroot}%{_bindir}/*.py +%endif + %changelog * Thu Sep 30 2021 Sjoerd Mullender - 11.41.11-20210930 - Rebuilt. diff --git a/ctest/tools/monetdbe/example1.c b/ctest/tools/monetdbe/example1.c --- a/ctest/tools/monetdbe/example1.c +++ b/ctest/tools/monetdbe/example1.c @@ -36,7 +36,7 @@ main(void) monetdbe_column* rcol; if ((err = monetdbe_result_fetch(result, , c)) != NULL) error(err) - switch (rcol->type) { + switch (rcol->type.type) { case monetdbe_int32_t: { monetdbe_column_int32_t * col = (monetdbe_column_int32_t *) rcol; if (col->data[r] == col->null_value) { diff --git a/ctest/tools/monetdbe/example2.c b/ctest/tools/monetdbe/example2.c --- a/ctest/tools/monetdbe/example2.c +++ b/ctest/tools/monetdbe/example2.c @@ -43,7 +43,7 @@ main(void) monetdbe_column* rcol; if ((err = monetdbe_result_fetch(result, , c)) != NULL) error(err) - switch (rcol->type) { + switch (rcol->type.type) { case monetdbe_bool: { monetdbe_column_bool * col = (monetdbe_column_bool *) rcol; if (col->data[r] == col->null_value) { diff --git a/ctest/tools/monetdbe/example_append.c b/ctest/tools/monetdbe/example_append.c --- a/ctest/tools/monetdbe/example_append.c +++ b/ctest/tools/monetdbe/example_append.c @@ -44,7 +44,7 @@ main(void) for (size_t c = 0; c < result->ncols; c++) { if ((err = monetdbe_result_fetch(result, rcol+c, c)) != NULL) error(err) - switch (rcol[c]->type) { + switch (rcol[c]->type.type) { case monetdbe_int32_t: { monetdbe_column_int32_t * col = (monetdbe_column_int32_t *) rcol[c]; if (col->data[r] == col->null_value) { @@ -129,7 +129,7 @@ main(void) for (size_t c = 0; c < result->ncols; c++) { if ((err = monetdbe_result_fetch(result, rcol+c, c)) != NULL) error(err) - switch (rcol[c]->type) { + switch (rcol[c]->type.type) { case monetdbe_int32_t: { monetdbe_column_int32_t * col = (monetdbe_column_int32_t *) rcol[c]; if (col->data[r] == col->null_value) { diff --git a/ctest/tools/monetdbe/example_append_raw.c b/ctest/tools/monetdbe/example_append_raw.c --- a/ctest/tools/monetdbe/example_append_raw.c +++ b/ctest/tools/monetdbe/example_append_raw.c @@ -38,11 +38,11 @@ main(void) int32_t i1 = 42; int32_t i2 = *(int32_t*)monetdbe_null(mdbe, monetdbe_int32_t); int32_t ints[2] = { i1, i2 }; - monetdbe_column col0 = { .type = monetdbe_int32_t, .data = , .count = 2 }; + monetdbe_column col0 =
MonetDB: default - Added defensive lines and cleanup
Changeset: 7016ddcd38f6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7016ddcd38f6 Modified Files: sql/server/rel_dump.c Branch: default Log Message: Added defensive lines and cleanup diffs (72 lines): diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -1238,6 +1238,8 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re } } + if (sname && !mvc_bind_schema(sql, sname)) + return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "No such schema '%s'\n", sname); if (!(f = sql_bind_func_(sql, sname, fname, tl, F_FILT))) return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "Filter: missing function '%s'.'%s'\n", sname, fname); if (!execute_priv(sql, f->func)) @@ -1335,33 +1337,29 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re } } if (r[*pos] == '(') { - sql_schema *s; sql_subfunc *f = NULL; - sql_subfunc *a = NULL; - node *n; if (!(exps = read_exps(sql, lrel, rrel, top_exps, r, pos, '(', 0, 0))) return NULL; tname = b; *e = 0; convertIdent(tname); - s = mvc_bind_schema(sql, tname); - if (tname && !s) - return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "Schema %s not found\n", tname); + if (tname && !mvc_bind_schema(sql, tname)) + return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "No such schema '%s'\n", tname); if (grp) { if (exps && exps->h) { list *ops = sa_list(sql->sa); - for( n = exps->h; n; n = n->next) + for( node *n = exps->h; n; n = n->next) append(ops, exp_subtype(n->data)); - a = sql_bind_func_(sql, tname, cname, ops, F_AGGR); + f = sql_bind_func_(sql, tname, cname, ops, F_AGGR); } else { - a = sql_bind_func(sql, tname, cname, sql_bind_localtype("void"), NULL, F_AGGR); /* count(*) */ + f = sql_bind_func(sql, tname, cname, sql_bind_localtype("void"), NULL, F_AGGR); /* count(*) */ } - if (!a) + if (!f) return function_error_string(sql, tname, cname, exps, false, F_AGGR); - if (!execute_priv(sql, a->func)) + if (!execute_priv(sql, f->func)) return function_error_string(sql, tname, cname, exps, true, F_AGGR); - exp = exp_aggr( sql->sa, exps, a, unique, no_nils, CARD_ATOM, 1); + exp = exp_aggr(sql->sa, exps, f, unique, no_nils, CARD_ATOM, 1); if (zero_if_empty) set_zero_if_empty(exp); } else { @@ -1377,7 +1375,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re } } else { list *ops = sa_list(sql->sa); - for( n = exps->h; n; n = n->next) + for( node *n = exps->h; n; n = n->next) append(ops, exp_subtype(n->data)); f = sql_bind_func_(sql, tname, cname, ops, F_FUNC); @@ -1855,6 +1853,8 @@ rel_read(mvc *sql, char *r, int *pos, li if (!(inputs = read_exps(sql, lrel, NULL, NULL, r, pos, '(', 0, 1))) return NULL; + if (!mvc_bind_schema(sql, sname)) + return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "No such schema '%s'\n", sname); if (!(tudf = find_table_function(sql, sname, tname, list_empty(inputs) ? NULL : inputs, list_empty(inputs) ? NULL : exp_types(sql->sa, inputs), F_UNION))) return NULL; sf = tudf->f; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Updated ChangeLog
Changeset: 926d0d52cb8c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/926d0d52cb8c Modified Files: sql/ChangeLog Branch: default Log Message: Updated ChangeLog diffs (15 lines): diff --git a/sql/ChangeLog b/sql/ChangeLog --- a/sql/ChangeLog +++ b/sql/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog file for sql # This file is updated with Maddlog +* Tue Oct 12 2021 Pedro Ferreira +- Many improvements were done for REMOTE table plans. As a consequence, + master or slave servers from this feature release are not compatible + with older releases. + * Tue Sep 7 2021 Sjoerd Mullender - The view sys.ids has been changed to give more information about the objects in the system. In particular, there is an extra column ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list