Changeset: e8deb0ba1619 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e8deb0ba1619
Modified Files:
        monetdb5/modules/atoms/Tests/json15.mal
        monetdb5/modules/atoms/Tests/json15.stable.out
        monetdb5/modules/atoms/json.c
        sql/benchmarks/nobench/Tests/nobench.sql
        sql/benchmarks/nobench/Tests/nobench.stable.out
        sql/common/sql_string.c
        
sql/test/BugTracker-2012/Tests/strange_escaping_in_csv.Bug-2133.stable.out
        sql/test/json/Tests/jsonvalidity.Bug-3753.stable.out
        sql/test/json/Tests/parsing.stable.err
Branch: default
Log Message:

merged with jul2015


diffs (truncated from 587 to 300 lines):

diff --git a/monetdb5/modules/atoms/Tests/json15.mal 
b/monetdb5/modules/atoms/Tests/json15.mal
--- a/monetdb5/modules/atoms/Tests/json15.mal
+++ b/monetdb5/modules/atoms/Tests/json15.mal
@@ -1,7 +1,7 @@
-j1:= json.new("3.14");
+#j1:= json.new("3.14");
 #json.dump(j1);
-d:= json.number(j1);
-io.print(d);
+#d:= json.number(j1);
+#io.print(d);
 
 j1:= json.new("[3.14]");
 #json.dump(j1);
@@ -18,10 +18,10 @@ d:= json.number(j1);
 io.print(d);
 
 
-j1:= json.new("314");
+#j1:= json.new("314");
 #json.dump(j1);
-i:= json.integer(j1);
-io.print(i);
+#i:= json.integer(j1);
+#io.print(i);
 
 j1:= json.new("{\"tag\":314}");
 #json.dump(j1);
diff --git a/monetdb5/modules/atoms/Tests/json15.stable.out 
b/monetdb5/modules/atoms/Tests/json15.stable.out
--- a/monetdb5/modules/atoms/Tests/json15.stable.out
+++ b/monetdb5/modules/atoms/Tests/json15.stable.out
@@ -19,10 +19,10 @@ stdout of test 'json15` in directory 'mo
 # MonetDB/JAQL module loaded
 # MonetDB/SQL module loaded
 function user.main():void;
-    j1 := json.new("3.14");
+#j1:= json.new("3.14"); 
 #json.dump(j1); 
-    d := json.number(j1);
-    io.print(d);
+#d:= json.number(j1); 
+#io.print(d); 
     j1 := json.new("[3.14]");
 #json.dump(j1); 
     d := json.number(j1);
@@ -34,10 +34,10 @@ function user.main():void;
     j1 := json.new("[3.14,2.1]");
     d := json.number(j1);
     io.print(d);
-    j1 := json.new("314");
+#j1:= json.new("314"); 
 #json.dump(j1); 
-    i := json.integer(j1);
-    io.print(i);
+#i:= json.integer(j1); 
+#io.print(i); 
     j1 := json.new("{\"tag\":314}");
 #json.dump(j1); 
     i := json.integer(j1);
@@ -51,7 +51,6 @@ function user.main():void;
     io.print(i);
 end user.main;
 [ 3.14 ]
-[ 3.14 ]
 [0] object child 0 list 1 {"tag":3.14}
 [1] element child 2 list tag
 [2] number child 0 list 3.14
@@ -59,7 +58,6 @@ end user.main;
 [ nil ]
 [ 314 ]
 [ 314 ]
-[ 314 ]
 [ nil ]
 
 # 11:57:32 >  
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -36,6 +36,13 @@
                        (J)++;                                                  
        \
        } while (0)
 
+#define CHECK_JSON(jt)                         \
+       if (jt && jt->error) {          \
+               char *msg = jt->error;  \
+               JSONfree(jt);           \
+               return msg;             \
+       }
+
 #define SEPARATOR ' '
 
 int TYPE_json;
