Changeset: 2151df7ab18e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2151df7ab18e
Modified Files:
        sql/include/sql_relation.h
        sql/server/rel_optimize_others.c
        sql/server/rel_optimize_proj.c
        sql/server/rel_optimize_sel.c
        sql/server/rel_unnest.c
Branch: Dec2025
Log Message:

reduced time spend in rewriters and optimizers solving bug #7780


diffs (truncated from 499 to 300 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
@@ -314,7 +314,7 @@ typedef struct relation {
         * Used by rewriters at rel_unnest, rel_optimizer and rel_distribute so 
a relation is not modified twice
         * The list is kept at rel_optimizer_private.h Please update it 
accordingly
         */
-       uint8_t used;
+       uint16_t used;
        int opt;
        void *p;        /* properties for the optimizer, distribution */
 } sql_rel;
diff --git a/sql/server/rel_optimize_others.c b/sql/server/rel_optimize_others.c
--- a/sql/server/rel_optimize_others.c
+++ b/sql/server/rel_optimize_others.c
@@ -706,7 +706,7 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
        }
 }
 
-static sql_rel *rel_dce_sub(mvc *sql, sql_rel *rel);
+static sql_rel *rel_dce_sub(visitor *v, sql_rel *rel);
 
 static sql_rel *
 rel_remove_unused(mvc *sql, sql_rel *rel)
@@ -903,7 +903,7 @@ rel_dce_refs(mvc *sql, sql_rel *rel, lis
 }
 
 static sql_rel *
