]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ensure that if a deferred FK constraint is violated by a statement that creates its... deferred-fk-quirk
authordan <dan@noemail.net>
Mon, 24 Jan 2011 16:00:58 +0000 (16:00 +0000)
committerdan <dan@noemail.net>
Mon, 24 Jan 2011 16:00:58 +0000 (16:00 +0000)
FossilOrigin-Name: 8063197ef141c0c62ba710efdd2b3421fbee4e5d

manifest
manifest.uuid
src/vdbeaux.c

index 61daaed0f0110312958624354380980df7d44443..54264470dc878ce96e338ebe12ccc523495ee32d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Modify\sthe\strace\scallback\smechanism\sso\sthat\sSQL\scommands\sexecuted\sfrom\swithin\svirtual\stable\sor\suser\sfunction\scallbacks\sare\spassed\sto\sthe\strace\scallback\swithout\sparameter\sexpansion\sand\senclosed\sin\sSQL\scomments.
-D 2011-01-22T13:32:30
+C Ensure\sthat\sif\sa\sdeferred\sFK\sconstraint\sis\sviolated\sby\sa\sstatement\sthat\screates\sits\sown\simplicit\stransaction,\sthe\sstatement\sis\snot\san\s"active-write"\safter\ssqlite3_step()\sreturns.
+D 2011-01-24T16:00:59
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in de6498556d536ae60bb8bb10e8c1ba011448658c
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -232,7 +232,7 @@ F src/vdbe.c 5d310eaf1a4d8383602126fa82e01291ab7d3cf3
 F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2
 F src/vdbeInt.h 6e6f28e9bccc6c703dca1372fd661c57b5c15fb0
 F src/vdbeapi.c 8e9324fd35eb70d0b5904bd1af40f2598744dc4d
-F src/vdbeaux.c 33448d23b857654dd69ed2103611f5c733606f68
+F src/vdbeaux.c 521b954f21ec15aee2ba5a0af8a1526bdd71e45e
 F src/vdbeblob.c 18955f0ee6b133cd08e1592010cb9a6b11e9984c
 F src/vdbemem.c 411649a35686f54268ccabeda175322c4697f5a6
 F src/vdbetrace.c 3ba13bc32bdf16d2bdea523245fd16736bed67b5
@@ -897,7 +897,10 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 380f61df0754ceec6b3f6a758d04e951cce8c3d9
-R 90a5119ad79fbdf46155bfdda925f6c3
+P a764915b87564fa91ee68e9b1f41394ce0f1fc7e
+R e8885ee042476ced2c7dfa4c7a736076
+T *branch * deferred-fk-quirk
+T *sym-deferred-fk-quirk *
+T -sym-trunk *
 U dan
-Z 22ba801a4079136db1b6273b2820344e
+Z 2132121d7c9351a52aa9ba299c7514e3
index 302247b035f5bf23d1bd4eade381a0d1303432f8..55b5ddd9fc2b9bb9447ce5183b833a43b070e701 100644 (file)
@@ -1 +1 @@
-a764915b87564fa91ee68e9b1f41394ce0f1fc7e
\ No newline at end of file
+8063197ef141c0c62ba710efdd2b3421fbee4e5d
\ No newline at end of file
index de69e544e5aa8e68973d4db8048916cd5935a237..7567df91a439b8fa0b99e5d85a5a127db56487ad 100644 (file)
@@ -2108,16 +2108,21 @@ int sqlite3VdbeHalt(Vdbe *p){
      && db->writeVdbeCnt==(p->readOnly==0) 
     ){
       if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){
-        if( sqlite3VdbeCheckFk(p, 1) ){
-          sqlite3BtreeMutexArrayLeave(&p->aMutex);
-          return SQLITE_ERROR;
+        rc = sqlite3VdbeCheckFk(p, 1);
+        if( rc!=SQLITE_OK ){
+          if( p->readOnly ){
+            sqlite3BtreeMutexArrayLeave(&p->aMutex);
+            return SQLITE_ERROR;
+          }
+          rc = SQLITE_CONSTRAINT;
+        }else{ 
+          /* The auto-commit flag is true, the vdbe program was successful 
+          ** or hit an 'OR FAIL' constraint and there are no deferred foreign
+          ** key constraints to hold up the transaction. This means a commit 
+          ** is required. */
+          rc = vdbeCommit(db, p);
         }
-        /* The auto-commit flag is true, the vdbe program was successful 
-        ** or hit an 'OR FAIL' constraint and there are no deferred foreign
-        ** key constraints to hold up the transaction. This means a commit 
-        ** is required.  */
-        rc = vdbeCommit(db, p);
-        if( rc==SQLITE_BUSY ){
+        if( rc==SQLITE_BUSY && p->readOnly ){
           sqlite3BtreeMutexArrayLeave(&p->aMutex);
           return SQLITE_BUSY;
         }else if( rc!=SQLITE_OK ){
@@ -2216,7 +2221,7 @@ int sqlite3VdbeHalt(Vdbe *p){
   }
 
   assert( db->activeVdbeCnt>0 || db->autoCommit==0 || db->nStatement==0 );
-  return SQLITE_OK;
+  return (p->rc==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK);
 }