1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Changes to savepoint in virtual tables for simpler and more consistent

operation.

FossilOrigin-Name: 92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883
This commit is contained in:
drh
2011-05-25 01:16:42 +00:00
parent e485522462
commit 346506f97b
7 changed files with 22 additions and 24 deletions

View File

@@ -3674,7 +3674,7 @@ static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){
TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); TESTONLY( Fts3Table *p = (Fts3Table*)pVtab );
assert( p->inTransaction ); assert( p->inTransaction );
assert( p->mxSavepoint >= iSavepoint ); assert( p->mxSavepoint >= iSavepoint );
TESTONLY( p->mxSavepoint = iSavepoint>0 ? iSavepoint-1 : 0 ); TESTONLY( p->mxSavepoint = iSavepoint-1 );
return SQLITE_OK; return SQLITE_OK;
} }
static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){

View File

@@ -1,5 +1,5 @@
C Do\snot\sinvoke\sthe\sxRollbackTo\sor\sxRelease\smethods\sof\sa\svirtual\stable\swithout\nhaving\sfirst\sinvoked\san\sappropriate\sxSavepoint\smethod.\s\sAdd\sassert()\sstatements\nto\sFTS3/4\sto\sverify\sthat\sthis\sis\shappening\sin\sall\scases. C Changes\sto\ssavepoint\sin\svirtual\stables\sfor\ssimpler\sand\smore\sconsistent\noperation.
D 2011-05-24T15:36:01.532 D 2011-05-25T01:16:42.774
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -61,7 +61,7 @@ F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0
F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a
F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9 F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9
F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
F ext/fts3/fts3.c e7600e285b58027657ebb46c6132b7d5a100accb F ext/fts3/fts3.c 0a2ae110f2d1806687ee0de837ac1eff106843b4
F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
F ext/fts3/fts3Int.h c8c0011c5e5b3a7703376ea6cd7deb91cfb96a06 F ext/fts3/fts3Int.h c8c0011c5e5b3a7703376ea6cd7deb91cfb96a06
F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf
@@ -181,7 +181,7 @@ F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff
F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48 F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48
F src/sqlite.h.in 91c63a69eeddbd62182ec00dbfee390016972bdb F src/sqlite.h.in 91c63a69eeddbd62182ec00dbfee390016972bdb
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
F src/sqliteInt.h 558170329f2b9cc3ac1a697fda69d6136b1052a1 F src/sqliteInt.h aba3cb057fabf6ff9fa634d677e750dfa946a856
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -236,15 +236,15 @@ F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f
F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60
F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70
F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e
F src/vdbe.c 408cc051fab3f16af2ccfe5a5eb0c86499ebb10c F src/vdbe.c 4812f0e5813b3969307ec466d26d9b32b7b814e9
F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797
F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae
F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1 F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1
F src/vdbeaux.c 535851211df61d83213c83d5ffd3c6ce9ecbdc18 F src/vdbeaux.c 07a5226ae6e9c6e54b5fcd3c395b86e7ffdba3a4
F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562
F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b
F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114
F src/vtab.c abc63828276619d7eb8f45ab265ebc2204c85ddd F src/vtab.c 6bff354033de8eff72f42565411a72a84fd2b26b
F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66 F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66
F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a
F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
@@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P a9d095660ca0e99b226e0fe669c11a0be6c49710 P 651ef24249d8c22c4f13e4c0bb98a60099cfd23a
R 19875cc50e6351fd8eaf432c5942eda7 R d659c94b5cac09c043b35685a3ce715d
U drh U drh
Z f15ff60c160c7edadf458f2c05939bd4 Z 45421066265cfeebb2a0b357f6a7553d

View File

@@ -1 +1 @@
651ef24249d8c22c4f13e4c0bb98a60099cfd23a 92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883

View File

@@ -1235,7 +1235,7 @@ struct VTable {
sqlite3_vtab *pVtab; /* Pointer to vtab instance */ sqlite3_vtab *pVtab; /* Pointer to vtab instance */
int nRef; /* Number of pointers to this structure */ int nRef; /* Number of pointers to this structure */
u8 bConstraint; /* True if constraints are supported */ u8 bConstraint; /* True if constraints are supported */
u8 bInSavepoint; /* True if within a SAVEPOINT */ u32 iSavepoint; /* Depth of the SAVEPOINT stack */
VTable *pNext; /* Next in linked list (see above) */ VTable *pNext; /* Next in linked list (see above) */
}; };

