Changeset: 40af3ffcd4dc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/40af3ffcd4dc
Modified Files:
sql/server/rel_optimizer.c
Branch: default
Log Message:
Only rewrite only if relation has one reference, and don't forget to destroy
previous relation before replacing it. Added defensive lines
diffs (71 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
@@ -9391,11 +9391,12 @@ rel_first_level_optimizations(visitor *v
static sql_rel *
rel_optimize_select_and_joins_bottomup(visitor *v, sql_rel *rel)
{
- if ((!is_join(rel->op) && !is_semi(rel->op) && !is_select(rel->op)) ||
list_empty(rel->exps))
+ if (!rel || (!is_join(rel->op) && !is_semi(rel->op) &&
!is_select(rel->op)) || list_empty(rel->exps))
return rel;
int level = *(int*) v->data;
- rel->exps = exp_merge_range(v, rel, rel->exps);
+ if (rel)
+ rel->exps = exp_merge_range(v, rel, rel->exps);
if (v->value_based_opt)
rel = rel_reduce_casts(v, rel);
rel = rel_select_cse(v, rel);
@@ -9424,7 +9425,8 @@ rel_optimize_unions_topdown(visitor *v,
static inline sql_rel *
rel_basecount(visitor *v, sql_rel *rel)
{
- if (is_groupby(rel->op) && rel->l && !rel->r && list_length(rel->exps)
== 1 && exp_aggr_is_count(rel->exps->h->data)) {
+ if (is_groupby(rel->op) && !rel_is_ref(rel) && rel->l &&
list_empty(rel->r) &&
+ list_length(rel->exps) == 1 &&
exp_aggr_is_count(rel->exps->h->data)) {
sql_rel *bt = rel->l;
sql_exp *e = rel->exps->h->data;
if (is_basetable(bt->op) && list_empty(e->l)) { /* count(*) */
@@ -9441,6 +9443,7 @@ rel_basecount(visitor *v, sql_rel *rel)
ne = exp_propagate(v->sql->sa, ne, e);
exp_setname(v->sql->sa, ne, exp_find_rel_name(e),
exp_name(e));
+ rel_destroy(rel);
rel = rel_project(v->sql->sa, NULL,
append(sa_list(v->sql->sa), ne));
v->changes++;
}
@@ -9501,7 +9504,7 @@ rel_optimize_projections(visitor *v, sql
{
rel = rel_project_cse(v, rel);
- if (!is_groupby(rel->op))
+ if (!rel || !is_groupby(rel->op))
return rel;
rel = rel_push_aggr_down(v, rel);
@@ -9532,13 +9535,13 @@ static sql_rel *
rel_optimize_semi_and_anti(visitor *v, sql_rel *rel)
{
/* rewrite semijoin (A, join(A,B)) into semijoin (A,B) */
- if (is_semi(rel->op))
+ if (rel && is_semi(rel->op))
rel = rel_rewrite_semijoin(v, rel);
/* push semijoin through join */
- if (is_semi(rel->op) || is_innerjoin(rel->op))
+ if (rel && (is_semi(rel->op) || is_innerjoin(rel->op)))
rel = rel_push_semijoin_down_or_up(v, rel);
/* antijoin(a, union(b,c)) -> antijoin(antijoin(a,b), c) */
- if (rel->op == op_anti)
+ if (rel && rel->op == op_anti)
rel = rel_rewrite_antijoin(v, rel);
return rel;
}
@@ -9553,7 +9556,7 @@ rel_optimize_select_and_joins_topdown(vi
rel = rel_simplify_fk_joins(v, rel);
rel = rel_push_select_down(v, rel);
- if (rel->l && (is_select(rel->op) || is_join(rel->op)))
+ if (rel && rel->l && (is_select(rel->op) || is_join(rel->op)))
rel = rel_use_index(v, rel);
if (!is_select(rel->op) || list_empty(rel->exps))
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list