]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the zeroblob() function and related APIs so that they work with SQLITE_OMIT_INCRB...
authordan <Dan Kennedy>
Mon, 8 Nov 2021 19:35:26 +0000 (19:35 +0000)
committerdan <Dan Kennedy>
Mon, 8 Nov 2021 19:35:26 +0000 (19:35 +0000)
FossilOrigin-Name: bc401a75dd9f3c29c5969ae36264e68ccefc0937e44e232ca1f6b550f7fd6e22

18 files changed:
ext/session/session6.test
manifest
manifest.uuid
src/vdbeInt.h
src/vdbeapi.c
src/vdbemem.c
test/e_blobbytes.test
test/e_blobclose.test
test/e_blobopen.test
test/e_blobwrite.test
test/incrblob3.test
test/incrblobfault.test
test/mmap1.test
test/pager1.test
test/tkt-2d1a5c67d.test
test/without_rowid5.test
test/zeroblob.test
test/zeroblobfault.test [new file with mode: 0644]

index 8a1f172cde6d8be02900a27a97e6472b42ad17fe..22fa93cb3575d523cd499eb726019dccb8e1599f 100644 (file)
@@ -19,6 +19,7 @@ if {![info exists testdir]} {
 source [file join [file dirname [info script]] session_common.tcl]
 source $testdir/tester.tcl
 ifcapable !session {finish_test; return}
+ifcapable !incrblob {finish_test; return}
 
 set testprefix session6
 
index 6d595de1c3293b7bfcce6aae813c384d60318172..79bcb4dc172d090b0922d84097dc100a61491e92 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\sassert()\sin\smemdbTruncate()\sthat\scould\sfail\swhen\sprocessing\sa\scorrupt\sdatabase.
-D 2021-11-08T15:46:08.854
+C Fix\sthe\szeroblob()\sfunction\sand\srelated\sAPIs\sso\sthat\sthey\swork\swith\sSQLITE_OMIT_INCRBLOB\sbuilds.
+D 2021-11-08T19:35:26.655
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -438,7 +438,7 @@ F ext/session/session2.test 7f53d755d921e0baf815c4258348e0ed460dfd8a772351bca5ad
 F ext/session/session3.test ce9ce3dfa489473987f899e9f6a0f2db9bde3479
 F ext/session/session4.test 6778997065b44d99c51ff9cece047ff9244a32856b328735ae27ddef68979c40
 F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169
-F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26
+F ext/session/session6.test 35279f2ec45448cd2e24a61688219dc6cf7871757716063acf4a8b5455e1e926
 F ext/session/session8.test 8e194b3f655d861ca36de5d4de53f702751bab3b
 F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069
 F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f
@@ -624,11 +624,11 @@ F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167
 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3
 F src/vdbe.c f2b30e312d2dc69d429998f17fab74298a4d9ed8c6d57c0d23d0284414c6ea1b
 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe
-F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b
-F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67
+F src/vdbeInt.h 31fbabdc1ed61d9695337dfe5269ea94e1cf615c17f5cafeaa1bb01066820bab
+F src/vdbeapi.c f4bd14b42d9717a35baac5f20c0c4bfccbf3691d64dc6ec02fc0ef19374d3c92
 F src/vdbeaux.c a57c760d1897f1b72f6fae26983df363db7a2c42d88721187e907f2c84862b42
 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8
-F src/vdbemem.c 71a449c57be10a66a8a5620e5c5a67ebb9ca70121556dc631ffd4c4458708d8c
+F src/vdbemem.c a3d91dc9bb9ef725db77e4e9de7e1acef43192c9f8406c307665d503e3c2837c
 F src/vdbesort.c 513b481c8bab4a6578c92194a60cf3bc3b48736e4a53f8d2d7918121c5b594e7
 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c
@@ -856,10 +856,10 @@ F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e
 F test/distinct.test 3e4210ef9cd1985aeec44939ad912c4621fbea9bb4a9c565696cebfe184b2ec5
 F test/distinct2.test cd1d15a4a2abf579298f7161e821ed50c0119136fe0424db85c52cf0adc230d1
 F test/distinctagg.test d76ef2e91fe810630c176d6bd0a58c14d5851c3125f0a1d977db87ba76359639
-F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05
-F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d
-F test/e_blobopen.test e95e1d40f995056f6f322cd5e1a1b83a27e1a145
-F test/e_blobwrite.test f87ff598b67af5b3ec002a8d83e804dc8d23808e88cf0080c176612fc9ffce14
+F test/e_blobbytes.test 4c01dfe4f12087b92b20705a3fdfded45dc4ed16d5a211fed4e1d2786ba68a52
+F test/e_blobclose.test 692fc02a058476c2222a63d97e3f3b2b809c1842e5525ded7f854d540ac2e075
+F test/e_blobopen.test 29f6055ee453b8e679fe9570c4d3acfedbef821622c5dad16875148c5952ef50
+F test/e_blobwrite.test 3075ff539827576d9a34cbb5a2ac75eb65fb49cd5aadc27686b0719fbf99c156
 F test/e_changes.test 0f8c3e6aab7335cb772d5a3ea34ca4c82f98d0eb896e2eb3add971c16984b405
 F test/e_createtable.test 7997c0106c181243e0ac7db7ba8b9ae7233d0bfb0188605650322a7a02ea326e
 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e
@@ -1088,10 +1088,10 @@ F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f
 F test/in6.test f5f40d6816a8bb7c784424b58a10ac38efb76ab29127a2c17399e0cbeeda0e4b
 F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822
 F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f
-F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4
+F test/incrblob3.test d47be78a46da142dd60b93772db6e03936a8a36a3b6129dff8d11923dfdc6d63
 F test/incrblob4.test 21a52a6843a56cdcce968c6a86b72a7066d0e6ba
 F test/incrblob_err.test 89372a28f1d98254f03fed705f9efcd34ef61a674df16d2dbb4726944a2de5e9
-F test/incrblobfault.test 74dd8ac108304cea0b4a0df6df63a1567e558758
+F test/incrblobfault.test de274b1e329169c2c3438f9528994807ea8201ebf38ae9f157d34bf3ec0cc549
 F test/incrcorrupt.test 6c567fbf870aa9e91866fe52ce6f200cd548939a
 F test/incrvacuum.test 3fa6145f5e71f603554fd7b8ec3da4290b1341029682313285cb5f9e1893d6ba
 F test/incrvacuum2.test 7d26cfda66c7e55898d196de54ac4ec7d86a4e3d
@@ -1218,7 +1218,7 @@ F test/misc7.test d912f3d45c2989191b797504a220ca225d6be80b21acad22ba0d35f4a9ee45
 F test/misc8.test 4db9f8be59834cea08c87e9658014080efa02678ef54a088f84fa5647e81fee0
 F test/misuse.test 9e7f78402005e833af71dcab32d048003869eca5abcaccc985d4f8dc1d86bcc7
 F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152
-F test/mmap1.test fb04e0c10492455007624ade884ca0c8852ff3e4e11d95408f9709ca2ef7f626
+F test/mmap1.test 5c1f768828094b0dd94e55ae7f10489a1ded74772682be2c4c78679d0acaf7ef
 F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022
 F test/mmap3.test b3c297e78e6a8520aafcc1a8f140535594c9086e
 F test/mmap4.test 2e2b4e32555b58da15176e6fe750f17c9dcf7f93
@@ -1263,7 +1263,7 @@ F test/oserror.test 1fc9746b83d778e70d115049747ba19c7fba154afce7cc165b09feb6ca6a
 F test/ossfuzz.c 9636dad2092a05a32110df0ca06713038dd0c43dd89a77dabe4b8b0d71096715
 F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17
 F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f
-F test/pager1.test 50df7826a03382ff508ed80a6b3c589c3e3ececc1d15239d67126be4b7c8b64b
+F test/pager1.test 8cb45ccbdb3ba423fc8158701c8f010a1d104336b8f14ef14bbfbadf14bad700
 F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71
 F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370
 F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e
@@ -1482,7 +1482,7 @@ F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c
 F test/tkt-18458b1a.test 6a62cb1ee50fa3c620da59e3a6f531eb38fceaf7e2166203816b724524e6f1d6
 F test/tkt-26ff0c2d1e.test c15bec890c4d226c0da2f35ff30f9e84c169cfef90e73a8cb5cec11d723dfa96
 F test/tkt-2a5629202f.test 0521bd25658428baa26665aa53ffed9367d33af2
-F test/tkt-2d1a5c67d.test be1326f3061caec85085f4c9ee4490561ca037c0
+F test/tkt-2d1a5c67d.test f143872a2102c62e777be3486b38ac2744c18ece31585ed3d0afcb573ca3b4f5
 F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28
 F test/tkt-31338dca7e.test 6fb8807851964da0d24e942f2e19c7c705b9fb58
 F test/tkt-313723c356.test 4b306ad45c736cedf2f5221f6155b92143244b6d
@@ -1818,12 +1818,13 @@ F test/without_rowid1.test df3de14f1cc422d2b0f9b79969b5ef8e51c86ed87834ab35fb513
 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99
 F test/without_rowid3.test 39ab0dd773eaa62e59b17093f875327630f54c4145458f6d2b053d68d4b2f67b
 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a
-F test/without_rowid5.test f058a97600c09c7c8754733b9d8adc428e055f815d8926d74b59b872e20d0e2b
+F test/without_rowid5.test f14298eb5ac8013894b75141c3f4f5f325a6ad0eded55516eef72c49e60a67cb
 F test/without_rowid6.test efbd7add62c59bf5ca97bf8da674e734e6a70ef979234e816166824b4d258f68
 F test/without_rowid7.test d7c59a93d726b55812d620f8f284e01904a5b85f9ee9eea8f2f68571a5e8c40e
 F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66
 F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc
-F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174
+F test/zeroblob.test 7b74cefc7b281dfa2b07cd237987fbe94b4a2037a7771e9e83f2d5f608b1d99e
+F test/zeroblobfault.test 861d8191a0d944dfebb3cb4d2c5b4e46a5a119eaec5a63dd996c2389f8063441
 F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc
 F test/zipfile.test 0d8758d8c0d63f16644f959689f78969d223789d998964276554039f067b4548
 F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d
@@ -1931,7 +1932,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 0f9fc6b6073365d5159cd71e7fe08f8dadbc7b42abd324361e809502f4359155
-R d589207b4da48162e0cabc9d665e988e
+P b1e2929860557cf88f98f0a4f2472e1a16be126bbb8050f0d728350f0cfe987a
+R 38e6cac2f0504419221900502859a6b1
 U dan
-Z 002c28892e3ca1452bf9a4418afbeb4c
+Z 081f4998dc35a67aaba184a060c36c98
index e3f31aedabfb915d55bc54b47338ab93ec2249ff..bd630146fad77ba9d4b25f2d285cbb7f88223e6a 100644 (file)
@@ -1 +1 @@
-b1e2929860557cf88f98f0a4f2472e1a16be126bbb8050f0d728350f0cfe987a
\ No newline at end of file
+bc401a75dd9f3c29c5969ae36264e68ccefc0937e44e232ca1f6b550f7fd6e22
\ No newline at end of file
index 763c4ed0944d10a9c7c836cb2a85bd6e98d7a6e9..599d064165b95f39604af7227fbc73bc7833829f 100644 (file)
@@ -526,7 +526,11 @@ void sqlite3VdbeMemSetInt64(Mem*, i64);
 void sqlite3VdbeMemSetPointer(Mem*, void*, const char*, void(*)(void*));
 void sqlite3VdbeMemInit(Mem*,sqlite3*,u16);
 void sqlite3VdbeMemSetNull(Mem*);
+#ifndef SQLITE_OMIT_INCRBLOB
 void sqlite3VdbeMemSetZeroBlob(Mem*,int);
+#else
+int sqlite3VdbeMemSetZeroBlob(Mem*,int);
+#endif
 #ifdef SQLITE_DEBUG
 int sqlite3VdbeMemIsRowSet(const Mem*);
 #endif
index 5c4c321b394b2912e8d72533d5f175a419a7abd4..5eeb5d1c0ec51e39a1c0deeb0f1b47f493f146eb 100644 (file)
@@ -541,8 +541,12 @@ int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){
   if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){
     return SQLITE_TOOBIG;
   }
