Changeset: c2f4e0bda9a3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c2f4e0bda9a3
Modified Files:
        monetdb5/modules/mal/batExtensions.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/test/nested/Tests/All
Branch: nested
Log Message:

pass info over multiset id columns


diffs (230 lines):

diff --git a/monetdb5/modules/mal/batExtensions.c 
b/monetdb5/modules/mal/batExtensions.c
--- a/monetdb5/modules/mal/batExtensions.c
+++ b/monetdb5/modules/mal/batExtensions.c
@@ -200,8 +200,14 @@ CMDBATappend_bulk(Client cntxt, MalBlkPt
        bat *r = getArgReference_bat(stk, pci, 0),
                *bid = getArgReference_bat(stk, pci, 1);
        bit force = *getArgReference_bit(stk, pci, 2);
+       bit ms = false;
+       int argc = 3;
+       if (getArgType(mb, pci, argc) == TYPE_bit && getArgType(mb, pci, argc + 
1) != TYPE_bit) {
+               ms = *getArgReference_bit(stk, pci, argc);
+               argc++;
+       }
        BAT *b;
-       BUN inputs = (BUN) (pci->argc - 3), number_existing = 0, total = 0;
+       BUN inputs = (BUN) (pci->argc - argc), number_existing = 0, total = 0;
 
        (void) cntxt;
        if ((b = BATdescriptor(*bid)) == NULL)
@@ -210,9 +216,32 @@ CMDBATappend_bulk(Client cntxt, MalBlkPt
        if (inputs > 0) {
                number_existing = BATcount(b);
 
-               if (isaBatType(getArgType(mb, pci, 3))) {       /* use 
BATappend for the bulk case */
+               if (isaBatType(getArgType(mb, pci, argc))) {    /* use 
BATappend for the bulk case */
                        gdk_return rt;
-                       for (int i = 3, args = pci->argc; i < args; i++) {
+                       if (ms) {
+                               int nr = -1;
+                               for (int i = argc, args = pci->argc; i < args; 
i++) {
+                                       BAT *d = 
BATdescriptor(*getArgReference_bat(stk, pci, i));
+                                       if (!d) {
+                                               BBPunfix(b->batCacheid);
+                                               throw(MAL, "bat.append_bulk",
+                                                               SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
+                                       }
+                                       if (i > argc) {
+                                               int *t = Tloc(d, 0);
+                                               for(BUN n = 0; n < BATcount(d); 
n++)
+                                                       t[n] += nr;
+                                       }
+                                       rt = BATappend(b, d, NULL, force);
+                                       nr = *(int*)Tloc(b, BATcount(b)-1);
+                                       BBPunfix(d->batCacheid);
+                                       if (rt != GDK_SUCCEED) {
+                                               BBPunfix(b->batCacheid);
+                                               throw(MAL, "bat.append_bulk", 
GDK_EXCEPTION);
+                                       }
+                               }
+                       } else
+                       for (int i = argc, args = pci->argc; i < args; i++) {
                                BAT *d = 
BATdescriptor(*getArgReference_bat(stk, pci, i));
                                if (!d) {
                                        BBPunfix(b->batCacheid);
@@ -242,7 +271,7 @@ CMDBATappend_bulk(Client cntxt, MalBlkPt
                                BBPunfix(b->batCacheid);
                                throw(MAL, "bat.append_bulk", GDK_EXCEPTION);
                        }
-                       for (int i = 3, args = pci->argc; i < args; i++) {
+                       for (int i = argc, args = pci->argc; i < args; i++) {
                                ptr u = getArgReference(stk, pci, i);
                                if (external)
                                        u = (ptr) *(ptr *) u;
@@ -291,6 +320,7 @@ mel_func batExtensions_init_funcs[] = {
  pattern("bat", "partition", CMDBATpartition2, false, "Create the n-th slice 
over the BAT broken into several pieces.", args(1,4, 
batargany("",1),batargany("b",1),arg("pieces",int),arg("n",int))),
  pattern("bat", "appendBulk", CMDBATappend_bulk, false, "append the arguments 
ins to i", args(1,4, batargany("",1), 
batargany("i",1),arg("force",bit),varargany("ins",1))),
  pattern("bat", "appendBulk", CMDBATappend_bulk, false, "append the arguments 
ins to i", args(1,4, batargany("",1), 
batargany("i",1),arg("force",bit),batvarargany("ins",1))),
+ pattern("bat", "appendBulk", CMDBATappend_bulk, false, "append the arguments 
ins to i", args(1,5, batargany("",1), 
batargany("i",1),arg("force",bit),arg("inc",bit), batvarargany("ins",1))),
  command("bat", "vacuum", CMDBATvacuum, false, "", args(1,2, 
batarg("",str),batarg("b",str))),
  { .imp=NULL }
 };
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
@@ -3440,6 +3440,7 @@ stmt_append_bulk(backend *be, stmt *c, l
        MalBlkPtr mb = be->mb;
        InstrPtr q = NULL;
        bool needs_columns = false;
+       bool ms = false;
 
        if (c->nr < 0)
                goto bailout;
@@ -3455,14 +3456,18 @@ stmt_append_bulk(backend *be, stmt *c, l
                        stmt *t = n->data;
                        if (t->nrcols == 0)
                                n->data = const_column(be, t);
+                       if (t->multiset)
+                               ms = true;
                }
        }
 
-       q = newStmtArgs(mb, batRef, appendBulkRef, list_length(l) + 3);
+       q = newStmtArgs(mb, batRef, appendBulkRef, list_length(l) + 3 + ms?1:0);
        if (q == NULL)
                goto bailout;
        q = pushArgument(mb, q, c->nr);
        q = pushBit(mb, q, TRUE);
+       if (ms)
+               q = pushBit(mb, q, TRUE);
        for (node *n = l->h ; n ; n = n->next) {
                stmt *a = n->data;
                q = pushArgument(mb, q, a->nr);
@@ -3959,14 +3964,20 @@ composite_type_resultsize(sql_subtype *t
        return nr;
 }
 
+typedef struct result_subtype {
+       sql_subtype st;
+       bool multiset; /* multiset id */
+} result_subtype;
+/* mark multiset rowid and msid as multiset, for later id correction */
 static int
-composite_type_result(backend *be, InstrPtr q, sql_subtype *t, sql_subtype 
*tps)
+composite_type_result(backend *be, InstrPtr q, sql_subtype *t, result_subtype 
*tps)
 {
        int i = 0;
        if (t->multiset || t->type->composite) {
                if (t->multiset) { /* id col : rowid */
                        q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(TYPE_int)));
-                       tps[i++] = *sql_bind_localtype("int");
+                       tps[i].st = *sql_bind_localtype("int");
+                       tps[i++].multiset = true;
                }
                if (t->type->composite) {
                        for (node *n = t->type->d.fields->h; n; n = n->next) {
@@ -3978,19 +3989,23 @@ composite_type_result(backend *be, Instr
                        }
                } else {
                        q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(t->type->localtype)));
-                       tps[i++] = *t;
+                       tps[i].st = *t;
+                       tps[i++].multiset = false;
                }
                if (t->multiset) { /* msid */
                        q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(TYPE_int)));
-                       tps[i++] = *sql_bind_localtype("int");
+                       tps[i].st = *sql_bind_localtype("int");
+                       tps[i++].multiset = true;
                }
                if (t->multiset == MS_ARRAY) { /* msnr */
                        q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(TYPE_int)));
-                       tps[i++] = *sql_bind_localtype("int");
+                       tps[i].st = *sql_bind_localtype("int");
+                       tps[i++].multiset = false;
                }
        } else {
                q = pushReturn(be->mb, q, newTmpVariable(be->mb, 
newBatType(t->type->localtype)));
-               tps[i++] = *t;
+               tps[i].st = *t;
+               tps[i++].multiset = false;
        }
        return i;
 }
@@ -4000,7 +4015,7 @@ 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);
+       result_subtype *tps = SA_NEW_ARRAY(be->mvc->sa, result_subtype, nrcols);
 
        InstrPtr q = newStmtArgs(be->mb, "sql", "from_json", nrcols + 2);
        if (q == NULL)
