From: dan Date: Wed, 13 Feb 2019 15:51:07 +0000 (+0000) Subject: Fix a problem with the incrblob API and reusable schemas. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6758315c8e049fe8e881601715939501ba668aea;p=thirdparty%2Fsqlite.git Fix a problem with the incrblob API and reusable schemas. FossilOrigin-Name: 34f0f96f47040df1e305ac9fd4664c5ed4246580e22a00573c73d6528a5725b5 --- diff --git a/manifest b/manifest index b46cf2db83..2229d6dcaf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Rearrange\sthe\scode\sin\sthe\sVDBE\sto\shelp\sout\sthe\sC-compiler\soptimizer.\nAnd\sfix\sa\sharmless\scompiler\swarning. -D 2019-02-13T14:06:56.682 +C Fix\sa\sproblem\swith\sthe\sincrblob\sAPI\sand\sreusable\sschemas. +D 2019-02-13T15:51:07.091 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 56456706c4da271309914c756c9c8ea537685f1c79f8785afa72f968d6810482 @@ -591,7 +591,7 @@ F src/vdbe.h 323218c4bfd64c719ba85d05fbc87cdd126991cadb39e73ccac7b59f30c3d53e F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 F src/vdbeaux.c 2f4fefdf74c484193de632c3c417c5886512f7a57f69a65dbdb858a58bc3f55a -F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 +F src/vdbeblob.c 6e362fafab5c537f247424fefade58d7eb938e60ef13817590031eb64cbb690f F src/vdbemem.c 3e89e087df928eba80e520824078dc563c579a0848b1557ac36845ec14392923 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 @@ -1227,7 +1227,7 @@ F test/releasetest.tcl 7712811e0f4e2f198ec786cb2e1352b3793d7395f48a3cceef0572d88 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/reuse1.test 5eee2efc7ee559fa9bdd214e35b351d5a949ad466c1671c256fee1f133e7eeea -F test/reuse2.test 350a01c5600336be4d60fedee7932ea5f2c65b8698ac54f889100551d44ab825 +F test/reuse2.test 7d9e63de7909711a970b848f1f068d820c0f8e61f12b68ee5ec11a019beba20e F test/reuse3.test 4eab99d5762c74422f24664680f4e482edd79f593919ffa3f18368735ee3b944 F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 @@ -1808,8 +1808,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 7c2ec2d4cfcda9c0aa6d57bd9a12ff98b78e648533d49da27f91d5a37bf1e001 e002666ac79c3452a772323c6ecc696104341cd842e77541553ec028f188096b -R 874fe30becc1a5c03c09070b47052542 -T +closed e002666ac79c3452a772323c6ecc696104341cd842e77541553ec028f188096b -U drh -Z 3bb7116d31fbb0c3e5ef362100dea8a9 +P 219b39e149a0334b577e094e066e1ca2fe686b408468e9f196611490f3a82810 +R 9047b65c4afb92b6d121e7343cd6282b +U dan +Z 8146267c5361e666d0319bd1ff8f7427 diff --git a/manifest.uuid b/manifest.uuid index 3005f7287e..755e662920 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -219b39e149a0334b577e094e066e1ca2fe686b408468e9f196611490f3a82810 \ No newline at end of file +34f0f96f47040df1e305ac9fd4664c5ed4246580e22a00573c73d6528a5725b5 \ No newline at end of file diff --git a/src/vdbeblob.c b/src/vdbeblob.c index 4279792696..ed90e10f2b 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -132,6 +132,7 @@ int sqlite3_blob_open( Table *pTab; Incrblob *pBlob = 0; Parse sParse; + int bUnlock; /* True to unlock reusable schemas before returning */ #ifdef SQLITE_ENABLE_API_ARMOR if( ppBlob==0 ){ @@ -148,6 +149,7 @@ int sqlite3_blob_open( sqlite3_mutex_enter(db->mutex); + bUnlock = sqlite3LockReusableSchema(db); pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob)); do { memset(&sParse, 0, sizeof(Parse)); @@ -331,6 +333,7 @@ int sqlite3_blob_open( } while( (++nAttempt)mallocFailed==0 ){ *ppBlob = (sqlite3_blob *)pBlob; }else{ diff --git a/test/reuse2.test b/test/reuse2.test index f05e3665d2..54b80da6b8 100644 --- a/test/reuse2.test +++ b/test/reuse2.test @@ -246,6 +246,47 @@ do_execsql_test -db db2 4.3.6 { SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool ORDER BY 1; } {26 17 18 13 14 15 4 5 6 nref=6 nschema=3} -finish_test +#-------------------------------------------------------------------------- +# Test the incremental-blob API with REUSE_SCHEMA connections. +# +catch {db1 close} +catch {db2 close} +catch {db3 close} +reset_db +do_execsql_test 5.0.1 { + CREATE TABLE bbb(a INTEGER PRIMARY KEY, b); +} +db close +do_test 5.0.2 { + sqlite3 db2 test.db -reuse-schema 1 + register_schemapool_module db2 + for {set i 1} {$i<6} {incr i} { + forcedelete test.db${i}-journal test.db${i}-wal test.db${i}-wal2 + forcecopy test.db test.db${i} + sqlite3 db test.db${i} + db eval { INSERT INTO bbb VALUES(123, 'database_' || $i) } + db close + db2 eval "ATTACH 'test.db${i}' AS db${i}" + } + execsql { + SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool ORDER BY 1; + } db2 +} {nref=6 nschema=1} + +do_test 5.1.1 { + set res [list] + for {set i 1} {$i<6} {incr i} { + set chan [db2 incrblob db${i} bbb b 123] + lappend res [gets $chan] + close $chan + } + set res +} {database_1 database_2 database_3 database_4 database_5} +do_execsql_test -db db2 5.1.2 { + SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool ORDER BY 1; +} {nref=6 nschema=1} + + +finish_test