@@ -93,10 +100,19 @@ int
 JSONfromString(str src, int *len, json *j)
 {
        ssize_t slen = (ssize_t) strlen(src);
+       JSON *jt = JSONparse(src, FALSE);
 
        if (*j)
                GDKfree(*j);
 
+       if (!jt || jt->error) {
+               *j = GDKstrdup(str_nil);
+               if (jt)
+                       JSONfree(jt);
+               return 0;
+       }
+       JSONfree(jt);
+
        *j = GDKstrdup(src);
        *len = (int) slen;
        if (GDKstrFromStr((unsigned char *) *j, (const unsigned char *) src, 
slen) < 0) {
@@ -228,6 +244,7 @@ JSONdump(void *ret, json *val)
 {
        JSON *jt = JSONparse(*val, FALSE);
 
+       CHECK_JSON(jt);
        (void) ret;
        JSONdumpInternal(jt, 0);
        JSONfree(jt);
@@ -254,15 +271,8 @@ str
 JSONstr2json(json *ret, str *j)
 {
        JSON *jt = JSONparse(*j, FALSE);
-       str msg = MAL_SUCCEED;
 
-       if (jt &&jt->error) {
-               *ret = 0;
-               msg = jt->error;
-               jt->error = 0;
-               JSONfree(jt);
-               return msg;
-       }
+       CHECK_JSON(jt);
        if (jt)
                JSONfree(jt);
        *ret = GDKstrdup(*j);
@@ -572,12 +582,8 @@ JSONfilterInternal(json *ret, json *js, 
        msg = JSONcompile(*expr, terms);
        if (msg)
                return msg;
-       jt = JSONparse(j, TRUE);
-       if (jt->error) {
-               msg = jt->error;
-               JSONfree(jt);
-               return msg;
-       }
+       jt = JSONparse(j, FALSE);
+       CHECK_JSON(jt);
 
        result = s = JSONmatch(jt, 0, terms, tidx);
        // process all other PATH expression
@@ -609,7 +615,7 @@ JSONstringParser(char *j, char **next, i
 {
        if (*j == '"')
                j++;
-       for (; *j; j++)
+       for (; *j; j++) {
                switch (*j) {
                case '\\':
                        // parse all escapes
@@ -623,7 +629,7 @@ JSONstringParser(char *j, char **next, i
                        case 'n':
                        case 'r':
                        case 't':
-                               break;
+                               continue;
                        case 'u':
                                j++;
                                hex(j);
@@ -644,6 +650,7 @@ JSONstringParser(char *j, char **next, i
                        *next = j;
                        return MAL_SUCCEED;
                }
+       }
        *next = j;
        if (!silent)
                throw(MAL, "json.parser", "Nonterminated string");
@@ -700,6 +707,7 @@ JSONtoken(JSON *jt, char *j, char **next
        str msg;
        int nxt, idx = JSONnew(jt);
 
+       assert(silent==0);
        skipblancs(j);
        switch (*j) {
        case '{':
@@ -711,10 +719,12 @@ JSONtoken(JSON *jt, char *j, char **next
                        if (*j == '}')
                                break;
                        nxt = JSONtoken(jt, j, next, silent);
+                       if (jt->error) 
+                               return idx;
                        if (jt->elm[nxt].kind != JSON_ELEMENT) {
                                if (!silent)
                                        jt->error = createException(MAL, 
"json.parser", "Syntax error : element expected");
-                               break;
+                               return idx;
                        }
                        JSONappend(jt, idx, nxt);
                        j = *next;
@@ -724,13 +734,14 @@ JSONtoken(JSON *jt, char *j, char **next
                        if (*j != '}' && *j != ',') {
                                if (!silent)
                                        jt->error = createException(MAL, 
"json.parser", "Syntax error : ','  or '}' expected");
-                               break;
+                               return idx;
                        }
                        j++;
                }
                if (*j != '}') {
                        if (!silent)
                                jt->error = createException(MAL, "json.parser", 
"Syntax error : '}' expected");
+                       return idx;
                } else
                        j++;
                *next = j;
@@ -745,6 +756,8 @@ JSONtoken(JSON *jt, char *j, char **next
                        if (*j == ']')
                                break;
                        nxt = JSONtoken(jt, j, next, silent);
+                       if (jt->error) 
+                               return idx;
                        switch (jt->elm[nxt].kind) {
                        case JSON_ELEMENT:{
                                int k = JSONnew(jt);
@@ -772,11 +785,12 @@ JSONtoken(JSON *jt, char *j, char **next
                        if (jt->elm[nxt].kind == JSON_ELEMENT) {
                                if (!silent)
                                        jt->error = createException(MAL, 
"json.parser", "Syntax error : Array value expected");
+                               return idx;
                        }
                        if (*j != ']' && *j != ',') {
                                if (!silent)
                                        jt->error = createException(MAL, 
"json.parser", "Syntax error : ','  or ']' expected");
-                               break;
+                               return idx;
                        }
                        j++;
                        skipblancs(j);
@@ -790,9 +804,11 @@ JSONtoken(JSON *jt, char *j, char **next
                jt->elm[idx].valuelen = *next - jt->elm[idx].value;
                return idx;
        case '"':
-               msg = JSONstringParser(j + 1, next, silent);
-               if (!silent)
+               msg = JSONstringParser(j, next, silent);
+               if (!silent && msg) {
                        jt->error = msg;
+                       return idx;
+               }
                jt->elm[idx].kind = JSON_STRING;
                jt->elm[idx].value = j;
                jt->elm[idx].valuelen = *next - j;
@@ -803,6 +819,8 @@ JSONtoken(JSON *jt, char *j, char **next
                        skipblancs(j);
                        jt->elm[idx].kind = JSON_ELEMENT;
                        nxt = JSONtoken(jt, j, next, silent);
+                       if (jt->error) 
+                               return idx;
                        jt->elm[idx].child = nxt;
                        jt->elm[idx].value++;
                        jt->elm[idx].valuelen -= 2;
@@ -827,7 +845,7 @@ JSONtoken(JSON *jt, char *j, char **next
                        jt->elm[idx].valuelen = 4;
                        return idx;
                }
-               if (!silent)
+               if (!silent) 
                        jt->error = createException(MAL, "json.parser", "Syntax 
error: True expected");
                return idx;
        case 'f':
@@ -845,7 +863,7 @@ JSONtoken(JSON *jt, char *j, char **next
                if (*j == '-' || (*j >= '0' && *j <= '9')) {
                        jt->elm[idx].value = j;
                        msg = JSONnumberParser(j, next, silent);
-                       if (!silent)
+                       if (!silent && msg)
                                jt->error = msg;
                        jt->elm[idx].kind = JSON_NUMBER;
                        jt->elm[idx].valuelen = *next - jt->elm[idx].value;
@@ -853,6 +871,7 @@ JSONtoken(JSON *jt, char *j, char **next
                }
                if (!silent)
                        jt->error = createException(MAL, "json.parser", "Syntax 
error: value expected");
+               return idx;
        }
        return idx;
 }
@@ -863,7 +882,14 @@ JSONparse(char *j, int silent)
 {
        JSON *jt = JSONnewtree(0);
 
+       skipblancs(j);
+       if (!*j || !(*j == '{' || *j == '[')) {
+               jt->error = createException(MAL, "json.parser", "Syntax error: 
json parse failed, expecting '{', '['");
+               return jt;
+       }
        JSONtoken(jt, j, &j, silent);
+       if (jt && jt->error)
+               return jt;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to