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

Reply via email to