Changeset: 871baa54ab84 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/871baa54ab84
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimize_proj.c
        sql/server/rel_unnest.c
        sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.test
        sql/test/miscellaneous/Tests/simple_plans.test
Branch: label
Log Message:

cleanup more string based lookups


diffs (250 lines):

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
@@ -753,6 +753,8 @@ exp_propagate(allocator *sa, sql_exp *ne
                set_no_nil(ne);
        if (!has_nil(oe))
                set_has_no_nil(ne);
+       if (has_nil(oe))
+               set_has_nil(ne);
        if (is_unique(oe))
                set_unique(ne);
        if (is_basecol(oe))
@@ -780,6 +782,8 @@ exp_ref_by_label(allocator *sa, sql_exp 
                e->tpe = *t;
        if (!has_nil(o))
                set_has_no_nil(e);
+       if (has_nil(o))
+               set_has_nil(e);
        if (is_unique(o))
                set_unique(e);
        if (is_intern(o))
@@ -1846,6 +1850,55 @@ rel_find_exp(sql_rel *rel, sql_exp *e)
        return rel_find_exp_and_corresponding_rel(rel, e, false, NULL, NULL);
 }
 
+bool
+rel_find_nid(sql_rel *rel, int nid)
+{
+       if (rel) {
+               switch(rel->op) {
+               case op_left:
+               case op_right:
+               case op_full:
+               case op_join:
+               case op_semi:
+               case op_anti:
+                       if (rel_find_nid(rel->l, nid))
+                               return true;
+                       if (is_join(rel->op))
+                               return rel_find_nid(rel->r, nid);
+                       break;
+               case op_table:
+               case op_basetable:
+               case op_munion:
+               case op_union:
+               case op_inter:
+               case op_except:
+               case op_project:
+               case op_groupby:
+                       if (rel->exps) {
+                               if (exps_bind_nid(rel->exps, nid))
+                                       return true;
+                       } else if (rel->op == op_basetable)
+                               return rel_base_has_nid(rel, nid);
+                       break;
+               case op_select:
+               case op_topn:
+               case op_sample:
+                       if (rel_find_nid(rel->l, nid))
+                               return true;
+                       break;
+               case op_ddl:
+               case op_insert:
+               case op_update:
+               case op_delete:
+               case op_truncate:
+               case op_merge:
+                       return false;
+
+               }
+       }
+       return false;
+}
+
 int
 exp_is_true(sql_exp *e)
 {
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -140,6 +140,7 @@ extern const char *exp_find_rel_name(sql
 
 extern sql_exp *rel_find_exp(sql_rel *rel, sql_exp *e);
 extern sql_exp *rel_find_exp_and_corresponding_rel(sql_rel *rel, sql_exp *e, 
bool subexp, sql_rel **res, bool *under_join);
+extern bool rel_find_nid(sql_rel *rel, int nid);
 
 extern int exp_cmp( sql_exp *e1, sql_exp *e2);
 extern int exp_equal( sql_exp *e1, sql_exp *e2);
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
@@ -387,10 +387,8 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel
                        return e;
                sql_exp *oe = e;
                e = NULL;
-               if (exp_name(ne) && ne->r && ne->l)
-                       e = rel_bind_column2(sql, t, ne->l, ne->r, 0);
-               if (!e && ne->r)
-                       e = rel_bind_column(sql, t, ne->r, 0, 1);
+               if (ne && ne->nid)
+                       e = rel_find_exp(t, ne);
                if (!e) {
                        sql->session->status = 0;
                        sql->errstr[0] = 0;
@@ -398,7 +396,10 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel
                                return ne;
                        return oe;
                }
-               return exp_ref(sql, e);
+               ne = exp_ref(sql, e);
+               if (oe)
+                       exp_propagate(sql->sa, ne, oe);
+               return ne;
        case e_cmp:
                if (e->flag == cmp_or || e->flag == cmp_filter) {
                        e->l = exps_rename(sql, e->l, f, t);
@@ -585,22 +586,6 @@ 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);
-                               const char *name = exp_name(e);
-
-                               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)) {
-                       assert(0);
-                                       return rel;
-                               }
-                       }
                        t = (r->op == op_project && r->l)?r->l:r;
                        r_exps = rel_projections(v->sql, t, NULL, 1, 1);
                        /* conflict with new right expressions */
@@ -613,11 +598,6 @@ rel_push_project_up_(visitor *v, sql_rel
                                        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))) {
-                       //assert(0);
-                                       return rel;
-                               }
                        }
                        /* conflict with new left expressions */
                        for(n = r_exps->h; n; n = n->next) {
@@ -629,11 +609,6 @@ rel_push_project_up_(visitor *v, sql_rel
                                        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))) {
-                       //assert(0);
-                                       return rel;
-                               }
                        }
                }
 
