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 -- [email protected]
To unsubscribe send an email to [email protected]