From: drh <> Date: Thu, 14 Nov 2024 12:03:13 +0000 (+0000) Subject: Early prototype code for COMMIT AND BEGIN. Does not currently work. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3e97909bc533efa92a2c3050fec5ed53648100be;p=thirdparty%2Fsqlite.git Early prototype code for COMMIT AND BEGIN. Does not currently work. FossilOrigin-Name: ddac5973215478d0cacdd99c697345019018916453ec0657868a4e2c21601779 --- diff --git a/manifest b/manifest index 22d5ef6cc2..90e5b256ed 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 446d6d59f6..455edb7320 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c0dd7de8f1e8eb745a8beff086d8b40b289c2dd75fe099a86ccc2bd0581f5e9a +ddac5973215478d0cacdd99c697345019018916453ec0657868a4e2c21601779 diff --git a/src/build.c b/src/build.c index a5deb54fc6..632c60f38e 100644 --- a/src/build.c +++ b/src/build.c @@ -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); } } diff --git a/src/parse.y b/src/parse.y index 8fdea9bfa3..a063e5ac7e 100644 --- a/src/parse.y +++ b/src/parse.y @@ -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). { diff --git a/src/sqliteInt.h b/src/sqliteInt.h index dbdf36200d..e5a0df289f 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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*); diff --git a/src/vdbe.c b/src/vdbe.c index 558970ed95..38b4d1c378 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -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;