Changeset: 1d48bbe3e8dc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1d48bbe3e8dc
Added Files:
        
sql/test/BugTracker-2017/Tests/sqlitelogictest-select-in.Bug-6433.stable.err
        
sql/test/BugTracker-2017/Tests/sqlitelogictest-select-in.Bug-6433.stable.out
        sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6432.sql
        sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6432.stable.err
        sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6432.stable.out
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/storage/bat/bat_storage.c
        
sql/test/BugTracker-2009/Tests/use_order_column_first.SF-2686008.stable.out
        sql/test/BugTracker-2017/Tests/All
Branch: Jul2017
Log Message:

fixed bug 6432, make sure all finished projects are set_processed
fixed bug 6433, incremented the allowed number of calls to _rel_optimize


diffs (truncated from 612 to 300 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
@@ -1306,9 +1306,10 @@ static sql_exp *
                }
                if (!ne && !e->l)
                        ne = rel_bind_column(sql, f, e->r, 0);
-               if (!ne)
+               if (!ne || ne->type != e_column)
                        return NULL;
                e = NULL;
+               /*
                if (ne->name && ne->rname)
                        e = rel_bind_column2(sql, t, ne->rname, ne->name, 0);
                if (!e && ne->name && !ne->rname)
@@ -1317,6 +1318,11 @@ static sql_exp *
                        e = rel_bind_column2(sql, t, ne->l, ne->r, 0);
                if (!e && ne->r && !ne->l)
                        e = rel_bind_column(sql, t, ne->r, 0);
+                       */
+               if (ne->l && ne->r)
+                       e = rel_bind_column2(sql, t, ne->l, ne->r, 0);
+               if (!e && ne->r && !ne->l)
+                       e = rel_bind_column(sql, t, ne->r, 0);
                sql->session->status = 0;
                sql->errstr[0] = 0;
                if (e && flag)
@@ -1327,10 +1333,13 @@ static sql_exp *
                return e;
        case e_cmp: 
                if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) {
-                       list *l = exps_push_down(sql, e->l, f, t);
-                       list *r = exps_push_down(sql, e->r, f, t);
-
-                       if (!l || !r) 
+                       list *l, *r;
+
+                       l = exps_push_down(sql, e->l, f, t);
+                       if (!l)
+                               return NULL;
+                       r = exps_push_down(sql, e->r, f, t);
+                       if (!r) 
                                return NULL;
                        if (get_cmp(e) == cmp_filter) 
                                return exp_filter(sql->sa, l, r, e->f, 
is_anti(e));
@@ -1339,13 +1348,19 @@ static sql_exp *
                        list *r;
 
                        l = _exp_push_down(sql, e->l, f, t);
+                       if (!l)
+                               return NULL;
                        r = exps_push_down(sql, e->r, f, t);
-                       if (!l || !r)
+                       if (!r)
                                return NULL;
                        return exp_in(sql->sa, l, r, e->flag);
                } else {
                        l = _exp_push_down(sql, e->l, f, t);
+                       if (!l)
+                               return NULL;
                        r = _exp_push_down(sql, e->r, f, t);
+                       if (!r)
+                               return NULL;
                        if (e->f) {
                                r2 = _exp_push_down(sql, e->f, f, t);
                                if (l && r && r2)
@@ -8866,7 +8881,7 @@ rewrite_topdown(mvc *sql, sql_rel *rel, 
 }
 
 static sql_rel *
-_rel_optimizer(mvc *sql, sql_rel *rel, int level) 
+_rel_optimizer(mvc *sql, sql_rel *rel, int *g_changes, int level) 
 {
        int changes = 0, e_changes = 0;
        global_props gp; 
@@ -9026,20 +9041,16 @@ static sql_rel *
        rel = rewrite_topdown(sql, rel, &rel_merge_table_rewrite, &changes);
        if (level <= 0 && mvc_debug_on(sql,8))
                rel = rewrite_topdown(sql, rel, &rel_add_dicts, &changes);
-
-       if (changes && level > 10) {
-               assert(0);
-               return rel;
-       }
-
-       if (changes || level == 0)
-               return _rel_optimizer(sql, rel, ++level);
-
+       *g_changes = changes;
        return rel;
 }
 
 sql_rel *
 rel_optimizer(mvc *sql, sql_rel *rel) 
 {
-       return _rel_optimizer(sql, rel, 0);
-}
+       int level = 0, changes = 1;
+
+       for( ;rel && level < 20 && changes; level++) 
+               rel = _rel_optimizer(sql, rel, &changes, level);
+       return rel;
+}
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -794,6 +794,8 @@ rel_project(sql_allocator *sa, sql_rel *
                rel->card = l->card;
                rel->nrcols = l->nrcols;
        }
+       if (e && !list_empty(e))
+               set_processed(rel);
        return rel;
 }
 
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
@@ -106,7 +106,6 @@ rel_project_exp(sql_allocator *sa, sql_e
 {
        sql_rel *rel = rel_project(sa, NULL, append(new_exp_list(sa), e));
 
-       set_processed(rel);
        return rel;
 }
 
@@ -172,7 +171,9 @@ rel_project2groupby(mvc *sql, sql_rel *g
                                }
                        }
                }
