Changeset: c93172648b05 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c93172648b05
Modified Files:
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_optimizer.c
        sql/server/rel_planner.c
        sql/server/rel_unnest.c
        sql/server/rel_updates.c
        sql/test/SQLancer/Tests/sqlancer22.test
Branch: default
Log Message:

Set joins as processed in the places where they are known so. It fixes the next 
sqlancer crash


diffs (truncated from 438 to 300 lines):

diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -2124,6 +2124,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                                return NULL;
                        rel = rel_crossproduct(sql->sa, lrel, rrel, j);
                        rel->exps = exps;
+                       set_processed(rel);
                }
                break;
        case 'l':
@@ -2180,6 +2181,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                        return NULL;
                rel = rel_crossproduct(sql->sa, lrel, rrel, j);
                rel->exps = exps;
+               set_processed(rel);
                break;
        case 'u':
                if (j == op_basetable) {
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
@@ -2077,7 +2077,12 @@ exps_rel_get_rel(sql_allocator *sa, list
                if (exp_has_rel(e)) {
                        if (!(r = exp_rel_get_rel(sa, e)))
                                return NULL;
-                       xp = xp ? rel_crossproduct(sa, xp, r, op_full) : r;
+                       if (xp) {
+                               xp = rel_crossproduct(sa, xp, r, op_full);
+                               set_processed(xp);
+                       } else {
+                               xp = r;
+                       }
                }
        }
        return xp;
@@ -2125,7 +2130,12 @@ exp_rel_get_rel(sql_allocator *sa, sql_e
                        if (exps_have_rel_exp(e->r)) {
                                if (!(r = exps_rel_get_rel(sa, e->r)))
                                        return NULL;
-                               xp = xp ? rel_crossproduct(sa, xp, r, op_join) 
: r;
+                               if (xp) {
+                                       xp = rel_crossproduct(sa, xp, r, 
op_join);
+                                       set_processed(xp);
+                               } else {
+                                       xp = r;
+                               }
                        }
                } else if (e->flag == cmp_in || e->flag == cmp_notin) {
                        if (exp_has_rel(e->l))
@@ -2133,7 +2143,12 @@ exp_rel_get_rel(sql_allocator *sa, sql_e
                        if (exps_have_rel_exp(e->r)) {
                                if (!(r = exps_rel_get_rel(sa, e->r)))
                                        return NULL;
-                               xp = xp ? rel_crossproduct(sa, xp, r, op_join) 
: r;
+                               if (xp) {
+                                       xp = rel_crossproduct(sa, xp, r, 
op_join);
+                                       set_processed(xp);
+                               } else {
+                                       xp = r;
+                               }
                        }
                } else {
                        if (exp_has_rel(e->l))
@@ -2141,12 +2156,22 @@ exp_rel_get_rel(sql_allocator *sa, sql_e
                        if (exp_has_rel(e->r)) {
                                if (!(r = exp_rel_get_rel(sa, e->r)))
                                        return NULL;
-                               xp = xp ? rel_crossproduct(sa, xp, r, op_join) 
: r;
+                               if (xp) {
+                                       xp = rel_crossproduct(sa, xp, r, 
op_join);
+                                       set_processed(xp);
+                               } else {
+                                       xp = r;
+                               }
                        }
                        if (e->f && exp_has_rel(e->f)) {
                                if (!(r = exp_rel_get_rel(sa, e->f)))
                                        return NULL;
-                               xp = xp ? rel_crossproduct(sa, xp, r, op_join) 
: r;
+                               if (xp) {
+                                       xp = rel_crossproduct(sa, xp, r, 
op_join);
+                                       set_processed(xp);
+                               } else {
+                                       xp = r;
+                               }
                        }
                }
                return xp;
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
@@ -665,6 +665,7 @@ order_joins(visitor *v, list *rels, list
                top = rel_crossproduct(v->sql->sa, l, r, op_join);
                if (rsingle)
                        set_single(r);
+               set_processed(top);
                rel_join_add_exp(v->sql->sa, top, cje);
 
                /* all other join expressions on these 2 relations */
@@ -734,6 +735,7 @@ order_joins(visitor *v, list *rels, list
                                top = rel_crossproduct(v->sql->sa, top, r, 
op_join);
                                if (rsingle)
                                        set_single(r);
+                               set_processed(top);
                                rel_join_add_exp(v->sql->sa, top, cje);
 
                                /* all join expressions on these tables */
@@ -770,6 +772,7 @@ order_joins(visitor *v, list *rels, list
                                top = rel_crossproduct(v->sql->sa, top, nr, 
op_join);
                                if (rsingle)
                                        set_single(nr);
+                               set_processed(top);
                        } else
                                top = nr;
                }
@@ -873,6 +876,7 @@ push_in_join_down(mvc *sql, list *rels, 
                                        sql_rel *nr = rel_crossproduct(sql->sa, 
l, r, op_join);
                                        if (rsingle)
                                                set_single(r);
+                                       set_processed(nr);
                                        rel_join_add_exp(sql->sa, nr, je);
                                        list_append(rels, nr);
                                        list_remove_data(rels, NULL, l);
@@ -1393,6 +1397,7 @@ rel_push_count_down(visitor *v, sql_rel 
                }
 
                cp = rel_crossproduct(v->sql->sa, gbl, gbr, op_join);
+               set_processed(cp);
 
                if (!(nce = rel_binop_(v->sql, NULL, cnt1, cnt2, "sys", 
"sql_mul", card_value))) {
                        v->sql->session->status = 0;
@@ -4690,6 +4695,7 @@ rel_push_join_down(visitor *v, sql_rel *
                        /* push join's left side (as semijoin) down group by */
                        l = gb->l = rel_crossproduct(v->sql->sa, gb->l, l, 
op_semi);
                        l->exps = jes;
+                       set_processed(l);
                        v->changes++;
                        return rel;
                }
@@ -4821,11 +4827,13 @@ rel_push_semijoin_down_or_up(visitor *v,
                else
                        l = rel_crossproduct(v->sql->sa, rel_dup(lr), 
rel_dup(r), op);
                l->exps = nsexps;
+               set_processed(l);
                if (left)
                        l = rel_crossproduct(v->sql->sa, l, rel_dup(lr), lop);
                else
                        l = rel_crossproduct(v->sql->sa, rel_dup(ll), l, lop);
                l->exps = njexps;
+               set_processed(l);
                rel_destroy(rel);
                rel = l;
                if (level <= 0)
@@ -4938,6 +4946,8 @@ rel_push_join_down_union(visitor *v, sql
                        nr = rel_crossproduct(v->sql->sa, lr, rel_dup(or), 
rel->op);
                        nl->exps = exps_copy(v->sql, exps);
                        nr->exps = exps_copy(v->sql, exps);
+                       set_processed(nl);
+                       set_processed(nr);
                        nl = rel_project(v->sql->sa, nl, 
rel_projections(v->sql, nl, NULL, 1, 1));
                        nr = rel_project(v->sql->sa, nr, 
rel_projections(v->sql, nr, NULL, 1, 1));
                        v->changes++;
@@ -4981,6 +4991,8 @@ rel_push_join_down_union(visitor *v, sql
                        nr = rel_crossproduct(v->sql->sa, lr, rr, rel->op);
                        nl->exps = exps_copy(v->sql, exps);
                        nr->exps = exps_copy(v->sql, exps);
+                       set_processed(nl);
+                       set_processed(nr);
                        nl = rel_project(v->sql->sa, nl, 
rel_projections(v->sql, nl, NULL, 1, 1));
                        nr = rel_project(v->sql->sa, nr, 
rel_projections(v->sql, nr, NULL, 1, 1));
                        v->changes++;
@@ -5010,6 +5022,8 @@ rel_push_join_down_union(visitor *v, sql
                        nr = rel_crossproduct(v->sql->sa, rel_dup(ol), rr, 
rel->op);
                        nl->exps = exps_copy(v->sql, exps);
                        nr->exps = exps_copy(v->sql, exps);
+                       set_processed(nl);
+                       set_processed(nr);
                        nl = rel_project(v->sql->sa, nl, 
rel_projections(v->sql, nl, NULL, 1, 1));
                        nr = rel_project(v->sql->sa, nr, 
rel_projections(v->sql, nr, NULL, 1, 1));
                        v->changes++;
@@ -5055,6 +5069,7 @@ rel_push_join_down_union(visitor *v, sql
                                }
                                nl = rel_crossproduct(v->sql->sa, rel_dup(ol), 
rl, rel->op);
                                nl->exps = exps_copy(v->sql, exps);
+                               set_processed(nl);
                                v->changes++;
                                return rel_inplace_project(v->sql->sa, rel, nl, 
rel_projections(v->sql, rel, NULL, 1, 1));
                        /* case 2: uses right not left */
@@ -5073,6 +5088,7 @@ rel_push_join_down_union(visitor *v, sql
                                }
                                nl = rel_crossproduct(v->sql->sa, rel_dup(ol), 
rr, rel->op);
                                nl->exps = exps_copy(v->sql, exps);
+                               set_processed(nl);
                                v->changes++;
                                return rel_inplace_project(v->sql->sa, rel, nl, 
rel_projections(v->sql, rel, NULL, 1, 1));
                        }
@@ -5110,6 +5126,7 @@ rel_push_join_down_outer(visitor *v, sql
                        sql_rel *nl = rel_crossproduct(v->sql->sa, rel_dup(l), 
rl, rel->op);
                        r->l = nl;
                        nl->exps = njexps;
+                       set_processed(nl);
                        rel_dup(r);
                        rel_destroy(rel);
                        rel = r;
@@ -8477,6 +8494,7 @@ rel_rewrite_antijoin(visitor *v, sql_rel
 
                nl = rel_crossproduct(v->sql->sa, rel->l, rl, op_anti);
                nl->exps = exps_copy(v->sql, rel->exps);
+               set_processed(nl);
                rel->l = nl;
                rel->r = rr;
                rel_destroy(r);
@@ -8564,6 +8582,8 @@ rel_split_outerjoin(visitor *v, sql_rel 
                e = rel->exps->h->data;
                nll->exps = exps_copy(v->sql, e->l);
                nlr->exps = exps_copy(v->sql, e->r);
+               set_processed(nll);
+               set_processed(nlr);
                if (!(nl = rel_or( v->sql, NULL, nll, nlr, NULL, NULL, NULL)))
                        return NULL;
 
@@ -8571,8 +8591,10 @@ rel_split_outerjoin(visitor *v, sql_rel 
                        /* split in 2 anti joins */
                        nr = rel_crossproduct(v->sql->sa, rel_dup(l), 
rel_dup(r), op_anti);
                        nr->exps = exps_copy(v->sql, e->l);
+                       set_processed(nr);
                        nr = rel_crossproduct(v->sql->sa, nr, rel_dup(r), 
op_anti);
                        nr->exps = exps_copy(v->sql, e->r);
+                       set_processed(nr);
 
                        /* project left */
                        nr = rel_project(v->sql->sa, nr,
@@ -8588,8 +8610,10 @@ rel_split_outerjoin(visitor *v, sql_rel 
                        /* split in 2 anti joins */
                        nr = rel_crossproduct(v->sql->sa, rel_dup(r), 
rel_dup(l), op_anti);
                        nr->exps = exps_copy(v->sql, e->l);
+                       set_processed(nr);
                        nr = rel_crossproduct(v->sql->sa, nr, rel_dup(l), 
op_anti);
                        nr->exps = exps_copy(v->sql, e->r);
+                       set_processed(nr);
 
                        nr = rel_project(v->sql->sa, nr, sa_list(v->sql->sa));
                        /* add null's for left */
diff --git a/sql/server/rel_planner.c b/sql/server/rel_planner.c
--- a/sql/server/rel_planner.c
+++ b/sql/server/rel_planner.c
@@ -921,6 +921,7 @@ memo_select_plan( mvc *sql, list *memo, 
                                list_remove_data(exps, NULL, e);
                        }
                }
+               set_processed(top);
                return top;
        } else {
                return mi->data;
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
@@ -769,6 +769,7 @@ rel_general_unnest(mvc *sql, sql_rel *re
                r->op = op_join;
                move_join_exps(sql, rel, r);
                set_dependent(r);
+               set_processed(r);
                inner_r = r;
 
                r = rel_project(sql->sa, r, 
(is_semi(inner_r->op))?sa_list(sql->sa):rel_projections(sql, r->r, NULL, 1, 1));
@@ -1323,6 +1324,7 @@ push_up_join(mvc *sql, sql_rel *rel, lis
                                nj = rel_crossproduct(sql->sa, rel_dup(d), 
rel_dup(jr), j->op);
                                if (is_single(j))
                                        set_single(nj);
+                               set_processed(nj);
                                rel_destroy(j);
                                j = nj;
                                set_dependent(j);
@@ -1357,6 +1359,7 @@ push_up_join(mvc *sql, sql_rel *rel, lis
                                        append(n->exps, je);
                                }
                                n->attr = attr;
+                               set_processed(n);
                                return n;
                        }
 
@@ -1367,6 +1370,7 @@ push_up_join(mvc *sql, sql_rel *rel, lis
                                        set_single(nj);
                                nj->exps = exps_copy(sql, j->exps);
                                nj->attr = j->attr;
+                               set_processed(nj);
                                rel_destroy(j);
                                j = nj;
                                if (is_semi(rel->op)) {
@@ -1383,6 +1387,7 @@ push_up_join(mvc *sql, sql_rel *rel, lis
                                        set_single(nj);
                                nj->exps = exps_copy(sql, j->exps);
                                nj->attr = j->attr;
+                               set_processed(nj);
                                rel_destroy(j);
                                j = nj;
                                if (is_semi(rel->op)) {
@@ -1420,6 +1425,7 @@ push_up_set(mvc *sql, sql_rel *rel, list
                        n = rel_crossproduct(sql->sa, rel_dup(d), sr, rel->op);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to