+#ifndef SQLITE_OMIT_INCRBLOB
   sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n);
   return SQLITE_OK;
+#else
+  return sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n);
+#endif
 }
 void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
   pCtx->isError = errCode ? errCode : -1;
@@ -1554,7 +1558,11 @@ int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){
   Vdbe *p = (Vdbe *)pStmt;
   rc = vdbeUnbind(p, i);
   if( rc==SQLITE_OK ){
+#ifndef SQLITE_OMIT_INCRBLOB
     sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n);
+#else
+    rc = sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n);
+#endif
     sqlite3_mutex_leave(p->db->mutex);
   }
   return rc;
index f659e55659b05fd5e7989ddbe5bbb9cb1195fb56..570a2eb38c1715e2e2e34930145ea765ad9a7f1a 100644 (file)
@@ -852,6 +852,7 @@ void sqlite3ValueSetNull(sqlite3_value *p){
 ** Delete any previous value and set the value to be a BLOB of length
 ** n containing all zeros.
 */
+#ifndef SQLITE_OMIT_INCRBLOB
 void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
   sqlite3VdbeMemRelease(pMem);
   pMem->flags = MEM_Blob|MEM_Zero;
@@ -861,6 +862,21 @@ void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
   pMem->enc = SQLITE_UTF8;
   pMem->z = 0;
 }
