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