]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Early prototype code for COMMIT AND BEGIN. Does not currently work.
authordrh <>
Thu, 14 Nov 2024 12:03:13 +0000 (12:03 +0000)
committerdrh <>
Thu, 14 Nov 2024 12:03:13 +0000 (12:03 +0000)
FossilOrigin-Name: ddac5973215478d0cacdd99c697345019018916453ec0657868a4e2c21601779

manifest
manifest.uuid
src/build.c
src/parse.y
src/sqliteInt.h
src/vdbe.c

index 22d5ef6cc2bb722fea4e7c1f32cdb438456dbab7..90e5b256edd90eb979868bb154c9cf730863fedc 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sthe\svfstrace.c\sextension\sto\sshow\ssymbolic\snames\sfor\sthe\svarious\nSHM\slocks.
-D 2024-11-13T18:23:18.773
+C Early\sprototype\scode\sfor\sCOMMIT\sAND\sBEGIN.\s\sDoes\snot\scurrently\swork.
+D 2024-11-14T12:03:13.845
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -717,7 +717,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
 F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c
 F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50
 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6
-F src/build.c c6b09342d870a509529244ed8e19b4175a261f2e3163c199241d69e1d8a57607
+F src/build.c c219c01d3490420addfe5e9673ed136cbf89acf4c72370b548cf68a4ad5cc281
 F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b
@@ -764,7 +764,7 @@ F src/os_win.c db4baa8f62bbfe3967c71b008cea31a8f2ff337c1667ff4d8a677e697315ff0d
 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
 F src/pager.c 9656ad4e8331efb8a4f94f7a0c6440b98caea073950a367ea0c728a53b8e62c9
 F src/pager.h 4b1140d691860de0be1347474c51fee07d5420bd7f802d38cbab8ea4ab9f538a
-F src/parse.y 8ec56598aa0df92428627502267d0d1c9778cc27308f8ffd31dfb2d017a8755f
+F src/parse.y 61033fb5fa609161a0025fe7b6941ee5afbf382f6927ea26c51892dd3b63d731
 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484
 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
 F src/pcache1.c 49516ad7718a3626f28f710fa7448ef1fce3c07fd169acbb4817341950264319
@@ -780,7 +780,7 @@ F src/shell.c.in 45e69e4e69576847a5b49aeac624c9ffad5666697ce037d38bc331a56733765
 F src/sqlite.h.in 4d93768709c53b7c653a63817a82d5a8625264ca0d8cdf99967ba147bdcf2aa6
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
-F src/sqliteInt.h 77be043f8694f4a8702d0ee882022b2e5a6489a0493e77c5d9a73f1efc5a2cc1
+F src/sqliteInt.h ba5f56d3ba50e2b86cc2d11599c141ad84f90b85e1d272913d1bd92bd2469bb6
 F src/sqliteLimit.h 6993c9cfe3af5b8169ae0e5f15627fc15596726d4f1dc90a221309f79715ce88
 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -844,7 +844,7 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
 F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba
 F src/util.c ceebf912f673247e305f16f97f0bb7285fca1d37413b79680714a553a9021d33
 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40
-F src/vdbe.c 8a6eb02823b424b273614bae41579392a5c495424592b60423dd2c443a583df0
+F src/vdbe.c dd800b9c36d4d63cf2185cfb98cc7443321ea47b8d24bbe82a9e705d85989d82
 F src/vdbe.h c2549a215898a390de6669cfa32adba56f0d7e17ba5a7f7b14506d6fd5f0c36a
 F src/vdbeInt.h 2da01c73e8e3736a9015d5b04aa04d209bc9023d279d237d4d409205e921ea1e
 F src/vdbeapi.c 6353de05e8e78e497ccb33381ba5662ccc11c0339e5b1455faff01b6dacc3075
