Changeset: 3d2fc4e012ef for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3d2fc4e012ef
Modified Files:
        sql/backends/monet5/sql_statement.c
Branch: nested
Log Message:

properly set output types of result


diffs (99 lines):

diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3960,28 +3960,39 @@ composite_type_resultsize(sql_subtype *t
 }
 
 static int
-composite_type_result(backend *be, InstrPtr q, sql_subtype *t)
+composite_type_result(backend *be, InstrPtr q, sql_subtype *t, sql_subtype 
*tps)
 {
+       int i = 0;
        if (t->multiset || t->type->composite) {
-               if (t->multiset) /* id col : rowid */
+               if (t->multiset) { /* id col : rowid */
                        q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(TYPE_int)));
+                       tps[i++] = *sql_bind_localtype("int");
+               }
                if (t->type->composite) {
                        for (node *n = t->type->d.fields->h; n; n = n->next) {
                                sql_arg *a = n->data;
-                               if (composite_type_result(be, q, &a->type) != 0)
+                               int r = 0;
+                               if ((r = composite_type_result(be, q, &a->type, 
tps+i)) < 0)
                                        return -1;
+                               i += r;
                        }
                } else {
                        q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(t->type->localtype)));
+                       tps[i++] = *t;
                }
-               if (t->multiset) /* msid */
+               if (t->multiset) { /* msid */
                        q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(TYPE_int)));
-               if (t->multiset == MS_ARRAY) /* msnr */
+                       tps[i++] = *sql_bind_localtype("int");
+               }
+               if (t->multiset == MS_ARRAY) { /* msnr */
                        q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(TYPE_int)));
+                       tps[i++] = *sql_bind_localtype("int");
+               }
        } else {
                q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(t->type->localtype)));
+               tps[i++] = *t;
        }
-       return 0;
+       return i;
 }
 
 static stmt *
@@ -3989,13 +4000,14 @@ stmt_from_json(backend *be, stmt *v, stm
 {
        (void)sel;
        int nrcols = composite_type_resultsize(t);
+       sql_subtype *tps = SA_NEW_ARRAY(be->mvc->sa, sql_subtype, nrcols);
 
        InstrPtr q = newStmtArgs(be->mb, "sql", "from_json", nrcols + 2);
        if (q == NULL)
                goto bailout;
 
        q->retc = q->argc = 0;
-       if (composite_type_result(be, q, t) != 0) {
+       if (composite_type_result(be, q, t, tps) < 0) {
                freeInstruction(q);
                goto bailout;
        }
@@ -4023,7 +4035,7 @@ stmt_from_json(backend *be, stmt *v, stm
        /* for each result create stmt_result and return stmt list */
        list *r = sa_list(be->mvc->sa);
        for(int i = 0; i < nrcols; i++)
-               append(r, stmt_result(be, s, i));
+               append(r, stmt_blackbox_result(be, s->q, i, tps+i));
        return stmt_list(be, r);
 bailout:
        if (be->mvc->sa->eb.enabled)
@@ -4036,13 +4048,14 @@ stmt_from_varchar(backend *be, stmt *v, 
 {
        (void)sel;
        int nrcols = composite_type_resultsize(t);
+       sql_subtype *tps = SA_NEW_ARRAY(be->mvc->sa, sql_subtype, nrcols);
 
        InstrPtr q = newStmtArgs(be->mb, "sql", "from_varchar", nrcols + 2);
        if (q == NULL)
                goto bailout;
 
        q->retc = q->argc = 0;
-       if (composite_type_result(be, q, t) != 0) {
+       if (composite_type_result(be, q, t, tps) < 0) {
                freeInstruction(q);
                goto bailout;
        }
@@ -4070,7 +4083,7 @@ stmt_from_varchar(backend *be, stmt *v, 
        /* for each result create stmt_result and return stmt list */
        list *r = sa_list(be->mvc->sa);
        for(int i = 0; i < nrcols; i++)
-               append(r, stmt_result(be, s, i));
+               append(r, stmt_blackbox_result(be, s->q, i, tps+i));
        return stmt_list(be, r);
 bailout:
        if (be->mvc->sa->eb.enabled)
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to