Changeset: 4d0b13c0faec for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4d0b13c0faec
Modified Files:
sql/server/rel_optimize_exps.c
sql/server/rel_optimize_others.c
sql/server/rel_optimize_proj.c
sql/server/rel_optimize_sel.c
sql/server/rel_unnest.c
sql/test/rel-optimizers/Tests/groupjoin.test
Branch: label
Log Message:
more removal of string looks
diffs (276 lines):
diff --git a/sql/server/rel_optimize_exps.c b/sql/server/rel_optimize_exps.c
--- a/sql/server/rel_optimize_exps.c
+++ b/sql/server/rel_optimize_exps.c
@@ -755,15 +755,12 @@ rel_remove_alias(visitor *v, sql_rel *re
if (l->op == op_project) {
sql_exp *ne = rel_find_exp(l, e);
if (ne && ne->type == e_column && is_selfref(ne)) {
- sql_exp *nne = NULL;
/* found ne in projection, try to find
reference in the same list */
- if (ne->l)
- nne = exps_bind_column2(l->exps, ne->l,
ne->r, NULL);
- else
- nne = exps_bind_column(l->exps, ne->r,
NULL, NULL, 1);
+ sql_exp *nne = exps_bind_nid(l->exps, ne->nid);
if (nne && nne != ne && list_position(l->exps,
nne) < list_position(l->exps, ne)) {
e->l = (char*)exp_relname(nne);
e->r = (char*)exp_name(nne);
+ e->nid = nne->alias.label;
v->changes++;
}
}
@@ -777,14 +774,11 @@ rel_remove_alias(visitor *v, sql_rel *re
sql_exp *ne = rel_find_exp(l, e);
found = true;
if (ne && ne->type == e_column &&
is_selfref(ne)) {
- sql_exp *nne = NULL;
- if (ne->l)
- nne =
exps_bind_column2(l->exps, ne->l, ne->r, NULL);
- else
- nne = exps_bind_column(l->exps,
ne->r, NULL, NULL, 1);
+ sql_exp *nne = exps_bind_nid(l->exps,
ne->nid);
if (nne && nne != ne &&
list_position(l->exps, nne) < list_position(l->exps, ne)) {
e->l = (char*)exp_relname(nne);
e->r = (char*)exp_name(nne);
+ e->nid = nne->alias.label;
v->changes++;
}
}
@@ -796,14 +790,11 @@ rel_remove_alias(visitor *v, sql_rel *re
sql_exp *ne = rel_find_exp(l, e);
found = true;
if (ne && ne->type == e_column &&
is_selfref(ne)) {
- sql_exp *nne = NULL;
- if (ne->l)
- nne =
exps_bind_column2(l->exps, ne->l, ne->r, NULL);
- else
- nne = exps_bind_column(l->exps,
ne->r, NULL, NULL, 1);
+ sql_exp *nne = exps_bind_nid(l->exps,
ne->nid);
if (nne && nne != ne &&
list_position(l->exps, nne) < list_position(l->exps, ne)) {
e->l = (char*)exp_relname(nne);
e->r = (char*)exp_name(nne);
+ e->nid = nne->alias.label;
v->changes++;
}
}
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
@@ -101,10 +101,8 @@ exp_push_down_prj(mvc *sql, sql_exp *e,
e = ne;
ne = NULL;
- if (e->l)
- ne = exps_bind_column2(f->exps, e->l, e->r,
NULL);
- if (!ne && !e->l)
- ne = exps_bind_column(f->exps, e->r, NULL,
NULL, 1);
+ if (e->nid)
+ ne = exps_bind_nid(f->exps, e->nid);
if (ne && ne != one && list_position(f->exps, ne) >=
list_position(f->exps, one))
ne = NULL;
if (!ne || ne == one) {
@@ -118,10 +116,8 @@ exp_push_down_prj(mvc *sql, sql_exp *e,
/* possibly a groupby/project column is renamed */
if (is_groupby(f->op) && !list_empty(f->r) && ne->type ==
e_column) {
sql_exp *gbe = NULL;
- if (ne->l)
- gbe = exps_bind_column2(f->r, ne->l, ne->r,
NULL);
- if (!gbe && !e->l)
- gbe = exps_bind_column(f->r, ne->r, NULL, NULL,
1);
+ if (ne->nid)
+ gbe = exps_bind_nid(f->exps, ne->nid);
ne = gbe;
if (!ne || (ne->type != e_column && (ne->type != e_atom
|| ne->f)))
return NULL;
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
@@ -38,7 +38,8 @@ rel_used_projections(mvc *sql, list *exp
for(node *n = users->h; n; n = n->next) {
sql_exp *e = n->data, *ne = NULL;
- if ((e->l && (ne = exps_bind_column2(exps, e->l, e->r, NULL)))
|| (ne = exps_bind_column(exps, e->r, NULL, NULL, 1))) {
+ assert(e->nid && exps_bind_nid(exps, e->nid));
+ if (e->nid && (ne = exps_bind_nid(exps, e->nid))) {
used[list_position(exps, ne)] = 1;
}
}
@@ -584,6 +585,7 @@ rel_push_project_up_(visitor *v, sql_rel
r_exps = rel_projections(v->sql, r, NULL, 1, 1);
if (rel->attr)
append(r_exps, exp_ref(v->sql,
rel->attr->h->data));
+ if (0)
for(n = l_exps->h; n; n = n->next) {
sql_exp *e = n->data;
const char *rname = exp_relname(e);
@@ -591,9 +593,13 @@ rel_push_project_up_(visitor *v, sql_rel
if (exp_is_atom(e))
continue;
+ if (e->alias.label && exps_bind_nid(r_exps,
e->alias.label))
+ return rel;
if ((rname && exps_bind_column2(r_exps, rname,
name, NULL) != NULL) ||
- (!rname && exps_bind_column(r_exps, name,
NULL, NULL, 1) != NULL))
+ (!rname && exps_bind_column(r_exps, name,
NULL, NULL, 1) != NULL)) {
+ assert(0);
return rel;
+ }
}
t = (r->op == op_project && r->l)?r->l:r;
r_exps = rel_projections(v->sql, t, NULL, 1, 1);
@@ -603,9 +609,15 @@ rel_push_project_up_(visitor *v, sql_rel
if (exp_is_atom(e))
continue;
+ if (e->nid && exps_bind_nid(r_exps, e->nid))
+ return rel;
+ if (e->alias.label && exps_bind_nid(r_exps,
e->alias.label))
+ return rel;
if ((e->l && exps_bind_column2(r_exps, e->l,
e->r, NULL) != NULL) ||
- (exps_bind_column(r_exps, e->r, NULL, NULL,
1) != NULL && (!e->l || !e->r)))
+ (exps_bind_column(r_exps, e->r, NULL, NULL,
1) != NULL && (!e->l || !e->r))) {
+ //assert(0);
return rel;
+ }
}
/* conflict with new left expressions */
for(n = r_exps->h; n; n = n->next) {
@@ -613,9 +625,15 @@ rel_push_project_up_(visitor *v, sql_rel
if (exp_is_atom(e))
continue;
+ if (e->nid && exps_bind_nid(l_exps, e->nid))
+ return rel;
+ if (e->alias.label && exps_bind_nid(l_exps,
e->alias.label))
+ return rel;
if ((e->l && exps_bind_column2(l_exps, e->l,
e->r, NULL) != NULL) ||
- (exps_bind_column(l_exps, e->r, NULL, NULL,
1) != NULL && (!e->l || !e->r)))
+ (exps_bind_column(l_exps, e->r, NULL, NULL,
1) != NULL && (!e->l || !e->r))) {
+ //assert(0);
return rel;
+ }
}
}
@@ -1513,7 +1531,7 @@ exp_is_const_op(sql_exp *exp, sql_exp *t
case e_column: {
if (is_simple_project(expr->op) || is_groupby(expr->op)) {
/* in a simple projection, self-references may occur */
- sql_exp *nexp = (exp->l ? exps_bind_column2(expr->exps,
exp->l, exp->r, NULL) : exps_bind_column(expr->exps, exp->r, NULL, NULL, 0));
+ sql_exp *nexp = exps_bind_nid(expr->exps, exp->nid);
if (nexp && list_position(expr->exps, nexp) <
list_position(expr->exps, tope))
return exp_is_const_op(nexp, exp, expr);
}
@@ -1865,22 +1883,13 @@ rel_groupby_cse(visitor *v, sql_rel *rel
if (exp_match_exp(e1, e2) || exp_refers(e1, e2)
|| (e1_sub && e2_sub && (exp_match_exp(e1_sub, e2_sub) || exp_refers(e1_sub,
e2_sub)))) {
/* use e2 from rel->exps instead of e2
from the rel->r as it can have an alias from the higher rel */
- sql_exp *e2_in_exps = (e1->alias.label
!= e2->alias.label) ?
- exps_uses_nid(rel->exps,
e2->alias.label):
- (e2->l && e2->alias.rname ==
e2->l && e2->alias.name == e2->r) ?
- exps_bind_column2(rel->exps,
e2->l, e2->r, NULL) :
- exps_bind_column(rel->exps,
e2->alias.name, NULL, NULL, 0);
+ sql_exp *e2_in_exps =
exps_uses_nid(rel->exps, e2->alias.label);
assert(e2_in_exps);
/* same as e2 */
- sql_exp *e1_in_exps = (e1->alias.label
!= e2->alias.label) ?
- exps_uses_nid(rel->exps,
e1->alias.label):
- (e1->l && e1->alias.rname ==
e1->l && e1->alias.name == e1->r) ?
- exps_bind_column2(rel->exps,
e1->l, e1->r, NULL) :
- exps_bind_column(rel->exps,
e1->alias.name, NULL, NULL, 0);
+ sql_exp *e1_in_exps =
exps_uses_nid(rel->exps, e1->alias.label);
if (!e1_in_exps)
continue;
- assert(e1_in_exps);
/* write e2 as an e1 alias since the
expressions are the same */
sql_exp* e2_as_e1_alias =
exp_copy(v->sql, e1_in_exps);
@@ -2695,10 +2704,8 @@ rel_reduce_groupby_exps(visitor *v, sql_
sql_exp *e = n->data, *ne = NULL;
if (e->type == e_column) {
- if (e->l)
- ne =
exps_bind_column2(dgbe, e->l, e->r, NULL);
- else
- ne =
exps_bind_column(dgbe, e->r, NULL, NULL, 1);
+ if (e->nid)
+ ne =
exps_bind_nid(dgbe, e->nid);
if (ne) {
ne = exp_copy(v->sql,
ne);
exp_prop_alias(v->sql->sa, ne, e);
@@ -2776,12 +2783,7 @@ rel_remove_const_aggr(visitor *v, sql_re
/* remove references to
constant group by columns */
if (e->type == e_column) {
sql_exp *found = NULL;
- const char *nrname =
(const char*) e->l, *nename = (const char*) e->r;
- if (nrname && nename) {
- found =
exps_bind_column2(rel->r, nrname, nename, NULL);
- } else if (nename) {
- found =
exps_bind_column(rel->r, nename, NULL, NULL, 1);
- }
+ found =
exps_bind_nid(rel->r, e->nid);
if (found) {
list_append(nexps, found);
list_remove_node(rel->exps, NULL, n);
@@ -4143,7 +4145,7 @@ rel_distinct_project2groupby_(visitor *v
if (e->type != e_column)
fnd = 1;
- else if (exps_bind_column2(rel->exps, e->l,
e->r, NULL) == 0)
+ else if (exps_bind_nid(rel->exps, e->nid) ==
NULL)
fnd = 1;
}
if (fnd)
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
@@ -1050,11 +1050,8 @@ replace_column_references_with_nulls_2(m
case e_column:
{
sql_exp *c = NULL;
- if (e->l) {
- c = exps_bind_column2(crefs, e->l, e->r, NULL);
- } else {
- c = exps_bind_column(crefs, e->r, NULL, NULL,
1);
- }
+ if (e->nid)
+ c = exps_bind_nid(crefs, e->nid);
if (c) {
e->type = e_atom;
e->l = atom_general(sql->sa, &e->tpe, NULL, 0);
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -3965,14 +3965,11 @@ rewrite_groupings(visitor *v, sql_rel *r
}
nrel->exps = exps;
if (!list_empty(rel->r) &&
!list_empty(nrel->r)) { /* aliases on grouping columns, ugh */
- for (node *n = ((list*)nrel->r)->h ; n
; n = n->next) {
+ for (node *n = ((list*)nrel->r)->h; n;
n = n->next) {
sql_exp *e = n->data;
- const char *rname =
exp_relname(e), *cname = exp_name(e);
- if (rname && cname) {
- n->data =
exp_copy(v->sql, exps_bind_column2(rel->r, rname, cname, NULL));
- } else if (cname) {
- n->data =
exp_copy(v->sql, exps_bind_column(rel->r, cname, NULL, NULL, 1));
- }
+ sql_exp *ne =
exps_bind_nid(rel->r, e->alias.label);
+ if (ne)
+ n->data =
exp_copy(v->sql, ne);
}
list_hash_clear(nrel->r);
}
diff --git a/sql/test/rel-optimizers/Tests/groupjoin.test
b/sql/test/rel-optimizers/Tests/groupjoin.test
--- a/sql/test/rel-optimizers/Tests/groupjoin.test
+++ b/sql/test/rel-optimizers/Tests/groupjoin.test
@@ -13,7 +13,7 @@ project (
| | table("sys"."integers") [ "integers"."i" as "i1"."i" ],
| | project (
| | | table("sys"."integers") [ "integers"."i" ]
-| | ) [ "integers"."i" as "%1"."%1", "%1"."%1" as "integers"."i" ]
-| ) [ ("i1"."i") + = ("%1"."%1"), ("i1"."i") = ("%1"."%1") ] [ boolean(1)
"true" as "%4"."%4" ]
+| | ) [ "integers"."i" as "%1"."%1" ]
+| ) [ ("i1"."i") + = ("%1"."%1") ] [ boolean(1) "true" as "%4"."%4" ]
) [ "i1"."i", "sys"."or"("%4"."%4", "sys"."isnull"("i1"."i") NOT NULL) ]
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]