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