-               return rel_project(sql->sa, g, rel_projections(sql, g, NULL, 1, 
1));
+               g = rel_project(sql->sa, g, rel_projections(sql, g, NULL, 1, 
1));
+               reset_processed(g);
+               return g;
        }
        return NULL;
 }
@@ -729,7 +730,6 @@ rel_named_table_operator(mvc *sql, sql_r
                        dnode *n = column_spec->h;
 
                        sq = rel_project(sql->sa, sq, rel_projections(sql, sq, 
NULL, 1, 1));
-                       set_processed(sq);
                        for (en = sq->exps->h; n && en; n = n->next, en = 
en->next) 
                                exp_setname(sql->sa, en->data, tname, 
n->data.sval );
                }
@@ -823,7 +823,6 @@ rel_values( mvc *sql, symbol *tableref)
                vals->f = nexps;
        }
        r = rel_project(sql->sa, NULL, exps);
-       set_processed(r);
        rel_table_optname(sql, r, optname);
        return r;
 }
@@ -893,7 +892,6 @@ table_ref(mvc *sql, sql_rel *rel, symbol
                        list *exps = rel_projections(sql, temp_table, NULL, 1, 
1);
 
                        temp_table = rel_project(sql->sa, temp_table, exps);
-                       set_processed(temp_table);
                        for (n = exps->h; n; n = n->next)
                                noninternexp_setname(sql->sa, n->data, tname, 
NULL);
                        return temp_table;
@@ -2012,7 +2010,6 @@ rel_logical_value_exp(mvc *sql, sql_rel 
                                        if (!l->processed) { /* add all 
expressions to the project */
                                                l->exps = list_merge(l->exps, 
rel_projections(sql, l->l, NULL, 1, 1), (fdup)NULL);
                                                l->exps = 
list_distinct(l->exps, (fcmp)exp_equal, (fdup)NULL);
-                                               set_processed(l);
                                        }
                                        if (!rel_find_exp(l, ls))
                                                rel_project_add_exp(sql, l, ls);
@@ -2137,9 +2134,10 @@ rel_logical_value_exp(mvc *sql, sql_rel 
                        set_processed(left);
                        e = exp_compare(sql->sa, l, r, cmp_equal );
                        rel_join_add_exp(sql->sa, left, e);
-                       if (*rel && needproj)
+                       if (*rel && needproj) {
                                left = *rel = rel_project(sql->sa, left, pexps);
-                       else
+                               reset_processed(left);
+                       } else
                                *rel = left;
                        if (sc->token == SQL_NOT_IN)
                                e = rel_binop_(sql, l, r, NULL, "<>", 
card_value);
@@ -2632,8 +2630,10 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                                rel_select_add_exp(sql->sa, select, e);
                                if (l_is_value && sc->token == SQL_NOT_IN) 
                                        set_anti(e);
-                               if (pexps && !right) 
+                               if (pexps && !right) {
                                        rel = rel_project(sql->sa, rel, pexps);
+                                       reset_processed(rel);
+                               }
                                if (!right)
                                        return rel;
                        }
@@ -2674,9 +2674,8 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                                rel->op = op_anti;
                                set_processed(rel);
                        }
-                       if (pexps)
+                       if (pexps) 
                                rel = rel_project(sql->sa, rel, pexps);
-                       set_processed(rel);
                        return rel;
                }
                return right;
