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

Reply via email to