Changeset: 22e92ed20e0e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/22e92ed20e0e Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/vaults/json/json.c Branch: nested Log Message:
don't throw error on unknown field in the json string but rather skip it
diffs (113 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
@@ -5991,8 +5991,18 @@ insert_json_element(char **msg, JSON *js
}
used_mask[index] = 1;
} else {
- *msg = createException(SQL,
"sql.insert_json_element", "%s %s",ERROR_UNKNOWN_FIELD, name);
- return -1;
+ // skip to tail of the missing field
+ while (jt->tail) {
+ elm = jt->tail + 1;
+ jt = js->elm + elm;
+ }
+ // advance to the next JSON_ELEMENT
+ while(jt->kind != JSON_ELEMENT && elm<js->size)
{
+ elm++;
+ jt = js->elm + elm;
+ }
+ //*msg = createException(SQL,
"sql.insert_json_element", "%s %s",ERROR_UNKNOWN_FIELD, name);
+ //return -1;
}
break;
case JSON_ARRAY:
@@ -6011,8 +6021,18 @@ insert_json_element(char **msg, JSON *js
}
used_mask[index] = 1;
} else {
- *msg = createException(SQL,
"sql.insert_json_element", "%s %s",ERROR_UNKNOWN_FIELD, name);
- return -1;
+ // skip to tail of the missing field
+ while (jt->tail) {
+ elm = jt->tail + 1;
+ jt = js->elm + elm;
+ }
+ // advance to the next JSON_ELEMENT
+ while(jt->kind != JSON_ELEMENT && elm<js->size)
{
+ elm++;
+ jt = js->elm + elm;
+ }
+ //*msg = createException(SQL,
"sql.insert_json_element", "%s %s",ERROR_UNKNOWN_FIELD, name);
+ //return -1;
}
break;
case JSON_VALUE:
@@ -6033,8 +6053,10 @@ insert_json_element(char **msg, JSON *js
used_mask[index] = 1;
elm++;
} else {
- *msg = createException(SQL,
"sql.insert_json_element", "%s %s",ERROR_UNKNOWN_FIELD, name);
- return -1;
+ // ignore missing field
+ elm++;
+ //*msg = createException(SQL,
"sql.insert_json_element", "%s %s",ERROR_UNKNOWN_FIELD, name);
+ //return -1;
}
break;
case JSON_ELEMENT:
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
@@ -310,29 +310,31 @@ JSONread_ndjson(Client cntxt, MalBlkPtr
char *head = content;
char *tail = content;
while (cnt < (jfh->size + 1)) {
- if (head[0] == '\n' || ((strlen(head) > 2) &&
(head[0] == '\r' && head[1] == '\n'))) {
- int skip = 1;
- if (head[0] == '\r' && head[1] == '\n')
- skip = 2;
- head[0] = '\0';
- JSON *jt = JSONparse(tail);
- if (jt) {
- // must be valid json obj str
- if (BUNappend(b, tail, false)
!= GDK_SUCCEED) {
- msg =
createException(SQL, "json.read_ndjson", "BUNappend failed!");
- break;
+ if (head && *head != '\0') {
+ if (head[0] == '\n' || ((head[0] ==
'\r' && head[1] == '\n'))) {
+ int skip = 1;
+ if (head[0] == '\r' && head[1]
== '\n')
+ skip = 2;
+ head[0] = '\0';
+ JSON *jt = JSONparse(tail);
+ if (jt) {
+ // must be valid json
obj str
+ if (BUNappend(b, tail,
false) != GDK_SUCCEED) {
+ msg =
createException(SQL, "json.read_ndjson", "BUNappend failed!");
+ break;
+ }
+ } else {
+ msg =
createException(SQL, "json.read_ndjson", "Invalid json object, JSONparse
failed!");
+ break;
}
- } else {
- msg =
createException(SQL, "json.read_ndjson", "Invalid json object, JSONparse
failed!");
- break;
+ JSONfree(jt);
+ tail = head + skip;
+ while (tail[0] == '\n') //
multiple newlines e.g. \n\n
+ tail ++;
+ head = tail;
}
- JSONfree(jt);
- tail = head + skip;
- while (tail[0] == '\n') // multiple
newlines e.g. \n\n
- tail ++;
- head = tail;
+ head ++;
}
- head ++;
cnt ++;
}
} else {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]
