Changeset: 998f526f60c1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/998f526f60c1
Modified Files:
sql/include/sql_relation.h
sql/server/rel_optimize_sel.c
Branch: groupjoin
Log Message:
rewrite left outer group joins into semi/anti joins when possible, ie when the
result of an exists/in/not in/any/all is used in the projection on which later
a where/having expression is done.
diffs (67 lines):
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -242,6 +242,7 @@ typedef enum operator_type {
#define set_semantics(e) (e)->semantics = 1
#define is_any(e) ((e)->any)
#define set_any(e) (e)->any = 1
+#define reset_any(e) (e)->any = 0
#define is_symmetric(e) ((e)->symmetric)
#define set_symmetric(e) (e)->symmetric = 1
#define is_intern(e) ((e)->intern)
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -3592,6 +3592,44 @@ rel_use_index(visitor *v, sql_rel *rel)
return rel;
}
+static sql_rel *
+rel_select_leftgroup_2_semi(visitor *v, sql_rel *rel)
+{
+ (void)v;
+ if (rel_is_ref(rel) || !is_select(rel->op) || list_empty(rel->exps))
+ return rel;
+ sql_rel *l = rel->l;
+
+ if (!l || rel_is_ref(l) || !is_left(l->op) || list_empty(l->attr))
+ return rel;
+
+ for(node *n = rel->exps->h; n; n = n->next) {
+ sql_exp *e = n->data;
+
+ if (e->type == e_cmp && !is_semantics(e) && !e->f) {
+ list *attrs = l->attr;
+ sql_exp *a = attrs->h->data;
+
+ if (exps_find_exp(l->attr, e->l) && exp_is_true(e->r)
&& e->flag == cmp_equal /*&& exp_is_true(a)*/) {
+ printf("# optimize select leftgroup -> semi\n");
+ if (!list_empty(l->exps)) {
+ for(node *m = l->exps->h; m; m =
m->next) {
+ sql_exp *j = m->data;
+ reset_any(j);
+ }
+ }
+ l->attr = NULL;
+ l->op = exp_is_true(a)?op_semi:op_anti;
+ list_remove_node(rel->exps, NULL, n);
+ rel = rel_project(v->sql->sa, rel,
rel_projections(v->sql, rel, NULL, 1, 1));
+ list_append(rel->exps, attrs->h->data);
+ v->changes++;
+ return rel;
+ }
+ }
+ }
+ return rel;
+}
static sql_rel *
rel_optimize_select_and_joins_topdown_(visitor *v, sql_rel *rel)
@@ -3605,6 +3643,7 @@ rel_optimize_select_and_joins_topdown_(v
rel = rel_simplify_fk_joins(v, rel);
rel = rel_push_select_down(v, rel);
+ rel = rel_select_leftgroup_2_semi(v, rel);
if (rel && rel->l && (is_select(rel->op) || is_join(rel->op)))
rel = rel_use_index(v, rel);
return rel;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]