@@ -4034,8 +4049,12 @@ stmt_from_json(backend *be, stmt *v, stm
        pushInstruction(be->mb, q);
        /* 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_blackbox_result(be, s->q, i, tps+i));
+       for(int i = 0; i < nrcols; i++) {
+               stmt *br = stmt_blackbox_result(be, s->q, i, &tps[i].st);
+               append(r, br);
+               if (tps[i].multiset)
+                       br->multiset = true;
+       }
        return stmt_list(be, r);
 bailout:
        if (be->mvc->sa->eb.enabled)
@@ -4048,7 +4067,7 @@ 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);
+       result_subtype *tps = SA_NEW_ARRAY(be->mvc->sa, result_subtype, nrcols);
 
        InstrPtr q = newStmtArgs(be->mb, "sql", "from_varchar", nrcols + 2);
        if (q == NULL)
@@ -4082,8 +4101,12 @@ stmt_from_varchar(backend *be, stmt *v, 
        pushInstruction(be->mb, q);
        /* 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_blackbox_result(be, s->q, i, tps+i));
+       for(int i = 0; i < nrcols; i++) {
+               stmt *br = stmt_blackbox_result(be, s->q, i, &tps[i].st);
+               append(r, br);
+               if (tps[i].multiset)
+                       br->multiset = true;
+       }
        return stmt_list(be, r);
 bailout:
        if (be->mvc->sa->eb.enabled)
@@ -4721,6 +4744,7 @@ stmt_alias_(backend *be, stmt *op1, int 
        s->nrcols = op1->nrcols;
        s->key = op1->key;
        s->aggr = op1->aggr;
+       s->multiset = op1->multiset;
 
        s->tname = tname;
        s->cname = alias;
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -124,7 +124,8 @@ typedef struct stmt {
         aggr:1,                /* aggregated */
         partition:1,   /* selected as mitosis candidate */
         reduce:1,              /* used to reduce number of rows (also for 
joins) */
-        loop:1;                /* cond statement is looping */
+        loop:1,                /* cond statement is looping */
+        multiset:1;    /* id column of multiset */
 
        struct stmt *cand;      /* optional candidate list */
 
diff --git a/sql/test/nested/Tests/All b/sql/test/nested/Tests/All
--- a/sql/test/nested/Tests/All
+++ b/sql/test/nested/Tests/All
@@ -2,3 +2,4 @@ simple
 basic
 json
 webclicks
+array
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to