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]

Reply via email to