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