Changeset: 4b82533d1d42 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/4b82533d1d42 Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/vaults/json/json.c Branch: nested Log Message:
wip inserting complex json diffs (105 lines): 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 @@ -5741,6 +5741,7 @@ static int insert_json_object(char **msg, JSON *js, BAT **bats, int bat_offset, int nr, int elm, int id, int anr, sql_subtype *t) { char buf[128]; /* TODO use proper buffer */ + int old_bat_offset = bat_offset; node *n; JSONterm *jt = js->elm+elm; if (jt->kind != JSON_OBJECT || !t->type->composite) { @@ -5788,6 +5789,7 @@ insert_json_object(char **msg, JSON *js, nlen = (int)jt->valuelen; break; case JSON_VALUE: + break; case JSON_STRING: case JSON_NUMBER: case JSON_BOOL: @@ -5817,10 +5819,13 @@ insert_json_object(char **msg, JSON *js, } } - if (t->multiset && elm > 0 && BUNappend(bats[w + bat_offset], &id, false) != GDK_SUCCEED) - elm = -3; - if (t->multiset == MS_ARRAY && elm > 0 && BUNappend(bats[w + 1 + bat_offset], &anr, false) != GDK_SUCCEED) - elm = -3; + if (bat_offset > old_bat_offset && old_bat_offset != 0) { + if (elm > 0 && BUNappend(bats[bat_offset], &id, false) != GDK_SUCCEED) + elm = -3; + if (elm > 0 && BUNappend(bats[bat_offset + 1], &anr, false) != GDK_SUCCEED) + elm = -3; + } + return elm; } @@ -5833,7 +5838,7 @@ insert_json_array(char **msg, JSON *js, *msg = "missing array start"; return -1; } - int anr = 1; + int anr = 1; // array number node *n; for (; elm < tail; elm=ja->next) { /* array begin, comma, end */ ja = js->elm+elm; @@ -5848,7 +5853,7 @@ insert_json_array(char **msg, JSON *js, t = &a->type; } elm = insert_json_object(msg, js, bats, bat_offset + 1, nr, elm, id, anr++, t); - (void)oanr; + (void)oanr; // outer array number break; default: printf("todo\n"); @@ -5863,16 +5868,16 @@ insert_json_array(char **msg, JSON *js, } static str -insert_json_str(const char *jstr, BAT **bats, int cnt, sql_subtype *t) +insert_json_str(const char *jstr, BAT **bats, int cnt, unsigned int row_id, sql_subtype *t) { char *res = MAL_SUCCEED; JSON *js = JSONparse(jstr); if (!js) throw(SQL, "insert_json_str", "JSONparse error"); if (t->multiset) - (void)insert_json_array(&res, js, bats, 0, cnt, 0, 1, 1, t); + (void)insert_json_array(&res, js, bats, 0, cnt, 0, row_id, 1, t); else - (void)insert_json_object(&res, js, bats, 0, cnt, 0, 1, 1, t); + (void)insert_json_object(&res, js, bats, 0, cnt, 0, row_id, 1, t); JSONfree(js); return res; } @@ -5910,7 +5915,7 @@ 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, p, t)) != MAL_SUCCEED) { BBPreclaim(b); goto bailout; } @@ -5921,7 +5926,7 @@ SQLfrom_json(Client cntxt, MalBlkPtr mb, if (strcmp(BATatoms[mtype].name, "json") != 0) throw(SQL, "SQLfrom_json", SQLSTATE(HY013) "Incorrect argument type"); str json = *(str*)getArgReference(stk, pci, pci->retc); - if ((msg = insert_json_str(json, bats, pci->retc, t )) != MAL_SUCCEED) + if ((msg = insert_json_str(json, bats, pci->retc, 1, t)) != MAL_SUCCEED) goto bailout; } diff --git a/sql/backends/monet5/vaults/json/json.c b/sql/backends/monet5/vaults/json/json.c --- a/sql/backends/monet5/vaults/json/json.c +++ b/sql/backends/monet5/vaults/json/json.c @@ -153,7 +153,7 @@ json_relation(mvc *sql, sql_subfunc *f, sql_schema *jsons = mvc_bind_schema(sql, "sys"); if (!jsons) return NULL; - sql_subtype *st = SA_NEW(sql->sa, sql_subtype); + sql_subtype *st = SA_ZNEW(sql->sa, sql_subtype); st->digits = st->scale = 0; st->multiset = 0; st->type = schema_bind_type(sql, jsons, "json"); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org