Changeset: 3193046d6b05 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3193046d6b05
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_exp.c
Branch: nested
Log Message:

combine multi-results


diffs (76 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -656,6 +656,8 @@ set_value_list(backend *be, sql_exp *val
        assert(is_values(vals_exp));
        list *vals = exp_get_values(vals_exp);
        sql_subtype *type = exp_subtype(vals->h->data);
+       bool single_value = list_length(vals) <= 1;
+       int multi_result = 0;
 
        if (!type)
                return sql_error(be->mvc, 02, SQLSTATE(42000) "Could not infer 
the type of a value list column");
@@ -668,15 +670,31 @@ set_value_list(backend *be, sql_exp *val
 
                if (!i)
                        return NULL;
-
-               if (list_length(vals) == 1)
+               if (single_value)
                        return i;
                list_append(l, i);
+
+               if (i->type == st_list && list_length(i->op4.lval) > 1)
+                       multi_result = list_length(i->op4.lval);
        }
        /*  n-tuples */
-       //for (node *n = l->h; n; n = n->next) {
-
-       //}
+       if (multi_result) {
+               list *rl = sa_list(be->mvc->sa);
+               for(int i = 0; i < multi_result; i++) {
+                       node *n = l->h;
+                       stmt *s = n->data;
+                       stmt *input = list_fetch(s->op4.lval, i);
+                       sql_subtype *type = tail_type(input);
+                       list *nl = list_append(sa_list(be->mvc->sa), input);
+                       for (; n; n = n->next) {
+                               stmt *s = n->data;
+                               stmt *input = list_fetch(s->op4.lval, i);
+                               nl = list_append(nl, input);
+                       }
+                       append(rl, stmt_append_bulk(be, stmt_temp(be, type), 
nl));
+               }
+               return stmt_list(be, rl);
+       }
        return stmt_append_bulk(be, stmt_temp(be, type), l);
 }
 
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -3682,7 +3682,7 @@ exp_check_composite_type(mvc *sql, sql_s
        node *n, *m;
        list *vals = NULL;
        assert(t->type->composite);
-       if (!exp_is_rel(exp) && !is_row(exp))
+       if (!exp_is_rel(exp) && is_row(exp) && !is_values(exp))
                return sql_error( sql, 03, SQLSTATE(42000) "cannot convert 
value into composite type '%s'", t->type->base.name);
 
        if (exp_is_rel(exp)) {
@@ -3767,9 +3767,12 @@ exp_check_type(mvc *sql, sql_subtype *t,
        if (t->type->composite || t->multiset) {
                if (fromtype && subtype_cmp(t, fromtype) == 0)
                        return exp;
-               if (t->multiset || !is_row(exp))
+               if (t->multiset && !is_row(exp))
                        return exp_check_multiset_type(sql, t, rel, exp, tpe);
-               return exp_check_composite_type(sql, t, rel, exp, tpe);
+               if (t->type->composite && (is_row(exp) || is_values(exp)))
+                       return exp_check_composite_type(sql, t, rel, exp, tpe);
+               if (is_values(exp))
+                       return NULL;
        }
        if ((!fromtype || !fromtype->type) && rel_set_type_param(sql, t, rel, 
exp, 0) == 0)
                return exp;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to