Changeset: 3c6ebd3f6adc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3c6ebd3f6adc
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/include/sql_relation.h
        sql/rel.txt
        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_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/sql_partition.c
Branch: balanced_union
Log Message:

Introducing multi-union relational operator WIP


diffs (truncated from 503 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
@@ -2229,6 +2229,9 @@ rel2bin_args(backend *be, sql_rel *rel, 
                args = rel2bin_args(be, rel->l, args);
                args = rel2bin_args(be, rel->r, args);
                break;
+       case op_munion:
+               assert(0);
+               break;
        case op_groupby:
                if (rel->r)
                        args = exps2bin_args(be, rel->r, args);
@@ -6712,6 +6715,9 @@ subrel_bin(backend *be, sql_rel *rel, li
                s = rel2bin_union(be, rel, refs);
                sql->type = Q_TABLE;
                break;
+       case op_munion:
+               assert(0);
+               break;
        case op_except:
                s = rel2bin_except(be, rel, refs);
                sql->type = Q_TABLE;
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
@@ -158,6 +158,7 @@ typedef enum operator_type {
        op_semi,
        op_anti,
        op_union,
+       op_munion,
        op_inter,
        op_except,
        op_groupby,
@@ -199,6 +200,7 @@ typedef enum operator_type {
 #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)
 #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)
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -53,6 +53,13 @@ UNION|EXCEPT|INTERSECT
        -> l            is left relation
        -> r            is right relation
 
+MUNION
+       (card ATOM, AGGR or MULTI (same card as lower relation))
+    -> exps     is list of projection expressions
+    -> l        is list of union relations
+    -> r        TBD # probably NULL
+    -> flag     TBD
+
 PROJECT  (card ATOM, AGGR or MULTI (same card as lower relation))
        -> exps         is list of projection expressions
        -> l            is relation
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
@@ -47,6 +47,9 @@ has_remote_or_replica( sql_rel *rel )
        case op_update:
        case op_delete:
                return has_remote_or_replica( rel->l ) || 
has_remote_or_replica( rel->r );
+       case op_munion:
+               assert(0);
+               break;
        case op_project:
        case op_select:
        case op_groupby:
@@ -301,6 +304,9 @@ rel_rewrite_remote_(visitor *v, sql_rel 
                        }
                }
                break;
+       case op_munion:
+               assert(0);
+               break;
        case op_project:
        case op_select:
        case op_groupby:
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
@@ -504,6 +504,9 @@ rel_print_rel(mvc *sql, stream  *fout, s
                if (is_join(rel->op) && rel->attr) /* mark joins */
                        exps_print(sql, fout, rel->attr, depth, refs, 1, 0);
                break;
+       case op_munion:
+               assert(0);
+               break;
        case op_project:
        case op_select:
        case op_groupby:
@@ -656,6 +659,9 @@ rel_print_refs(mvc *sql, stream* fout, s
                        list_append(refs, rel->l);
                }
                break;
+       case op_munion:
+               assert(0);
+               break;
        case op_insert:
        case op_update:
        case op_delete:
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
@@ -3361,6 +3361,7 @@ rel_find_parameter(mvc *sql, sql_subtype
                        (void) sql_error(sql, 10, SQLSTATE(42000) "Cannot set 
parameter types under set relations at the moment");
                        return -1;
                }
+               case op_munion:
                default: /* For table returning functions, the type must be set 
when the relation is created */
                        return 0;
        }
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
@@ -620,6 +620,9 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
                }
                break;
 
+       case op_munion:
+               assert(0);
+               break;
        case op_join:
        case op_left:
        case op_right:
@@ -730,6 +733,9 @@ rel_remove_unused(mvc *sql, sql_rel *rel
        case op_semi:
        case op_anti:
                return rel;
+       case op_munion:
+               assert(0);
+               break;
        case op_ddl:
                if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table || rel->flag == 
ddl_create_table || rel->flag == ddl_create_view) {
                        if (rel->l)
@@ -791,6 +797,9 @@ rel_dce_refs(mvc *sql, sql_rel *rel, lis
                if (rel->r)
                        rel_dce_refs(sql, rel->r, refs);
                break;
+       case op_munion:
+               assert(0);
+               break;
        case op_ddl:
 
                if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table || rel->flag == 
ddl_create_table || rel->flag == ddl_create_view) {
@@ -868,6 +877,9 @@ rel_dce_down(mvc *sql, sql_rel *rel, int
                        rel_dce_sub(sql, rel);
                return rel;
 
+       case op_munion:
+               assert(0);
+               break;
        case op_select:
                if (rel->l)
                        rel->l = rel_dce_down(sql, rel->l, 0);
@@ -962,6 +974,9 @@ rel_add_projects(mvc *sql, sql_rel *rel)
                        rel->r = rel_add_projects(sql, r);
                }
                return rel;
+       case op_munion:
+               assert(0);
+               break;
        case op_topn:
        case op_sample:
        case op_project:
diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -3312,6 +3312,9 @@ has_no_selectivity(mvc *sql, sql_rel *re
        case op_except:
        case op_select:
                return false;
+       case op_munion:
+               assert(0);
+               return false;
        }
        return true;
 }
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -2406,6 +2406,9 @@ rel_join_order_(visitor *v, sql_rel *rel
                rel->l = rel_join_order_(v, rel->l);
                rel->r = rel_join_order_(v, rel->r);
                break;
+       case op_munion:
+               assert(0);
+               break;
        case op_project:
        case op_select:
        case op_groupby:
diff --git a/sql/server/rel_partition.c b/sql/server/rel_partition.c
--- a/sql/server/rel_partition.c
+++ b/sql/server/rel_partition.c
@@ -77,6 +77,9 @@ find_basetables(mvc *sql, sql_rel *rel, 
                if (rel->r)
                        find_basetables(sql, rel->r, tables);
                break;
+       case op_munion:
+               assert(0);
+               break;
        case op_semi:
        case op_anti:
        case op_groupby:
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -566,6 +566,9 @@ rel_change_base_table(mvc* sql, sql_rel*
                        if (rel->r)
                                rel->r = rel_change_base_table(sql, rel->r, 
oldt, newt);
                        break;
+               case op_munion:
+                       assert(0);
+                       break;
                case op_groupby:
                case op_project:
                case op_select:
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
@@ -116,6 +116,11 @@ rel_destroy_(sql_rel *rel)
                if (rel->r)
                        rel_destroy(rel->r);
                break;
+       case op_munion:
+               for (node *n = ((list*)rel->l)->h; n; n = n->next)
+                       // TODO: should we check for n->data == NULL?
+                       rel_destroy(n->data);
+               break;
        case op_project:
        case op_groupby:
        case op_select:
@@ -197,6 +202,10 @@ rel_copy(mvc *sql, sql_rel *i, int deep)
                        }
                }
                break;
+       case op_munion:
+               if (i->l)
+                       rel->l = list_dup(i->l, (fdup) rel_dup);
+               break;
        case op_ddl:
                if (i->flag == ddl_output || i->flag == ddl_create_seq || 
i->flag == ddl_alter_seq || i->flag == ddl_alter_table || i->flag == 
ddl_create_table || i->flag == ddl_create_view) {
                        if (i->l)
@@ -557,6 +566,29 @@ rel_inplace_groupby(sql_rel *rel, sql_re
        return rel;
 }
 
+sql_rel *
+rel_inplace_munion(sql_rel *rel, list *rels)
+{
+       rel_destroy_(rel);
+       rel_inplace_reset_props(rel);
+       // TODO: what is the semantics of cardinality? is that right?
+       rel->card = CARD_ATOM;
+       rel->nrcols = 0;
+       if (rels)
+               rel->l = rels;
+       if (rels) {
+               for (node* n = rels->h; n; n = n->next) {
+                       sql_rel *r = n->data;
+                       // TODO: could we overflow the nrcols this way?
+                       rel->nrcols += r->nrcols;
+               }
+       }
+       rel->r = NULL;
+       rel->exps = NULL;
+       rel->op = op_munion;
+       return rel;
+}
+
 /* this function is to be used with the above rel_inplace_* functions */
 sql_rel *
 rel_dup_copy(sql_allocator *sa, sql_rel *rel)
@@ -602,6 +634,11 @@ rel_dup_copy(sql_allocator *sa, sql_rel 
                if (nrel->l)
                        rel_dup(nrel->l);
                break;
+       case op_munion:
+               // TODO: is that even right?
+               if (nrel->l)
+                       nrel->l = list_dup(nrel->l, (fdup) rel_dup);
+               break;
        }
        return nrel;
 }
@@ -1043,10 +1080,14 @@ exps_reset_props(list *exps, bool setnil
        }
 }
 
+/* Return a list with all the projection expressions, that optionaly
+ * refer to the tname relation, anywhere in the relational tree
+ */
 list *
 _rel_projections(mvc *sql, sql_rel *rel, const char *tname, int settname, int 
intern, int basecol /* basecol only */ )
 {
-       list *lexps, *rexps = NULL, *exps;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to