Changeset: bf40ecc3d114 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bf40ecc3d114 Modified Files: sql/server/rel_optimizer.c sql/server/rel_unnest.c sql/test/mergetables/Tests/sqlsmith-exists2.stable.out Branch: Jun2020 Log Message:
Fix for failing sqlsmith test, ie added missing processed flags on newly created projections at rel_unnest and rel_optimizer diffs (256 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 @@ -1776,6 +1776,7 @@ rel_push_count_down(mvc *sql, sql_rel *r exp_label(sql->sa, e, ++sql->label); cnt = exp_ref(sql, e); gbl = rel_groupby(sql, rel_dup(srel), NULL); + set_processed(gbl); rel_groupby_add_aggr(sql, gbl, e); append(args, cnt); } @@ -1788,6 +1789,7 @@ rel_push_count_down(mvc *sql, sql_rel *r exp_label(sql->sa, e, ++sql->label); cnt = exp_ref(sql, e); gbr = rel_groupby(sql, rel_dup(srel), NULL); + set_processed(gbr); rel_groupby_add_aggr(sql, gbr, e); append(args, cnt); } @@ -1800,6 +1802,7 @@ rel_push_count_down(mvc *sql, sql_rel *r rel_destroy(rel); rel = rel_project(sql->sa, cp, append(new_exp_list(sql->sa), nce)); + set_processed(rel); (*changes)++; } @@ -4515,10 +4518,12 @@ gen_push_groupby_down(mvc *sql, sql_rel else cr = j->l = rel_groupby(sql, cr, gbe); cr->exps = list_merge(cr->exps, aggrs, (fdup)NULL); + set_processed(cr); if (!is_project(cl->op)) cl = rel_project(sql->sa, cl, rel_projections(sql, cl, NULL, 1, 1)); cl->exps = list_merge(cl->exps, aliases, (fdup)NULL); + set_processed(cl); if (!left) j->l = cl; else @@ -6249,6 +6254,7 @@ rel_groupby_distinct(mvc *sql, sql_rel * arg->h->data = darg; l = rel->l = rel_groupby(sql, rel->l, gbe); l->exps = exps; + set_processed(l); rel->r = ngbe; rel->exps = nexps; set_nodistinct(distinct); diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -1999,8 +1999,10 @@ rel_union_exps(mvc *sql, sql_exp **l, li if (exp_has_rel(ve)) sq = exp_rel_get_rel(sql->sa, ve); /* get subquery */ - else + else { sq = rel_project(sql->sa, NULL, append(sa_list(sql->sa), ve)); + set_processed(sq); + } if (is_tuple) { /* cast each one */ for (node *m=sq->exps->h, *o = ((list *)(*l)->f)->h; m && o; m = m->next, o = o->next) { r = m->data; @@ -2024,6 +2026,7 @@ rel_union_exps(mvc *sql, sql_exp **l, li if (exp_has_rel(ve)) { ve = exp_rel_update_exp(sql, ve); sq = rel_project(sql->sa, sq, append(sa_list(sql->sa), ve)); + set_processed(sq); } exp_set_freevar(sql, ve, sq); } @@ -2033,6 +2036,7 @@ rel_union_exps(mvc *sql, sql_exp **l, li } else { u = rel_setop(sql->sa, u, sq, op_union); rel_set_exps(u, exps); + set_processed(u); } exps = rel_projections(sql, sq, NULL, 1/*keep names */, 1); } @@ -2142,6 +2146,7 @@ rewrite_anyequal(mvc *sql, sql_rel *rel, } else if (has_label(re)) { re = exp_ref(sql, re); } + set_processed(rsq); } if (is_project(rel->op) || (is_select(rel->op) && (depth > 0 || (!is_tuple && rsq && rel_has_freevar(sql, rsq) && !is_anyequal(sf))))) { @@ -2216,6 +2221,7 @@ rewrite_anyequal(mvc *sql, sql_rel *rel, le = rel_groupby_add_aggr(sql, lsq, a); if (exp_name(e)) exp_prop_alias(sql->sa, le, e); + set_processed(lsq); return le; } else { if (lsq) @@ -2342,6 +2348,7 @@ rewrite_compare(mvc *sql, sql_rel *rel, list_hash_clear(rsq->exps); re = exp_ref(sql, re); } + set_processed(rsq); } int is_cnt = 0; @@ -2377,6 +2384,7 @@ rewrite_compare(mvc *sql, sql_rel *rel, } re = exp_aggr1(sql->sa, re, a, 0, 1, CARD_AGGR, has_nil(re)); re = rel_groupby_add_aggr(sql, rsq, re); + set_processed(rsq); } else if (rsq && exp_card(re) > CARD_ATOM) { sql_subfunc *zero_or_one = sql_bind_func(sql->sa, NULL, compare_aggr_op(op, quantifier), exp_subtype(re), NULL, F_AGGR); @@ -2384,6 +2392,7 @@ rewrite_compare(mvc *sql, sql_rel *rel, re = exp_aggr1(sql->sa, re, zero_or_one, 0, 0, CARD_AGGR, has_nil(re)); re = rel_groupby_add_aggr(sql, rsq, re); + set_processed(rsq); } if (rsq) (void)rewrite_inner(sql, rel, rsq, is_cnt?op_left:op_join); @@ -2607,6 +2616,7 @@ rewrite_exists(mvc *sql, sql_rel *rel, s return NULL; if (exp_name(e)) exp_prop_alias(sql->sa, le, e); + set_processed(sq); } else { /* rewrite into semi/anti join */ (void)rewrite_inner(sql, rel, sq, is_exists(sf)?op_semi:op_anti); return exp_atom_bool(sql->sa, 1); @@ -2631,6 +2641,7 @@ rewrite_ifthenelse(mvc *sql, sql_rel *re sql_rel *r = rel->l = rel_project(sql->sa, rel->l, rel_projections(sql, rel->l, NULL, 1, 1)); e->ref = 0; + set_processed(r); append(r->exps, e); return exp_ref(sql, e); } @@ -2671,6 +2682,7 @@ rewrite_ifthenelse(mvc *sql, sql_rel *re } lsq = rel_project(sql->sa, lsq, append(sa_list(sql->sa), then_exp)); exp_set_freevar(sql, cond, lsq); + set_processed(lsq); lsq = rel_select(sql->sa, lsq, cond); if (exp_has_rel(else_exp)) { exp_set_freevar(sql, else_exp, rsq); @@ -2684,11 +2696,13 @@ rewrite_ifthenelse(mvc *sql, sql_rel *re cond = exp_copy(sql, cond); exp_set_freevar(sql, cond, rsq); cond = rel_unop_(sql, rsq, cond, NULL, "not", card_value); + set_processed(rsq); rsq = rel_select(sql->sa, rsq, cond); usq = rel_setop(sql->sa, lsq, rsq, op_union); rel_set_exps(usq, append(sa_list(sql->sa), exp_ref(sql, e))); if (single) set_single(usq); + set_processed(usq); e = exp_rel(sql, usq); } else if (!e->used && (has_nil(cond) || (inner && is_outerjoin(inner->op))) && (cond->type != e_func || !is_isnull_func(nf))) { @@ -2751,6 +2765,7 @@ rewrite_remove_xp_project(mvc *sql, sql_ if (is_atom(t->type) && !exp_name(t)) { /* atom with out alias cannot be used later */ rel = rel_project(sql->sa, rel->l, rel_projections(sql, rel->l, NULL, 1, 1)); list_merge(rel->exps, r->exps, (fdup)NULL); + set_processed(rel); (*changes)++; } } @@ -2819,6 +2834,7 @@ rewrite_fix_count(mvc *sql, sql_rel *rel if (rel_changes) { /* add project */ exps = list_merge(rel_projections(sql, rel->l, NULL, 1, 1), rexps, (fdup)NULL); rel = rel_project(sql->sa, rel, exps); + set_processed(rel); r->used = 1; (*changes)++; } @@ -2902,7 +2918,9 @@ rewrite_groupings(mvc *sql, sql_rel *rel append(pexps, ne); } nrel->exps = exps; + set_processed(nrel); nrel = rel_project(sql->sa, nrel, pexps); + set_processed(nrel); if (!unions) unions = nrel; @@ -2947,8 +2965,11 @@ rewrite_groupings(mvc *sql, sql_rel *rel append(pexps, ne); } nrel->exps = exps; + set_processed(nrel); (*changes)++; - return rel_project(sql->sa, nrel, pexps); + nrel = rel_project(sql->sa, nrel, pexps); + set_processed(nrel); + return nrel; } } } @@ -3071,6 +3092,7 @@ rewrite_values(mvc *sql, sql_rel *rel, i list *vals = exp_get_values(e); for(int i = 0; i<list_length(vals); i++) { sql_rel *nrel = rel_project(sql->sa, NULL, sa_list(sql->sa)); + set_processed(nrel); for(node *n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; if (i == 0) @@ -3083,6 +3105,7 @@ rewrite_values(mvc *sql, sql_rel *rel, i if (cur) { nrel = rel_setop(sql->sa, cur, nrel, op_union); rel_set_exps(nrel, exps); + set_processed(nrel); } cur = nrel; } diff --git a/sql/test/mergetables/Tests/sqlsmith-exists2.stable.out b/sql/test/mergetables/Tests/sqlsmith-exists2.stable.out --- a/sql/test/mergetables/Tests/sqlsmith-exists2.stable.out +++ b/sql/test/mergetables/Tests/sqlsmith-exists2.stable.out @@ -400,6 +400,40 @@ stdout of test 'sqlsmith-exists2` in dir % c0, c1 # name % int, int # type % 1, 1 # length +#select +# subq_0.c3 as c0, +# subq_0.c4 as c1, +# subq_0.c2 as c2, +# subq_0.c1 as c3, +# subq_0.c2 as c4 +#from +# (select +# ref_0.col0 as c0, +# ref_0.col0 as c1, +# ref_0.col0 as c2, +# ref_0.col1 as c3, +# ref_0.col2 as c4 +# from +# tab1 as ref_0 +# where true +# limit 48) as subq_0 +#where (case when exists ( +# select +# subq_0.c1 as c0, +# ref_1.col5 as c1, +# ref_1.col7 as c2, +# ref_1.col5 as c3, +# subq_0.c3 as c4, +# subq_0.c1 as c5 +# from +# longtable as ref_1 +# where (true) +# or ((ref_1.col1 is null) +# and (true))) then subq_0.c1 else subq_0.c1 end +% ., ., ., ., . # table_name +% c0, c1, c2, c3, c4 # name +% int, int, int, int, int # type +% 1, 1, 1, 1, 1 # length #ROLLBACK; # 22:12:15 > _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list