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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to