]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Open a statement transaction for "CREATE VIRTUAL TABLE" statements in order to ensure... vcreate-stmt
authordan <dan@noemail.net>
Mon, 28 Mar 2016 14:57:04 +0000 (14:57 +0000)
committerdan <dan@noemail.net>
Mon, 28 Mar 2016 14:57:04 +0000 (14:57 +0000)
FossilOrigin-Name: d0a3853b37230c12f8d4c5c24401cb707991e5e4

ext/fts5/test/fts5simple3.test
manifest
manifest.uuid
src/vdbeaux.c
src/vtab.c

index b6922f84dd7b33dd88c3692d94b20cd4114a1859..3d956459f944d0beb44987ba72ac47844317e60b 100644 (file)
@@ -55,11 +55,11 @@ foreach_detail_mode $testprefix {
     }
     execsql "CREATE VIRTUAL TABLE t2 USING fts5(detail=%DETAIL%,[join $cols ,])"
   } {}
-  
+
   do_test 2.2 {
     execsql "INSERT INTO t2 VALUES([join $vals ,])"
   } {}
-  
   foreach {tn q res} {
     1 { c1:val1 }     1
     2 { c300:val300 } 1
@@ -81,5 +81,20 @@ do_execsql_test 3.0 {
 }
 
 
+#-------------------------------------------------------------------------
+# Check that if a CREATE VIRTUAL TABLE statement fails within a 
+# transaction, any changes made to the database are reverted before
+# continuing.
+#
+reset_db
+do_catchsql_test 4.0 {
+  BEGIN;
+    CREATE VIRTUAL TABLE t1 USING fts5;
+} {1 {vtable constructor failed: t1}}
+
+do_execsql_test 4.1 { SELECT * FROM sqlite_master } {}
+do_execsql_test 4.2 { COMMIT }
+do_execsql_test 4.3 { SELECT * FROM sqlite_master } {}
+
 finish_test
 
index 943c941a237be99b880a4b4db5f6cf0c53ad599d..7a49cd4b701d72195c032cf8bc37ce4a6f163163 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sthe\smultiplexor\sso\sthat\sit\sdoes\snot\sassume\sthat\sthe\sxGetLastError\smethod\nis\snon-NULL\sin\sthe\schild\sVFS.
-D 2016-03-28T11:01:54.323
+C Open\sa\sstatement\stransaction\sfor\s"CREATE\sVIRTUAL\sTABLE"\sstatements\sin\sorder\sto\sensure\sthat\sif\sthe\sxCreate()\scall\sfails,\schanges\smade\sto\sthe\ssqlite_master\sand\spossibly\sother\stables\sare\srolled\sback.
+D 2016-03-28T14:57:04.013
 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66
@@ -182,7 +182,7 @@ F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17
 F ext/fts5/test/fts5rowid.test 16908a99d6efc9ba21081b4f2b86b3fc699839a6
 F ext/fts5/test/fts5simple.test cd23d4072ea095d652c9b6db12284cc642e49c98
 F ext/fts5/test/fts5simple2.test 98377ae1ff7749a42c21fe1a139c1ed312522c46
-F ext/fts5/test/fts5simple3.test 8e71733b3d1b0e695011d02c68ebc5ca40b6124e
+F ext/fts5/test/fts5simple3.test 5e00bc009aa0a62190e795383d969b8f31dbde15
 F ext/fts5/test/fts5synonym.test 6475d189c2e20d60795808f83e36bf9318708d48
 F ext/fts5/test/fts5synonym2.test aa4c43bd3b691ff80f658cb064f5ab40690e834e
 F ext/fts5/test/fts5tok1.test beb894c6f3468f10a574302f69ebe4436b0287c7
@@ -423,12 +423,12 @@ F src/vdbe.c cd990451b504507b455cc649d46dad51f2835a67
 F src/vdbe.h 6f44193e7be52fd5f7c308175a936555b1e6b101
 F src/vdbeInt.h f88d3115e9bde33b01d81f0dd26d8dd51f995991
 F src/vdbeapi.c 95b1f8e527240a18a9aea41a655b013bf07a7009
-F src/vdbeaux.c c8dd3e4e932bede6363b380519d05c0557ad27ce
+F src/vdbeaux.c 12936eacddb053711755c0811cdfca54bccec574
 F src/vdbeblob.c 3b570b730109e8f653d9d2081649f6e7015113db
 F src/vdbemem.c fe76c1f866de362d9b8332e59d74aa44f6560d69
 F src/vdbesort.c 307460bfa4de4d1c3901fcd42089159131e34062
 F src/vdbetrace.c f75c5455d8cf389ef86a8bfdfd3177e0e3692484
-F src/vtab.c 23b6cdfa996152d43b390504ed4a942c8caf3a00
+F src/vtab.c 708a9c55986d9ff0266a50ad8841050cbaf38d67
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c 10deb6b43887662691e5f53d10b3c171c401169b
 F src/wal.h 2f7c831cf3b071fa548bf2d5cac640846a7ff19c
@@ -1459,7 +1459,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 8213c2f58167243411d29cc58e303b4be656f756
-R 345c74a0cb9568a53ff6b8825c4a812b
-U drh
-Z 80e7037d98d6e1826970b484373d3274
+P f6a88cccbc0c62a0b453f4711298c9d5e1882b18
+R dadeb3bb7a060e0da4677a7f51fa7277
+T *branch * vcreate-stmt
+T *sym-vcreate-stmt *
+T -sym-trunk *
+U dan
+Z e4289e8a630a23c8c71af0317c2bb78e
index 7c1af05774385b60beb3430de03c4062550272ab..aa92ca4e7b5736076d07ca69114d5c3e011be383 100644 (file)
@@ -1 +1 @@
-f6a88cccbc0c62a0b453f4711298c9d5e1882b18
\ No newline at end of file
+d0a3853b37230c12f8d4c5c24401cb707991e5e4
\ No newline at end of file
index e651589aceddce1d48ade7afa09cd0643aaf5989..3de18a2e07d2915eb5cbac8fab7c25f16b41810e 100644 (file)
@@ -509,6 +509,9 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
       break;
     }
     if( opcode==OP_CreateTable ) hasCreateTable = 1;
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+    if( opcode==OP_VCreate ) hasAbort = 1;
+#endif
     if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1;
 #ifndef SQLITE_OMIT_FOREIGN_KEY
     if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){
index 802a8cac3af2bdd7a5933665f306ef165dfe8202..7e86025200ea4241beb168761394033405375428 100644 (file)
@@ -316,6 +316,7 @@ void sqlite3VtabBeginParse(
   sqlite3 *db;          /* Database connection */
 
   sqlite3StartTable(pParse, pName1, pName2, 0, 0, 1, ifNotExists);
+  sqlite3MayAbort(pParse);
   pTable = pParse->pNewTable;
   if( pTable==0 ) return;
   assert( 0==pTable->pIndex );