Changeset: 103c27da7d60 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=103c27da7d60
Modified Files:
sql/include/sql_relation.h
sql/server/rel_unnest.c
Branch: default
Log Message:
Merged with Oct2020
diffs (71 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
@@ -277,7 +277,7 @@ typedef struct relation {
outer:1, /* used as outer (ungrouped) */
grouped:1, /* groupby processed all the group by exps */
single:1,
- used:1; /* used by rewrite_fix_count at rel_unnest, so a
relation is not modified twice */
+ used:2; /* used by rewriters at rel_unnest and rel_dce, so a
relation is not modified twice */
void *p; /* properties for the optimizer, distribution */
} sql_rel;
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
@@ -20,6 +20,13 @@
#include "sql_query.h"
#include "mal_errors.h" /* for SQLSTATE() */
+/* 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 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)
+
static void
exp_set_freevar(mvc *sql, sql_exp *e, sql_rel *r)
{
@@ -3173,7 +3180,7 @@ rewrite_fix_count(visitor *v, sql_rel *r
int rel_changes = 0;
sql_rel *r = rel->r;
- if (!r->used) {
+ if (!is_rewrite_fix_count_used(r->used)) {
/* TODO create an exp iterator */
list *rexps = rel_projections(v->sql, r, NULL, 1, 1),
*exps;
@@ -3207,7 +3214,7 @@ rewrite_fix_count(visitor *v, sql_rel *r
exps = list_merge(rel_projections(v->sql,
rel->l, NULL, 1, 1), rexps, (fdup)NULL);
rel = rel_project(v->sql->sa, rel, exps);
set_processed(rel);
- r->used = 1;
+ r->used |= rewrite_fix_count_used;
v->changes++;
}
}
@@ -3468,11 +3475,12 @@ rewrite_values(visitor *v, sql_rel *rel)
if (!is_simple_project(rel->op) || list_empty(rel->exps))
return rel;
- if (rel_is_ref(rel)) { /* need extra project */
+ if (rel_is_ref(rel) && !is_rewrite_values_used(rel->used)) { /* need
extra project */
rel->l = rel_project(v->sql->sa, rel->l, rel->exps);
rel->exps = rel_projections(v->sql, rel->l, NULL, 1, 1);
((sql_rel*)rel->l)->r = rel->r; /* propagate order by exps */
rel->r = NULL;
+ rel->used |= rewrite_values_used;
return rel;
}
sql_exp *e = rel->exps->h->data;
@@ -3545,7 +3553,8 @@ rel_unnest(mvc *sql, sql_rel *rel)
rel = rel_visitor_bottomup(&v, rel, &rel_remove_empty_select);
rel = rel_visitor_bottomup(&v, rel, &_rel_unnest);
rel = rel_visitor_bottomup(&v, rel, &rewrite_fix_count); /* fix
count inside a left join (adds a project (if (cnt IS null) then (0) else (cnt))
*/
- rel = rel_visitor_bottomup(&v, rel, &rewrite_reset_used); /*
rewrite_fix_count uses 'used' property from sql_rel, reset it after it's done */
+ /* both rewrite_values and rewrite_fix_count use 'used' property from
sql_rel, reset it */
+ rel = rel_visitor_bottomup(&v, rel, &rewrite_reset_used);
rel = rel_visitor_bottomup(&v, rel, &rewrite_remove_xp); /*
remove crossproducts with project [ atom ] */
rel = rel_visitor_bottomup(&v, rel, &rewrite_groupings); /*
transform group combinations into union of group relations */
rel = rel_visitor_bottomup(&v, rel, &rewrite_empty_project);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list