]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Allow "BEGIN CONCURRENT" transactions to modify the temp schema.
authordan <dan@noemail.net>
Mon, 6 Nov 2017 10:04:45 +0000 (10:04 +0000)
committerdan <dan@noemail.net>
Mon, 6 Nov 2017 10:04:45 +0000 (10:04 +0000)
FossilOrigin-Name: 0fb6d91cea347384fc081ce4c79582b365801dd4f56f5bf2ed40922bbfca0344

manifest
manifest.uuid
src/vdbe.c
test/concurrent.test

index 861009c90166bde561ec0eca11e3d9e6495d7a7a..6930c352bb018157524fd87c488fb2fe133ec4a4 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Cherrypick\s[ec37ad6d08]\sinto\sthis\sbranch.\sWith\sthis\spatch,\sif\nSQLITE_SHARED_MAPPING\sis\sdefined\sat\sbuild-time\sSQLite\swill\suse\sa\ssingle\smemory\nmapping\sfor\smultiple\sconnections\sto\sthe\ssame\sdatabase\sfile\swithin\sa\ssingle\nprocess.
-D 2017-09-22T11:09:09.656
+C Allow\s"BEGIN\sCONCURRENT"\stransactions\sto\smodify\sthe\stemp\sschema.
+D 2017-11-06T10:04:45.041
 F Makefile.in 4bc36d913c2e3e2d326d588d72f618ac9788b2fd4b7efda61102611a6495c3ff
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 6033b51b6aea702ea059f6ab2d47b1d3cef648695f787247dd4fb395fe60673f
@@ -530,7 +530,7 @@ F src/update.c 5404be9e840717323a69209190cdbc9d0d34adaedaaf1d1a1069babf2c4171c0
 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
 F src/util.c 5168013cfd937a695d23cce8c67cb07a3dda242d4cb812530ba1148b88e0f159
 F src/vacuum.c 07eec96f821c7dcbdca2fadffc6e38ea2c24bf409fcb15fe9fb3ac444d632dfe
-F src/vdbe.c 96467c73f53c3cb2b3ad7a73c69d59fb43966d772a7fc70114dde14cf3876dd0
+F src/vdbe.c 8b7313c7012c627a0f6579b0c1d3a42f48ffd187e4beb6a0face21092d728ac0
 F src/vdbe.h d50cadf12bcf9fb99117ef392ce1ea283aa429270481426b6e8b0280c101fd97
 F src/vdbeInt.h 1fe00770144c12c4913128f35262d11527ef3284561baaab59b947a41c08d0d9
 F src/vdbeapi.c 9c670ca0dcc1cd86373aa353b747b26fe531ca5cd4331690c611d1f03842e2a1
@@ -668,7 +668,7 @@ F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151eca
 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1
 F test/colname.test c47639d26cbeba6977457e5ef2c2c55c5b6c889478dd7eb0ed858ba894e7fa93
 F test/concfault.test 500f17c3fcfe7705114422bcc6ddd3c740001a43
-F test/concurrent.test a801cd60c370f0ed851657c9576b102f9ab1dd846c6a88e6ae45939a8deeda7c
+F test/concurrent.test 86661967a680670127a62a819e60dc93c2d3d49043ac95b26dfa70d3e60dbde5
 F test/concurrent2.test 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8
 F test/concurrent3.test f4af1cf1220908c6dd5694923621c19e999b78cd997e2646285f08a52bcb4170
 F test/concurrent4.test e0b12cd467137e50259df3b4f837507e82aaa07c35941c88664dc8ed1d089c44
@@ -1666,8 +1666,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 307b802e8627c93a51e4c54851a4fab33db5061bb80e3d327ce53b127d6d511b
-Q +ec37ad6d08362f4c9faad9b629c0fa23f5864ff6ad7f4cbed93a25d5f7b815d8
-R a7069c27bdffb405c8574ad991612563
+P c7a5880d6d898299b4c9414b7702cfa450aa5f7bf4ec8f417b94d2a7b6558264
+R 202ef8632fda2b1b9ef7af4f1e374f95
 U dan