View File

@@ -2840,7 +2840,7 @@ case OP_Transaction: {
p->iStatement = db->nSavepoint + db->nStatement; p->iStatement = db->nSavepoint + db->nStatement;
} }
rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement); rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3BtreeBeginStmt(pBt, p->iStatement); rc = sqlite3BtreeBeginStmt(pBt, p->iStatement);
} }

View File

@@ -2202,17 +2202,11 @@ int sqlite3VdbeHalt(Vdbe *p){
** do so. If this operation returns an error, and the current statement ** do so. If this operation returns an error, and the current statement
** error code is SQLITE_OK or SQLITE_CONSTRAINT, then promote the ** error code is SQLITE_OK or SQLITE_CONSTRAINT, then promote the
** current statement error code. ** current statement error code.
**
** Note that sqlite3VdbeCloseStatement() can only fail if eStatementOp
** is SAVEPOINT_ROLLBACK. But if p->rc==SQLITE_OK then eStatementOp
** must be SAVEPOINT_RELEASE. Hence the NEVER(p->rc==SQLITE_OK) in
** the following code.
*/ */
if( eStatementOp ){ if( eStatementOp ){
rc = sqlite3VdbeCloseStatement(p, eStatementOp); rc = sqlite3VdbeCloseStatement(p, eStatementOp);
if( rc ){ if( rc ){
assert( eStatementOp==SAVEPOINT_ROLLBACK ); if( p->rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT ){
if( NEVER(p->rc==SQLITE_OK) || p->rc==SQLITE_CONSTRAINT ){
p->rc = rc; p->rc = rc;
sqlite3DbFree(db, p->zErrMsg); sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = 0; p->zErrMsg = 0;

View File

@@ -753,6 +753,7 @@ static void callFinaliser(sqlite3 *db, int offset){
x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset); x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset);
if( x ) x(p); if( x ) x(p);
} }
pVTab->iSavepoint = 0;
sqlite3VtabUnlock(pVTab); sqlite3VtabUnlock(pVTab);
} }
sqlite3DbFree(db, db->aVTrans); sqlite3DbFree(db, db->aVTrans);
@@ -870,17 +871,18 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){
int rc = SQLITE_OK; int rc = SQLITE_OK;
assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN ); assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN );
assert( iSavepoint>=0 );
if( db->aVTrans ){ if( db->aVTrans ){
int i; int i;
for(i=0; rc==SQLITE_OK && i<db->nVTrans; i++){ for(i=0; rc==SQLITE_OK && i<db->nVTrans; i++){
VTable *pVTab = db->aVTrans[i]; VTable *pVTab = db->aVTrans[i];
const sqlite3_module *pMod = pVTab->pMod->pModule; const sqlite3_module *pMod = pVTab->pMod->pModule;
if( pMod->iVersion>=2 && (pVTab->bInSavepoint || op==SAVEPOINT_BEGIN) ){ if( pMod->iVersion>=2 ){
int (*xMethod)(sqlite3_vtab *, int); int (*xMethod)(sqlite3_vtab *, int);
switch( op ){ switch( op ){
case SAVEPOINT_BEGIN: case SAVEPOINT_BEGIN:
xMethod = pMod->xSavepoint; xMethod = pMod->xSavepoint;
pVTab->bInSavepoint = 1; pVTab->iSavepoint = iSavepoint+1;
break; break;
case SAVEPOINT_ROLLBACK: case SAVEPOINT_ROLLBACK:
xMethod = pMod->xRollbackTo; xMethod = pMod->xRollbackTo;
@@ -889,7 +891,9 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){
xMethod = pMod->xRelease; xMethod = pMod->xRelease;
break; break;
} }
if( xMethod ) rc = xMethod(db->aVTrans[i]->pVtab, iSavepoint); if( xMethod && pVTab->iSavepoint>iSavepoint ){
rc = xMethod(db->aVTrans[i]->pVtab, iSavepoint);
}
} }
} }
} }