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