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