Changeset: 1bd118dc2235 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1bd118dc2235
Modified Files:
sql/server/rel_exp.c
sql/server/rel_optimizer.c
sql/server/rel_rel.c
sql/server/rel_rel.h
sql/server/rel_rewriter.c
sql/server/rel_select.c
sql/server/rel_unnest.c
Branch: default
Log Message:
Clear the list hash only when a visitor does changes. This speeds up SQL
optimization significantly.
This requires a visitor to flag whenever a change is made, and helps to find
bugs with optimizers, because some expressions may get deleted by rel_dce if
the hash is not cleared.
diffs (truncated from 934 to 300 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
@@ -2158,7 +2158,6 @@ exp_rel_update_exps(mvc *sql, list *exps
else if (!exp_is_atom(e))
exp_rel_update_set_freevar(e);
}
- list_hash_clear(exps);
return exps;
}
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
@@ -1915,7 +1915,7 @@ rel_rename_exps( mvc *sql, list *exps1,
rname = exp_relname(e2);
exp_setalias(e2, rname, exp_name(e1));
}
- exps2->ht = NULL;
+ list_hash_clear(exps2);
}
static sql_rel *
@@ -2399,7 +2399,7 @@ rel_distinct_aggregate_on_unique_values(
}
if (all_unique) {
set_nodistinct(exp);
- v->changes = 1;
+ v->changes++;
}
}
}
@@ -2531,13 +2531,16 @@ rel_distinct_project2groupby(visitor *v,
set_nodistinct(rel);
if (rel->card > CARD_ATOM) /* if the projection just contains
constants, then no topN is needed */
rel->l = rel_topn(v->sql->sa, rel->l,
append(sa_list(v->sql->sa), exp_atom_lng(v->sql->sa, 1)));
+ v->changes++;
}
/* rewrite distinct project [ pk ] ( select ( table ) [ e op val ])
* into project [ pk ] ( select/semijoin ( table ) */
if (rel->op == op_project && rel->l && !rel->r /* no order by */ &&
need_distinct(rel) &&
- (l->op == op_select || l->op == op_semi) && exps_unique(v->sql,
rel, rel->exps))
+ (l->op == op_select || l->op == op_semi) && exps_unique(v->sql,
rel, rel->exps)) {
set_nodistinct(rel);
+ v->changes++;
+ }
/* rewrite distinct project ( join(p,f) [ p.pk = f.fk ] ) [ p.pk ]
* into project( (semi)join(p,f) [ p.pk = f.fk ] ) [ p.pk ] */
@@ -2589,7 +2592,7 @@ rel_distinct_project2groupby(visitor *v,
rel->l = rel_dup(side);
rel_destroy(l);
- v->changes = 1;
+ v->changes++;
set_nodistinct(rel);
return rel;
}
@@ -2605,7 +2608,7 @@ rel_distinct_project2groupby(visitor *v,
l->op = op_semi;
}
}
- v->changes = 1;
+ v->changes++;
set_nodistinct(rel);
return rel;
}
@@ -2638,8 +2641,10 @@ rel_distinct_project2groupby(visitor *v,
fnd = 0;
}
}
- if (fnd == (list_length(gbe)+1))
+ if (fnd == (list_length(gbe)+1)) {
+ v->changes++;
set_nodistinct(rel);
+ }
}
}
if (rel->op == op_project && rel->l &&
@@ -2681,7 +2686,7 @@ rel_distinct_project2groupby(visitor *v,
rel = rel_project(v->sql->sa, rel,
rel_projections(v->sql, rel, NULL, 1, 1));
rel->r = obe;
}
- v->changes = 1;
+ v->changes++;
}
return rel;
}
@@ -3224,7 +3229,7 @@ rel_simplify_math(visitor *v, sql_rel *r
int ochanges = 0;
if ((is_project(rel->op) || (rel->op == op_ddl && rel->flag ==
ddl_psm)) && rel->exps) {
- int needed = 0, clean_hash = 0;
+ int needed = 0;
for (node *n = rel->exps->h; n && !needed; n = n->next) {
sql_exp *e = n->data;
@@ -3236,16 +3241,12 @@ rel_simplify_math(visitor *v, sql_rel *r
return rel;
for (node *n = rel->exps->h; n; n = n->next) {
- sql_exp *e = n->data, *ne = exp_simplify_math(v->sql,
e, &ochanges);
-
- if (!e)
+ sql_exp *ne = exp_simplify_math(v->sql, n->data,
&ochanges);
+
+ if (!ne)
return NULL;
- if (ne != e)
- clean_hash = 1;
n->data = ne;
}
- if (clean_hash)
- list_hash_clear(rel->exps);
}
v->changes += ochanges;
return rel;
@@ -3949,7 +3950,9 @@ rel_merge_select_rse(visitor *v, sql_rel
list *ps = exps_merge_select_rse(v->sql, e->l,
e->r, &merged);
for (o = ps->h; o; o = o->next)
append(nexps, o->data);
- if (!merged)
+ if (merged)
+ v->changes++;
+ else
append(nexps, e);
} else {
append(nexps, e);
@@ -4231,7 +4234,6 @@ gen_push_groupby_down(mvc *sql, sql_rel
sql_rel *j = rel->l;
list *gbe = rel->r;
- (void)changes;
if (rel->op == op_groupby && list_length(gbe) == 1 && j->op == op_join){
sql_rel *jl = j->l, *jr = j->r, *cr, *cl;
sql_exp *gb = gbe->h->data, *e;
@@ -4333,6 +4335,7 @@ gen_push_groupby_down(mvc *sql, sql_rel
rel_destroy(j);
j = r;
}
+ (*changes)++;
return j;
}
return rel;
@@ -4422,9 +4425,9 @@ rel_push_groupby_down(visitor *v, sql_re
exp_prop_alias(v->sql->sa, ge, pe);
/* zap both project and groupby name hash
tables (as we changed names above) */
- rel->exps->ht = NULL;
- ((list*)rel->r)->ht = NULL;
- p->exps->ht = NULL;
+ list_hash_clear(rel->exps);
+ list_hash_clear((list*)rel->r);
+ list_hash_clear(p->exps);
/* add join */
j->l = rel;
@@ -4766,6 +4769,7 @@ rel_push_join_down(visitor *v, sql_rel *
/* push join's left side (as semijoin) down group by */
l = gb->l = rel_crossproduct(v->sql->sa, gb->l, l,
op_semi);
l->exps = jes;
+ v->changes++;
return rel;
}
}
@@ -4979,12 +4983,14 @@ rel_join_push_exps_down(visitor *v, sql_
if (!lexps)
lexps=sa_list(v->sql->sa);
append(lexps, e);
+ v->changes++;
list_remove_node(rel->exps, NULL, n);
/* select expressions on right */
} else if (re) {
if (!rexps)
rexps=sa_list(v->sql->sa);
append(rexps, e);
+ v->changes++;
list_remove_node(rel->exps, NULL, n);
}
n = next;
@@ -4996,7 +5002,6 @@ rel_join_push_exps_down(visitor *v, sql_
l = rel->l = rel_select(v->sql->sa, rel->l,
NULL);
l->exps = lexps;
}
- v->changes++;
}
if (rexps) {
if (is_select(r->op)) {
@@ -5005,7 +5010,6 @@ rel_join_push_exps_down(visitor *v, sql_
r = rel->r = rel_select(v->sql->sa, rel->r,
NULL);
r->exps = rexps;
}
- v->changes++;
}
}
return rel;
@@ -5237,6 +5241,7 @@ rel_push_join_down_outer(visitor *v, sql
rel_dup(r);
rel_destroy(rel);
rel = r;
+ v->changes++;
}
}
return rel;
@@ -5837,7 +5842,6 @@ rel_reduce_groupby_exps(visitor *v, sql_
}
if (cnr && nr &&
list_length(tbls[j]->pkey->k.columns) == nr) {
list *ngbe = new_exp_list(v->sql->sa);
- bool changed = false;
for (l = 0, n = gbe->h; l < k && n;
l++, n = n->next) {
sql_exp *e = n->data;
@@ -5861,17 +5865,14 @@ rel_reduce_groupby_exps(visitor *v, sql_
exp_setname(v->sql->sa, rs, exp_find_rel_name(e), exp_name(e));
e = rs;
fnd = 1;
- changed = true;
}
}
m->data = e;
}
- if (changed)
- list_hash_clear(rel->exps);
/* new reduced aggr expression list */
assert(list_length(rel->exps)>0);
/* only one reduction at a time */
- v->changes = 1;
+ v->changes++;
return rel;
}
gbe = rel->r;
@@ -5924,7 +5925,6 @@ rel_reduce_groupby_exps(visitor *v, sql_
}
n->data = e;
}
- list_hash_clear(rel->exps);
v->changes++;
}
}
@@ -6518,7 +6518,6 @@ rel_push_project_up(visitor *v, sql_rel
assert(e);
n->data = e;
}
- list_hash_clear(rel->exps);
}
rel->l = l->l;
l->l = NULL;
@@ -6534,7 +6533,6 @@ rel_push_project_up(visitor *v, sql_rel
assert(e);
n->data = e;
}
- list_hash_clear(rel->exps);
}
rel->r = r->l;
r->l = NULL;
@@ -8098,7 +8096,7 @@ rel_split_select(visitor *v, sql_rel *re
}
static list *
-exp_merge_range(sql_allocator *sa, list *exps)
+exp_merge_range(visitor *v, list *exps)
{
node *n, *m;
for (n=exps->h; n; n = n->next) {
@@ -8108,8 +8106,8 @@ exp_merge_range(sql_allocator *sa, list
/* handle the and's in the or lists */
if (e->type == e_cmp && e->flag == cmp_or && !is_anti(e)) {
- e->l = exp_merge_range(sa, e->l);
- e->r = exp_merge_range(sa, e->r);
+ e->l = exp_merge_range(v, e->l);
+ e->r = exp_merge_range(v, e->r);
/* only look for gt, gte, lte, lt */
} else if (n->next &&
e->type == e_cmp && e->flag < cmp_equal && !e->f &&
@@ -8138,14 +8136,15 @@ exp_merge_range(sql_allocator *sa, list
f->flag == cmp_lte))
continue;
if (!swap)
- ne = exp_compare2(sa, le, re,
rf, CMP_BETWEEN|compare2range(e->flag, f->flag));
+ ne = exp_compare2(v->sql->sa,
le, re, rf, CMP_BETWEEN|compare2range(e->flag, f->flag));
else
- ne = exp_compare2(sa, le, rf,
re, CMP_BETWEEN|compare2range(f->flag, e->flag));
+ ne = exp_compare2(v->sql->sa,
le, rf, re, CMP_BETWEEN|compare2range(f->flag, e->flag));
list_remove_data(exps, NULL, e);
list_remove_data(exps, NULL, f);
list_append(exps, ne);
- return exp_merge_range(sa, exps);
+ v->changes++;
+ return exp_merge_range(v, exps);
}
}
} else if (n->next &&
@@ -8202,14 +8201,15 @@ exp_merge_range(sql_allocator *sa, list
if (lt && (ff == cmp_lt || ff ==
cmp_lte))
continue;
if (!swap)
- ne = exp_compare2(sa, le, re,
rf, CMP_BETWEEN|compare2range(ef, ff));
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list