Changeset: 0eabc5eba7b5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0eabc5eba7b5
Modified Files:
        sql/server/rel_optimizer.c
Branch: antipush
Log Message:

Preparing to introduce optimizers running after the regular optimization path 
is done


diffs (211 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
@@ -9568,42 +9568,40 @@ rel_push_func_and_select_down(visitor *v
 }
 
 static sql_rel *
-optimize_rel(mvc *sql, sql_rel *rel, int *g_changes, int level, bool 
value_based_opt, bool storage_based_opt)
-{
-       visitor v = { .sql = sql, .value_based_opt = value_based_opt, 
.storage_based_opt = storage_based_opt, .data = &level };
-       global_props gp = (global_props) {.cnt = {0},};
-       rel_properties(sql, &gp, rel);
+optimize_rel(mvc *sql, sql_rel *rel, visitor *v, global_props *gp)
+{
+       int level = *(int*)v->data;
 
        TRC_DEBUG_IF(SQL_REWRITER) {
                int i;
                for (i = 0; i < ddl_maxops; i++) {
-                       if (gp.cnt[i]> 0)
-                               TRC_DEBUG_ENDIF(SQL_REWRITER, "%s %d\n", 
op2string((operator_type)i), gp.cnt[i]);
-               }
-       }
-
-       if (level <= 0 && gp.cnt[op_select])
-               rel = rel_split_select(&v, rel, 1);
+                       if (gp->cnt[i]> 0)
+                               TRC_DEBUG_ENDIF(SQL_REWRITER, "%s %d\n", 
op2string((operator_type)i), gp->cnt[i]);
+               }
+       }
+
+       if (level <= 0 && gp->cnt[op_select])
+               rel = rel_split_select(v, rel, 1);
 
        /* simple merging of projects */
-       if (gp.cnt[op_project] || gp.cnt[op_groupby] || gp.cnt[op_ddl]) {
-               rel = rel_visitor_bottomup(&v, rel, &rel_push_project_down);
-               rel = rel_visitor_bottomup(&v, rel, &rel_merge_projects);
+       if (gp->cnt[op_project] || gp->cnt[op_groupby] || gp->cnt[op_ddl]) {
+               rel = rel_visitor_bottomup(v, rel, &rel_push_project_down);
+               rel = rel_visitor_bottomup(v, rel, &rel_merge_projects);
 
                /* push (simple renaming) projections up */
-               if (gp.cnt[op_project])
-                       rel = rel_visitor_bottomup(&v, rel, 
&rel_push_project_up);
-               if (level <= 0 && (gp.cnt[op_project] || gp.cnt[op_groupby]))
-                       rel = rel_split_project(&v, rel, 1);
+               if (gp->cnt[op_project])
+                       rel = rel_visitor_bottomup(v, rel, 
&rel_push_project_up);
+               if (level <= 0 && (gp->cnt[op_project] || gp->cnt[op_groupby]))
+                       rel = rel_split_project(v, rel, 1);
                if (level <= 0) {
-                       if (gp.cnt[op_left] || gp.cnt[op_right] || 
gp.cnt[op_full] || gp.cnt[op_join] || gp.cnt[op_semi] || gp.cnt[op_anti])
-                               rel = rel_visitor_bottomup(&v, rel, 
&rel_remove_redundant_join); /* this optimizer has to run before 
rel_first_level_optimizations */
-                       rel = rel_visitor_bottomup(&v, rel, 
&rel_first_level_optimizations);
-               }
-       }
-
-       if (level <= 1 && value_based_opt)
-               rel = rel_exp_visitor_bottomup(&v, rel, 
&rel_simplify_predicates, false);
+                       if (gp->cnt[op_left] || gp->cnt[op_right] || 
gp->cnt[op_full] || gp->cnt[op_join] || gp->cnt[op_semi] || gp->cnt[op_anti])
+                               rel = rel_visitor_bottomup(v, rel, 
&rel_remove_redundant_join); /* this optimizer has to run before 
rel_first_level_optimizations */
+                       rel = rel_visitor_bottomup(v, rel, 
&rel_first_level_optimizations);
+               }
+       }
+
+       if (level <= 1 && v->value_based_opt)
+               rel = rel_exp_visitor_bottomup(v, rel, 
&rel_simplify_predicates, false);
 
        /* join's/crossproducts between a relation and a constant (row).
         * could be rewritten
@@ -9611,68 +9609,67 @@ optimize_rel(mvc *sql, sql_rel *rel, int
         * also joins between a relation and a DICT (which isn't used)
         * could be removed.
         * */
