Changeset: fe4565b282d6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fe4565b282d6
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
Branch: balanced_union
Log Message:

Introduces unionize merge table with munion


diffs (107 lines):

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
@@ -119,6 +119,24 @@ rel_unionize_mt_tables_balanced(visitor 
 }
 
 static sql_rel *
+rel_unionize_mt_tables_munion(visitor *v, sql_rel* mt, list* tables, 
merge_table_prune_info *info)
+{
+       /* create the list of all the operand rels */
+       list *rels = sa_list(v->sql->sa);
+       for (node *n = tables->h; n; n = n->next) {
+               sql_rel *r = rel_wrap_select_around_table(v, n->data, info);
+               append(rels, r);
+       }
+
+       /* create the munion */
+       sql_rel *mu = rel_setop_n_ary(v->sql->sa, rels, op_munion);
+       rel_setop_n_ary_set_exps(v->sql, mu, rel_projections(v->sql, mt, NULL, 
1, 1), true);
+       set_processed(mu);
+
+       return mu;
+}
+
+static sql_rel *
 merge_table_prune_and_unionize(visitor *v, sql_rel *mt_rel, 
merge_table_prune_info *info)
 {
        if (mvc_highwater(v->sql))
@@ -420,6 +438,12 @@ merge_table_prune_and_unionize(visitor *
                        } else {
                                nrel = rel_unionize_mt_tables_balanced(v, 
mt_rel, tables, info);
                        }
+               } else if (mvc_debug_on(v->sql, 32)) {
+                       if (tables->cnt == 1) {
+                               nrel = rel_wrap_select_around_table(v, 
tables->h->data, info);
+                       } else {
+                               nrel = rel_unionize_mt_tables_munion(v, mt_rel, 
tables, info);
+                       }
                } else {
                        for (node *n = tables->h; n ; n = n->next) {
                                sql_rel *next = n->data;
@@ -532,6 +556,8 @@ rel_merge_table_rewrite_(visitor *v, sql
                        /* Always do relation inplace. If the mt relation has 
more than 1 reference, this is required */
                        if (is_union(nrel->op)) {
                                rel = rel_inplace_setop(v->sql, rel, nrel->l, 
nrel->r, op_union, nrel->exps);
+                       } else if (is_munion(nrel->op)) {
+                               rel = rel_inplace_setop_n_ary(v->sql, rel, 
nrel->l, op_munion, nrel->exps);
                        } else if (is_select(nrel->op)) {
                                rel = rel_inplace_select(rel, nrel->l, 
nrel->exps);
                        } else if (is_basetable(nrel->op)) {
@@ -541,6 +567,7 @@ rel_merge_table_rewrite_(visitor *v, sql
                                rel = rel_inplace_project(v->sql->sa, rel, 
nrel->l, nrel->exps);
                                rel->card = exps_card(nrel->exps);
                        }
+                       /* make sure that we do NOT destroy the subrels */
                        nrel->l = nrel->r = NULL;
                        rel_destroy(nrel);
                        v->changes++;
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
@@ -117,8 +117,10 @@ rel_destroy_(sql_rel *rel)
                        rel_destroy(rel->r);
                break;
        case op_munion:
-               for (node *n = ((list*)rel->l)->h; n; n = n->next)
-                       rel_destroy(n->data);
+               /* the rel->l might be in purpose NULL see 
rel_merge_table_rewrite_() */
+               if (rel->l)
+                       for (node *n = ((list*)rel->l)->h; n; n = n->next)
+                               rel_destroy(n->data);
                break;
        case op_project:
        case op_groupby:
@@ -545,6 +547,21 @@ rel_inplace_setop(mvc *sql, sql_rel *rel
 }
 
 sql_rel *
+rel_inplace_setop_n_ary(mvc *sql, sql_rel *rel, list *rl, operator_type setop, 
list *exps)
+{
+       // TODO: for now we only deal with munion
+       assert(setop == op_munion);
+       rel_destroy_(rel);
+       rel_inplace_reset_props(rel);
+       /* rl should be a list of relations */
+       rel->l = rl;
+       rel->op = setop;
+       rel->card = CARD_MULTI;
+       rel_setop_n_ary_set_exps(sql, rel, exps, false);
+       return rel;
+}
+
+sql_rel *
 rel_inplace_project(sql_allocator *sa, sql_rel *rel, sql_rel *l, list *e)
 {
        if (!l) {
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
@@ -77,6 +77,7 @@ extern sql_exp *rel_first_column(mvc *sq
 
 extern sql_rel *rel_inplace_basetable(sql_rel *rel, sql_rel *bt);
 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_setop_n_ary(mvc *sql, sql_rel *rel, list *rl, 
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_select(sql_rel *rel, sql_rel *l, list *exps);
 extern sql_rel *rel_inplace_groupby(sql_rel *rel, sql_rel *l, list 
*groupbyexps, list *exps );
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to