Changeset: e2a1cfbff798 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/e2a1cfbff798 Modified Files: sql/backends/monet5/sql.c Branch: nested Log Message:
merge upstream diffs (truncated from 532 to 300 lines): diff --git a/clients/Tests/MAL-signatures-hge.test b/clients/Tests/MAL-signatures-hge.test --- a/clients/Tests/MAL-signatures-hge.test +++ b/clients/Tests/MAL-signatures-hge.test @@ -3729,6 +3729,11 @@ pattern bat.appendBulk(X_0:bat[:any_1], CMDBATappend_bulk append the arguments ins to i bat +appendBulk +pattern bat.appendBulk(X_0:bat[:any_1], X_1:bit, X_2:bit, X_3:bat[:any_1]...):bat[:any_1] +CMDBATappend_bulk +append the arguments ins to i +bat delete command bat.delete(X_0:bat[:any_1], X_1:oid):bat[:any_1] BKCdelete @@ -49165,7 +49170,7 @@ SQLfrom_json Reads json string into table of nested/multiset structures sql from_varchar -pattern sql.from_varchar(X_0:str, X_1:ptr):bat[:any]... +pattern sql.from_varchar(X_0:bat?[:str], X_1:ptr):bat[:any]... SQLfrom_varchar Reads string into table of nested/multiset structures sql diff --git a/clients/Tests/MAL-signatures.test b/clients/Tests/MAL-signatures.test --- a/clients/Tests/MAL-signatures.test +++ b/clients/Tests/MAL-signatures.test @@ -3164,6 +3164,11 @@ pattern bat.appendBulk(X_0:bat[:any_1], CMDBATappend_bulk append the arguments ins to i bat +appendBulk +pattern bat.appendBulk(X_0:bat[:any_1], X_1:bit, X_2:bit, X_3:bat[:any_1]...):bat[:any_1] +CMDBATappend_bulk +append the arguments ins to i +bat delete command bat.delete(X_0:bat[:any_1], X_1:oid):bat[:any_1] BKCdelete @@ -37605,7 +37610,7 @@ SQLfrom_json Reads json string into table of nested/multiset structures sql from_varchar -pattern sql.from_varchar(X_0:str, X_1:ptr):bat[:any]... +pattern sql.from_varchar(X_0:bat?[:str], X_1:ptr):bat[:any]... SQLfrom_varchar Reads string into table of nested/multiset structures sql 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.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -5881,10 +5881,13 @@ SQLfrom_json(Client cntxt, MalBlkPtr mb, BUN p, q; BATloop(b, p, q) { const char *json = (const char *) BUNtail(bi, p); - if ((msg = insert_json_str(json, bats, pci->retc, t )) != MAL_SUCCEED) + if ((msg = insert_json_str(json, bats, pci->retc, t )) != MAL_SUCCEED) { + BBPreclaim(b); goto bailout; + } } bat_iterator_end(&bi); + BBPreclaim(b); } else { if (strcmp(BATatoms[mtype].name, "json") != 0) throw(SQL, "SQLfrom_json", SQLSTATE(HY013) "Incorrect argument type"); diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c --- a/sql/backends/monet5/sql_result.c +++ b/sql/backends/monet5/sql_result.c @@ -2147,7 +2147,22 @@ ARRAYparser(char *s, Column *cols, int n throw(SQL, "SQLfrom_varchar", SQLSTATE(42000) "missing ( at end of composite value"); } else { /* handle literals */ - char *ns = strchr(s, ','); + int skip = 0; + char *ns = NULL; + if (t->type->localtype == TYPE_str) { + /* todo improve properly skip "" strings. */ + if (*s != '"') + throw(SQL, "SQLfrom_varchar", SQLSTATE(42000) "missing \" at start of string value"); + s++; + ns = s; + while(*ns && *ns != '"') + ns++; + if (*ns != '"') + throw(SQL, "SQLfrom_varchar", SQLSTATE(42000) "missing \" at end of string value"); + skip++; + } else { + ns = strchr(s, ','); + } if (!ns) { ns = strchr(s, '}'); } @@ -2164,6 +2179,8 @@ ARRAYparser(char *s, Column *cols, int n elm++; *ns = sep; s = ns; + if (skip) + s++; } /* insert msid */ if (elm >= 0 && BUNappend(cols[elm].c, &id, false) != GDK_SUCCEED) 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; + } _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org