-       if (gp.cnt[op_join] && gp.cnt[op_project] && /* DISABLES CODE */ (0))
-               rel = rel_visitor_bottomup(&v, rel, &rel_remove_join);
-
-       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] || gp.cnt[op_select]) {
-               rel = rel_visitor_bottomup(&v, rel, 
&rel_optimize_select_and_joins_bottomup);
+       if (gp->cnt[op_join] && gp->cnt[op_project] && /* DISABLES CODE */ (0))
+               rel = rel_visitor_bottomup(v, rel, &rel_remove_join);
+
+       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] || gp->cnt[op_select]) 
{
+               rel = rel_visitor_bottomup(v, rel, 
&rel_optimize_select_and_joins_bottomup);
                if (level == 1)
-                       rel = rel_visitor_bottomup(&v, rel, 
&rewrite_reset_used); /* reset used flag, used by rel_merge_select_rse */
-       }
-
-       if (value_based_opt)
-               rel = rel_project_reduce_casts(&v, rel);
-
-       if (gp.cnt[op_union])
-               rel = rel_visitor_bottomup(&v, rel, 
&rel_optimize_unions_bottomup);
-
-       if ((gp.cnt[op_left] || gp.cnt[op_right] || gp.cnt[op_full]) && /* 
DISABLES CODE */ (0))
-               rel = rel_visitor_topdown(&v, rel, &rel_split_outerjoin);
-
-       if (level <= 1 && gp.cnt[op_project])
-               rel = rel_exp_visitor_bottomup(&v, rel, &rel_merge_project_rse, 
false);
-
-       if (gp.cnt[op_groupby] || gp.cnt[op_project] || gp.cnt[op_union] || 
gp.cnt[op_inter] || gp.cnt[op_except])
-               rel = rel_visitor_topdown(&v, rel, &rel_optimize_projections);
-
-       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_optimize_joins);
-               if (!gp.cnt[op_update])
-                       rel = rel_join_order(&v, rel);
+                       rel = rel_visitor_bottomup(v, rel, 
&rewrite_reset_used); /* reset used flag, used by rel_merge_select_rse */
+       }
+
+       if (v->value_based_opt)
+               rel = rel_project_reduce_casts(v, rel);
+
+       if (gp->cnt[op_union])
+               rel = rel_visitor_bottomup(v, rel, 
&rel_optimize_unions_bottomup);
+
+       if ((gp->cnt[op_left] || gp->cnt[op_right] || gp->cnt[op_full]) && /* 
DISABLES CODE */ (0))
+               rel = rel_visitor_topdown(v, rel, &rel_split_outerjoin);
+
+       if (level <= 1 && gp->cnt[op_project])
+               rel = rel_exp_visitor_bottomup(v, rel, &rel_merge_project_rse, 
false);
+
+       if (gp->cnt[op_groupby] || gp->cnt[op_project] || gp->cnt[op_union] || 
gp->cnt[op_inter] || gp->cnt[op_except])
+               rel = rel_visitor_topdown(v, rel, &rel_optimize_projections);
+
+       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_optimize_joins);
+               if (!gp->cnt[op_update])
+                       rel = rel_join_order(v, rel);
        }
 
        /* Important -> Re-write semijoins after rel_join_order */
