Changeset: b5aafce4d16e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b5aafce4d16e
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/include/sql_relation.h
        sql/server/rel_distribute.c
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_optimize_others.c
        sql/server/rel_optimize_proj.c
        sql/server/rel_optimize_sel.c
        sql/server/rel_optimizer.c
        sql/server/rel_partition.c
        sql/server/rel_propagate.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_rewriter.c
        sql/server/rel_select.c
        sql/server/rel_statistics.c
        sql/server/rel_unnest.c
        sql/server/rel_updates.c
        sql/server/sql_partition.c
Branch: nested
Log Message:

merged with default


diffs (truncated from 1215 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2882,7 +2882,6 @@ rel2bin_args(backend *be, sql_rel *rel, 
        case op_semi:
        case op_anti:
 
-       case op_union:
        case op_inter:
        case op_except:
        case op_merge:
@@ -4789,52 +4788,6 @@ rel2bin_munion(backend *be, sql_rel *rel
 }
 
 static stmt *
-rel2bin_union(backend *be, sql_rel *rel, list *refs)
-{
-       mvc *sql = be->mvc;
-       list *l;
-       node *n, *m;
-       stmt *left = NULL, *right = NULL, *sub;
-
-       if (rel->l) /* first construct the left sub relation */
-               left = subrel_bin(be, rel->l, refs);
-       if (rel->r) /* first construct the right sub relation */
-               right = subrel_bin(be, rel->r, refs);
-       left = subrel_project(be, left, refs, rel->l);
-       right = subrel_project(be, right, refs, rel->r);
-       if (!left || !right)
-               return NULL;
-
-       /* construct relation */
-       l = sa_list(sql->sa);
-       for (n = left->op4.lval->h, m = right->op4.lval->h; n && m;
-                n = n->next, m = m->next) {
-               stmt *c1 = n->data;
-               assert(c1->type == st_alias);
-               stmt *c2 = m->data;
-               sql_alias *rnme = table_name(sql->sa, c1);
-               const char *nme = column_name(sql->sa, c1);
-               stmt *s;
-
-               s = stmt_append(be, create_const_column(be, c1, NULL), c2);
-               if (s == NULL)
-                       return NULL;
-               s = stmt_alias(be, s, c1->label, rnme, nme);
-               if (s == NULL)
-                       return NULL;
-               list_append(l, s);
-       }
-       sub = stmt_list(be, l);
-
-       sub = rel_rename(be, rel, sub);
-       if (need_distinct(rel))
-               sub = rel2bin_distinct(be, sub, NULL);
-       if (is_single(rel))
-               sub = rel2bin_single(be, sub);
-       return sub;
-}
-
-static stmt *
 rel2bin_except(backend *be, sql_rel *rel, list *refs)
 {
        mvc *sql = be->mvc;
@@ -8614,10 +8567,6 @@ subrel_bin(backend *be, sql_rel *rel, li
                s = rel2bin_antijoin(be, rel, refs);
                sql->type = Q_TABLE;
                break;
-       case op_union:
-               s = rel2bin_union(be, rel, refs);
-               sql->type = Q_TABLE;
-               break;
        case op_munion:
                s = rel2bin_munion(be, rel, refs);
                sql->type = Q_TABLE;
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -4713,7 +4713,7 @@ stmt_direct_func(backend *be, InstrPtr q
                if(!s) {
                        return NULL;
                }
-               s->flag = op_union;
+               s->flag = op_munion;
                s->nrcols = 3;
                s->nr = getDestVar(q);
                s->q = q;
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
@@ -166,7 +166,6 @@ typedef enum operator_type {
        op_full,
        op_semi,
        op_anti,
-       op_union,
        op_munion,
        op_inter,
        op_except,
@@ -207,9 +206,8 @@ typedef enum operator_type {
 #define is_semi(op)            (op == op_semi || op == op_anti)
 #define is_joinop(op)          (is_join(op) || is_semi(op))
 #define is_select(op)          (op == op_select)
-#define is_set(op)                     (op == op_union || op == op_inter || op 
== op_except)
+#define is_set(op)                     (op == op_inter || op == op_except)
 #define is_mset(op)            (op == op_munion || op == op_inter || op == 
op_except)
-#define is_union(op)           (op == op_union)
 #define is_inter(op)           (op == op_inter)
 #define is_except(op)          (op == op_except)
 #define is_munion(op)          (op == op_munion)
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -72,7 +72,6 @@ has_remote_or_replica( sql_rel *rel )
        case op_semi:
        case op_anti:
 
-       case op_union:
        case op_inter:
        case op_except:
        case op_merge:
@@ -405,7 +404,6 @@ rel_rewrite_remote_(visitor *v, sql_rel 
        case op_semi:
        case op_anti:
 
-       case op_union:
        case op_inter:
        case op_except:
 
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
@@ -567,7 +567,6 @@ rel_print_rel(mvc *sql, stream  *fout, s
        case op_full:
        case op_semi:
        case op_anti:
-       case op_union:
        case op_inter:
        case op_except:
                r = "join";
@@ -581,8 +580,6 @@ rel_print_rel(mvc *sql, stream  *fout, s
                        r = "semijoin";
                else if (rel->op == op_anti)
                        r = "antijoin";
-               else if (rel->op == op_union)
-                       r = "union";
                else if (rel->op == op_inter)
                        r = "intersect";
                else if (rel->op == op_except)
@@ -778,7 +775,6 @@ rel_print_refs(mvc *sql, stream* fout, s
        case op_full:
        case op_semi:
        case op_anti:
-       case op_union:
        case op_inter:
        case op_except:
                if (rel->l)
@@ -2522,12 +2518,6 @@ rel_read(mvc *sql, char *r, int *pos, li
                        j = op_munion;
                }
                /* fall through */
-       case 'u':
-               if (j == op_basetable) {
-                       *pos += (int) strlen("union");
-                       j = op_union;
-               }
-               /* fall through */
        case 'i':
                if (j == op_basetable) {
                        *pos += (int) strlen("intersect");
@@ -2585,7 +2575,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                                return sql_error(sql, -1, SQLSTATE(42000) 
"Setop: number of expressions don't match\n");
                } else {
                        rel = rel_setop(sql->sa, lrel, rrel, j);
-                       rel_setop_set_exps(sql, rel, exps, false);
+                       rel_setop_set_exps(sql, rel, exps);
                        if (rel_set_types(sql, rel) < 0)
                                return sql_error(sql, -1, SQLSTATE(42000) 
"Setop: number of expressions don't match\n");
                }
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
@@ -1998,7 +1998,6 @@ rel_find_nid(sql_rel *rel, int nid)
                case op_table:
                case op_basetable:
                case op_munion:
-               case op_union:
                case op_inter:
                case op_except:
                case op_project:
@@ -4097,7 +4096,6 @@ rel_find_parameter(mvc *sql, sql_subtype
                        if (rel->l)
                                res = rel_find_parameter(sql, type, rel->l, 
nid, nrname, nename);
                        break;
-               case op_union: /* TODO for set relations this needs further 
improvement */
                case op_inter:
                case op_except:
                case op_munion: {
diff --git a/sql/server/rel_optimize_others.c b/sql/server/rel_optimize_others.c
--- a/sql/server/rel_optimize_others.c
+++ b/sql/server/rel_optimize_others.c
@@ -625,7 +625,6 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
                }
                break;
 
-       case op_union:
        case op_inter:
        case op_except:
                /* For now we mark all union expression as used */
@@ -660,7 +659,6 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
 
        case op_munion:
                assert(rel->l);
-               // TODO: here we blindly follow the same logic as op_union. 
RE-evaluate
                if (proj && (need_distinct(rel) || !rel->exps)) {
                        rel_used(rel);
                        if (!rel->exps) {
@@ -800,7 +798,6 @@ rel_remove_unused(mvc *sql, sql_rel *rel
                }
                return rel;
 
-       case op_union:
        case op_inter:
        case op_except:
        case op_munion:
@@ -861,7 +858,6 @@ rel_dce_refs(mvc *sql, sql_rel *rel, lis
                        rel_dce_refs(sql, rel->r, refs);
                break;
 
-       case op_union:
        case op_inter:
        case op_except:
        case op_join:
@@ -946,7 +942,6 @@ rel_dce_down(mvc *sql, sql_rel *rel, int
                        rel_dce_sub(sql, rel);
                return rel;
 
-       case op_union:
        case op_inter:
        case op_except:
                if (skip_proj) {
@@ -1025,6 +1020,15 @@ rel_dce_sub(mvc *sql, sql_rel *rel)
        return rel;
 }
 
+/*
+sql_rel *
+rel_deadcode_elimination(mvc *sql, sql_rel *rel)
+{
+       rel_used(rel);
+       return rel_dce_sub(sql, rel);
+}
+*/
+
 /* add projects under set ops */
 static sql_rel *
 rel_add_projects(mvc *sql, sql_rel *rel)
@@ -1042,7 +1046,6 @@ rel_add_projects(mvc *sql, sql_rel *rel)
                if (rel->r)
                        rel->r = rel_add_projects(sql, rel->r);
                return rel;
-       case op_union:
        case op_inter:
        case op_except:
                /* We can only reduce the list of expressions of an set op
@@ -1305,8 +1308,8 @@ rel_push_topn_and_sample_down_(visitor *
                if (!topn_sample_safe_exps(rel->exps, false))
                        return rel;
 
-               /* duplicate topn/sample direct under union or crossproduct */
-               if (r && !rel_is_ref(r) && r->l && r->r && ((is_union(r->op) && 
r->exps) || (r->op == op_join && list_empty(r->exps)))) {
+               /* duplicate topn/sample direct under crossproduct */
+               if (r && !rel_is_ref(r) && r->l && r->r && r->op == op_join && 
list_empty(r->exps)) {
                        sql_rel *u = r, *x;
                        sql_rel *ul = u->l;
                        sql_rel *ur = u->r;
@@ -1337,24 +1340,46 @@ rel_push_topn_and_sample_down_(visitor *
                        return rel;
                }
 
+               /* duplicate topn/sample direct under union */
+               if (r && !rel_is_ref(r) && r->l && r->r && is_munion(r->op) && 
r->exps) {
+                       list *rels = r->l;
+                       bool changed = false;
+                       for(node *n = rels->h; n; n = n->next) {
+                               sql_rel *ue = n->data, *x;
+
+                               x = ue;
+                               while (is_simple_project(x->op) && 
!need_distinct(x) && !rel_is_ref(x) && x->l && list_empty(x->r))
+                                       x = x->l;
+                               if (x && x->op != rel->op) { /* only push topn 
once */
+                                       ue = func(v->sql->sa, ue, 
sum_limit_offset(v->sql, rel));
+                                       set_processed(ue);
+                                       n->data = ue;
+                                       changed = true;
+                               }
+                       }
+                       if (changed)
+                               v->changes++;
+                       return rel;
+               }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to