aboutsummaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
authordrh <>2023-09-29 22:37:18 +0000
committerdrh <>2023-09-29 22:37:18 +0000
commit5736ba5ac3a2c4e4a9735f5b35ce0f4dc76c5f14 (patch)
treeefbabf8d5a55c5ad47a0f4a1195eccc66f240039 /src/json.c
parentee50aad86544f188fa87644376fa3a7879abb043 (diff)
downloadsqlite-5736ba5ac3a2c4e4a9735f5b35ce0f4dc76c5f14.tar.gz
sqlite-5736ba5ac3a2c4e4a9735f5b35ce0f4dc76c5f14.zip
Update json_each() and json_tree() so that they work with JSONB inputs.
FossilOrigin-Name: bb5e50ff56dff95d954aacdd4c5461790f953cef8d7b89da000d8d587fcdf9b8
Diffstat (limited to 'src/json.c')
-rw-r--r--src/json.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/json.c b/src/json.c
index 9b988c1b6..a790157a5 100644
--- a/src/json.c
+++ b/src/json.c
@@ -5402,12 +5402,19 @@ static int jsonEachFilter(
const char *z;
const char *zRoot = 0;
sqlite3_int64 n;
+ int isBinary;
UNUSED_PARAMETER(idxStr);
UNUSED_PARAMETER(argc);
jsonEachCursorReset(p);
if( idxNum==0 ) return SQLITE_OK;
- z = (const char*)sqlite3_value_text(argv[0]);
+ if( jsonFuncArgMightBeBinary(argv[0]) ){
+ z = (const char*)sqlite3_value_blob(argv[0]);
+ isBinary = 1;
+ }else{
+ z = (const char*)sqlite3_value_text(argv[0]);
+ isBinary = 0;
+ }
if( z==0 ) return SQLITE_OK;
memset(&p->sParse, 0, sizeof(p->sParse));
p->sParse.nJPRef = 1;
@@ -5417,9 +5424,11 @@ static int jsonEachFilter(
n = sqlite3_value_bytes(argv[0]);
p->sParse.zJson = sqlite3RCStrNew( n+1 );
if( p->sParse.zJson==0 ) return SQLITE_NOMEM;
- memcpy(p->sParse.zJson, z, (size_t)n+1);
+ memcpy(p->sParse.zJson, z, (size_t)n+(isBinary==0));
+ p->sParse.nJson = n;
}
p->sParse.bJsonIsRCStr = 1;
+ p->sParse.isBinary = isBinary;
p->zJson = p->sParse.zJson;
if( jsonParse(&p->sParse, 0) ){
int rc = SQLITE_NOMEM;