-       if (gp.cnt[op_anti] || gp.cnt[op_semi]) {
-               rel = rel_visitor_bottomup(&v, rel, 
&rel_optimize_semi_and_anti);
+       if (gp->cnt[op_anti] || gp->cnt[op_semi]) {
+               rel = rel_visitor_bottomup(v, rel, &rel_optimize_semi_and_anti);
                if (level <= 0)
-                       rel = rel_visitor_topdown(&v, rel, 
&rel_semijoin_use_fk);
+                       rel = rel_visitor_topdown(v, rel, &rel_semijoin_use_fk);
        }
 
        /* Important -> Make sure rel_push_select_down gets called after 
rel_join_order,
           because pushing down select expressions makes rel_join_order more 
difficult */
-       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] || gp.cnt[op_select])
-               rel = rel_visitor_topdown(&v, rel, 
&rel_optimize_select_and_joins_topdown);
-
-       if (gp.cnt[op_union])
-               rel = rel_visitor_topdown(&v, rel, 
&rel_optimize_unions_topdown);
+       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] || gp->cnt[op_select])
+               rel = rel_visitor_topdown(v, rel, 
&rel_optimize_select_and_joins_topdown);
+
+       if (gp->cnt[op_union])
+               rel = rel_visitor_topdown(v, rel, &rel_optimize_unions_topdown);
 
        /* Remove unused expressions */
        if (level <= 0)
                rel = rel_dce(sql, rel);
 
-       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] || gp.cnt[op_select])
-               rel = rel_visitor_topdown(&v, rel, 
&rel_push_func_and_select_down);
-
-       if (gp.cnt[op_topn] || gp.cnt[op_sample])
-               rel = rel_visitor_topdown(&v, rel, 
&rel_push_topn_and_sample_down);
-
-       if (level <= 0 && gp.needs_distinct && gp.cnt[op_project])
-               rel = rel_visitor_bottomup(&v, rel, 
&rel_distinct_project2groupby);
-
-       if (gp.has_mergetable)
-               rel = rel_visitor_topdown(&v, rel, &rel_merge_table_rewrite);
-
-       *g_changes = v.changes;
+       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] || gp->cnt[op_select])
+               rel = rel_visitor_topdown(v, rel, 
&rel_push_func_and_select_down);
+
+       if (gp->cnt[op_topn] || gp->cnt[op_sample])
+               rel = rel_visitor_topdown(v, rel, 
&rel_push_topn_and_sample_down);
+
+       if (gp->needs_distinct && gp->cnt[op_project])
+               rel = rel_visitor_bottomup(v, rel, 
&rel_distinct_project2groupby);
+
+       if (gp->has_mergetable)
+               rel = rel_visitor_topdown(v, rel, &rel_merge_table_rewrite);
+
        return rel;
 }
 
@@ -9737,14 +9734,20 @@ need_optimization(mvc *sql, sql_rel *rel
 sql_rel *
 rel_optimizer(mvc *sql, sql_rel *rel, int value_based_opt, int 
storage_based_opt)
 {
-       int level = 0, changes = 1;
+       int level = 0;
+       visitor v = { .sql = sql, .value_based_opt = value_based_opt, 
.storage_based_opt = storage_based_opt, .data = &level, .changes = 1 };
+       global_props gp = (global_props) {.cnt = {0},};
 
        if (!need_optimization(sql, rel))
                return rel;
 
        rel = rel_keep_renames(sql, rel);
-       for( ;rel && level < 20 && changes; level++)
-               rel = optimize_rel(sql, rel, &changes, level, value_based_opt, 
storage_based_opt);
+       for( ;rel && level < 20 && v.changes; level++) {
+               v.changes = 0;
+               gp = (global_props) {.cnt = {0},};
+               rel_properties(sql, &gp, rel); /* colect relational tree 
properties */
+               rel = optimize_rel(sql, rel, &v, &gp);
+       }
 #ifndef NDEBUG
        assert(level < 20);
 #endif
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to