Changeset: e697ddc8b538 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e697ddc8b538
Modified Files:
sql/server/rel_optimizer.c
Branch: default
Log Message:
Small cleanup, run sejoins rewriter only when necessary
diffs (97 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
@@ -27,7 +27,8 @@ typedef struct global_props {
instantiate:1,
needs_mergetable_rewrite:1,
needs_remote_replica_rewrite:1,
- needs_distinct:1;
+ needs_distinct:1,
+ needs_setjoin_rewrite:1;
} global_props;
static int
@@ -244,6 +245,22 @@ rel_properties(visitor *v, sql_rel *rel)
/* If the plan has a merge table or a child of one, then
rel_merge_table_rewrite has to run */
gp->needs_mergetable_rewrite |= (isMergeTable(t) || (t->s &&
t->s->parts && (pt = partition_find_part(sql->session->tr, t, NULL))));
gp->needs_remote_replica_rewrite |= (isRemote(t) ||
isReplicaTable(t));
+ } else if (is_join(rel->op)) {
+ /* check for setjoin rewrite */
+ if (!list_empty(rel->attr)) {
+ gp->needs_setjoin_rewrite = 1;
+ return rel;
+ }
+ if (!list_empty(rel->exps)) {
+ for (node *n = rel->exps->h; n ; n = n->next) {
+ sql_exp *e = n->data;
+
+ if (e->type == e_cmp && (e->flag == mark_in ||
e->flag == mark_notin)) {
+ gp->needs_setjoin_rewrite = 1;
+ return rel;
+ }
+ }
+ }
}
return rel;
}
@@ -9874,16 +9891,17 @@ need_optimization(mvc *sql, sql_rel *rel
static sql_rel *
rel_setjoins_2_joingroupby(visitor *v, sql_rel *rel)
{
- if (rel && is_join(rel->op) && (rel->exps || rel->attr)) {
+ if (rel && is_join(rel->op) && (!list_empty(rel->exps) ||
!list_empty(rel->attr))) {
sql_exp *me = NULL;
- int needed = 0;
- if (rel->exps) {
- for (node *n = rel->exps->h; n; n = n->next) {
+ bool needed = false;
+
+ if (!list_empty(rel->exps)) {
+ for (node *n = rel->exps->h; n && !needed; n = n->next)
{
sql_exp *e = n->data;
if (e->type == e_cmp && (e->flag == mark_in ||
e->flag == mark_notin)) {
me = e;
- needed++;
+ needed = true;
}
}
}
@@ -9891,8 +9909,8 @@ rel_setjoins_2_joingroupby(visitor *v, s
rel->op = (me->flag == mark_in)?op_semi:op_anti;
return rel;
}
- if (needed || rel->attr) {
- assert(needed || rel->attr);
+ if (needed || !list_empty(rel->attr)) {
+ assert(needed || !list_empty(rel->attr));
sql_exp *nequal = NULL;
sql_exp *lid = NULL, *rid = NULL;
sql_rel *l = rel->l, *p = rel;
@@ -9924,7 +9942,7 @@ rel_setjoins_2_joingroupby(visitor *v, s
}
list *aexps = sa_list(v->sql->sa);
- if (rel->exps) {
+ if (!list_empty(rel->exps)) {
for (node *n = rel->exps->h; n;) {
node *next = n->next;
sql_exp *e = n->data;
@@ -9947,7 +9965,7 @@ rel_setjoins_2_joingroupby(visitor *v, s
}
}
- if (rel->attr) {
+ if (!list_empty(rel->attr)) {
sql_exp *a = rel->attr->h->data;
exp_setname(v->sql->sa, nequal,
exp_find_rel_name(a), exp_name(a));
@@ -10004,6 +10022,7 @@ rel_optimizer(mvc *sql, sql_rel *rel, in
v.data = &level;
rel = rel_visitor_bottomup(&v, rel, &rel_remote_func);
}
- rel = rel_visitor_bottomup(&v, rel, &rel_setjoins_2_joingroupby);
+ if (gp.needs_setjoin_rewrite)
+ rel = rel_visitor_bottomup(&v, rel,
&rel_setjoins_2_joingroupby);
return rel;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list