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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to