Fix an error in the new json_patch() routine discovered by Ralf Junker.

FossilOrigin-Name: 9d5350418b2f6113e0b50c57e8a872006f27753067baf08ffdfa7943c0c9a148
This commit is contained in:
drh
2017-03-24 12:35:17 +00:00
parent adc117d40e
commit 29c9969871
4 changed files with 39 additions and 14 deletions
+21 -5
View File
@@ -1164,6 +1164,25 @@ static void jsonWrongNumArgs(
sqlite3_free(zMsg);
}
/*
** Mark all NULL entries in the Object passed in as JNODE_REMOVE.
*/
static void jsonRemoveAllNulls(JsonNode *pNode){
int i, n;
assert( pNode->eType==JSON_OBJECT );
n = pNode->n;
for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){
switch( pNode[i].eType ){
case JSON_NULL:
pNode[i].jnFlags |= JNODE_REMOVE;
break;
case JSON_OBJECT:
jsonRemoveAllNulls(&pNode[i]);
break;
}
}
}
/****************************************************************************
** SQL functions used for testing and debugging
@@ -1373,11 +1392,7 @@ static JsonNode *jsonMergePatch(
pTarget = &pParse->aNode[iTarget];
assert( (pPatch->jnFlags & JNODE_APPEND)==0 );
if( pTarget->eType!=JSON_OBJECT ){
for(i=2; i<=pPatch->n; i += jsonNodeSize(&pPatch[i])+1){
if( pPatch[i].eType==JSON_NULL ){
pPatch[i].jnFlags |= JNODE_REMOVE;
}
}
jsonRemoveAllNulls(pPatch);
return pPatch;
}
iRoot = iTarget;
@@ -1415,6 +1430,7 @@ static JsonNode *jsonMergePatch(
jsonParseAddNode(pParse, JSON_STRING, nKey, zKey);
iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
if( pParse->oom ) return 0;
jsonRemoveAllNulls(pPatch);
pTarget = &pParse->aNode[iTarget];
pParse->aNode[iRoot].jnFlags |= JNODE_APPEND;
pParse->aNode[iRoot].u.iAppend = iStart - iRoot;