Changeset: d8260ac0adad for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d8260ac0adad
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_rel.c
sql/server/rel_unnest.c
Branch: Jun2020
Log Message:
When propagating an expression, call exp_prop_alias so the label can get
propagated
diffs (277 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3070,21 +3070,25 @@ exp_simplify_math( mvc *sql, sql_exp *e,
if (exp_is_atom(le) && exp_is_null(sql, le)) {
(*changes)++;
if (f && f->func && f->func->imp &&
strstr(f->func->imp, "_no_nil") != NULL) {
- exp_setname(sql->sa, re,
exp_relname(e), exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, re, e);
return re;
}
le = exp_null(sql->sa, et);
- exp_setname(sql->sa, le, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, le, e);
return le;
}
if (exp_is_atom(re) && exp_is_null(sql, re)) {
(*changes)++;
if (f && f->func && f->func->imp &&
strstr(f->func->imp, "_no_nil") != NULL) {
- exp_setname(sql->sa, le,
exp_relname(e), exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, le, e);
return le;
}
re = exp_null(sql->sa, et);
- exp_setname(sql->sa, re, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, re, e);
return re;
}
}
@@ -3097,27 +3101,31 @@ exp_simplify_math( mvc *sql, sql_exp *e,
if (exp_is_atom(le) && exp_is_zero(sql, le) &&
exp_is_atom(re) && exp_is_not_null(sql, re)) {
(*changes)++;
le = exp_zero(sql->sa, et);
- exp_setname(sql->sa, le, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, le, e);
return le;
}
/* a*0 = 0 */
if (exp_is_atom(re) && exp_is_zero(sql, re) &&
exp_is_atom(le) && exp_is_not_null(sql, le)) {
(*changes)++;
re = exp_zero(sql->sa, et);
- exp_setname(sql->sa, re, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, re, e);
return re;
}
/* 1*a = a
if (exp_is_atom(le) && exp_is_one(sql, le)) {
(*changes)++;
- exp_setname(sql->sa, re, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, re, e);
return re;
}
*/
/* a*1 = a
if (exp_is_atom(re) && exp_is_one(sql, re)) {
(*changes)++;
- exp_setname(sql->sa, le, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, le, e);
return le;
}
*/
@@ -3132,7 +3140,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
if (a && atom_cast(sql->sa, a,
exp_subtype(e))) {
sql_exp *ne = exp_atom(sql->sa,
a);
(*changes)++;
- exp_setname(sql->sa, ne,
exp_relname(e), exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa,
ne, e);
return ne;
}
}
@@ -3162,7 +3171,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
append(l, re);
(*changes)++;
ne = exp_op(sql->sa, l, pow);
- exp_setname(sql->sa, ne, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, ne, e);
return ne;
}
/* change a*pow(a,n) or pow(a,n)*a into pow(a,n+1) */
@@ -3176,7 +3186,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
if (exp_equal(re, lle)==0) {
if (atom_inc(exp_value(sql,
lre, sql->args, sql->argc))) {
(*changes)++;
- exp_setname(sql->sa,
le, exp_relname(e), exp_name(e));
+ if (exp_name(e))
+
exp_prop_alias(sql->sa, le, e);
return le;
}
}
@@ -3211,12 +3222,14 @@ exp_simplify_math( mvc *sql, sql_exp *e,
sql_exp *re = l->h->next->data;
if (exp_is_atom(le) && exp_is_zero(sql, le)) {
(*changes)++;
- exp_setname(sql->sa, re, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, re, e);
return re;
}
if (exp_is_atom(re) && exp_is_zero(sql, re)) {
(*changes)++;
- exp_setname(sql->sa, le, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, le, e);
return le;
}
if (exp_is_atom(le) && exp_is_atom(re)) {
@@ -3229,7 +3242,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
if (a) {
sql_exp *ne = exp_atom(sql->sa,
a);
(*changes)++;
- exp_setname(sql->sa, ne,
exp_relname(e), exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa,
ne, e);
return ne;
}
}
@@ -3297,7 +3311,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
if (a) {
sql_exp *ne = exp_atom(sql->sa,
a);
(*changes)++;
- exp_setname(sql->sa, ne,
exp_relname(e), exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa,
ne, e);
return ne;
}
}
@@ -3315,7 +3330,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
}
ne = exp_atom(sql->sa, a);
(*changes)++;
- exp_setname(sql->sa, ne, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, ne, e);
return ne;
}
if (is_func(le->type)) {
@@ -3326,7 +3342,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
sql_exp *lre = ll->h->next->data;
if (exp_equal(re, lre) == 0) {
/* (x+a)-a = x*/
- exp_setname(sql->sa, lle,
exp_relname(e), exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa,
lle, e);
(*changes)++;
return lle;
}
@@ -4054,7 +4071,8 @@ rel_merge_project_rse(visitor *v, sql_re
if (between) {
sql_exp *ne =
exp_op(v->sql->sa, ops, between);
- exp_setname(v->sql->sa, ne,
exp_relname(e), exp_name(e));
+ if (exp_name(e))
+
exp_prop_alias(v->sql->sa, ne, e);
e = ne;
}
v->changes++;
@@ -7899,12 +7917,14 @@ rel_simplify_ifthenelse(visitor *v, sql_
if (exp_is_true(v->sql, ie)) { /* ifthenelse(true, x,
y) -> x */
sql_exp *res = args->h->next->data;
- exp_setname(v->sql->sa, res, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(v->sql->sa, res, e);
v->changes++;
return res;
} else if (exp_is_false(v->sql, ie) ||
exp_is_null(v->sql, ie)) { /* ifthenelse(false or null, x, y) -> y */
sql_exp *res = args->h->next->next->data;
- exp_setname(v->sql->sa, res, exp_relname(e),
exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(v->sql->sa, res, e);
v->changes++;
return res;
}
@@ -8733,7 +8753,8 @@ add_nulls(mvc *sql, sql_rel *rel, sql_re
sql_exp *e = n->data, *ne;
ne = exp_atom(sql->sa, atom_general(sql->sa, exp_subtype(e),
NULL));
- exp_setname(sql->sa, ne, exp_relname(e), exp_name(e));
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, ne, e);
append(rel->exps, ne);
}
}
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1164,12 +1164,11 @@ rel_safe_project(mvc *sql, sql_rel *rel)
assert(!list_empty(rel->exps));
for(node *n = rel->exps->h; n; n=n->next) {
sql_exp *e = n->data, *ne;
- const char *cname = exp_name(e);
- const char *rname = exp_relname(e);
n->data = e = exp_label(sql->sa, e, ++sql->label);
ne = exp_ref(sql, e);
- exp_setname(sql->sa, ne, rname, cname);
+ if (exp_name(e))
+ exp_prop_alias(sql->sa, ne, e);
append(nexps, ne);
}
list_hash_clear(rel->exps);
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
@@ -2606,10 +2606,10 @@ rewrite_exists(visitor *v, sql_rel *rel,
sql_rel *sq = NULL;
if (!exp_is_rel(ie)) { /* exists over a constant or a
single value */
- const char *rname = exp_relname(e), *name =
exp_name(e);
- e = exp_atom_bool(v->sql->sa,
is_exists(sf)?1:0);
- exp_setname(v->sql->sa, e, rname, name);
- return e;
+ le = exp_atom_bool(v->sql->sa,
is_exists(sf)?1:0);
+ if (exp_name(e))
+ exp_prop_alias(v->sql->sa, le, e);
+ return le;
}
sq = exp_rel_get_rel(v->sql->sa, ie); /* get subquery */
@@ -2836,7 +2836,6 @@ rewrite_fix_count(visitor *v, sql_rel *r
sql_exp *e = n->data, *ne;
if (exp_is_count(e, r)) {
- const char *rname = exp_relname(e),
*name = exp_name(e);
/* rewrite count in subquery */
list *args, *targs;
sql_subfunc *isnil =
sql_bind_func(v->sql->sa, NULL, "isnull", exp_subtype(e), NULL, F_FUNC),
*ifthen;
@@ -2853,9 +2852,10 @@ rewrite_fix_count(visitor *v, sql_rel *r
append(args, ne);
append(args, exp_atom(v->sql->sa,
atom_zero_value(v->sql->sa, exp_subtype(e))));
append(args, e);
- e = exp_op(v->sql->sa, args, ifthen);
- exp_setname(v->sql->sa, e, rname, name);
- n->data = e;
+ ne = exp_op(v->sql->sa, args, ifthen);
+ if (exp_name(e))
+ exp_prop_alias(v->sql->sa, ne,
e);
+ n->data = ne;
}
}
if (rel_changes) { /* add project */
@@ -2933,11 +2933,13 @@ rewrite_groupings(visitor *v, sql_rel *r
}
ne = exp_atom(v->sql->sa, a);
- exp_setname(v->sql->sa, ne,
e->alias.rname, e->alias.name);
+ if (exp_name(e))
+
exp_prop_alias(v->sql->sa, ne, e);
} else if (e->type == e_column &&
!exps_find_exp(l, e) && !has_label(e)) {
/* do not include in the output
of the group by, but add to the project as null */
ne = exp_atom(v->sql->sa,
atom_general(v->sql->sa, exp_subtype(e), NULL));
- exp_setname(v->sql->sa, ne,
e->alias.rname, e->alias.name);
+ if (exp_name(e))
+
exp_prop_alias(v->sql->sa, ne, e);
} else {
ne = exp_ref(v->sql, e);
append(exps, e);
@@ -2984,7 +2986,8 @@ rewrite_groupings(visitor *v, sql_rel *r
if (e->type == e_aggr && !agr->func->s
&& !strcmp(agr->func->base.name, "grouping")) {
ne = exp_atom(v->sql->sa,
atom_int(v->sql->sa, bt, 0));
- exp_setname(v->sql->sa, ne,
e->alias.rname, e->alias.name);
+ if (exp_name(e))
+
exp_prop_alias(v->sql->sa, ne, e);
} else {
ne = exp_ref(v->sql, e);
append(exps, e);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list