Changeset: 54b5078dff77 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=54b5078dff77
Modified Files:
        sql/server/rel_optimizer.c
Branch: default
Log Message:

Pack more optimizers


diffs (146 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
@@ -7442,64 +7442,59 @@ find_index(sql_allocator *sa, sql_rel *r
        return NULL;
 }
 
-static sql_rel *
+static inline sql_rel *
 rel_use_index(visitor *v, sql_rel *rel)
 {
-       if (rel->l && (is_select(rel->op) || is_join(rel->op))) {
-               list *exps = NULL;
-               sql_idx *i = find_index(v->sql->sa, rel, rel->l, &exps);
-               int left = 1;
-
-               if (!i && is_join(rel->op)) {
-                       left = 0;
-                       i = find_index(v->sql->sa, rel, rel->r, &exps);
-               }
-
-               if (i) {
-                       prop *p;
-                       node *n;
-                       int single_table = 1;
-                       sql_exp *re = NULL;
-
-                       for( n = exps->h; n && single_table; n = n->next) {
+       list *exps = NULL;
+       sql_idx *i = find_index(v->sql->sa, rel, rel->l, &exps);
+       int left = 1;
+
+       assert(is_select(rel->op) || is_join(rel->op));
+       if (!i && is_join(rel->op)) {
+               left = 0;
+               i = find_index(v->sql->sa, rel, rel->r, &exps);
+       }
+
+       if (i) {
+               prop *p;
+               node *n;
+               int single_table = 1;
+               sql_exp *re = NULL;
+
+               for( n = exps->h; n && single_table; n = n->next) {
+                       sql_exp *e = n->data;
+                       sql_exp *nre = e->r;
+
+                       if (is_join(rel->op) && ((left && !rel_find_exp(rel->l, 
e->l)) || (!left && !rel_find_exp(rel->r, e->l))))
+                               nre = e->l;
+                       single_table = (!re || (exp_relname(nre) && 
exp_relname(re) && strcmp(exp_relname(nre), exp_relname(re)) == 0));
+                       re = nre;
+               }
+               if (single_table) { /* add PROP_HASHCOL to all column exps */
+                       for( n = exps->h; n; n = n->next) {
                                sql_exp *e = n->data;
-                               sql_exp *nre = e->r;
-
-                               if (is_join(rel->op) &&
-                                       ((left && !rel_find_exp(rel->l, e->l)) 
||
-                                       (!left && !rel_find_exp(rel->r, e->l))))
-                                       nre = e->l;
-                               single_table = (!re || (exp_relname(nre) && 
exp_relname(re) && strcmp(exp_relname(nre), exp_relname(re)) == 0));
-                               re = nre;
-                       }
-                       if (single_table) { /* add PROP_HASHCOL to all column 
exps */
-                               for( n = exps->h; n; n = n->next) {
-                                       sql_exp *e = n->data;
-                                       int anti = is_anti(e), semantics = 
is_semantics(e);
-
-                                       /* swapped ? */
-                                       if (is_join(rel->op) &&
-                                               ((left && !rel_find_exp(rel->l, 
e->l)) ||
-                                               (!left && !rel_find_exp(rel->r, 
e->l))))
-                                               n->data = e = 
exp_compare(v->sql->sa, e->r, e->l, cmp_equal);
-                                       if (anti) set_anti(e);
-                                       if (semantics) set_semantics(e);
-                                       p = find_prop(e->p, PROP_HASHCOL);
-                                       if (!p)
-                                               e->p = p = 
prop_create(v->sql->sa, PROP_HASHCOL, e->p);
-                                       p->value = i;
-                               }
-                       }
-                       /* add the remaining exps to the new exp list */
-                       if (list_length(rel->exps) > list_length(exps)) {
-                               for( n = rel->exps->h; n; n = n->next) {
-                                       sql_exp *e = n->data;
-                                       if (!list_find(exps, e, (fcmp)&exp_cmp))
-                                               list_append(exps, e);
-                               }
-                       }
-                       rel->exps = exps;
-               }
+                               int anti = is_anti(e), semantics = 
is_semantics(e);
+
+                               /* swapped ? */
+                               if (is_join(rel->op) && ((left && 
!rel_find_exp(rel->l, e->l)) || (!left && !rel_find_exp(rel->r, e->l))))
+                                       n->data = e = exp_compare(v->sql->sa, 
e->r, e->l, cmp_equal);
+                               if (anti) set_anti(e);
+                               if (semantics) set_semantics(e);
+                               p = find_prop(e->p, PROP_HASHCOL);
+                               if (!p)
+                                       e->p = p = prop_create(v->sql->sa, 
PROP_HASHCOL, e->p);
+                               p->value = i;
+                       }
+               }
+               /* add the remaining exps to the new exp list */
+               if (list_length(rel->exps) > list_length(exps)) {
+                       for( n = rel->exps->h; n; n = n->next) {
+                               sql_exp *e = n->data;
+                               if (!list_find(exps, e, (fcmp)&exp_cmp))
+                                       list_append(exps, e);
+                       }
+               }
+               rel->exps = exps;
        }
        return rel;
 }
@@ -7653,8 +7648,11 @@ rel_simplify_like_select(visitor *v, sql
 
 /* pack select optimizers into a single function to void iterations in the AST 
*/
 static sql_rel *
-rel_optimize_select(visitor *v, sql_rel *rel)
-{
+rel_optimize_select_and_index(visitor *v, sql_rel *rel)
+{
+       if (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))
                return rel;
 
@@ -9766,11 +9764,8 @@ optimize_rel(mvc *sql, sql_rel *rel, int
        if (gp.cnt[op_join] || gp.cnt[op_left] || gp.cnt[op_right] || 
gp.cnt[op_full] || gp.cnt[op_semi] || gp.cnt[op_anti])
                rel = rel_visitor_topdown(&v, rel, &rel_simplify_fk_joins);
 
-       if (gp.cnt[op_select])
-               rel = rel_visitor_bottomup(&v, rel, &rel_optimize_select);
-
-       if (gp.cnt[op_select] || gp.cnt[op_join] || gp.cnt[op_left] || 
gp.cnt[op_right] || gp.cnt[op_full] || gp.cnt[op_semi] || gp.cnt[op_anti])
-               rel = rel_visitor_bottomup(&v, rel, &rel_use_index);
+       if (gp.cnt[op_select] || gp.cnt[op_join] || gp.cnt[op_left] || 
gp.cnt[op_right] || gp.cnt[op_full])
+               rel = rel_visitor_bottomup(&v, rel, 
&rel_optimize_select_and_index);
 
        if (gp.cnt[op_project] && gp.cnt[op_union])
                rel = rel_visitor_topdown(&v, rel, 
&rel_push_project_down_union);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to