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 -- [email protected]
To unsubscribe send an email to [email protected]