@@ -2199,8 +2199,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 2560cc7072c923f534a5de1e15d2b0dd4ac5faf0a8876d9e3bf9804345585444
-R 5d29f4bc70b99f0334d8d6e56e448522
+P c0dd7de8f1e8eb745a8beff086d8b40b289c2dd75fe099a86ccc2bd0581f5e9a
+R f00c299a3caf2717b89c62777ed369f1
+T *branch * commit-and-begin
+T *sym-commit-and-begin *
+T -sym-trunk *
 U drh
-Z 8e77042ea0a98703802cf67ef314193e
+Z 5e44940d7e45450f39f97880ce59ef43
 # Remove this line to create a well-formed Fossil manifest.
index 446d6d59f612fa47552f3d81f9a53de4e4010522..455edb7320465da172b97f31eec107673cbcdfe3 100644 (file)
@@ -1 +1 @@
-c0dd7de8f1e8eb745a8beff086d8b40b289c2dd75fe099a86ccc2bd0581f5e9a
+ddac5973215478d0cacdd99c697345019018916453ec0657868a4e2c21601779
index a5deb54fc6d4d6216d4765b77d5d0b29fd0c85df..632c60f38eabc97c9629b04ec3a81b6eb3cde0d4 100644 (file)
@@ -5198,6 +5198,7 @@ void sqlite3BeginTransaction(Parse *pParse, int type){
   int i;
 
   assert( pParse!=0 );
+  assert( type==TK_DEFERRED || type==TK_IMMEDIATE || type==TK_EXCLUSIVE );
   db = pParse->db;
   assert( db!=0 );
   if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){
@@ -5228,13 +5229,15 @@ void sqlite3BeginTransaction(Parse *pParse, int type){
 ** Code for ROLLBACK is generated if eType==TK_ROLLBACK.  Otherwise
 ** code is generated for a COMMIT.
 */
-void sqlite3EndTransaction(Parse *pParse, int eType){
+void sqlite3EndTransaction(Parse *pParse, int eType, int eRestart){
   Vdbe *v;
   int isRollback;
 
   assert( pParse!=0 );
   assert( pParse->db!=0 );
   assert( eType==TK_COMMIT || eType==TK_END || eType==TK_ROLLBACK );
+  assert( eRestart==0 || eRestart==TK_DEFERRED || eRestart==TK_IMMEDIATE
+            || eRestart==TK_EXCLUSIVE );
   isRollback = eType==TK_ROLLBACK;
   if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION,
        isRollback ? "ROLLBACK" : "COMMIT", 0, 0) ){
@@ -5242,7 +5245,10 @@ void sqlite3EndTransaction(Parse *pParse, int eType){
   }
   v = sqlite3GetVdbe(pParse);
   if( v ){
-    sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, isRollback);
+    int p3 = 0;
+    if( eRestart ) p3 = eRestart==TK_DEFERRED ? 1 : 2;
+    sqlite3VdbeAddOp3(v, OP_AutoCommit, 1, isRollback, p3);
+    if( eRestart ) sqlite3BeginTransaction(pParse, eRestart);
   }
 }
 
index 8fdea9bfa31a51a16edf65562d7312e63c950e57..a063e5ac7e6abc09523d0865e7bb53ecec193b52 100644 (file)
@@ -169,8 +169,9 @@ transtype(A) ::= .             {A = TK_DEFERRED;}
 transtype(A) ::= DEFERRED(X).  {A = @X; /*A-overwrites-X*/}
 transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/}
 transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/}
-cmd ::= COMMIT|END(X) trans_opt.   {sqlite3EndTransaction(pParse,@X);}
-cmd ::= ROLLBACK(X) trans_opt.     {sqlite3EndTransaction(pParse,@X);}
+cmd ::= ROLLBACK(X) trans_opt.                {sqlite3EndTransaction(pParse,@X,0);}
+cmd ::= COMMIT|END(X) trans_opt.              {sqlite3EndTransaction(pParse,@X,0);}
+// See also the COMMIT AND BEGIN section below
 
 savepoint_opt ::= SAVEPOINT.
 savepoint_opt ::= .
