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