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]