Changeset: b599d28be2f0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b599d28be2f0
Modified Files:
        sql/server/rel_unnest.c
Branch: default
Log Message:

a little more values flattening, ie with projections with multiple attributes 
and multiple values (and a sub query) flatten using unions.


diffs (75 lines):

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
@@ -3784,15 +3784,51 @@ rewrite_complex(visitor *v, sql_rel *rel
        return e;
 }
 
+static sql_rel *
+flatten_values(mvc *sql, sql_rel *rel)
+{
+       list *exps = sa_list(sql->sa);
+       sql_exp *e = rel->exps->h->data;
+       sql_rel *cur = NULL;
+       list *vals = exp_get_values(e);
+       if (vals) {
+               for(int i = 0; i<list_length(vals); i++) {
+                       sql_rel *nrel = rel_project(sql->sa, NULL, 
sa_list(sql->sa));
+                       set_processed(nrel);
+                       for(node *n = rel->exps->h; n; n = n->next) {
+                               sql_exp *e = n->data;
+                               list *vals = exp_get_values(e);
+
+                               if (vals) {
+                                       if (i == 0)
+                                               append(exps, exp_ref(sql, e));
+                                       sql_exp *v = list_fetch(vals, i);
+                                       append(nrel->exps, v);
+                                       rel_set_exps(nrel, nrel->exps);
+                               }
+                       }
+                       if (cur) {
+                               nrel = rel_setop(sql->sa, cur, nrel, op_union);
+                               rel_setop_set_exps(sql, nrel, exps, false);
+                               set_processed(nrel);
+                       }
+                       cur = nrel;
+               }
+               rel_destroy(rel);
+               rel = cur;
+       }
+       return rel;
+}
+
 /* rewrite project [ [multi values], [multi values2] , .. [] ] -> union ) */
 static inline sql_rel *
 rewrite_values(visitor *v, sql_rel *rel)
 {
        int single = is_single(rel);
-       if (!is_simple_project(rel->op) || list_empty(rel->exps))
+       if (!is_simple_project(rel->op) || list_empty(rel->exps) || 
is_rewrite_values_used(rel->used))
                return rel;
 
-       if (rel_is_ref(rel) && !is_rewrite_values_used(rel->used)) { /* need 
extra project */
+       if (rel_is_ref(rel)) { /* 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 */
@@ -3803,6 +3839,9 @@ rewrite_values(visitor *v, sql_rel *rel)
        }
        sql_exp *e = rel->exps->h->data;
 
+       if (is_values(e) && list_length(rel->exps) > 1 && 
exps_have_rel_exp(rel->exps))
+               return flatten_values(v->sql, rel);
+
        if (!is_values(e) || list_length(exp_get_values(e))<=1 || 
(!exp_has_freevar(v->sql, e) && !exp_has_rel(e)))
                return rel;
 
@@ -3834,6 +3873,7 @@ rewrite_values(visitor *v, sql_rel *rel)
                }
                rel_destroy(rel);
                rel = cur;
+               rel->used |= rewrite_values_used;
                if (single)
                        set_single(rel);
        }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to