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