From 346506f97b5cae2252569fd00739b5c34f44735a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 25 May 2011 01:16:42 +0000 Subject: [PATCH 1/3] Changes to savepoint in virtual tables for simpler and more consistent operation. FossilOrigin-Name: 92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 --- ext/fts3/fts3.c | 2 +- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/sqliteInt.h | 2 +- src/vdbe.c | 2 +- src/vdbeaux.c | 8 +------- src/vtab.c | 10 +++++++--- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index fecf092148..5e2472753e 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -3674,7 +3674,7 @@ static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); assert( p->inTransaction ); assert( p->mxSavepoint >= iSavepoint ); - TESTONLY( p->mxSavepoint = iSavepoint>0 ? iSavepoint-1 : 0 ); + TESTONLY( p->mxSavepoint = iSavepoint-1 ); return SQLITE_OK; } static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ diff --git a/manifest b/manifest index 51c28b73df..70bd6447db 100644 --- a/manifest +++ b/manifest @@ -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. -D 2011-05-24T15:36:01.532 +C Changes\sto\ssavepoint\sin\svirtual\stables\sfor\ssimpler\sand\smore\sconsistent\noperation. +D 2011-05-25T01:16:42.774 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d 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.tokenizers 998756696647400de63d5ba60e9655036cb966e9 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/fts3Int.h c8c0011c5e5b3a7703376ea6cd7deb91cfb96a06 F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf @@ -181,7 +181,7 @@ F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48 F src/sqlite.h.in 91c63a69eeddbd62182ec00dbfee390016972bdb F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h 558170329f2b9cc3ac1a697fda69d6136b1052a1 +F src/sqliteInt.h aba3cb057fabf6ff9fa634d677e750dfa946a856 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -236,15 +236,15 @@ F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e -F src/vdbe.c 408cc051fab3f16af2ccfe5a5eb0c86499ebb10c +F src/vdbe.c 4812f0e5813b3969307ec466d26d9b32b7b814e9 F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1 -F src/vdbeaux.c 535851211df61d83213c83d5ffd3c6ce9ecbdc18 +F src/vdbeaux.c 07a5226ae6e9c6e54b5fcd3c395b86e7ffdba3a4 F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 -F src/vtab.c abc63828276619d7eb8f45ab265ebc2204c85ddd +F src/vtab.c 6bff354033de8eff72f42565411a72a84fd2b26b F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66 F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P a9d095660ca0e99b226e0fe669c11a0be6c49710 -R 19875cc50e6351fd8eaf432c5942eda7 +P 651ef24249d8c22c4f13e4c0bb98a60099cfd23a +R d659c94b5cac09c043b35685a3ce715d U drh -Z f15ff60c160c7edadf458f2c05939bd4 +Z 45421066265cfeebb2a0b357f6a7553d diff --git a/manifest.uuid b/manifest.uuid index 47cc55cc06..ddcd4dc4ff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -651ef24249d8c22c4f13e4c0bb98a60099cfd23a \ No newline at end of file +92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a6fac4f854..753c0fcefb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1235,7 +1235,7 @@ struct VTable { sqlite3_vtab *pVtab; /* Pointer to vtab instance */ int nRef; /* Number of pointers to this structure */ 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) */ }; diff --git a/src/vdbe.c b/src/vdbe.c index 5b421a65e5..add643f176 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2840,7 +2840,7 @@ case OP_Transaction: { 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 ){ rc = sqlite3BtreeBeginStmt(pBt, p->iStatement); } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index e89a87b522..e9764a5096 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2202,17 +2202,11 @@ int sqlite3VdbeHalt(Vdbe *p){ ** do so. If this operation returns an error, and the current statement ** error code is SQLITE_OK or SQLITE_CONSTRAINT, then promote the ** 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 ){ rc = sqlite3VdbeCloseStatement(p, eStatementOp); if( rc ){ - assert( eStatementOp==SAVEPOINT_ROLLBACK ); - if( NEVER(p->rc==SQLITE_OK) || p->rc==SQLITE_CONSTRAINT ){ + if( p->rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT ){ p->rc = rc; sqlite3DbFree(db, p->zErrMsg); p->zErrMsg = 0; diff --git a/src/vtab.c b/src/vtab.c index 1de0baec91..0a4c9ea0a4 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -753,6 +753,7 @@ static void callFinaliser(sqlite3 *db, int offset){ x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset); if( x ) x(p); } + pVTab->iSavepoint = 0; sqlite3VtabUnlock(pVTab); } sqlite3DbFree(db, db->aVTrans); @@ -870,17 +871,18 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ int rc = SQLITE_OK; assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN ); + assert( iSavepoint>=0 ); if( db->aVTrans ){ int i; for(i=0; rc==SQLITE_OK && inVTrans; i++){ VTable *pVTab = db->aVTrans[i]; 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); switch( op ){ case SAVEPOINT_BEGIN: xMethod = pMod->xSavepoint; - pVTab->bInSavepoint = 1; + pVTab->iSavepoint = iSavepoint+1; break; case SAVEPOINT_ROLLBACK: xMethod = pMod->xRollbackTo; @@ -889,7 +891,9 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ xMethod = pMod->xRelease; break; } - if( xMethod ) rc = xMethod(db->aVTrans[i]->pVtab, iSavepoint); + if( xMethod && pVTab->iSavepoint>iSavepoint ){ + rc = xMethod(db->aVTrans[i]->pVtab, iSavepoint); + } } } } From addd8f872949d25653d925d728011bcceb27be0a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 25 May 2011 15:54:09 +0000 Subject: [PATCH 2/3] Fix a compiler warning. FossilOrigin-Name: 6df99e52dabf2a243ad635529649b86c21735e91 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 70bd6447db..a7124cf8a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\ssavepoint\sin\svirtual\stables\sfor\ssimpler\sand\smore\sconsistent\noperation. -D 2011-05-25T01:16:42.774 +C Fix\sa\scompiler\swarning. +D 2011-05-25T15:54:09.204 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -181,7 +181,7 @@ F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48 F src/sqlite.h.in 91c63a69eeddbd62182ec00dbfee390016972bdb F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h aba3cb057fabf6ff9fa634d677e750dfa946a856 +F src/sqliteInt.h d9ff5f198b5bac7ee0c6e1ea55f76897ba4dda87 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 651ef24249d8c22c4f13e4c0bb98a60099cfd23a -R d659c94b5cac09c043b35685a3ce715d +P 92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 +R 1179d31eff61655636edf672584723cf U drh -Z 45421066265cfeebb2a0b357f6a7553d +Z c44adff51be44d9f0cc2862535697c61 diff --git a/manifest.uuid b/manifest.uuid index ddcd4dc4ff..e2dc48d525 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 \ No newline at end of file +6df99e52dabf2a243ad635529649b86c21735e91 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 753c0fcefb..bba0b3c441 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1235,7 +1235,7 @@ struct VTable { sqlite3_vtab *pVtab; /* Pointer to vtab instance */ int nRef; /* Number of pointers to this structure */ u8 bConstraint; /* True if constraints are supported */ - u32 iSavepoint; /* Depth of the SAVEPOINT stack */ + int iSavepoint; /* Depth of the SAVEPOINT stack */ VTable *pNext; /* Next in linked list (see above) */ }; From 2cac2078f6afd8fb6d262293029e12f9c235a130 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 25 May 2011 18:46:22 +0000 Subject: [PATCH 3/3] Fix a case where a malloc() error could lead to mismatched virtual-table xBegin/xCommit/xRollback callbacks. FossilOrigin-Name: d807304a695fc85402b86e1cd32a6e3bbb2823c8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vtab.c | 30 ++++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index a7124cf8a8..1074285b3f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scompiler\swarning. -D 2011-05-25T15:54:09.204 +C Fix\sa\scase\swhere\sa\smalloc()\serror\scould\slead\sto\smismatched\svirtual-table\sxBegin/xCommit/xRollback\scallbacks. +D 2011-05-25T18:46:22.024 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -244,7 +244,7 @@ F src/vdbeaux.c 07a5226ae6e9c6e54b5fcd3c395b86e7ffdba3a4 F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 -F src/vtab.c 6bff354033de8eff72f42565411a72a84fd2b26b +F src/vtab.c 9ba8c7fdb7d39260c033a402f6032d3e7bc5d336 F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66 F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 -R 1179d31eff61655636edf672584723cf -U drh -Z c44adff51be44d9f0cc2862535697c61 +P 6df99e52dabf2a243ad635529649b86c21735e91 +R 02c26b8fd230a540c57276590c974e79 +U dan +Z e2a23225f8e5abceac6a8fe1d14982ec diff --git a/manifest.uuid b/manifest.uuid index e2dc48d525..5b49fb4d2d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6df99e52dabf2a243ad635529649b86c21735e91 \ No newline at end of file +d807304a695fc85402b86e1cd32a6e3bbb2823c8 \ No newline at end of file diff --git a/src/vtab.c b/src/vtab.c index 0a4c9ea0a4..dffd6a2664 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -577,11 +577,11 @@ int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ return rc; } - /* -** Add the virtual table pVTab to the array sqlite3.aVTrans[]. +** Grow the db->aVTrans[] array so that there is room for at least one +** more v-table. Return SQLITE_NOMEM if a malloc fails, or SQLITE_OK otherwise. */ -static int addToVTrans(sqlite3 *db, VTable *pVTab){ +static int growVTrans(sqlite3 *db){ const int ARRAY_INCR = 5; /* Grow the sqlite3.aVTrans array if required */ @@ -596,10 +596,17 @@ static int addToVTrans(sqlite3 *db, VTable *pVTab){ db->aVTrans = aVTrans; } + return SQLITE_OK; +} + +/* +** Add the virtual table pVTab to the array sqlite3.aVTrans[]. Space should +** have already been reserved using growVTrans(). +*/ +static void addToVTrans(sqlite3 *db, VTable *pVTab){ /* Add pVtab to the end of sqlite3.aVTrans */ db->aVTrans[db->nVTrans++] = pVTab; sqlite3VtabLock(pVTab); - return SQLITE_OK; } /* @@ -637,7 +644,10 @@ int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){ /* Justification of ALWAYS(): The xConstructor method is required to ** create a valid sqlite3_vtab if it returns SQLITE_OK. */ if( rc==SQLITE_OK && ALWAYS(sqlite3GetVTable(db, pTab)) ){ - rc = addToVTrans(db, sqlite3GetVTable(db, pTab)); + rc = growVTrans(db); + if( rc==SQLITE_OK ){ + addToVTrans(db, sqlite3GetVTable(db, pTab)); + } } return rc; @@ -843,10 +853,14 @@ int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ } } - /* Invoke the xBegin method */ - rc = pModule->xBegin(pVTab->pVtab); + /* Invoke the xBegin method. If successful, add the vtab to the + ** sqlite3.aVTrans[] array. */ + rc = growVTrans(db); if( rc==SQLITE_OK ){ - rc = addToVTrans(db, pVTab); + rc = pModule->xBegin(pVTab->pVtab); + if( rc==SQLITE_OK ){ + addToVTrans(db, pVTab); + } } } return rc;