Changeset: 35185063f6ba for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/35185063f6ba
Modified Files:
        sql/backends/monet5/rel_bin.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_rel.c
        sql/server/rel_rewriter.c
        sql/server/rel_select.c
        sql/server/rel_statistics.c
        sql/server/rel_unnest.c
Branch: reducedstack
Log Message:

merged with default


diffs (truncated from 1378 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
@@ -2562,7 +2562,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:
@@ -4455,52 +4454,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;
-               const char *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), 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;
@@ -7950,10 +7903,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
@@ -4300,7 +4300,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
@@ -164,7 +164,6 @@ typedef enum operator_type {
        op_full,
        op_semi,
        op_anti,
-       op_union,
        op_munion,
        op_inter,
        op_except,
@@ -203,9 +202,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
@@ -559,7 +559,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";
@@ -573,8 +572,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)
@@ -770,7 +767,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)
@@ -2518,12 +2514,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");
@@ -2581,7 +2571,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
@@ -1944,7 +1944,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:
@@ -3975,7 +3974,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
@@ -13,6 +13,7 @@
 #include "monetdb_config.h"
 #include "rel_optimizer.h"
 #include "rel_optimizer_private.h"
+#include "rel_optimizer.h"
 #include "rel_exp.h"
 #include "rel_select.h"
 
@@ -267,6 +268,52 @@ exps_mark_used(sql_rel *subrel, list *l,
        return nr;
 }
 
+/* mark all expression related to this nid */
+static int
+exps_mark_all_used(list *exps, int nid, int local_proj)
+{
+       if (!list_empty(exps)) {
+               int i = 0;
+               for(node *n = exps->h; n; n = n->next, i++) {
+                       sql_exp *e = n->data;
+
+                       if (e->alias.label == nid) {
+                               if (local_proj <= -1 || i < local_proj) {
+                                       if (local_proj < 0 || e->nid != 
e->alias.label) {
+                                               e->used = 1;
+                                               return 1;
+                                       }
+                               }
+                       }
+                       /*
+                       if (e->f && e->type == e_column && (local_proj <= -1 || 
i < local_proj)) {
+                               if (exps_mark_all_used(e->f, nid, -2)) {
+                                       e->used = 1;
+                                       return 1;
+                               }
+                       }
+                       */
+               }
+       }
+       return 0;
+}
+
+static int
+rel_mark_all_used(sql_rel *r, int nid, int local_proj)
+{
+       if (is_project(r->op) || (is_base(r->op) && r->exps))
+               return exps_mark_all_used(r->exps, nid, local_proj);
+       if (is_select(r->op) || is_semi(r->op))
+               return rel_mark_all_used(r->l, nid, local_proj);
+       if (is_join(r->op)) {
+               if (r->l && rel_mark_all_used(r->l, nid, local_proj))
+                       return 1;
+               else if (r->r)
+                       return rel_mark_all_used(r->r, nid, local_proj);
+       }
+       return 0;
+}
+
 static int
 exp_mark_used(sql_rel *subrel, sql_exp *e, int local_proj)
 {
@@ -275,7 +322,10 @@ exp_mark_used(sql_rel *subrel, sql_exp *
 
        switch(e->type) {
        case e_column:
-               ne = rel_find_exp(subrel, e);
+               if (e->nid && subrel && subrel->exps && 
rel_mark_all_used(subrel, e->nid, local_proj))
+                       nr++;
+               else
+                       ne = rel_find_exp(subrel, e);
                /* if looking in the same projection, make sure 'ne' is 
projected before the searched column */
                if (ne && local_proj > -1 && list_position(subrel->exps, ne) >= 
local_proj)
                        ne = NULL;
@@ -363,7 +413,7 @@ rel_exps_mark_used(allocator *sa, sql_re
 {
        int nr = 0;
 
-       if (rel->r && (is_simple_project(rel->op) || is_groupby(rel->op))) {
+       if (rel->l && rel->r && (is_simple_project(rel->op) || 
is_groupby(rel->op))) {
                list *l = rel->r;
                node *n;
 
@@ -371,7 +421,7 @@ rel_exps_mark_used(allocator *sa, sql_re
                        sql_exp *e = n->data;
 
                        e->used = 1;
-                       exp_mark_used(rel, e, -1);
+                       exp_mark_used(rel->l, e, -1);
                }
        }
        if (rel->attr) {
@@ -591,7 +641,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 */
@@ -626,7 +675,6 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to