Changeset: 6ca9a842453b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6ca9a842453b
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_propagate.c
        sql/server/rel_unnest.c
        sql/server/rel_updates.c
Branch: default
Log Message:
Set new select relations as processed during optimization


diffs (truncated from 421 to 300 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
@@ -1493,7 +1493,9 @@ rel_simplify_project_fk_join(mvc *sql, s
        } else {
                nr = rel_dup(r->r);
        }
-       return rel_select(sql->sa, nr, nje);
+       nr = rel_select(sql->sa, nr, nje);
+       set_processed(nr);
+       return nr;
 }
 
 static sql_rel *
@@ -1568,7 +1570,9 @@ rel_simplify_count_fk_join(mvc *sql, sql
        } else {
                nr = rel_dup(r->r);
        }
-       return rel_select(sql->sa, nr, nje);
+       nr = rel_select(sql->sa, nr, nje);
+       set_processed(nr);
+       return nr;
 }
 
 /*
@@ -4343,6 +4347,7 @@ rel_push_select_down(visitor *v, sql_rel
                        sql_rel *l = rel_select(v->sql->sa, rel->l, NULL);
 
                        l->exps = rel->exps;
+                       set_processed(l);
                        rel->exps = NULL;
                        rel->l = l;
                        v->changes++;
@@ -4397,8 +4402,7 @@ rel_push_select_down(visitor *v, sql_rel
 
        /* push select through join */
        if (is_select(rel->op) && r && is_join(r->op) && !rel_is_ref(r) && 
!is_single(r)){
-               sql_rel *jl = r->l;
-               sql_rel *jr = r->r;
+               sql_rel *jl = r->l, *ojl = jl, *jr = r->r, *ojr = jr;
                int left = r->op == op_join || r->op == op_left;
                int right = r->op == op_join || r->op == op_right;
 
@@ -4427,6 +4431,10 @@ rel_push_select_down(visitor *v, sql_rel
                        }
                        n = next;
                }
+               if (ojl != jl)
+                       set_processed(jl);
+               if (ojr != jr)
+                       set_processed(jr);
        }
 
        /* merge select and cross product ? */
