aboutsummaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
authordrh <>2024-01-23 13:21:40 +0000
committerdrh <>2024-01-23 13:21:40 +0000
commite318f10ce25f2c36ce3bcbca71688c1060546dd8 (patch)
tree31a81adddce57d2373e6c993b7d3f418d7ba364f /src/json.c
parent41fb2eed07d109c5bf452d443562ec154dc3b78a (diff)
downloadsqlite-e318f10ce25f2c36ce3bcbca71688c1060546dd8.tar.gz
sqlite-e318f10ce25f2c36ce3bcbca71688c1060546dd8.zip
If a BLOB looks like JSON when cast to text, then treat it as if it really
were JSON. This replicates a long-standing bug in the JSON processing routines, and thereby avoids breaking legacy. FossilOrigin-Name: d79a37690ce7ebb91df203170d73511da44546328043c2b3fe1786b2f0087093
Diffstat (limited to 'src/json.c')
-rw-r--r--src/json.c45
1 files changed, 21 insertions, 24 deletions
diff --git a/src/json.c b/src/json.c
index b9a88822e..69995bbdf 100644
--- a/src/json.c
+++ b/src/json.c
@@ -3311,20 +3311,18 @@ rebuild_from_cache:
}
return p;
}
-#if defined(SQLITE_JSON_BLOB_INPUT_BUG_COMPATIBLE)
- /* If the input is a BLOB that is not JSONB, fall through into trying
- ** to process that BLOB as if it where text. This goes against all
- ** historical documentation about how the SQLite JSON functions are
- ** suppose to work. Nevertheless, many SQLite implementations prior to
- ** version 3.45.0 contained a bug such that they did behave this way
- ** and some applications came to depend upon this buggy behavior. The
- ** SQLITE_JSON_BLOB_INPUT_BUG_COMPATIBLE compile-time option provides
- ** a mechanism for those applications to continue working even after
- ** the bug was fixed. See
- ** https://sqlite.org/forum/forumpost/012136abd5292b8d */
-#else
- goto json_pfa_malformed;
-#endif
+ /* If the blob is not valid JSONB, fall through into trying to cast
+ ** the blob into text which is then interpreted as JSON. (tag-20240123-a)
+ **
+ ** This goes against all historical documentation about how the SQLite
+ ** JSON functions were suppose to work. From the beginning, blob was
+ ** reserved for expansion and a blob value should have raised an error.
+ ** But it did not, due to a bug. And many applications came to depend
+ ** upon this buggy behavior, espeically when using the CLI and reading
+ ** JSON text using readfile(), which returns a blob. For this reason
+ ** we will continue to support the bug moving forward.
+ ** See for example https://sqlite.org/forum/forumpost/012136abd5292b8d
+ */
}
p->zJson = (char*)sqlite3_value_text(pArg);
p->nJson = sqlite3_value_bytes(pArg);
@@ -4300,12 +4298,12 @@ static void jsonValidFunc(
return;
}
case SQLITE_BLOB: {
- if( (flags & 0x0c)!=0 && jsonFuncArgMightBeBinary(argv[0]) ){
+ if( jsonFuncArgMightBeBinary(argv[0]) ){
if( flags & 0x04 ){
/* Superficial checking only - accomplished by the
** jsonFuncArgMightBeBinary() call above. */
res = 1;
- }else{
+ }else if( flags & 0x08 ){
/* Strict checking. Check by translating BLOB->TEXT->BLOB. If
** no errors occur, call that a "strict check". */
JsonParse px;
@@ -4316,8 +4314,11 @@ static void jsonValidFunc(
iErr = jsonbValidityCheck(&px, 0, px.nBlob, 1);
res = iErr==0;
}
+ break;
}
- break;
+ /* Fall through into interpreting the input as text. See note
+ ** above at tag-20240124-a. */
+ /* no break */ deliberate_fall_through
}
default: {
JsonParse px;
@@ -5053,13 +5054,9 @@ static int jsonEachFilter(
memset(&p->sParse, 0, sizeof(p->sParse));
p->sParse.nJPRef = 1;
p->sParse.db = p->db;
- if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
- if( jsonFuncArgMightBeBinary(argv[0]) ){
- p->sParse.nBlob = sqlite3_value_bytes(argv[0]);
- p->sParse.aBlob = (u8*)sqlite3_value_blob(argv[0]);
- }else{
- goto json_each_malformed_input;
- }
+ if( jsonFuncArgMightBeBinary(argv[0]) ){
+ p->sParse.nBlob = sqlite3_value_bytes(argv[0]);
+ p->sParse.aBlob = (u8*)sqlite3_value_blob(argv[0]);
}else{
p->sParse.zJson = (char*)sqlite3_value_text(argv[0]);
p->sParse.nJson = sqlite3_value_bytes(argv[0]);