-rel_dce_down(mvc *sql, sql_rel *rel, int skip_proj)
+rel_dce_down(visitor *v, sql_rel *rel, int skip_proj)
 {
        if (!rel)
                return rel;
@@ -916,9 +916,9 @@ rel_dce_down(mvc *sql, sql_rel *rel, int
        case op_table:
 
                if (skip_proj && rel->l && rel->op == op_table && rel->flag != 
TRIGGER_WRAPPER)
-                       rel->l = rel_dce_down(sql, rel->l, 0);
+                       rel->l = rel_dce_down(v, rel->l, 0);
                if (!skip_proj)
-                       rel_dce_sub(sql, rel);
+                       rel_dce_sub(v, rel);
                /* fall through */
 
        case op_truncate:
@@ -926,16 +926,16 @@ rel_dce_down(mvc *sql, sql_rel *rel, int
 
        case op_insert:
                rel_used(rel->r);
-               rel_dce_sub(sql, rel->r);
+               rel_dce_sub(v, rel->r);
                return rel;
 
        case op_update:
        case op_delete:
 
                if (skip_proj && rel->r)
-                       rel->r = rel_dce_down(sql, rel->r, 0);
+                       rel->r = rel_dce_down(v, rel->r, 0);
                if (!skip_proj)
-                       rel_dce_sub(sql, rel);
+                       rel_dce_sub(v, rel);
                return rel;
 
        case op_topn:
@@ -944,34 +944,34 @@ rel_dce_down(mvc *sql, sql_rel *rel, int
        case op_groupby:
 
                if (skip_proj && rel->l)
-                       rel->l = rel_dce_down(sql, rel->l, is_topn(rel->op) || 
is_sample(rel->op));
+                       rel->l = rel_dce_down(v, rel->l, is_topn(rel->op) || 
is_sample(rel->op));
                if (!skip_proj)
-                       rel_dce_sub(sql, rel);
+                       rel_dce_sub(v, rel);
                return rel;
 
        case op_inter:
        case op_except:
                if (skip_proj) {
                        if (rel->l)
-                               rel->l = rel_dce_down(sql, rel->l, 0);
+                               rel->l = rel_dce_down(v, rel->l, 0);
                        if (rel->r)
-                               rel->r = rel_dce_down(sql, rel->r, 0);
+                               rel->r = rel_dce_down(v, rel->r, 0);
                }
                if (!skip_proj)
-                       rel_dce_sub(sql, rel);
+                       rel_dce_sub(v, rel);
                return rel;
 
        case op_munion:
                if (skip_proj) {
                        for (node *n = ((list*)rel->l)->h; n; n = n->next)
-                               n->data = rel_dce_down(sql, n->data, 0);
+                               n->data = rel_dce_down(v, n->data, 0);
                }
                if (!skip_proj)
-                       rel_dce_sub(sql, rel);
+                       rel_dce_sub(v, rel);
                return rel;
        case op_select:
                if (rel->l)
-                       rel->l = rel_dce_down(sql, rel->l, 0);
+                       rel->l = rel_dce_down(v, rel->l, 0);
                return rel;
 
        case op_join:
@@ -981,22 +981,22 @@ rel_dce_down(mvc *sql, sql_rel *rel, int
        case op_semi:
        case op_anti:
                if (rel->l)
-                       rel->l = rel_dce_down(sql, rel->l, 0);
+                       rel->l = rel_dce_down(v, rel->l, 0);
                if (rel->r)
-                       rel->r = rel_dce_down(sql, rel->r, 0);
+                       rel->r = rel_dce_down(v, rel->r, 0);
                if (!skip_proj && !list_empty(rel->attr))
-                       rel_dce_sub(sql, rel);
+                       rel_dce_sub(v, rel);
                return rel;
 
        case op_ddl:
                if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table || rel->flag == 
ddl_create_table || rel->flag == ddl_create_view) {
                        if (rel->l)
-                               rel->l = rel_dce_down(sql, rel->l, 0);
+                               rel->l = rel_dce_down(v, rel->l, 0);
                } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
                        if (rel->l)
-                               rel->l = rel_dce_down(sql, rel->l, 0);
+                               rel->l = rel_dce_down(v, rel->l, 0);
                        if (rel->r)
-                               rel->r = rel_dce_down(sql, rel->r, 0);
+                               rel->r = rel_dce_down(v, rel->r, 0);
                }
                return rel;
        }
@@ -1010,48 +1010,46 @@ rel_dce_down(mvc *sql, sql_rel *rel, int
  */
 
 static sql_rel *
-rel_dce_sub(mvc *sql, sql_rel *rel)
+rel_dce_sub(visitor *v, sql_rel *rel)
 {
        if (!rel)
                return rel;
+       if (v->opt >= 0 && rel->opt >= v->opt) /* only once */
+        return rel;
 
        /*
         * Mark used up until the next project
         * For setops we need to first mark, then remove
         * because of positional dependency
         */
-       rel_mark_used(sql, rel, 1);
-       rel = rel_remove_unused(sql, rel);
-       rel_dce_down(sql, rel, 1);
+       rel_mark_used(v->sql, rel, 1);
+       rel = rel_remove_unused(v->sql, rel);
+       rel_dce_down(v, rel, 1);
+       if (rel && v->opt >= 0)
+        rel->opt = v->opt;
        return rel;
 }
 
-/*
-sql_rel *
-rel_deadcode_elimination(mvc *sql, sql_rel *rel)
-{
-       rel_used(rel);
-       return rel_dce_sub(sql, rel);
-}
-*/
-
 /* add projects under set ops */
 static sql_rel *
-rel_add_projects(mvc *sql, sql_rel *rel)
+rel_add_projects(visitor *v, sql_rel *rel)
 {
        if (!rel)
                return rel;
 
+       if (v->opt >= 0 && rel->opt >= v->opt) /* only once */
+        return rel;
+
        switch(rel->op) {
        case op_basetable:
        case op_truncate:
-               return rel;
+               break;
        case op_insert:
        case op_update:
        case op_delete:
                if (rel->r)
-                       rel->r = rel_add_projects(sql, rel->r);
-               return rel;
+                       rel->r = rel_add_projects(v, rel->r);
+               break;
        case op_inter:
        case op_except:
                /* We can only reduce the list of expressions of an set op
@@ -1061,27 +1059,27 @@ rel_add_projects(mvc *sql, sql_rel *rel)
                        sql_rel *l = rel->l;
 
                        if (!is_project(l->op) && !need_distinct(rel))
-                               l = rel_project(sql->sa, l, 
rel_projections(sql, l, NULL, 1, 1));
-                       rel->l = rel_add_projects(sql, l);
+                               l = rel_project(v->sql->sa, l, 
rel_projections(v->sql, l, NULL, 1, 1));
+                       rel->l = rel_add_projects(v, l);
                }
                if (rel->r) {
                        sql_rel *r = rel->r;
 
                        if (!is_project(r->op) && !need_distinct(rel))
-                               r = rel_project(sql->sa, r, 
rel_projections(sql, r, NULL, 1, 1));
-                       rel->r = rel_add_projects(sql, r);
+                               r = rel_project(v->sql->sa, r, 
rel_projections(v->sql, r, NULL, 1, 1));
+                       rel->r = rel_add_projects(v, r);
                }
-               return rel;
+               break;
        case op_munion:
                assert(rel->l);
                for (node *n = ((list*)rel->l)->h; n; n = n->next) {
                        sql_rel* r = n->data;
                        if (!is_project(r->op) && !need_distinct(rel))
-                               r = rel_project(sql->sa, r, 
rel_projections(sql, r, NULL, 1, 1));
-                       r = rel_add_projects(sql, r);
+                               r = rel_project(v->sql->sa, r, 
rel_projections(v->sql, r, NULL, 1, 1));
+                       r = rel_add_projects(v, r);
                        n->data = r;
                }
-               return rel;
+               break;
        case op_topn:
        case op_sample:
        case op_project:
@@ -1089,8 +1087,8 @@ rel_add_projects(mvc *sql, sql_rel *rel)
        case op_select:
        case op_table:
                if (rel->l && (rel->op != op_table || rel->flag != 
TRIGGER_WRAPPER))
-                       rel->l = rel_add_projects(sql, rel->l);
-               return rel;
+                       rel->l = rel_add_projects(v, rel->l);
+               break;
        case op_join:
        case op_left:
        case op_right:
@@ -1098,31 +1096,35 @@ rel_add_projects(mvc *sql, sql_rel *rel)
        case op_semi:
        case op_anti:
                if (rel->l)
-                       rel->l = rel_add_projects(sql, rel->l);
+                       rel->l = rel_add_projects(v, rel->l);
                if (rel->r)
-                       rel->r = rel_add_projects(sql, rel->r);
-               return rel;
+                       rel->r = rel_add_projects(v, rel->r);
+               break;
        case op_ddl:
                if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table || rel->flag == 
ddl_create_table || rel->flag == ddl_create_view) {
                        if (rel->l)
-                               rel->l = rel_add_projects(sql, rel->l);
+                               rel->l = rel_add_projects(v, rel->l);
                } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
                        if (rel->l)
-                               rel->l = rel_add_projects(sql, rel->l);
+                               rel->l = rel_add_projects(v, rel->l);
                        if (rel->r)
-                               rel->r = rel_add_projects(sql, rel->r);
+                               rel->r = rel_add_projects(v, rel->r);
                }
-               return rel;
+               break;
        }
+       if (rel && v->opt >= 0)
+        rel->opt = v->opt;
        return rel;
 }
 
 static sql_rel *
-rel_dce_(mvc *sql, sql_rel *rel)
+rel_dce_(visitor *v, sql_rel *rel)
 {
-       list *refs = sa_list(sql->sa);
+       list *refs = sa_list(v->sql->sa);
 
-       rel_dce_refs(sql, rel, refs);
+       if (v->opt >= 0 && rel)
+               v->opt = rel->opt+1;
+       rel_dce_refs(v->sql, rel, refs);
        if (refs) {
                for(node *n = refs->h; n; n = n->next) {
                        sql_rel *i = n->data;
@@ -1133,9 +1135,11 @@ rel_dce_(mvc *sql, sql_rel *rel)
                                rel_used(i);
                }
        }
-       rel = rel_add_projects(sql, rel);
+       rel = rel_add_projects(v, rel);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to