@@ -4437,7 +4445,7 @@ rel_push_select_down(visitor *v, sql_rel
 
                        if (exp_is_join(e, NULL) == 0) {
                                if (!r->exps)
-                                       r->exps = new_exp_list(v->sql->sa);
+                                       r->exps = sa_list(v->sql->sa);
                                append(r->exps, e);
                                list_remove_node(exps, NULL, n);
                                v->changes++;
@@ -4447,31 +4455,29 @@ rel_push_select_down(visitor *v, sql_rel
        }
 
        if (is_select(rel->op) && r && r->op == op_project && !rel_is_ref(r) && 
!is_single(r)){
-               sql_rel *pl = r->l;
+               sql_rel *pl = r->l, *opl = pl;
                /* we cannot push through window functions (for safety I 
disabled projects over DDL too) */
                if (pl && pl->op != op_ddl && !exps_have_unsafe(r->exps, 0)) {
                        /* introduce selects under the project (if needed) */
                        set_processed(pl);
-                       if (pl && (is_select(pl->op) || is_join(pl->op) || 
is_semi(pl->op)) && !pl->exps)
+                       if (!pl->exps)
                                pl->exps = sa_list(v->sql->sa);
                        for (n = exps->h; n;) {
                                node *next = n->next;
                                sql_exp *e = n->data, *ne = NULL;
 
-                               if (e->type == e_cmp) {
-                                       ne = exp_push_down_prj(v->sql, e, r, 
pl);
-
-                                       /* can we move it down */
-                                       if (ne && ne != e && pl->exps) {
-                                               if (!(is_select(pl->op) && 
is_join(pl->op) && is_semi(pl->op)) || rel_is_ref(pl))
-                                                       r->l = pl = 
rel_select(v->sql->sa, pl, NULL);
-                                               rel_select_add_exp(v->sql->sa, 
pl, ne);
-                                               list_remove_node(exps, NULL, n);
-                                               v->changes++;
-                                       }
+                               /* can we move it down */
+                               if (e->type == e_cmp && (ne = 
exp_push_down_prj(v->sql, e, r, pl)) && ne != e) {
+                                       if (!(is_select(pl->op) && 
is_join(pl->op) && is_semi(pl->op)) || rel_is_ref(pl))
+                                               r->l = pl = 
rel_select(v->sql->sa, pl, NULL);
+                                       rel_select_add_exp(v->sql->sa, pl, ne);
+                                       list_remove_node(exps, NULL, n);
+                                       v->changes++;
                                }
                                n = next;
                        }
+                       if (opl != pl)
+                               set_processed(pl);
                }
        }
 
@@ -4493,8 +4499,10 @@ rel_push_select_down(visitor *v, sql_rel
                /* introduce selects under the set */
                ul = rel_select(v->sql->sa, ul, NULL);
                ul->exps = exps_copy(v->sql, exps);
+               set_processed(ul);
                ur = rel_select(v->sql->sa, ur, NULL);
                ur->exps = exps_copy(v->sql, exps);
+               set_processed(ur);
 
                rel = rel_inplace_setop(v->sql, rel, ul, ur, u->op, 
rel_projections(v->sql, rel, NULL, 1, 1));
                if (need_distinct(u))
@@ -4512,35 +4520,34 @@ rel_push_join_exps_down(visitor *v, sql_
        if ((is_innerjoin(rel->op) || is_left(rel->op) || is_right(rel->op) || 
is_semi(rel->op)) && !list_empty(rel->exps)) {
                int left = is_innerjoin(rel->op) || is_right(rel->op) || 
/*is_semi(rel->op)*/ rel->op == op_semi;
                int right = is_innerjoin(rel->op) || is_left(rel->op) || 
is_semi(rel->op);
-
+               sql_rel *jl = rel->l, *ojl = jl, *jr = rel->r, *ojr = jr;
+
+               set_processed(jl);
+               set_processed(jr);
                for (node *n = rel->exps->h; n;) {
                        node *next = n->next;
                        sql_exp *e = n->data;
 
-                       if (left && rel_rebind_exp(v->sql, rel->l, e)) { /* 
select expressions on left */
-                               sql_rel *l = rel->l;
-                               if (!is_select(l->op) || rel_is_ref(l)) {
-                                       set_processed(l);
-                                       rel->l = l = rel_select(v->sql->sa, 
rel->l, NULL);
-                               }
-                               rel_select_add_exp(v->sql->sa, rel->l, e);
+                       if (left && rel_rebind_exp(v->sql, jl, e)) { /* select 
expressions on left */
+                               if (!is_select(jl->op) || rel_is_ref(jl))
+                                       rel->l = jl = rel_select(v->sql->sa, 
jl, NULL);
+                               rel_select_add_exp(v->sql->sa, jl, e);
                                list_remove_node(rel->exps, NULL, n);
                                v->changes++;
                        } else if (right && ((rel->op != op_anti && rel->op != 
op_left) || (e->flag != mark_notin && e->flag != mark_in)) &&
-                                          rel_rebind_exp(v->sql, rel->r, e)) { 
/* select expressions on right */
-                               sql_rel *r = rel->r;
-                               if (!is_select(r->op) || rel_is_ref(r)) {
-                                       set_processed(r);
-                                       rel->r = r = rel_select(v->sql->sa, 
rel->r, NULL);
-                               }
-                               rel_select_add_exp(v->sql->sa, rel->r, e);
+                                          rel_rebind_exp(v->sql, jr, e)) { /* 
select expressions on right */
+                               if (!is_select(jr->op) || rel_is_ref(jr))
+                                       rel->r = jr = rel_select(v->sql->sa, 
jr, NULL);
+                               rel_select_add_exp(v->sql->sa, jr, e);
                                list_remove_node(rel->exps, NULL, n);
                                v->changes++;
                        }
                        n = next;
                }
-               if (is_join(rel->op) && list_empty(rel->exps))
-                       rel->exps = NULL; /* crossproduct */
+               if (ojl != jl)
+                       set_processed(jl);
+               if (ojr != jr)
+                       set_processed(jr);
        }
        return rel;
 }
@@ -4753,23 +4760,25 @@ rel_push_semijoin_down_or_up(visitor *v,
        }
        /* first push down the expressions involving only A */
        if (rel->op == op_semi && rel->exps && rel->l) {
+               sql_rel *jl = rel->l, *ojl = jl;
+
+               set_processed(jl);
                for (node *n = rel->exps->h; n;) {
                        node *next = n->next;
                        sql_exp *e = n->data;
 
-                       if (n != rel->exps->h && e->type == e_cmp && 
rel_rebind_exp(v->sql, rel->l, e)) {
-                               sql_rel *l = rel->l;
-                               if (!is_select(l->op) || rel_is_ref(l)) {
-                                       set_processed(l);
-                                       rel->l = l = rel_select(v->sql->sa, 
rel->l, NULL);
-                               }
-                               rel_select_add_exp(v->sql->sa, rel->l, e);
+                       if (n != rel->exps->h && e->type == e_cmp && 
rel_rebind_exp(v->sql, jl, e)) {
+                               if (!is_select(jl->op) || rel_is_ref(jl))
+                                       rel->l = jl = rel_select(v->sql->sa, 
jl, NULL);
+                               rel_select_add_exp(v->sql->sa, jl, e);
                                list_remove_node(rel->exps, NULL, n);
                                if (level <= 0)
                                        v->changes++;
                        }
                        n = next;
                }
+               if (ojl != jl)
+                       set_processed(jl);
        }
        if (rel->op == op_semi && rel->exps && rel->l) {
                operator_type op = rel->op, lop;
@@ -8955,6 +8964,7 @@ merge_table_prune_and_unionize(visitor *
                list *converted = sa_list(v->sql->sa);
                nrel = rel_project_exp(v->sql, exp_atom_bool(v->sql->sa, 1));
                nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa, 
0));
+               set_processed(nrel);
 
                for (node *n = mt_rel->exps->h ; n ; n = n->next) {
                        sql_exp *e = n->data, *a = exp_atom(v->sql->sa, 
atom_general(v->sql->sa, exp_subtype(e), NULL));
@@ -8973,6 +8983,7 @@ merge_table_prune_and_unionize(visitor *
                        } else if (info) { /* propagate select under union */
                                next = rel_select(v->sql->sa, next, NULL);
                                next->exps = exps_copy(v->sql, info->sel->exps);
+                               set_processed(next);
                        }
 
                        if (nrel) {
@@ -9363,6 +9374,7 @@ rel_remove_union_partitions(visitor *v, 
                list *converted = sa_list(v->sql->sa);
                sql_rel *nrel = rel_project_exp(v->sql, 
exp_atom_bool(v->sql->sa, 1));
                nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa, 
0));
+               set_processed(nrel);
 
                for (node *n = rel->exps->h ; n ; n = n->next) {
                        sql_exp *e = n->data, *a = exp_atom(v->sql->sa, 
atom_general(v->sql->sa, exp_subtype(e), NULL));
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -214,6 +214,7 @@ create_range_partition_anti_rel(sql_quer
        }
 
        anti_rel = rel_select(sql->sa, anti_rel, anti_exp);
+       set_processed(anti_rel);
        anti_rel = rel_groupby(sql, anti_rel, NULL);
        aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_rel->card, 0);
        (void) rel_groupby_add_aggr(sql, anti_rel, aggr);
@@ -257,6 +258,7 @@ create_list_partition_anti_rel(sql_query
        }
 
        anti_rel = rel_select(sql->sa, anti_rel, anti_exp);
+       set_processed(anti_rel);
        anti_rel = rel_groupby(sql, anti_rel, NULL);
        aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_rel->card, 0);
        (void) rel_groupby_add_aggr(sql, anti_rel, aggr);
@@ -781,8 +783,10 @@ rel_generate_subinserts(sql_query *query
                        } else if (range) {
                                accum = exp_copy(sql, range);
                        }
-                       if (full_range)
+                       if (full_range) {
                                dup = rel_select(sql->sa, dup, full_range);
+                               set_processed(dup);
+                       }
                } else if (isListPartitionTable(t)) {
                        sql_exp *ein = NULL;
 
@@ -812,6 +816,7 @@ rel_generate_subinserts(sql_query *query
                                found_nils = 1;
                        }
                        dup = rel_select(sql->sa, dup, ein);
+                       set_processed(dup);
                } else {
                        assert(0);
                }
@@ -865,6 +870,7 @@ rel_generate_subinserts(sql_query *query
                }
                /* generate a count aggregation for the values not present in 
any of the partitions */
                anti_rel = rel_select(sql->sa, anti_rel, anti_exp);
+               set_processed(anti_rel);
                anti_rel = rel_groupby(sql, anti_rel, NULL);
                aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_rel->card, 0);
                (void) rel_groupby_add_aggr(sql, anti_rel, aggr);
@@ -1040,6 +1046,7 @@ rel_subtable_insert(sql_query *query, sq
        if (!found_all_range_values || !found_nils) {
                /* generate a count aggregation for the values not present in 
any of the partitions */
                anti_dup = rel_select(sql->sa, anti_dup, anti_exp);
+               set_processed(anti_dup);
                anti_dup = rel_groupby(sql, anti_dup, NULL);
                aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_dup->card, 0);
                (void) rel_groupby_add_aggr(sql, anti_dup, aggr);
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1077,6 +1077,7 @@ push_up_select(mvc *sql, sql_rel *rel, l
                rel->r = rel_dup(r->l);
                rel = rel_select(sql->sa, rel, NULL);
                rel->exps = !cp?exps:exps_copy(sql, exps);
+               set_processed(rel);
                rel_destroy(r);
        }
        return rel;
@@ -1242,6 +1243,7 @@ push_up_groupby(mvc *sql, sql_rel *rel, 
                        if (list_length(sexps)) {
                                r = rel_select(sql->sa, r, NULL);
                                r->exps = sexps;
+                               set_processed(r);
                        }
                        return r;
                }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to