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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list