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