if( pStr->zBuf==0 ){
jsonInit(pStr, ctx);
jsonAppendChar(pStr, '[');
- }else{
+ }else if( pStr->nUsed>1 ){
jsonAppendChar(pStr, ',');
pStr->pCtx = ctx;
}
){
int i;
int inStr = 0;
+ int nNest = 0;
char *z;
+ char c;
JsonString *pStr;
UNUSED_PARAM(argc);
UNUSED_PARAM(argv);
if( NEVER(!pStr) ) return;
#endif
z = pStr->zBuf;
- for(i=1; z[i]!=',' || inStr; i++){
- assert( i<pStr->nUsed );
- if( z[i]=='"' ){
+ for(i=1; (c = z[i])!=',' || inStr || nNest; i++){
+ if( i>=pStr->nUsed ){
+ pStr->nUsed = 1;
+ return;
+ }
+ if( c=='"' ){
inStr = !inStr;
- }else if( z[i]=='\\' ){
+ }else if( c=='\\' ){
i++;
+ }else if( !inStr ){
+ if( c=='{' || c=='[' ) nNest++;
+ if( c=='}' || c==']' ) nNest--;
}
}
pStr->nUsed -= i;
if( pStr->zBuf==0 ){
jsonInit(pStr, ctx);
jsonAppendChar(pStr, '{');
- }else{
+ }else if( pStr->nUsed>1 ){
jsonAppendChar(pStr, ',');
pStr->pCtx = ctx;
}
-C Fix\sa\sproblem\swith\susing\sjson1\swindow\sfunctions\swith\san\sEXCLUDE\sclause.
-D 2019-09-13T20:42:46.328
+C Fix\sthe\swindows\sinverse\sfunction\son\sthe\sJSON\saggregates.
+D 2019-09-14T00:21:34.282
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F ext/misc/fossildelta.c 7708651072eb5620ab21bbfb518d184f27b2c29c0131b09b9a2d8852a8016430
F ext/misc/fuzzer.c c4e27daf41433a64cad5265cd27dbcb891147e9994d0422200ce81ce9a54b625
F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c
-F ext/misc/json1.c 5e94e787ddce590585227ace85005bb7dd2a768def24bc77d7fc4a386989dd76
+F ext/misc/json1.c 061950860e6b8b7af6fc40029bf673fb97887ab04d6a33950c32a0ced6775577
F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d
F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b
F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567
F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b
F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693
F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be
-F test/windowB.test fae072a311cea62715007b482afd40b1124fef56dcc9988bffb85b29ccabb5dd
+F test/windowB.test af8f3b0a24cc5e7f296e13ef4d312391427d95ace391e248120e1fb90226c3b2
F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0
F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b
F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 807975c76b36347f02aa0ce9661d608adbffe1f7e77c15f8da677e47e1187153
-R 19b6534ebeb3a6a9bfaaa41ce75a9354
-U dan
-Z e45766b9d1c40d7379299659b41fb108
+P 4a1978814da41608a16f6953bd575c97d587a34bd80b7ac0e619d62bfdc903d2
+R 476ca0efeffea95d421b220f4123feec
+U drh
+Z 549cbff31496c774b10a02d54a853bdd
-4a1978814da41608a16f6953bd575c97d587a34bd80b7ac0e619d62bfdc903d2
\ No newline at end of file
+f464d847af490dd3ec45565dcc4c2e6ff4ed1ebb65036f30ca0b3ce2e73080e6
\ No newline at end of file
ifcapable json1 {
reset_db
do_execsql_test 3.0 {
- CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT);
- INSERT INTO testjson VALUES(1, '{"a":1}');
- INSERT INTO testjson VALUES(2, '{"b":2}');
- INSERT INTO testjson VALUES(3, '{"c":3}');
- INSERT INTO testjson VALUES(4, '{"d":4}');
+ CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT, x TEXT);
+ INSERT INTO testjson VALUES(1, '{"a":1}', 'a');
+ INSERT INTO testjson VALUES(2, '{"b":2}', 'b');
+ INSERT INTO testjson VALUES(3, '{"c":3}', 'c');
+ INSERT INTO testjson VALUES(4, '{"d":4}', 'd');
}
do_execsql_test 3.1 {
do_execsql_test 3.3 {
SELECT json_group_array(json(j)) OVER (
- ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES
+ ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+ EXCLUDE TIES
) FROM testjson;
} {
{[{"a":1}]}
{[{"b":2},{"c":3}]}
}
- if 0 {
-
- do_execsql_test 3.5 {
+ do_execsql_test 3.5a {
+ UPDATE testjson SET j = replace(j,char(125),',"e":9'||char(125));
+ SELECT j FROM testjson;
+ } {
+ {{"a":1,"e":9}}
+ {{"b":2,"e":9}}
+ {{"c":3,"e":9}}
+ {{"d":4,"e":9}}
+ }
+ do_execsql_test 3.5b {
+ SELECT group_concat(x,'') OVER (
+ ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
+ ) FROM testjson ORDER BY id;
+ } {bc cd d {}}
+ do_execsql_test 3.5c {
SELECT json_group_array(json(j)) OVER (
ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
) FROM testjson;
} {
+ {[{"b":2,"e":9},{"c":3,"e":9}]}
+ {[{"c":3,"e":9},{"d":4,"e":9}]}
+ {[{"d":4,"e":9}]}
{[]}
- {[{"a":1}]}
- {[{"a":1},{"b":2}]}
- {[{"b":2},{"c":3}]}
+ }
+ do_execsql_test 3.5d {
+ SELECT json_group_object(x,json(j)) OVER (
+ ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
+ ) FROM testjson;
+ } {
+ {{"b":{"b":2,"e":9},"c":{"c":3,"e":9}}}
+ {{"c":{"c":3,"e":9},"d":{"d":4,"e":9}}}
+ {{"d":{"d":4,"e":9}}}
+ {{}}
}
- explain_i {
- SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER (
+ do_execsql_test 3.7b {
+ SELECT group_concat(x,'') FILTER (WHERE id!=2) OVER (
ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
) FROM testjson;
- }
- do_execsql_test 3.7 {
- PRAGMA vdbe_trace = 1;
+ } {{} a a c}
+
+ do_execsql_test 3.7c {
SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER (
ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
- ) FROM testjson;
+ ) FROM testjson
} {
{[]}
- {[{"a":1}]}
- {[{"a":1}]}
- {[{"c":3}]}
+ {[{"a":1,"e":9}]}
+ {[{"a":1,"e":9}]}
+ {[{"c":3,"e":9}]}
}
-
+ do_execsql_test 3.7d {
+ SELECT json_group_object(x,json(j)) FILTER (WHERE id!=2) OVER (
+ ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING
+ ) FROM testjson
+ } {
+ {{}}
+ {{"a":{"a":1,"e":9}}}
+ {{"a":{"a":1,"e":9}}}
+ {{"c":{"c":3,"e":9}}}
}
}