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