Changeset: 411a4fe9f4a3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/411a4fe9f4a3
Modified Files:
        sql/include/sql_relation.h
        sql/server/rel_distribute.c
        sql/server/rel_optimize_sel.c
        sql/server/rel_optimizer_private.h
        sql/server/rel_rewriter.c
        sql/server/rel_rewriter.h
        sql/server/rel_unnest.c
Branch: default
Log Message:

Clean 'used' flag usage from SQL relation. We have to keep track of every 
rewriter that uses it in a single location. Don't do relational tree iterations 
to clear it


diffs (163 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
@@ -294,14 +294,12 @@ typedef struct relation {
         processed:1,   /* fully processed or still in the process of building 
*/
         outer:1,       /* used as outer (ungrouped) */
         grouped:1,     /* groupby processed all the group by exps */
-        single:1,
+        single:1;
        /*
         * Used by rewriters at rel_unnest, rel_optimizer and rel_distribute so 
a relation is not modified twice
-        * All bits are used by rel_unnest modifiers and always reset after.
-        * The first bit is also used by rel_dce and rel_merge_select_rse 
optimizers.
-        * The third bit is used by rel_remote_func only and it's not reset.
+        * The list is kept at rel_optimizer_private.h Please update it 
accordingly
         */
-        used:3;
+       uint8_t used;
        void *p;        /* properties for the optimizer, distribution */
 } sql_rel;
 
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -364,10 +364,10 @@ rel_remote_func_(visitor *v, sql_rel *re
 {
        (void) v;
 
-       int rused = 1 << 2; /* Don't modify the same relation twice */
-       if (rel->used & rused)
+       /* Don't modify the same relation twice */
+       if (is_rel_remote_func_used(rel->used))
                return rel;
-       rel->used |= rused;
+       rel->used |= rel_remote_func_used;
 
        if (find_prop(rel->p, PROP_REMOTE) != NULL) {
                list *exps = rel_projections(v->sql, rel, NULL, 1, 1);
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
@@ -897,7 +897,7 @@ static inline sql_rel *
 rel_merge_select_rse(visitor *v, sql_rel *rel)
 {
        /* only execute once per select */
-       if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && 
rel->exps && !rel->used) {
+       if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && 
rel->exps && !is_rel_merge_select_rse_used(rel->used)) {
                node *n, *o;
                list *nexps = new_exp_list(v->sql->sa);
 
@@ -920,7 +920,7 @@ rel_merge_select_rse(visitor *v, sql_rel
                        }
                }
                rel->exps = nexps;
-               rel->used = 1;
+               rel->used |= rel_merge_select_rse_used;
        }
        return rel;
 }
@@ -946,8 +946,6 @@ rel_optimize_select_and_joins_bottomup(v
 {
        v->data = &gp->opt_cycle;
        rel = rel_visitor_bottomup(v, rel, 
&rel_optimize_select_and_joins_bottomup_);
-       if (gp->opt_cycle == 1)
-               rel = rel_visitor_bottomup(v, rel, &rewrite_reset_used); /* 
reset used flag, used by rel_merge_select_rse */
        v->data = gp;
        return rel;
 }
diff --git a/sql/server/rel_optimizer_private.h 
b/sql/server/rel_optimizer_private.h
--- a/sql/server/rel_optimizer_private.h
+++ b/sql/server/rel_optimizer_private.h
@@ -33,6 +33,20 @@ typedef struct sql_optimizer {
        run_optimizer (*bind_optimizer)(visitor *v, global_props *gp); /* if 
cannot run (disabled or not needed) returns NULL */
 } sql_optimizer;
 
+/* For every rewriter that cannot run twice on a relation, use the 'used' flag 
from the relation to mark when visited.
+   Please update this list accordingly when new rewriters are added */
+#define rewrite_fix_count_used    (1 << 0)
+#define rewrite_values_used       (1 << 1)
+#define rewrite_outer_used        (1 << 2)
+#define rel_merge_select_rse_used (1 << 3)
+#define rel_remote_func_used      (1 << 4)
+
+#define is_rewrite_fix_count_used(X)    ((X & rewrite_fix_count_used) == 
rewrite_fix_count_used)
+#define is_rewrite_values_used(X)       ((X & rewrite_values_used) == 
rewrite_values_used)
+#define is_rewrite_outer_used(X)        ((X & rewrite_outer_used) == 
rewrite_outer_used)
+#define is_rel_merge_select_rse_used(X) ((X & rel_merge_select_rse_used) == 
rel_merge_select_rse_used)
+#define is_rel_remote_func_used(X)      ((X & rel_remote_func_used) == 
rel_remote_func_used)
+
 /* At the moment the follwowing optimizers 'packs' can be disabled,
    later we could disable individual optimizers from the 'pack' */
 #define split_select                        (1 << 0)
diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c
--- a/sql/server/rel_rewriter.c
+++ b/sql/server/rel_rewriter.c
@@ -231,14 +231,6 @@ rewrite_simplify(visitor *v, uint8_t cyc
        return try_remove_empty_select(v, rel);
 }
 
-sql_rel *
-rewrite_reset_used(visitor *v, sql_rel *rel)
-{
-       (void) v;
-       rel->used = 0;
-       return rel;
-}
-
 int
 find_member_pos(list *l, sql_table *t)
 {
diff --git a/sql/server/rel_rewriter.h b/sql/server/rel_rewriter.h
--- a/sql/server/rel_rewriter.h
+++ b/sql/server/rel_rewriter.h
@@ -37,8 +37,6 @@ try_remove_empty_select(visitor *v, sql_
        return rel;
 }
 
-extern sql_rel *rewrite_reset_used(visitor *v, sql_rel *rel);
-
 extern int find_member_pos(list *l, sql_table *t);
 extern sql_column *name_find_column(sql_rel *rel, const char *rname, const 
char *name, int pnr, sql_rel **bt);
 
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
@@ -6,9 +6,8 @@
  * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V.
  */
 
-/*#define DEBUG*/
-
 #include "monetdb_config.h"
+#include "rel_optimizer_private.h"
 #include "sql_decimal.h"
 #include "rel_unnest.h"
 #include "rel_basetable.h"
@@ -16,15 +15,6 @@
 #include "rel_select.h"
 #include "rel_rewriter.h"
 
-/* some unnesting steps use the 'used' flag to avoid further rewrites. List 
them here, so only one reset flag iteration will be used */
-#define rewrite_fix_count_used (1 << 0)
-#define rewrite_values_used    (1 << 1)
-#define rewrite_outer_used     (1 << 2)
-
-#define is_rewrite_fix_count_used(X) ((X & rewrite_fix_count_used) == 
rewrite_fix_count_used)
-#define is_rewrite_values_used(X)    ((X & rewrite_values_used) == 
rewrite_values_used)
-#define is_rewrite_outer_used(X)     ((X & rewrite_outer_used) == 
rewrite_outer_used)
-
 static void
 exp_set_freevar(mvc *sql, sql_exp *e, sql_rel *r)
 {
@@ -4116,10 +4106,6 @@ rel_unnest_simplify(visitor *v, sql_rel 
 static sql_rel *
 rel_unnest_projects(visitor *v, sql_rel *rel)
 {
-       /* The rewriters 'rewrite_values', 'rewrite_fix_count' and 
'rewrite_outer2inner_union' use
-          'used' property from sql_rel, reset it, so make sure 
rewrite_reset_used is called first */
-       if (rel)
-               rel = rewrite_reset_used(v, rel);
        if (rel)
                rel = rewrite_remove_xp(v, rel);        /* remove crossproducts 
with project [ atom ] */
        if (rel)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to