Changeset: 6ca9a842453b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6ca9a842453b
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_propagate.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
Branch: default
Log Message:
Set new select relations as processed during optimization
diffs (truncated from 421 to 300 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
@@ -1493,7 +1493,9 @@ rel_simplify_project_fk_join(mvc *sql, s
} else {
nr = rel_dup(r->r);
}
- return rel_select(sql->sa, nr, nje);
+ nr = rel_select(sql->sa, nr, nje);
+ set_processed(nr);
+ return nr;
}
static sql_rel *
@@ -1568,7 +1570,9 @@ rel_simplify_count_fk_join(mvc *sql, sql
} else {
nr = rel_dup(r->r);
}
- return rel_select(sql->sa, nr, nje);
+ nr = rel_select(sql->sa, nr, nje);
+ set_processed(nr);
+ return nr;
}
/*
@@ -4343,6 +4347,7 @@ rel_push_select_down(visitor *v, sql_rel
sql_rel *l = rel_select(v->sql->sa, rel->l, NULL);
l->exps = rel->exps;
+ set_processed(l);
rel->exps = NULL;
rel->l = l;
v->changes++;
@@ -4397,8 +4402,7 @@ rel_push_select_down(visitor *v, sql_rel
/* push select through join */
if (is_select(rel->op) && r && is_join(r->op) && !rel_is_ref(r) &&
!is_single(r)){
- sql_rel *jl = r->l;
- sql_rel *jr = r->r;
+ sql_rel *jl = r->l, *ojl = jl, *jr = r->r, *ojr = jr;
int left = r->op == op_join || r->op == op_left;
int right = r->op == op_join || r->op == op_right;
@@ -4427,6 +4431,10 @@ rel_push_select_down(visitor *v, sql_rel
}
n = next;
}
+ if (ojl != jl)
+ set_processed(jl);
+ if (ojr != jr)
+ set_processed(jr);
}
/* merge select and cross product ? */
@@ -4437,7 +4445,7 @@ rel_push_select_down(visitor *v, sql_rel
if (exp_is_join(e, NULL) == 0) {
if (!r->exps)
- r->exps = new_exp_list(v->sql->sa);
+ r->exps = sa_list(v->sql->sa);
append(r->exps, e);
list_remove_node(exps, NULL, n);
v->changes++;
@@ -4447,31 +4455,29 @@ rel_push_select_down(visitor *v, sql_rel
}
if (is_select(rel->op) && r && r->op == op_project && !rel_is_ref(r) &&
!is_single(r)){
- sql_rel *pl = r->l;
+ sql_rel *pl = r->l, *opl = pl;
/* we cannot push through window functions (for safety I
disabled projects over DDL too) */
if (pl && pl->op != op_ddl && !exps_have_unsafe(r->exps, 0)) {
/* introduce selects under the project (if needed) */
set_processed(pl);
- if (pl && (is_select(pl->op) || is_join(pl->op) ||
is_semi(pl->op)) && !pl->exps)
+ if (!pl->exps)
pl->exps = sa_list(v->sql->sa);
for (n = exps->h; n;) {
node *next = n->next;
sql_exp *e = n->data, *ne = NULL;
- if (e->type == e_cmp) {
- ne = exp_push_down_prj(v->sql, e, r,
pl);
-
- /* can we move it down */
- if (ne && ne != e && pl->exps) {
- if (!(is_select(pl->op) &&
is_join(pl->op) && is_semi(pl->op)) || rel_is_ref(pl))
- r->l = pl =
rel_select(v->sql->sa, pl, NULL);
- rel_select_add_exp(v->sql->sa,
pl, ne);
- list_remove_node(exps, NULL, n);
- v->changes++;
- }
+ /* can we move it down */
+ if (e->type == e_cmp && (ne =
exp_push_down_prj(v->sql, e, r, pl)) && ne != e) {
+ if (!(is_select(pl->op) &&
is_join(pl->op) && is_semi(pl->op)) || rel_is_ref(pl))
+ r->l = pl =
rel_select(v->sql->sa, pl, NULL);
+ rel_select_add_exp(v->sql->sa, pl, ne);
+ list_remove_node(exps, NULL, n);
+ v->changes++;
}
n = next;
}
+ if (opl != pl)
+ set_processed(pl);
}
}
@@ -4493,8 +4499,10 @@ rel_push_select_down(visitor *v, sql_rel
/* introduce selects under the set */
ul = rel_select(v->sql->sa, ul, NULL);
ul->exps = exps_copy(v->sql, exps);
+ set_processed(ul);
ur = rel_select(v->sql->sa, ur, NULL);
ur->exps = exps_copy(v->sql, exps);
+ set_processed(ur);
rel = rel_inplace_setop(v->sql, rel, ul, ur, u->op,
rel_projections(v->sql, rel, NULL, 1, 1));
if (need_distinct(u))
@@ -4512,35 +4520,34 @@ rel_push_join_exps_down(visitor *v, sql_
if ((is_innerjoin(rel->op) || is_left(rel->op) || is_right(rel->op) ||
is_semi(rel->op)) && !list_empty(rel->exps)) {
int left = is_innerjoin(rel->op) || is_right(rel->op) ||
/*is_semi(rel->op)*/ rel->op == op_semi;
int right = is_innerjoin(rel->op) || is_left(rel->op) ||
is_semi(rel->op);
-
+ sql_rel *jl = rel->l, *ojl = jl, *jr = rel->r, *ojr = jr;
+
+ set_processed(jl);
+ set_processed(jr);
for (node *n = rel->exps->h; n;) {
node *next = n->next;
sql_exp *e = n->data;
- if (left && rel_rebind_exp(v->sql, rel->l, e)) { /*
select expressions on left */
- sql_rel *l = rel->l;
- if (!is_select(l->op) || rel_is_ref(l)) {
- set_processed(l);
- rel->l = l = rel_select(v->sql->sa,
rel->l, NULL);
- }
- rel_select_add_exp(v->sql->sa, rel->l, e);
+ if (left && rel_rebind_exp(v->sql, jl, e)) { /* select
expressions on left */
+ if (!is_select(jl->op) || rel_is_ref(jl))
+ rel->l = jl = rel_select(v->sql->sa,
jl, NULL);
+ rel_select_add_exp(v->sql->sa, jl, e);
list_remove_node(rel->exps, NULL, n);
v->changes++;
} else if (right && ((rel->op != op_anti && rel->op !=
op_left) || (e->flag != mark_notin && e->flag != mark_in)) &&
- rel_rebind_exp(v->sql, rel->r, e)) {
/* select expressions on right */
- sql_rel *r = rel->r;
- if (!is_select(r->op) || rel_is_ref(r)) {
- set_processed(r);
- rel->r = r = rel_select(v->sql->sa,
rel->r, NULL);
- }
- rel_select_add_exp(v->sql->sa, rel->r, e);
+ rel_rebind_exp(v->sql, jr, e)) { /*
select expressions on right */
+ if (!is_select(jr->op) || rel_is_ref(jr))
+ rel->r = jr = rel_select(v->sql->sa,
jr, NULL);
+ rel_select_add_exp(v->sql->sa, jr, e);
list_remove_node(rel->exps, NULL, n);
v->changes++;
}
n = next;
}
- if (is_join(rel->op) && list_empty(rel->exps))
- rel->exps = NULL; /* crossproduct */
+ if (ojl != jl)
+ set_processed(jl);
+ if (ojr != jr)
+ set_processed(jr);
}
return rel;
}
@@ -4753,23 +4760,25 @@ rel_push_semijoin_down_or_up(visitor *v,
}
/* first push down the expressions involving only A */
if (rel->op == op_semi && rel->exps && rel->l) {
+ sql_rel *jl = rel->l, *ojl = jl;
+
+ set_processed(jl);
for (node *n = rel->exps->h; n;) {
node *next = n->next;
sql_exp *e = n->data;
- if (n != rel->exps->h && e->type == e_cmp &&
rel_rebind_exp(v->sql, rel->l, e)) {
- sql_rel *l = rel->l;
- if (!is_select(l->op) || rel_is_ref(l)) {
- set_processed(l);
- rel->l = l = rel_select(v->sql->sa,
rel->l, NULL);
- }
- rel_select_add_exp(v->sql->sa, rel->l, e);
+ if (n != rel->exps->h && e->type == e_cmp &&
rel_rebind_exp(v->sql, jl, e)) {
+ if (!is_select(jl->op) || rel_is_ref(jl))
+ rel->l = jl = rel_select(v->sql->sa,
jl, NULL);
+ rel_select_add_exp(v->sql->sa, jl, e);
list_remove_node(rel->exps, NULL, n);
if (level <= 0)
v->changes++;
}
n = next;
}
+ if (ojl != jl)
+ set_processed(jl);
}
if (rel->op == op_semi && rel->exps && rel->l) {
operator_type op = rel->op, lop;
@@ -8955,6 +8964,7 @@ merge_table_prune_and_unionize(visitor *
list *converted = sa_list(v->sql->sa);
nrel = rel_project_exp(v->sql, exp_atom_bool(v->sql->sa, 1));
nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa,
0));
+ set_processed(nrel);
for (node *n = mt_rel->exps->h ; n ; n = n->next) {
sql_exp *e = n->data, *a = exp_atom(v->sql->sa,
atom_general(v->sql->sa, exp_subtype(e), NULL));
@@ -8973,6 +8983,7 @@ merge_table_prune_and_unionize(visitor *
} else if (info) { /* propagate select under union */
next = rel_select(v->sql->sa, next, NULL);
next->exps = exps_copy(v->sql, info->sel->exps);
+ set_processed(next);
}
if (nrel) {
@@ -9363,6 +9374,7 @@ rel_remove_union_partitions(visitor *v,
list *converted = sa_list(v->sql->sa);
sql_rel *nrel = rel_project_exp(v->sql,
exp_atom_bool(v->sql->sa, 1));
nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa,
0));
+ set_processed(nrel);
for (node *n = rel->exps->h ; n ; n = n->next) {
sql_exp *e = n->data, *a = exp_atom(v->sql->sa,
atom_general(v->sql->sa, exp_subtype(e), NULL));
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -214,6 +214,7 @@ create_range_partition_anti_rel(sql_quer
}
anti_rel = rel_select(sql->sa, anti_rel, anti_exp);
+ set_processed(anti_rel);
anti_rel = rel_groupby(sql, anti_rel, NULL);
aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_rel->card, 0);
(void) rel_groupby_add_aggr(sql, anti_rel, aggr);
@@ -257,6 +258,7 @@ create_list_partition_anti_rel(sql_query
}
anti_rel = rel_select(sql->sa, anti_rel, anti_exp);
+ set_processed(anti_rel);
anti_rel = rel_groupby(sql, anti_rel, NULL);
aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_rel->card, 0);
(void) rel_groupby_add_aggr(sql, anti_rel, aggr);
@@ -781,8 +783,10 @@ rel_generate_subinserts(sql_query *query
} else if (range) {
accum = exp_copy(sql, range);
}
- if (full_range)
+ if (full_range) {
dup = rel_select(sql->sa, dup, full_range);
+ set_processed(dup);
+ }
} else if (isListPartitionTable(t)) {
sql_exp *ein = NULL;
@@ -812,6 +816,7 @@ rel_generate_subinserts(sql_query *query
found_nils = 1;
}
dup = rel_select(sql->sa, dup, ein);
+ set_processed(dup);
} else {
assert(0);
}
@@ -865,6 +870,7 @@ rel_generate_subinserts(sql_query *query
}
/* generate a count aggregation for the values not present in
any of the partitions */
anti_rel = rel_select(sql->sa, anti_rel, anti_exp);
+ set_processed(anti_rel);
anti_rel = rel_groupby(sql, anti_rel, NULL);
aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_rel->card, 0);
(void) rel_groupby_add_aggr(sql, anti_rel, aggr);
@@ -1040,6 +1046,7 @@ rel_subtable_insert(sql_query *query, sq
if (!found_all_range_values || !found_nils) {
/* generate a count aggregation for the values not present in
any of the partitions */
anti_dup = rel_select(sql->sa, anti_dup, anti_exp);
+ set_processed(anti_dup);
anti_dup = rel_groupby(sql, anti_dup, NULL);
aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_dup->card, 0);
(void) rel_groupby_add_aggr(sql, anti_dup, aggr);
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
@@ -1077,6 +1077,7 @@ push_up_select(mvc *sql, sql_rel *rel, l
rel->r = rel_dup(r->l);
rel = rel_select(sql->sa, rel, NULL);
rel->exps = !cp?exps:exps_copy(sql, exps);
+ set_processed(rel);
rel_destroy(r);
}
return rel;
@@ -1242,6 +1243,7 @@ push_up_groupby(mvc *sql, sql_rel *rel,
if (list_length(sexps)) {
r = rel_select(sql->sa, r, NULL);
r->exps = sexps;
+ set_processed(r);
}
return r;
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]