Changeset: 35185063f6ba for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/35185063f6ba
Modified Files:
sql/backends/monet5/rel_bin.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_rel.c
sql/server/rel_rewriter.c
sql/server/rel_select.c
sql/server/rel_statistics.c
sql/server/rel_unnest.c
Branch: reducedstack
Log Message:
merged with default
diffs (truncated from 1378 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
@@ -2562,7 +2562,6 @@ rel2bin_args(backend *be, sql_rel *rel,
case op_semi:
case op_anti:
- case op_union:
case op_inter:
case op_except:
case op_merge:
@@ -4455,52 +4454,6 @@ rel2bin_munion(backend *be, sql_rel *rel
}
static stmt *
-rel2bin_union(backend *be, sql_rel *rel, list *refs)
-{
- mvc *sql = be->mvc;
- list *l;
- node *n, *m;
- stmt *left = NULL, *right = NULL, *sub;
-
- if (rel->l) /* first construct the left sub relation */
- left = subrel_bin(be, rel->l, refs);
- if (rel->r) /* first construct the right sub relation */
- right = subrel_bin(be, rel->r, refs);
- left = subrel_project(be, left, refs, rel->l);
- right = subrel_project(be, right, refs, rel->r);
- if (!left || !right)
- return NULL;
-
- /* construct relation */
- l = sa_list(sql->sa);
- for (n = left->op4.lval->h, m = right->op4.lval->h; n && m;
- n = n->next, m = m->next) {
- stmt *c1 = n->data;
- assert(c1->type == st_alias);
- stmt *c2 = m->data;
- const char *rnme = table_name(sql->sa, c1);
- const char *nme = column_name(sql->sa, c1);
- stmt *s;
-
- s = stmt_append(be, create_const_column(be, c1), c2);
- if (s == NULL)
- return NULL;
- s = stmt_alias(be, s, c1->label, rnme, nme);
- if (s == NULL)
- return NULL;
- list_append(l, s);
- }
- sub = stmt_list(be, l);
-
- sub = rel_rename(be, rel, sub);
- if (need_distinct(rel))
- sub = rel2bin_distinct(be, sub, NULL);
- if (is_single(rel))
- sub = rel2bin_single(be, sub);
- return sub;
-}
-
-static stmt *
rel2bin_except(backend *be, sql_rel *rel, list *refs)
{
mvc *sql = be->mvc;
@@ -7950,10 +7903,6 @@ subrel_bin(backend *be, sql_rel *rel, li
s = rel2bin_antijoin(be, rel, refs);
sql->type = Q_TABLE;
break;
- case op_union:
- s = rel2bin_union(be, rel, refs);
- sql->type = Q_TABLE;
- break;
case op_munion:
s = rel2bin_munion(be, rel, refs);
sql->type = Q_TABLE;
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -4300,7 +4300,7 @@ stmt_direct_func(backend *be, InstrPtr q
if(!s) {
return NULL;
}
- s->flag = op_union;
+ s->flag = op_munion;
s->nrcols = 3;
s->nr = getDestVar(q);
s->q = q;
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
@@ -164,7 +164,6 @@ typedef enum operator_type {
op_full,
op_semi,
op_anti,
- op_union,
op_munion,
op_inter,
op_except,
@@ -203,9 +202,8 @@ typedef enum operator_type {
#define is_semi(op) (op == op_semi || op == op_anti)
#define is_joinop(op) (is_join(op) || is_semi(op))
#define is_select(op) (op == op_select)
-#define is_set(op) (op == op_union || op == op_inter || op
== op_except)
+#define is_set(op) (op == op_inter || op == op_except)
#define is_mset(op) (op == op_munion || op == op_inter || op ==
op_except)
-#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)
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
@@ -72,7 +72,6 @@ has_remote_or_replica( sql_rel *rel )
case op_semi:
case op_anti:
- case op_union:
case op_inter:
case op_except:
case op_merge:
@@ -405,7 +404,6 @@ rel_rewrite_remote_(visitor *v, sql_rel
case op_semi:
case op_anti:
- case op_union:
case op_inter:
case op_except:
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
@@ -559,7 +559,6 @@ rel_print_rel(mvc *sql, stream *fout, s
case op_full:
case op_semi:
case op_anti:
- case op_union:
case op_inter:
case op_except:
r = "join";
@@ -573,8 +572,6 @@ rel_print_rel(mvc *sql, stream *fout, s
r = "semijoin";
else if (rel->op == op_anti)
r = "antijoin";
- else if (rel->op == op_union)
- r = "union";
else if (rel->op == op_inter)
r = "intersect";
else if (rel->op == op_except)
@@ -770,7 +767,6 @@ rel_print_refs(mvc *sql, stream* fout, s
case op_full:
case op_semi:
case op_anti:
- case op_union:
case op_inter:
case op_except:
if (rel->l)
@@ -2518,12 +2514,6 @@ rel_read(mvc *sql, char *r, int *pos, li
j = op_munion;
}
/* fall through */
- case 'u':
- if (j == op_basetable) {
- *pos += (int) strlen("union");
- j = op_union;
- }
- /* fall through */
case 'i':
if (j == op_basetable) {
*pos += (int) strlen("intersect");
@@ -2581,7 +2571,7 @@ rel_read(mvc *sql, char *r, int *pos, li
return sql_error(sql, -1, SQLSTATE(42000)
"Setop: number of expressions don't match\n");
} else {
rel = rel_setop(sql->sa, lrel, rrel, j);
- rel_setop_set_exps(sql, rel, exps, false);
+ rel_setop_set_exps(sql, rel, exps);
if (rel_set_types(sql, rel) < 0)
return sql_error(sql, -1, SQLSTATE(42000)
"Setop: number of expressions don't match\n");
}
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
@@ -1944,7 +1944,6 @@ rel_find_nid(sql_rel *rel, int nid)
case op_table:
case op_basetable:
case op_munion:
- case op_union:
case op_inter:
case op_except:
case op_project:
@@ -3975,7 +3974,6 @@ rel_find_parameter(mvc *sql, sql_subtype
if (rel->l)
res = rel_find_parameter(sql, type, rel->l,
nid, nrname, nename);
break;
- case op_union: /* TODO for set relations this needs further
improvement */
case op_inter:
case op_except:
case op_munion: {
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
@@ -13,6 +13,7 @@
#include "monetdb_config.h"
#include "rel_optimizer.h"
#include "rel_optimizer_private.h"
+#include "rel_optimizer.h"
#include "rel_exp.h"
#include "rel_select.h"
@@ -267,6 +268,52 @@ exps_mark_used(sql_rel *subrel, list *l,
return nr;
}
+/* mark all expression related to this nid */
+static int
+exps_mark_all_used(list *exps, int nid, int local_proj)
+{
+ if (!list_empty(exps)) {
+ int i = 0;
+ for(node *n = exps->h; n; n = n->next, i++) {
+ sql_exp *e = n->data;
+
+ if (e->alias.label == nid) {
+ if (local_proj <= -1 || i < local_proj) {
+ if (local_proj < 0 || e->nid !=
e->alias.label) {
+ e->used = 1;
+ return 1;
+ }
+ }
+ }
+ /*
+ if (e->f && e->type == e_column && (local_proj <= -1 ||
i < local_proj)) {
+ if (exps_mark_all_used(e->f, nid, -2)) {
+ e->used = 1;
+ return 1;
+ }
+ }
+ */
+ }
+ }
+ return 0;
+}
+
+static int
+rel_mark_all_used(sql_rel *r, int nid, int local_proj)
+{
+ if (is_project(r->op) || (is_base(r->op) && r->exps))
+ return exps_mark_all_used(r->exps, nid, local_proj);
+ if (is_select(r->op) || is_semi(r->op))
+ return rel_mark_all_used(r->l, nid, local_proj);
+ if (is_join(r->op)) {
+ if (r->l && rel_mark_all_used(r->l, nid, local_proj))
+ return 1;
+ else if (r->r)
+ return rel_mark_all_used(r->r, nid, local_proj);
+ }
+ return 0;
+}
+
static int
exp_mark_used(sql_rel *subrel, sql_exp *e, int local_proj)
{
@@ -275,7 +322,10 @@ exp_mark_used(sql_rel *subrel, sql_exp *
switch(e->type) {
case e_column:
- ne = rel_find_exp(subrel, e);
+ if (e->nid && subrel && subrel->exps &&
rel_mark_all_used(subrel, e->nid, local_proj))
+ nr++;
+ else
+ ne = rel_find_exp(subrel, e);
/* if looking in the same projection, make sure 'ne' is
projected before the searched column */
if (ne && local_proj > -1 && list_position(subrel->exps, ne) >=
local_proj)
ne = NULL;
@@ -363,7 +413,7 @@ rel_exps_mark_used(allocator *sa, sql_re
{
int nr = 0;
- if (rel->r && (is_simple_project(rel->op) || is_groupby(rel->op))) {
+ if (rel->l && rel->r && (is_simple_project(rel->op) ||
is_groupby(rel->op))) {
list *l = rel->r;
node *n;
@@ -371,7 +421,7 @@ rel_exps_mark_used(allocator *sa, sql_re
sql_exp *e = n->data;
e->used = 1;
- exp_mark_used(rel, e, -1);
+ exp_mark_used(rel->l, e, -1);
}
}
if (rel->attr) {
@@ -591,7 +641,6 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
}
break;
- case op_union:
case op_inter:
case op_except:
/* For now we mark all union expression as used */
@@ -626,7 +675,6 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]