@@ -4108,7 +4107,6 @@ rel_order_by_column_exp(mvc *sql, sql_re
        if (!is_project(r->op) || is_set(r->op)) {
                r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 
1));
                (*R)->l = r;
-               set_processed(r);
        }
 
        if (!e) {
@@ -4130,7 +4128,6 @@ rel_order_by_column_exp(mvc *sql, sql_re
                        sql->session->status = 0;
                        sql->errstr[0] = '\0';
 
-                       set_processed(nr);
                        e = rel_value_exp(sql, &nr, column_r, sql_sel, ek);
                        if (e) {
                                /* first rewrite e back into current column 
names */
@@ -4303,6 +4300,7 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
        /* window operations are only allowed in the projection */
        if (r && r->op != op_project) {
                *rel = r = rel_project(sql->sa, r, rel_projections(sql, r, 
NULL, 1, 1));
+               reset_processed(r);
                project_added = 1;
        }
        if (f != sql_sel || !r || r->op != op_project || is_processed(r))
@@ -4310,6 +4308,7 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
 
        p = r->l;
        p = rel_project(sql->sa, p, rel_projections(sql, p, NULL, 1, 1));
+       reset_processed(p);
 
        /* Partition By */
        if (window_specification->h->data.sym) {
@@ -4422,7 +4421,6 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
        e = exp_op(sql->sa, args, wf);
 
        r->l = p = rel_project(sql->sa, p, rel_projections(sql, p, NULL, 1, 1));
-       set_processed(p);
        append(p->exps, e);
        e = rel_lastexp(sql, p);
        if (project_added) {
@@ -4722,9 +4720,10 @@ rel_simple_select(mvc *sql, sql_rel *rel
                if (ce && exp_subtype(ce)) {
                        /* new relational, we need to rewrite */
                        if (!is_project(inner->op)) {
-                               if (inner != o_inner && pre_prj) 
+                               if (inner != o_inner && pre_prj) {
                                        inner = rel_project(sql->sa, inner, 
pre_prj);
-                               else
+                                       reset_processed(inner);
+                               } else
                                        inner = rel_project(sql->sa, inner, 
new_exp_list(sql->sa));
                        }
                        rel_project_add_exp(sql, inner, ce);
@@ -4797,7 +4796,6 @@ join_on_column_name(mvc *sql, sql_rel *r
                append(outexps, re);
        }
        rel = rel_project(sql->sa, rel, outexps);
-       set_processed(rel);
        return rel;
 }
 
@@ -4903,9 +4901,10 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
                           around this inner relation.
                        */
                        if (!is_project(inner->op)) {
-                               if (inner != o_inner && pre_prj) 
+                               if (inner != o_inner && pre_prj) {
                                        inner = rel_project(sql->sa, inner, 
pre_prj);
-                               else
+                                       reset_processed(inner);
+                               } else
                                        inner = rel_project(sql->sa, inner, 
new_exp_list(sql->sa));
                        }
                        rel_project_add_exp(sql, inner, ce);
@@ -5194,7 +5193,6 @@ rel_setquery(mvc *sql, sql_rel *rel, sym
                sql_rel *r = rel;
 
                r = rel_project( sql->sa, rel, rel_projections(sql, rel, NULL, 
1, 1));
-               set_processed(r);
                used = 1;
 
                /* reset error */
@@ -5211,7 +5209,6 @@ rel_setquery(mvc *sql, sql_rel *rel, sym
                if (used)
                        rel = rel_dup(rel);
                r = rel_project( sql->sa, rel, rel_projections(sql, rel, NULL, 
1, 1));
-               set_processed(r);
 
                /* reset error */
                sql->session->status = 0;
@@ -5476,8 +5473,6 @@ rel_unionjoinquery(mvc *sql, sql_rel *re
        }
        lv = rel_project(sql->sa, lv, lexps);
        rv = rel_project(sql->sa, rv, rexps);
-       set_processed(lv);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to