Changeset: 5d454d2623a0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5d454d2623a0 Removed Files: sql/test/SQLancer/Tests/sqlancer02.sql Modified Files: sql/include/sql_relation.h sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_unnest.c sql/server/rel_updates.c sql/test/SQLancer/Tests/sqlancer02.test sql/test/merge-partitions/Tests/mergepart31.test Branch: default Log Message:
Merged with Oct2020 and converted tests diffs (truncated from 645 to 300 lines): diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -197,7 +197,6 @@ typedef enum operator_type { #define is_simple_project(op) (op == op_project) #define is_project(op) (op == op_project || op == op_groupby || is_set(op)) #define is_groupby(op) (op == op_groupby) -#define is_sort(rel) (((rel)->op == op_project && (rel)->r) || (rel)->op == op_topn) #define is_topn(op) (op == op_topn) #define is_modify(op) (op == op_insert || op == op_update || op == op_delete || op == op_truncate) #define is_sample(op) (op == op_sample) 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 @@ -2077,6 +2077,7 @@ rel_push_topn_and_sample_down(visitor *v ur = func(v->sql->sa, ur, sum_limit_offset(v->sql, rel)); u = rel_setop(v->sql->sa, ul, ur, op_union); + /* TODO the list of expressions of u don't match ul and ur */ u->exps = exps_alias(v->sql, r->exps); u->nrcols = list_length(u->exps); set_processed(u); @@ -4100,7 +4101,7 @@ rel_push_aggr_down(visitor *v, sql_rel * sql_table *mt = (bt)?bt->r:NULL; if (c && mt && list_find(c->t->pkey->k.columns, c, cmp) != NULL) { v->changes++; - return rel_inplace_setop(rel, ul, ur, op_union, + return rel_inplace_setop(v->sql, rel, ul, ur, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); } } @@ -5058,7 +5059,7 @@ rel_push_join_down_union(visitor *v, sql 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++; - return rel_inplace_setop(rel, nl, nr, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); + return rel_inplace_setop(v->sql, rel, nl, nr, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); } else if (is_union(l->op) && !need_distinct(l) && is_union(r->op) && !need_distinct(r)) { sql_rel *nl, *nr; @@ -5101,7 +5102,7 @@ rel_push_join_down_union(visitor *v, sql 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++; - return rel_inplace_setop(rel, nl, nr, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); + return rel_inplace_setop(v->sql, rel, nl, nr, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); } else if (!is_union(l->op) && is_union(r->op) && !need_distinct(r) && !is_semi(rel->op)) { @@ -5130,7 +5131,7 @@ rel_push_join_down_union(visitor *v, sql 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++; - return rel_inplace_setop(rel, nl, nr, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); + return rel_inplace_setop(v->sql, rel, nl, nr, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); /* {semi}join ( A1, union (A2, B)) [A1.partkey = A2.partkey] -> * {semi}join ( A1, A2 ) * and @@ -5460,7 +5461,7 @@ rel_push_select_down_union(visitor *v, s ul->exps = exps_copy(v->sql, s->exps); ur->exps = exps_copy(v->sql, s->exps); - rel = rel_inplace_setop(rel, ul, ur, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); + rel = rel_inplace_setop(v->sql, rel, ul, ur, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); v->changes++; return rel; } @@ -5589,7 +5590,7 @@ rel_push_project_down_union(visitor *v, ul->exps = exps_copy(v->sql, p->exps); ur->exps = exps_copy(v->sql, p->exps); - rel = rel_inplace_setop(rel, ul, ur, op_union, + rel = rel_inplace_setop(v->sql, rel, ul, ur, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); if (need_distinct) set_distinct(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 @@ -378,6 +378,9 @@ rel_bind_column2( mvc *sql, sql_rel *rel if ((is_simple_project(rel->op) || is_groupby(rel->op)) && rel->l) { if (!is_processed(rel)) return rel_bind_column2(sql, rel->l, tname, cname, f); + } else if (is_set(rel->op)) { + assert(is_processed(rel)); + return NULL; } else if (is_join(rel->op)) { sql_exp *e = rel_bind_column2(sql, rel->l, tname, cname, f); @@ -389,9 +392,7 @@ rel_bind_column2( mvc *sql, sql_rel *rel set_has_nil(e); } return e; - } else if (is_set(rel->op) || - is_sort(rel) || - is_semi(rel->op) || + } else if (is_semi(rel->op) || is_select(rel->op) || is_topn(rel->op) || is_sample(rel->op)) { @@ -416,18 +417,15 @@ rel_first_column(mvc *sql, sql_rel *r) } sql_rel * -rel_inplace_setop(sql_rel *rel, sql_rel *l, sql_rel *r, operator_type setop, list *exps) +rel_inplace_setop(mvc *sql, sql_rel *rel, sql_rel *l, sql_rel *r, operator_type setop, list *exps) { rel_destroy_(rel); rel->l = l; rel->r = r; rel->op = setop; - rel->exps = NULL; rel->card = CARD_MULTI; rel->flag = 0; - if (l && r) - rel->nrcols = l->nrcols + r->nrcols; - rel->exps = exps; + rel_setop_set_exps(sql, rel, exps); set_processed(rel); return rel; } @@ -539,6 +537,7 @@ rel_setop_set_exps(mvc *sql, sql_rel *re set_has_nil(e); else set_has_no_nil(e); + e->p = NULL; /* remove all the properties on unions */ e->card = MAX(f->card, g->card); } else e->card = f->card; @@ -1451,7 +1450,7 @@ rel_or(mvc *sql, sql_rel *rel, sql_rel * rel = rel_setop_check_types(sql, l, r, ls, rs, op_union); if (!rel) return NULL; - rel->exps = rel_projections(sql, rel, NULL, 1, 1); + rel_setop_set_exps(sql, rel, rel_projections(sql, rel, NULL, 1, 1)); set_processed(rel); rel->nrcols = list_length(rel->exps); rel = rel_distinct(rel); @@ -1564,17 +1563,27 @@ rel_find_column( sql_allocator *sa, sql_ if (e && !ambiguous && !multi) return exp_alias(sa, exp_relname(e), exp_name(e), exp_relname(e), cname, exp_subtype(e), e->card, has_nil(e), is_intern(e)); } - if (is_project(rel->op) && rel->l && !is_processed(rel)) { - return rel_find_column(sa, rel->l, tname, cname); + if ((is_simple_project(rel->op) || is_groupby(rel->op)) && rel->l) { + if (!is_processed(rel)) + return rel_find_column(sa, rel->l, tname, cname); + } else if (is_set(rel->op)) { + assert(is_processed(rel)); + return NULL; } else if (is_join(rel->op)) { sql_exp *e = rel_find_column(sa, rel->l, tname, cname); - if (!e) + + if (e && (is_right(rel->op) || is_full(rel->op))) + set_has_nil(e); + if (!e) { e = rel_find_column(sa, rel->r, tname, cname); + if (e && (is_left(rel->op) || is_full(rel->op))) + set_has_nil(e); + } return e; - } else if (is_set(rel->op) || - is_sort(rel) || - is_semi(rel->op) || - is_select(rel->op)) { + } else if (is_semi(rel->op) || + is_select(rel->op) || + is_topn(rel->op) || + is_sample(rel->op)) { if (rel->l) return rel_find_column(sa, rel->l, tname, cname); } diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h --- a/sql/server/rel_rel.h +++ b/sql/server/rel_rel.h @@ -68,7 +68,7 @@ extern sql_exp *rel_bind_column( mvc *sq extern sql_exp *rel_bind_column2( mvc *sql, sql_rel *rel, const char *tname, const char *cname, int f ); extern sql_exp *rel_first_column(mvc *sql, sql_rel *rel); -extern sql_rel *rel_inplace_setop(sql_rel *rel, sql_rel *l, sql_rel *r, operator_type setop, list *exps); +extern sql_rel *rel_inplace_setop(mvc *sql, sql_rel *rel, sql_rel *l, sql_rel *r, operator_type setop, list *exps); extern sql_rel *rel_inplace_project(sql_allocator *sa, sql_rel *rel, sql_rel *l, list *e); extern sql_rel *rel_inplace_groupby(sql_rel *rel, sql_rel *l, list *groupbyexps, list *exps ); 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 @@ -5689,8 +5689,11 @@ rel_setquery(sql_query *query, symbol *q res = rel_setquery_(query, t1, t2, corresponding, op_except ); else if ( q->token == SQL_INTERSECT) res = rel_setquery_(query, t1, t2, corresponding, op_inter ); - if (res && distinct) - res = rel_distinct(res); + if (res) { + set_processed(res); + if (distinct) + res = rel_distinct(res); + } return res; } 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 @@ -2013,8 +2013,9 @@ rewrite_or_exp(visitor *v, sql_rel *rel) list *rs = rel_projections(v->sql, rel, NULL, 1, 1); if (!(rel = rel_setop_check_types(v->sql, l, r, ls, rs, op_union))) return NULL; + rel_setop_set_exps(v->sql, rel, exps); + set_processed(rel); rel = rel_distinct(rel); - rel_set_exps(rel, exps); v->changes++; return rel; } @@ -3313,6 +3314,7 @@ rewrite_outer2inner_union(visitor *v, sq rel_project(v->sql->sa, rel_dup(rel->l), rel_projections(v->sql, rel->l, NULL, 1, 1)), rel_project(v->sql->sa, rel_dup(prel), rel_projections(v->sql, rel->l, NULL, 1, 1)), op_except); rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->l, NULL, 1, 1)); + set_processed(except); sql_rel *nrel = rel_crossproduct(v->sql->sa, except, rel_dup(rel->r), op_left); rel_join_add_exp(v->sql->sa, nrel, f); rel->op = op_join; @@ -3320,7 +3322,8 @@ rewrite_outer2inner_union(visitor *v, sq prel, rel_project(v->sql->sa, nrel, rel_projections(v->sql, nrel, NULL, 1, 1)), op_union); - rel_set_exps(nrel, rel_projections(v->sql, rel, NULL, 1, 1)); + rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1)); + set_processed(nrel); return nrel; } else if (is_right(rel->op)) { sql_rel *prel = rel_project(v->sql->sa, rel, rel_projections(v->sql, rel, NULL, 1, 1)); @@ -3328,6 +3331,7 @@ rewrite_outer2inner_union(visitor *v, sq rel_project(v->sql->sa, rel_dup(rel->r), rel_projections(v->sql, rel->r, NULL, 1, 1)), rel_project(v->sql->sa, rel_dup(prel), rel_projections(v->sql, rel->r, NULL, 1, 1)), op_except); rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->r, NULL, 1, 1)); + set_processed(except); sql_rel *nrel = rel_crossproduct(v->sql->sa, rel_dup(rel->l), except, op_right); rel_join_add_exp(v->sql->sa, nrel, f); rel->op = op_join; @@ -3335,7 +3339,8 @@ rewrite_outer2inner_union(visitor *v, sq prel, rel_project(v->sql->sa, nrel, rel_projections(v->sql, nrel, NULL, 1, 1)), op_union); - rel_set_exps(nrel, rel_projections(v->sql, rel, NULL, 1, 1)); + rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1)); + set_processed(nrel); return nrel; } else if (is_full(rel->op)) { sql_rel *prel = rel_project(v->sql->sa, rel, rel_projections(v->sql, rel, NULL, 1, 1)); @@ -3343,6 +3348,7 @@ rewrite_outer2inner_union(visitor *v, sq rel_project(v->sql->sa, rel_dup(rel->l), rel_projections(v->sql, rel->l, NULL, 1, 1)), rel_project(v->sql->sa, rel_dup(prel), rel_projections(v->sql, rel->l, NULL, 1, 1)), op_except); rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->l, NULL, 1, 1)); + set_processed(except); sql_rel *lrel = rel_crossproduct(v->sql->sa, except, rel_dup(rel->r), op_left); rel_join_add_exp(v->sql->sa, lrel, f); @@ -3350,6 +3356,7 @@ rewrite_outer2inner_union(visitor *v, sq rel_project(v->sql->sa, rel_dup(rel->r), rel_projections(v->sql, rel->r, NULL, 1, 1)), rel_project(v->sql->sa, rel_dup(prel), rel_projections(v->sql, rel->r, NULL, 1, 1)), op_except); rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->r, NULL, 1, 1)); + set_processed(except); sql_rel *rrel = rel_crossproduct(v->sql->sa, rel_dup(rel->l), except, op_right); rel_join_add_exp(v->sql->sa, rrel, f); lrel = rel_setop(v->sql->sa, @@ -3357,12 +3364,14 @@ rewrite_outer2inner_union(visitor *v, sq rel_project(v->sql->sa, rrel, rel_projections(v->sql, rrel, NULL, 1, 1)), op_union); rel_setop_set_exps(v->sql, lrel, rel_projections(v->sql, rel, NULL, 1, 1)); + set_processed(lrel); rel->op = op_join; lrel = rel_setop(v->sql->sa, rel_project(v->sql->sa, prel, rel_projections(v->sql, rel, NULL, 1, 1)), rel_project(v->sql->sa, lrel, rel_projections(v->sql, lrel, NULL, 1, 1)), op_union); rel_setop_set_exps(v->sql, lrel, rel_projections(v->sql, rel, NULL, 1, 1)); + set_processed(lrel); return lrel; } } @@ -3422,7 +3431,7 @@ rewrite_values(visitor *v, sql_rel *rel) } if (cur) { nrel = rel_setop(v->sql->sa, cur, nrel, op_union); - rel_set_exps(nrel, exps); + rel_setop_set_exps(v->sql, nrel, exps); set_processed(nrel); } cur = nrel; diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -1350,6 +1350,7 @@ merge_into_table(sql_query *query, dlist no_tid = rel_project(sql->sa, rel_dup(joined), rel_projections(sql, joined, NULL, 1, 0)); extra_project = rel_setop(sql->sa, no_tid, extra_project, op_except); rel_setop_set_exps(sql, extra_project, rel_projections(sql, extra_project, NULL, 1, 0)); + set_processed(extra_project); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list