@@ -474,6 +475,11 @@ resolvetype(A) ::= raisetype(A).
 resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
 resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
 
+////////////////////////// COMMIT AND BEGIN ///////////////////////////////////
+//
+cmd ::= COMMIT|END(X) AND BEGIN transtype(A) trans_opt.
+                                              {sqlite3EndTransaction(pParse,@X,A);}
+
 ////////////////////////// The DROP TABLE /////////////////////////////////////
 //
 cmd ::= DROP TABLE ifexists(E) fullname(X). {
index dbdf36200db54c01ecf12a8a87e490855ce42cf1..e5a0df289f3aefb3ea856b76a48b4e6d7fa23072 100644 (file)
@@ -1649,6 +1649,7 @@ struct sqlite3 {
   u32 dbOptFlags;               /* Flags to enable/disable optimizations */
   u8 enc;                       /* Text encoding */
   u8 autoCommit;                /* The auto-commit flag. */
+  u8 autoRebegin;               /* Restart a new transaction on COMMIT */
   u8 temp_store;                /* 1: file 2: memory 0: default */
   u8 mallocFailed;              /* True if we have seen a malloc failure */
   u8 bBenignMalloc;             /* Do not require OOMs if true */
@@ -5072,8 +5073,8 @@ void sqlite3PrngRestoreState(void);
 void sqlite3RollbackAll(sqlite3*,int);
 void sqlite3CodeVerifySchema(Parse*, int);
 void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb);
-void sqlite3BeginTransaction(Parse*, int);
-void sqlite3EndTransaction(Parse*,int);
+void sqlite3BeginTransaction(Parse*,int);
+void sqlite3EndTransaction(Parse*,int,int);
 void sqlite3Savepoint(Parse*, int, Token*);
 void sqlite3CloseSavepoints(sqlite3 *);
 void sqlite3LeaveMutexAndCloseZombie(sqlite3*);
index 558970ed953c06cc65045048213dab370faffdf9..38b4d1c378ef7c62b6ecadf2273c99b5bf6ba3e4 100644 (file)
@@ -3934,14 +3934,21 @@ case OP_Savepoint: {
   break;
 }
 
-/* Opcode: AutoCommit P1 P2 * * *
+/* Opcode: AutoCommit P1 P2 P3 * *
 **
-** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll
-** back any currently active btree transactions. If there are any active
-** VMs (apart from this one), then a ROLLBACK fails.  A COMMIT fails if
-** there are active writing VMs or active VMs that use shared cache.
+** Set the database auto-commit flag to P1 (1 or 0).  The current trasaction
+** while commit when the VDBE halts if the auto-commit flag is 1.  The
+** cureent transaction will stay in effect if the auto-commit flags is 0.
+** Thus, this opcode implements COMMIT when P1 is 0 and it implements
+** BEGIN when P1 is 1.
 **
-** This instruction causes the VM to halt.
+** If P2 is true, rollback any currently active btree transactions. If there
+** are any active VMs (apart from this one), then a ROLLBACK fails.  A
+** COMMIT fails if there are active writing VMs or active VMs that use
+** shared cache.
+**
+** If P3 is 1 or 2 and P1 is 1, then COMMIT but also start a new transaction
+** atomically.
 */
 case OP_AutoCommit: {
   int desiredAutoCommit;
@@ -3970,6 +3977,7 @@ case OP_AutoCommit: {
     }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
       goto vdbe_return;
     }else{
+      db->autoRebegin = pOp->p3;
       db->autoCommit = (u8)desiredAutoCommit;
     }
     if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
@@ -3980,6 +3988,12 @@ case OP_AutoCommit: {
     }
     sqlite3CloseSavepoints(db);
     if( p->rc==SQLITE_OK ){
+      if( pOp->p3 ){
+        db->nVdbeActive++;
+        db->nVdbeRead++;
+        p->eVdbeState = VDBE_RUN_STATE;
+        break;
+      }
       rc = SQLITE_DONE;
     }else{
       rc = SQLITE_ERROR;