Changeset: 439cd2cddb4c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=439cd2cddb4c
Added Files:
sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-not-in.Bug-6594.stable.err
sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-not-in.Bug-6594.stable.out
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
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/rel_exp.c
sql/server/rel_optimizer.c
sql/server/rel_optimizer.h
sql/server/rel_select.c
sql/server/rel_updates.c
sql/test/Dependencies/Tests/Dependencies.stable.out
sql/test/Dependencies/Tests/Dependencies.stable.out.int128
sql/test/Tests/systemfunctions.stable.out
sql/test/Tests/systemfunctions.stable.out.int128
Branch: Mar2018
Log Message:
fixes for bugs 6594 and 6595
6595, disabled optimizers based on arguments (A...) as
these are passed after the optimizer is run
Also approved output after recent changes on system functions
diffs (truncated from 1150 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
@@ -2941,7 +2941,7 @@ sql_parse(backend *be, sql_allocator *sa
sql_rel *r = rel_semantic(m, m->sym);
if (r) {
- r = rel_optimizer(m, r);
+ r = rel_optimizer(m, r, 1);
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
@@ -119,7 +119,7 @@ sql_symbol2relation(mvc *c, symbol *sym)
if (!r)
return NULL;
if (r) {
- r = rel_optimizer(c, r);
+ r = rel_optimizer(c, r, 1);
r = rel_distribute(c, r);
r = rel_partition(c, r);
if (rel_no_mitosis(r) || rel_need_distinct_query(r))
@@ -358,7 +358,7 @@ create_table_or_view(mvc *sql, char *sna
throw(SQL, "sql.catalog",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
r = rel_parse(sql, s, nt->query, m_deps);
if (r)
- r = rel_optimizer(sql, r);
+ r = rel_optimizer(sql, r, 0);
if (r) {
list *id_l = rel_dependencies(sql->sa, r);
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
@@ -217,7 +217,7 @@ 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_optimizer(sql, r);
+ r = rel_optimizer(sql, r, 0);
if (r) {
list *id_l = rel_dependencies(sql->sa, r);
@@ -549,7 +549,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_optimizer(sql, r);
+ r = rel_optimizer(sql, r, 0);
if (r) {
node *n;
list *id_l = rel_dependencies(sql->sa, 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
@@ -846,7 +846,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS
int oldstop = c->curprg->def->stop;
if (*opt)
- rel = rel_optimizer(m, rel);
+ rel = rel_optimizer(m, rel, 0);
if ((msg = MSinitClientPrg(c, "user", "test")) != MAL_SUCCEED) {
rel_destroy(rel);
@@ -957,7 +957,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
rel = rel_read(m, *expr, &pos, refs);
stack_pop_frame(m);
if (rel)
- rel = rel_optimizer(m, rel);
+ rel = rel_optimizer(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
@@ -968,7 +968,7 @@ backend_create_sql_func(backend *be, sql
f->sql++;
r = rel_parse(m, f->s, f->query, m_instantiate);
if (r) {
- r = rel_optimizer(m, r);
+ r = rel_optimizer(m, r, 0);
r = rel_distribute(m, r);
r = rel_partition(m, r);
}
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
@@ -2909,7 +2909,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_optimizer(be->mvc, rel);
+ rel = rel_optimizer(be->mvc, rel, 0);
if (p) {
p->p = rel->p;
rel->p = p;
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
@@ -618,7 +618,7 @@ exp_rel(mvc *sql, sql_rel *rel)
if (e == NULL)
return NULL;
/*
- rel = rel_optimizer(sql, rel);
+ rel = rel_optimizer(sql, rel, 0);
rel = rel_distribute(sql, rel);
*/
e->l = rel;
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
@@ -1721,13 +1721,15 @@ rel_push_func_down(int *changes, mvc *sq
* ) [ sql_mul(.., .. NOT
NULL) ]
* )
*/
-
-
-
static sql_rel *
rel_push_count_down(int *changes, mvc *sql, sql_rel *rel)
{
- sql_rel *r = rel->l;
+ sql_rel *r;
+
+ if (!is_groupby(rel->op))
+ return rel;
+
+ r = rel->l;
if (is_groupby(rel->op) && !rel_is_ref(rel) &&
r && !r->exps && r->op == op_join && !(rel_is_ref(r)) &&
@@ -9112,7 +9114,7 @@ rewrite_topdown(mvc *sql, sql_rel *rel,
}
static sql_rel *
-optimize_rel(mvc *sql, sql_rel *rel, int *g_changes, int level)
+optimize_rel(mvc *sql, sql_rel *rel, int *g_changes, int level, int
value_based_opt)
{
int changes = 0, e_changes = 0;
global_props gp;
@@ -9135,7 +9137,8 @@ optimize_rel(mvc *sql, sql_rel *rel, int
rel = rewrite(sql, rel, &rel_merge_projects, &changes);
if (level <= 0) {
rel = rewrite(sql, rel, &rel_case_fixup, &changes);
- rel = rewrite(sql, rel, &rel_simplify_math, &changes);
+ if (value_based_opt)
+ rel = rewrite(sql, rel, &rel_simplify_math,
&changes);
rel = rewrite(sql, rel, &rel_distinct_project2groupby,
&changes);
}
}
@@ -9146,7 +9149,8 @@ optimize_rel(mvc *sql, sql_rel *rel, int
rel = rel_split_project(&changes, sql, rel, 1);
if ((gp.cnt[op_select] || gp.cnt[op_left] || gp.cnt[op_right] ||
gp.cnt[op_full]) && level <= 0)
- rel = rewrite(sql, rel, &rel_simplify_predicates, &changes);
+ if (value_based_opt)
+ rel = rewrite(sql, rel, &rel_simplify_predicates,
&changes);
/* join's/crossproducts between a relation and a constant (row).
* could be rewritten
@@ -9162,8 +9166,10 @@ optimize_rel(mvc *sql, sql_rel *rel, int
gp.cnt[op_semi] || gp.cnt[op_anti] ||
gp.cnt[op_select]) {
rel = rewrite(sql, rel, &rel_find_range, &changes);
- rel = rel_project_reduce_casts(&changes, sql, rel);
- rel = rewrite(sql, rel, &rel_reduce_casts, &changes);
+ if (value_based_opt) {
+ rel = rel_project_reduce_casts(&changes, sql, rel);
+ rel = rewrite(sql, rel, &rel_reduce_casts, &changes);
+ }
}
if (gp.cnt[op_union])
@@ -9322,27 +9328,27 @@ rel_reset_subquery(sql_rel *rel)
}
static sql_rel *
-optimize(mvc *sql, sql_rel *rel)
+optimize(mvc *sql, sql_rel *rel, int value_based_opt)
{
int level = 0, changes = 1;
rel_reset_subquery(rel);
for( ;rel && level < 20 && changes; level++)
- rel = optimize_rel(sql, rel, &changes, level);
+ rel = optimize_rel(sql, rel, &changes, level, value_based_opt);
return rel;
}
sql_rel *
-rel_optimizer(mvc *sql, sql_rel *rel)
-{
- rel = optimize(sql, rel);
+rel_optimizer(mvc *sql, sql_rel *rel, int value_based_opt)
+{
+ rel = optimize(sql, rel, value_based_opt);
if (sql->sqs) {
node *n;
for(n = sql->sqs->h; n; n = n->next) {
sql_subquery *v = n->data;
- v->rel = optimize(sql, v->rel);
+ v->rel = optimize(sql, v->rel, value_based_opt);
}
}
return rel;
diff --git a/sql/server/rel_optimizer.h b/sql/server/rel_optimizer.h
--- a/sql/server/rel_optimizer.h
+++ b/sql/server/rel_optimizer.h
@@ -12,7 +12,7 @@
#include "sql_relation.h"
#include "sql_mvc.h"
-extern sql_rel * rel_optimizer(mvc *sql, sql_rel *rel);
+extern sql_rel * rel_optimizer(mvc *sql, sql_rel *rel, int value_based_opt);
extern int exp_joins_rels(sql_exp *e, list *rels);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2132,6 +2132,10 @@ rel_logical_value_exp(mvc *sql, sql_rel
reset_processed(gp);
r = exp_column(sql->sa,
exp_relname(r), exp_name(r), exp_subtype(r), r->card, has_nil(r), is_intern(r));
left = z;
+ if (!needproj) {
+ needproj = 1;
+ pexps = outer->exps;
+ }
}
z = NULL;
}
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -939,7 +939,7 @@ update_table(mvc *sql, dlist *qname, dli
sym = newSelectNode(sql->sa, 0, selection, NULL,
symbol_create_list(sql->sa, SQL_FROM, from_list), opt_where, NULL, NULL, NULL,
NULL, NULL, NULL, NULL);
sq = rel_selects(sql, sym);
if (sq)
- sq = rel_optimizer(sql, sq);
+ sq = rel_optimizer(sql, sq, 0);
}
#endif
diff --git
a/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-not-in.Bug-6594.stable.err
b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-not-in.Bug-6594.stable.err
new file mode 100644
--- /dev/null
+++
b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-not-in.Bug-6594.stable.err
@@ -0,0 +1,35 @@
+stderr of test 'sqlitelogictest-complex-case-not-in.Bug-6594` in directory
'sql/test/BugTracker-2018` itself:
+
+
+# 11:53:12 >
+# 11:53:12 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=36548" "--set"
"mapi_usock=/var/tmp/mtest-5809/.s.monetdb.36548" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/niels/scratch/rc-old/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2018"
"--set" "embedded_c=true"
+# 11:53:12 >
+
+# builtin opt gdk_dbpath =
/home/niels/scratch/rc-old/Linux-x86_64/var/monetdb5/dbfarm/demo
+# builtin opt gdk_debug = 0
+# builtin opt gdk_vmtrim = no
+# builtin opt monet_prompt = >
+# builtin opt monet_daemon = no
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt mapi_port = 36548
+# cmdline opt mapi_usock = /var/tmp/mtest-5809/.s.monetdb.36548
+# cmdline opt monet_prompt =
+# cmdline opt gdk_dbpath =
/home/niels/scratch/rc-old/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2018
+# cmdline opt embedded_c = true
+# cmdline opt gdk_debug = 553648138
+
+# 11:53:13 >
+# 11:53:13 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-5809" "--port=36548"
+# 11:53:13 >
+
+
+# 11:53:13 >
+# 11:53:13 > "Done."
+# 11:53:13 >
+
diff --git
a/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-not-in.Bug-6594.stable.out
b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-not-in.Bug-6594.stable.out
new file mode 100644
--- /dev/null
+++
b/sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-not-in.Bug-6594.stable.out
@@ -0,0 +1,39 @@
+stdout of test 'sqlitelogictest-complex-case-not-in.Bug-6594` in directory
'sql/test/BugTracker-2018` itself:
+
+
+# 11:53:12 >
+# 11:53:12 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=36548" "--set"
"mapi_usock=/var/tmp/mtest-5809/.s.monetdb.36548" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/niels/scratch/rc-old/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2018"
"--set" "embedded_c=true"
+# 11:53:12 >
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list