@@ -784,8 +759,7 @@ add_exp_too_project(mvc *sql, sql_exp *e
                sql_exp *ne = n->data;
 
                if (rel && rel->l) {
-                       if ((exp_relname(ne) && exp_name(ne) && 
rel_bind_column2(sql, rel->l, exp_relname(ne), exp_name(ne), 0)) ||
-                          (!exp_relname(ne) && exp_name(ne) && 
rel_bind_column(sql, rel->l, exp_name(ne), 0, 1))) {
+                       if (ne && ne->alias.label && rel_find_nid(rel->l, 
ne->alias.label)) {
                                exp_label(sql->sa, e, ++sql->label);
                                append(rel->exps, e);
                                ne = e;
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
@@ -46,8 +46,7 @@ exp_set_freevar(mvc *sql, sql_exp *e, sq
                        exps_set_freevar(sql, e->l, r);
                break;
        case e_column:
-               if ((e->l && rel_bind_column2(sql, r, e->l, e->r, 0)) ||
-                   (!e->l && rel_bind_column(sql, r, e->r, 0, 1)))
+               if (rel_find_nid(r, e->nid))
                        return;
                set_freevar(e, 0);
                break;
diff --git a/sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.test 
b/sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.test
--- a/sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.test
+++ b/sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.test
@@ -59,18 +59,14 @@ project (
 | | | table("sys"."v") [ "v"."a1" UNIQUE, "v"."a2" ],
 | | | project (
 | | | | crossproduct (
-| | | | | project (
-| | | | | | select (
-| | | | | | | table("sys"."input_double") [ "input_double"."a1" UNIQUE, 
"input_double"."a2" UNIQUE ]
-| | | | | | ) [ ("input_double"."a1" UNIQUE) = (varchar "latitude") ]
-| | | | | ) [ "input_double"."a2" UNIQUE as "tmp_2"."a2" ],
-| | | | | project (
-| | | | | | select (
-| | | | | | | table("sys"."input_double") [ "input_double"."a1" UNIQUE, 
"input_double"."a2" UNIQUE ]
-| | | | | | ) [ ("input_double"."a1" UNIQUE) = (varchar "longitude") ]
-| | | | | ) [ "input_double"."a2" UNIQUE as "tmp_3"."a2" ]
+| | | | | select (
+| | | | | | table("sys"."input_double") [ "input_double"."a1" UNIQUE, 
"input_double"."a2" UNIQUE ]
+| | | | | ) [ ("input_double"."a1" UNIQUE) = (varchar "latitude") ],
+| | | | | select (
+| | | | | | table("sys"."input_double") [ "input_double"."a1" UNIQUE, 
"input_double"."a2" UNIQUE ]
+| | | | | ) [ ("input_double"."a1" UNIQUE) = (varchar "longitude") ]
 | | | | ) [  ]
-| | | ) [ "sys"."st_point"("tmp_2"."a2", "tmp_3"."a2") as "a1" ]
+| | | ) [ "sys"."st_point"("input_double"."a2", "input_double"."a2") as "a1" ]
 | | ) [  ]
 | ) [ "v"."a1" as "a1", "sys"."st_distance"("v"."a2", "a1") as "prob" ]
 ) [ "a1" as "r"."a1", "prob" as "r"."prob" ]
diff --git a/sql/test/miscellaneous/Tests/simple_plans.test 
b/sql/test/miscellaneous/Tests/simple_plans.test
--- a/sql/test/miscellaneous/Tests/simple_plans.test
+++ b/sql/test/miscellaneous/Tests/simple_plans.test
@@ -385,23 +385,15 @@ PLAN SELECT 1 FROM view1 s INNER JOIN vi
 ----
 project (
 | join (
-| | project (
-| | | table("sys"."tabel3") [ "tabel3"."id_nr" as "a"."id_nr" ]
-| | ) [ "a"."id_nr" ],
-| | project (
-| | | left outer join (
-| | | | join (
-| | | | | project (
-| | | | | | table("sys"."tabel1") [ "tabel1"."id_nr" UNIQUE as "a"."id_nr" ]
-| | | | | ) [ "a"."id_nr" UNIQUE as "s"."id_nr" ],
-| | | | | project (
-| | | | | | table("sys"."tabel2") [ "tabel2"."id_nr" as "a"."id_nr" ]
-| | | | | ) [ "a"."id_nr" as "h"."id_nr" ]
-| | | | ) [ ("s"."id_nr" UNIQUE) = ("h"."id_nr") ],
+| | table("sys"."tabel3") [ "tabel3"."id_nr" as "a"."id_nr" ],
+| | left outer join (
+| | | join (
+| | | | table("sys"."tabel1") [ "tabel1"."id_nr" UNIQUE as "a"."id_nr" ],
 | | | | table("sys"."tabel2") [ "tabel2"."id_nr" as "a"."id_nr" ]
-| | | ) [ ("h"."id_nr" NOT NULL) = ("a"."id_nr") ]
-| | ) [ "s"."id_nr" NOT NULL ]
-| ) [ ("a"."id_nr") = ("s"."id_nr" NOT NULL) ]
+| | | ) [ ("a"."id_nr" UNIQUE) = ("a"."id_nr") ],
+| | | table("sys"."tabel2") [ "tabel2"."id_nr" as "a"."id_nr" ]
+| | ) [ ("a"."id_nr" NOT NULL) = ("a"."id_nr") ]
+| ) [ ("a"."id_nr") = ("a"."id_nr" NOT NULL) ]
 ) [ tinyint(1) "1" ]
 
 statement ok
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to