+#else
+int sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
+  int nByte = n>0?n:1;
+  if( sqlite3VdbeMemGrow(pMem, nByte, 0) ){
+    return SQLITE_NOMEM_BKPT;
+  }
+  assert( pMem->z!=0 );
+  assert( sqlite3DbMallocSize(pMem->db, pMem->z)>=nByte );
+  memset(pMem->z, 0, nByte);
+  pMem->n = n>0?n:0;
+  pMem->flags = MEM_Blob;
+  pMem->enc = SQLITE_UTF8;
+  return SQLITE_OK;
+}
+#endif
 
 /*
 ** The pMem is known to contain content that needs to be destroyed prior
index d38f56bf344dd5d649039386c347b6045dd1f54e..c24318c565aceed3ff4efc60fe1089372cc45927 100644 (file)
@@ -14,6 +14,11 @@ set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix e_blobbytes
 
+ifcapable !incrblob {
+  finish_test
+  return
+}
+
 do_execsql_test 1.0 {
   CREATE TABLE q1(r INTEGER PRIMARY KEY, s TEXT);
   WITH d(a, b) AS (
index 26831978547067e1f83a8dbff70bee02b663b17b..40291cf03677a656960ec7e5ccbc1f9550522405 100644 (file)
@@ -14,6 +14,11 @@ set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix e_blobclose
 
+ifcapable !incrblob {
+  finish_test
+  return
+}
+
 set dots [string repeat . 40]
 do_execsql_test 1.0 {
   CREATE TABLE x1(a INTEGER PRIMARY KEY, b DOTS);
index a6168042e9d77a1743b04d2114ffe10739bf3438..41fd13c674c52279ea4bf5ff72fc4bf6b974ecf7 100644 (file)
@@ -14,6 +14,11 @@ set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix e_blobopen
 
+ifcapable !incrblob {
+  finish_test
+  return
+}
+
 forcedelete test.db2
 
 do_execsql_test 1.0 {
index afcfc281a7b703e55ba6fe9a084a35c243553508..8d8588e6aa88b9393d0cacac20b27492c9d78c2e 100644 (file)
@@ -14,6 +14,11 @@ set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix e_blobwrite
 
+ifcapable !incrblob {
+  finish_test
+  return
+}
+
 #--------------------------------------------------------------------------
 # EVIDENCE-OF: R-62898-22698 This function is used to write data into an
 # open BLOB handle from a caller-supplied buffer. N bytes of data are
index 5f2e860d08e62fa16d5e8e7c49371a92bda8a94a..b2bc8f8e0d7a5ab790818497e3b025ee6ae63d13 100644 (file)
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 
+ifcapable !incrblob {
+  finish_test
+  return
+}
+
 sqlite3 db test.db
 sqlite3_db_config_lookaside db 0 0 0
 
index 10c2c8ecb479805f234a199ca5f034495ee672f5..d070babe2cb98bd3c6f8969abf8825dfd430925f 100644 (file)
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 
+ifcapable !incrblob {
+  finish_test
+  return
+}
+
 set testprefix incrblobfault
 
 do_execsql_test 1.0 {
index 7dcd1f8a43d903e1c7eb576a65e65a0749d4c714..3362f7187f3e92fcf7bd2c49700416d148978258 100644 (file)
@@ -12,7 +12,7 @@
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
-ifcapable !mmap {
+ifcapable !mmap||!incrblob {
   finish_test
   return
 }
index 7cb158c992bc854110714786b162058401053342..ff7d3e4061c4a20ac328e63314866a715820a0eb 100644 (file)
@@ -21,6 +21,10 @@ if {[atomic_batch_write test.db]} {
   finish_test
   return
 }
+ifcapable !incrblob {
+  finish_test
+  return
+}
 
 # Do not use a codec for tests in this file, as the database file is
 # manipulated directly using tcl scripts (using the [hexio_write] command).
index 0d12a6ec43e804a2e53ead999698b5ab4e43f7d0..1f797686bf066325c9b6bb274606581c669064bc 100644 (file)
@@ -19,7 +19,7 @@ set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix tkt-2d1a5c67d
 
-ifcapable {!vtab} {finish_test; return}
+ifcapable {!vtab || !incrblob} {finish_test; return}
 if {[wal_is_capable]==0} {finish_test; return}
 
 for {set ii 1} {$ii<=10} {incr ii} {
index 29d226a757f677d8bb2c27734a4d5af515974729..d1c494484c9b014315aed725d12894ed28665779 100644 (file)
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 
+ifcapable !incrblob {
+  finish_test
+  return
+}
 
 # EVIDENCE-OF: R-36924-43758 By default, every row in SQLite has a
 # special column, usually called the "rowid", that uniquely identifies
index 9daa7d8d9a4f9b365a268a3a766334de71a8efce..df234eea44ed527d0313f39983e7b0a4a3435fad 100644 (file)
@@ -19,10 +19,7 @@ set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix zeroblob
 
-ifcapable !incrblob {
-  finish_test
-  return
-}
+# ifcapable !incrblob { finish_test return }
 
 test_set_config_pagecache 0 0
 
@@ -42,12 +39,17 @@ do_test zeroblob-1.1 {
   execsql {
     INSERT INTO t1 VALUES(2,3,4,zeroblob(1000000));
   }
-  set ::sqlite3_max_blobsize
-} {10}
+} {}
+
+ifcapable incrblob {
+  do_test zeroblob-1.1.1 {
+    set ::sqlite3_max_blobsize
+  } {10}
+  do_test zeroblob-1.1.2 {
+    expr {[sqlite3_memory_highwater]<$::memused+35000}
+  } {1}
+}
 
-do_test zeroblob-1.1.1 {
-  expr {[sqlite3_memory_highwater]<$::memused+35000}
-} {1}
 do_test zeroblob-1.2 {
   execsql {
     SELECT length(d) FROM t1
@@ -78,8 +80,12 @@ do_test zeroblob-1.5 {
   execsql {
     INSERT INTO t1 VALUES(4,5,zeroblob(10000),zeroblob(10000));
   }
-  set ::sqlite3_max_blobsize
-} {11}
+} {}
+ifcapable incrblob {
+  do_test zeroblob-1.5.1 {
+    set ::sqlite3_max_blobsize
+  } {11}
+}
 do_test zeroblob-1.6 {
   execsql {
     SELECT length(c), length(d) FROM t1
@@ -94,8 +100,12 @@ do_test zeroblob-1.7 {
   execsql {
     INSERT INTO t1 VALUES(5,zeroblob(10000),NULL,zeroblob(10000));
   }
-  set ::sqlite3_max_blobsize
-} {10}
+} {}
+ifcapable incrblob {
+  do_test zeroblob-1.7.1 {
+    set ::sqlite3_max_blobsize
+  } {10}
+}
 do_test zeroblob-1.8 {
   execsql {
     SELECT length(b), length(d) FROM t1 WHERE a=5
@@ -214,12 +224,14 @@ do_test zeroblob-7.2 {
 do_test zeroblob-7.3 {
   sqlite3_finalize $::STMT
 } {SQLITE_OK}
-do_test zeroblob-7.4 {
-  set ::sqlite3_max_blobsize
-} {0}
-do_test zeroblob-7.5 {
-  expr {[sqlite3_memory_highwater]<$::memused+10000}
-} {1}
+ifcapable incrblob {
+  do_test zeroblob-7.4 {
+    set ::sqlite3_max_blobsize
+  } {0}
+  do_test zeroblob-7.5 {
+    expr {[sqlite3_memory_highwater]<$::memused+10000}
+  } {1}
+}
 
 # Test that MakeRecord can handle a value with some real content
 # and a zero-blob tail.
diff --git a/test/zeroblobfault.test b/test/zeroblobfault.test
new file mode 100644 (file)
index 0000000..0ae5bea
--- /dev/null
@@ -0,0 +1,28 @@
+# 2021 November 8
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+set testprefix zeroblobfault
+set quoted_res [db one { SELECT quote(zeroblob(2000)) }]
+
+do_faultsim_test 1 -prep {
+  sqlite3 db test.db
+} -body {
+  execsql { SELECT quote(zeroblob(2000)) }
+} -test {
+  faultsim_test_result [list 0 $::quoted_res]
+}
+
+finish_test