-Z 9a1235c2d010c6dd3774c97b07deb6f2
+Z d758dc3efdc3027768a35f11fc7171bf
index da8f0bb88ea43cbf7cf5b31c6ecd0b58abb296d7..e36be45a6d9b72bc8d81330a37f0a548008f2e08 100644 (file)
@@ -1 +1 @@
-c7a5880d6d898299b4c9414b7702cfa450aa5f7bf4ec8f417b94d2a7b6558264
\ No newline at end of file
+0fb6d91cea347384fc081ce4c79582b365801dd4f56f5bf2ed40922bbfca0344
\ No newline at end of file
index 09c0cd32b405a4a4b1f2151fc15103693eded172..4292fce260bce2d66c133c99efc7fa0fb3cb704b 100644 (file)
@@ -3306,7 +3306,7 @@ case OP_SetCookie: {
   rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3);
   if( pOp->p2==BTREE_SCHEMA_VERSION ){
     /* When the schema cookie changes, record the new cookie internally */
-    assert( db->bConcurrent==0 );
+    assert( pOp->p1==1 || db->bConcurrent==0 );
     pDb->pSchema->schema_cookie = pOp->p3;
     db->mDbFlags |= DBFLAG_SchemaChange;
   }else if( pOp->p2==BTREE_FILE_FORMAT ){
@@ -6509,7 +6509,7 @@ case OP_Expire: {
 case OP_TableLock: {
   u8 isWriteLock = (u8)pOp->p3;
 #ifndef SQLITE_OMIT_CONCURRENT
-  if( isWriteLock && db->bConcurrent && pOp->p2==1 ){
+  if( isWriteLock && db->bConcurrent && pOp->p2==1 && pOp->p1!=1 ){
     rc = SQLITE_ERROR;
     sqlite3VdbeError(p, 
         "cannot modify database schema within CONCURRENT transaction");
index b8f8d7e0d608517bd708f0d859ff4934ec709ea8..b94071a8f1ef6ac397fee3252fe3cda30f90e022 100644 (file)
@@ -112,19 +112,47 @@ foreach {tn sql} {
   2 { DROP TABLE t1 }
   3 { CREATE INDEX i1 ON t1(a) }
   4 { CREATE VIEW v1 AS SELECT * FROM t1 }
-  5 { CREATE TEMP TABLE xx(a, b) }
 } {
-  do_catchsql_test 1.7.$tn.1 "
+  do_catchsql_test 1.7.0.$tn.1 "
     BEGIN CONCURRENT;
     $sql
   " {1 {cannot modify database schema within CONCURRENT transaction}}
 
-  do_execsql_test 1.7.$tn.2 {
+  do_execsql_test 1.7.0.$tn.2 {
     SELECT sql FROM sqlite_master;
     SELECT sql FROM sqlite_temp_master;
   } {{CREATE TABLE t1(a, b)}}
 
-  do_execsql_test 1.7.$tn.3 COMMIT
+  do_execsql_test 1.7.0.$tn.3 COMMIT
+}
+
+# Except the temp db schema.
+foreach {tn sql} {
+  1 { CREATE TEMP TABLE xx(a, b) }
+  2 { DROP TABLE xx }
+  3 { CREATE TEMP TABLE yy(a, b) }
+  4 { CREATE VIEW temp.v1 AS SELECT * FROM t1 }
+  5 { CREATE INDEX yyi1 ON yy(a); }
+  6 { CREATE TABLE temp.zz(a, b) }
+} {
+  do_catchsql_test 1.7.1.$tn.1 "
+    BEGIN CONCURRENT;
+    $sql
+  " {0 {}}
+
+  do_execsql_test 1.7.1.$tn.2 COMMIT
+}
+
+
+do_execsql_test 1.7.1.x {
+  SELECT sql FROM sqlite_master;
+  SELECT sql FROM sqlite_temp_master;
+} {
+  {CREATE TABLE t1(a, b)}
+  {CREATE TABLE yy(a, b)} 
+  {CREATE VIEW v1 AS SELECT * FROM t1} 
+  {CREATE INDEX yyi1 ON yy(a)} 
+  {CREATE TABLE zz(a, b)}
 }
 
 #-------------------------------------------------------------------------