From c7792fa052499f7ff04adaa787a957eb3f6b5e47 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Apr 2011 16:28:52 +0000 Subject: [PATCH 01/14] Begin a series of changes designed to reduce the scope and frequency of invalidating schemas. Design goals are that the internal schema should never be deleted out from under a prepared statement that is running and that all prepared statements should be expired if the schema is invalidated. At the same time, minimize the number of schema invalidations. This change merely revises the sqlite3ResetInternalSchema() function to use -1 as the wildcard for "all" rather than 0, so that we can reset the main schema independently of all the others. FossilOrigin-Name: 6a8ad6e31e0d2b8a5ace38faf0efd805155ee5f3 --- manifest | 36 ++++++++++++++++++++---------------- manifest.uuid | 2 +- src/attach.c | 4 ++-- src/backup.c | 2 +- src/build.c | 24 ++++++++++++++++-------- src/main.c | 6 +++--- src/pragma.c | 2 +- src/prepare.c | 4 ++-- src/vacuum.c | 3 ++- src/vdbe.c | 4 ++-- src/vdbeaux.c | 2 +- src/vtab.c | 2 +- 12 files changed, 52 insertions(+), 39 deletions(-) diff --git a/manifest b/manifest index 8411b2239f..2df9766380 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\srace\scondition\sin\sOP_ParseSchema. -D 2011-04-02T09:44:43 +C Begin\sa\sseries\sof\schanges\sdesigned\sto\sreduce\sthe\sscope\sand\sfrequency\sof\ninvalidating\sschemas.\s\sDesign\sgoals\sare\sthat\sthe\sinternal\sschema\sshould\nnever\sbe\sdeleted\sout\sfrom\sunder\sa\sprepared\sstatement\sthat\sis\srunning\sand\nthat\sall\sprepared\sstatements\sshould\sbe\sexpired\sif\sthe\sschema\sis\sinvalidated.\nAt\sthe\ssame\stime,\sminimize\sthe\snumber\sof\sschema\sinvalidations.\s\sThis\schange\nmerely\srevises\sthe\ssqlite3ResetInternalSchema()\sfunction\sto\suse\s-1\sas\sthe\nwildcard\sfor\s"all"\srather\sthan\s0,\sso\sthat\swe\scan\sreset\sthe\smain\sschema\nindependently\sof\sall\sthe\sothers. +D 2011-04-02T16:28:52.034 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -116,15 +116,15 @@ F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc F sqlite3.pc.in ae6f59a76e862f5c561eb32a380228a02afc3cad F src/alter.c 280f5c04b11b492703a342222b3de0a999445280 F src/analyze.c d0a673d303f611690fc7a3293aaefed57cccc5c8 -F src/attach.c 438ea6f6b5d5961c1f49b737f2ce0f14ce7c6877 +F src/attach.c 7cae2cf0c14762ce14c074a860ec52890a973a56 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 -F src/backup.c 537f89c7ef5021cb580f31f782e556ffffcb2ed1 +F src/backup.c b7529a6691f0fd534ae8ff622203c46a7f1b626b F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef F src/btmutex.c 96a12f50f7a17475155971a241d85ec5171573ff F src/btree.c 2b9c81ff64da339a67dda4f94c0d763627be0b67 F src/btree.h 8d36f774ec4b1d0027b8966f8c03d9a72a518c14 F src/btreeInt.h 20f73dc93b1eeb83afd7259fbc6bd7dcf2df7fe4 -F src/build.c 6c490fe14dedb094a202f559e3b29a276abffcf8 +F src/build.c 9dca3dc000b85753cff822c69151f88d913f3b3e F src/callback.c 5069f224882cbdccd559f591271d28d7f37745bc F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 @@ -143,7 +143,7 @@ F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e F src/loadext.c 8af9fcc75708d60b88636ccba38b4a7b3c155c3e -F src/main.c c23c62e53d120c5eee086c0e2cc96cc9a691c50e +F src/main.c 14c019b381b76ea378ee8629d1ed861a3899e075 F src/malloc.c 92d59a007d7a42857d4e9454aa25b6b703286be1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206 @@ -170,8 +170,8 @@ F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050 F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e -F src/pragma.c 4221eb822d7cdb1fb69be555b189e15e5a24b6b5 -F src/prepare.c eb4944d9f7bfa13eb42a7416ed9aaed4de4d0bf3 +F src/pragma.c 672c5e453d6321fdcfd76ffe346d99cae54fcddb +F src/prepare.c cec63cb151fcaeee00006ec5376698310caea56a F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 @@ -234,16 +234,16 @@ F src/trigger.c ec4813709e990a169b6923293e839fa5dfd64282 F src/update.c 81911be16ece3c3e7716aa18565b4814ec41f8b9 F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c cd997077bad039efc0597eb027c929658f93c018 -F src/vacuum.c 924bd1bcee2dfb05376f79845bd3b4cec7b54b2f -F src/vdbe.c a45a6a0daf2161797d50b3b5b8a3e0e4debf2d2b +F src/vacuum.c 3b2b0998f4f277e4bc61469c2d78d8424d02899b +F src/vdbe.c 6b15a8fb9bb5d5abd232fbc72cc6410c2fd70c1b F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 F src/vdbeInt.h e1c6254641168507d25b46affb6dfb53c782f553 F src/vdbeapi.c a09ad9164cafc505250d5dd6b69660c960f1308c -F src/vdbeaux.c 77921792f7ebae267490816deb6a9488f938fa85 +F src/vdbeaux.c e97565fb2fea822a2e853370c440b493ef09d7e7 F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 3ba13bc32bdf16d2bdea523245fd16736bed67b5 -F src/vtab.c e1edca38c4c4310710635bb91bb3c87fdf60f21d +F src/vtab.c 341ae69e949ce583c1729b0177f62ab821e8b42f F src/wal.c 7334009b396285b658a95a3b6bc6d2b016a1f794 F src/wal.h 7a5fbb00114b7f2cd40c7e1003d4c41ce9d26840 F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f @@ -926,7 +926,11 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 20afd81a4cf4d23962ec841bbd375f36a5156fb6 -R 25d34b3e2efbdd1c8e0ceadec6512306 -U dan -Z 659aea6fa897bf521b0a686e5d197299 +P 71a799b02a3b3cf2e12758dea29fd2465bbec3e1 +R 5fca8a4df9fe5cb6d589b9d60d83b4fc +T *bgcolor * #d3a8bc +T *branch * schema-parse-refactor +T *sym-schema-parse-refactor * +T -sym-trunk * +U drh +Z 80e5b841d301ef316c4772ca966c9795 diff --git a/manifest.uuid b/manifest.uuid index fa61c3c651..8ad8e8fd35 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -71a799b02a3b3cf2e12758dea29fd2465bbec3e1 \ No newline at end of file +6a8ad6e31e0d2b8a5ace38faf0efd805155ee5f3 \ No newline at end of file diff --git a/src/attach.c b/src/attach.c index 37b61935f3..fe88aa73cd 100644 --- a/src/attach.c +++ b/src/attach.c @@ -200,7 +200,7 @@ static void attachFunc( db->aDb[iDb].pBt = 0; db->aDb[iDb].pSchema = 0; } - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); db->nDb = iDb; if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ db->mallocFailed = 1; @@ -272,7 +272,7 @@ static void detachFunc( sqlite3BtreeClose(pDb->pBt); pDb->pBt = 0; pDb->pSchema = 0; - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); return; detach_error: diff --git a/src/backup.c b/src/backup.c index 82be9635b1..c062744c5c 100644 --- a/src/backup.c +++ b/src/backup.c @@ -401,7 +401,7 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){ int nDestTruncate; if( p->pDestDb ){ - sqlite3ResetInternalSchema(p->pDestDb, 0); + sqlite3ResetInternalSchema(p->pDestDb, -1); } /* Set nDestTruncate to the final number of pages in the destination diff --git a/src/build.c b/src/build.c index bf3273fc84..c7cd6363d9 100644 --- a/src/build.c +++ b/src/build.c @@ -393,26 +393,34 @@ void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){ ** if there were schema changes during the transaction or if a ** schema-cookie mismatch occurs. ** -** If iDb==0 then reset the internal schema tables for all database -** files. If iDb>=1 then reset the internal schema for only the +** If iDb<0 then reset the internal schema tables for all database +** files. If iDb>=0 then reset the internal schema for only the ** single file indicated. */ void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){ int i, j; - assert( iDb>=0 && iDbnDb ); + assert( iDbnDb ); - if( iDb==0 ){ - sqlite3BtreeEnterAll(db); + if( iDb>=0 ){ + /* Case 1: Reset the single schema identified by iDb */ + Db *pDb = &db->aDb[iDb]; + if( pDb->pSchema ){ + assert(iDb==1 || (pDb->pBt && sqlite3BtreeHoldsMutex(pDb->pBt))); + sqlite3SchemaFree(pDb->pSchema); + } + return; } - for(i=iDb; inDb; i++){ + /* Case 2 (from here to the end): Reset all schemas for all attached + ** databases. */ + assert( iDb<0 ); + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ Db *pDb = &db->aDb[i]; if( pDb->pSchema ){ assert(i==1 || (pDb->pBt && sqlite3BtreeHoldsMutex(pDb->pBt))); sqlite3SchemaFree(pDb->pSchema); } - if( iDb>0 ) return; } - assert( iDb==0 ); db->flags &= ~SQLITE_InternChanges; sqlite3VtabUnlockList(db); sqlite3BtreeLeaveAll(db); diff --git a/src/main.c b/src/main.c index 03097498c5..ca862edc7f 100644 --- a/src/main.c +++ b/src/main.c @@ -687,7 +687,7 @@ int sqlite3_close(sqlite3 *db){ } sqlite3_mutex_enter(db->mutex); - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); /* If a transaction is open, the ResetInternalSchema() call above ** will not have called the xDisconnect() method on any virtual @@ -730,7 +730,7 @@ int sqlite3_close(sqlite3 *db){ } } } - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); /* Tell the code in notify.c that the connection no longer holds any ** locks and does not require any further unlock-notify callbacks. @@ -821,7 +821,7 @@ void sqlite3RollbackAll(sqlite3 *db){ if( db->flags&SQLITE_InternChanges ){ sqlite3ExpirePreparedStatements(db); - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); } /* Any deferred constraint violations have now been resolved. */ diff --git a/src/pragma.c b/src/pragma.c index db55e4bb41..0a092e8c3e 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -115,7 +115,7 @@ static int invalidateTempStorage(Parse *pParse){ } sqlite3BtreeClose(db->aDb[1].pBt); db->aDb[1].pBt = 0; - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); } return SQLITE_OK; } diff --git a/src/prepare.c b/src/prepare.c index 45654ecfca..0687ddea42 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -338,7 +338,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ } if( db->mallocFailed ){ rc = SQLITE_NOMEM; - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); } if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){ /* Black magic: If the SQLITE_RecoveryMode flag is set, then consider @@ -613,7 +613,7 @@ static int sqlite3Prepare( schemaIsValid(pParse); } if( pParse->rc==SQLITE_SCHEMA ){ - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); } if( db->mallocFailed ){ pParse->rc = SQLITE_NOMEM; diff --git a/src/vacuum.c b/src/vacuum.c index 4babf5b409..5ca39ae1e0 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -335,8 +335,9 @@ end_of_vacuum: pDb->pSchema = 0; } - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); return rc; } + #endif /* SQLITE_OMIT_VACUUM && SQLITE_OMIT_ATTACH */ diff --git a/src/vdbe.c b/src/vdbe.c index ddf507ee9d..0c790d6502 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2649,7 +2649,7 @@ case OP_Savepoint: { } if( p1==SAVEPOINT_ROLLBACK && (db->flags&SQLITE_InternChanges)!=0 ){ sqlite3ExpirePreparedStatements(db); - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); db->flags = (db->flags | SQLITE_InternChanges); } } @@ -5946,7 +5946,7 @@ vdbe_error_halt: sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1; rc = SQLITE_ERROR; - if( resetSchemaOnFault ) sqlite3ResetInternalSchema(db, 0); + if( resetSchemaOnFault ) sqlite3ResetInternalSchema(db, -1); /* This is the only way out of this procedure. We have to ** release the mutexes on btrees that were acquired at the diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 7cab12f78d..a2f4a2b484 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2191,7 +2191,7 @@ int sqlite3VdbeHalt(Vdbe *p){ /* Rollback or commit any schema changes that occurred. */ if( p->rc!=SQLITE_OK && db->flags&SQLITE_InternChanges ){ - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); db->flags = (db->flags | SQLITE_InternChanges); } diff --git a/src/vtab.c b/src/vtab.c index b9f1e6f348..30e302deaf 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -48,7 +48,7 @@ static int createModule( if( pDel==pMod ){ db->mallocFailed = 1; } - sqlite3ResetInternalSchema(db, 0); + sqlite3ResetInternalSchema(db, -1); }else if( xDestroy ){ xDestroy(pAux); } From ff2e14b93fe1eed5ce64d713b3571f5ffc9419a3 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Apr 2011 16:50:25 +0000 Subject: [PATCH 02/14] When resetting any non-TEMP schema, also reset the TEMP schema since it might be holding references to the non-TEMP schema that just got reset. FossilOrigin-Name: 211d5dde1f9c15048c65d1d700141aa7b2491011 --- manifest | 16 ++++++---------- manifest.uuid | 2 +- src/build.c | 7 +++++++ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 2df9766380..6eb669650b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Begin\sa\sseries\sof\schanges\sdesigned\sto\sreduce\sthe\sscope\sand\sfrequency\sof\ninvalidating\sschemas.\s\sDesign\sgoals\sare\sthat\sthe\sinternal\sschema\sshould\nnever\sbe\sdeleted\sout\sfrom\sunder\sa\sprepared\sstatement\sthat\sis\srunning\sand\nthat\sall\sprepared\sstatements\sshould\sbe\sexpired\sif\sthe\sschema\sis\sinvalidated.\nAt\sthe\ssame\stime,\sminimize\sthe\snumber\sof\sschema\sinvalidations.\s\sThis\schange\nmerely\srevises\sthe\ssqlite3ResetInternalSchema()\sfunction\sto\suse\s-1\sas\sthe\nwildcard\sfor\s"all"\srather\sthan\s0,\sso\sthat\swe\scan\sreset\sthe\smain\sschema\nindependently\sof\sall\sthe\sothers. -D 2011-04-02T16:28:52.034 +C When\sresetting\sany\snon-TEMP\sschema,\salso\sreset\sthe\sTEMP\sschema\ssince\sit\smight\nbe\sholding\sreferences\sto\sthe\snon-TEMP\sschema\sthat\sjust\sgot\sreset. +D 2011-04-02T16:50:25.018 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -124,7 +124,7 @@ F src/btmutex.c 96a12f50f7a17475155971a241d85ec5171573ff F src/btree.c 2b9c81ff64da339a67dda4f94c0d763627be0b67 F src/btree.h 8d36f774ec4b1d0027b8966f8c03d9a72a518c14 F src/btreeInt.h 20f73dc93b1eeb83afd7259fbc6bd7dcf2df7fe4 -F src/build.c 9dca3dc000b85753cff822c69151f88d913f3b3e +F src/build.c fcdd8f47361261432fb10d0e7234ba617025d1f2 F src/callback.c 5069f224882cbdccd559f591271d28d7f37745bc F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 @@ -926,11 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 71a799b02a3b3cf2e12758dea29fd2465bbec3e1 -R 5fca8a4df9fe5cb6d589b9d60d83b4fc -T *bgcolor * #d3a8bc -T *branch * schema-parse-refactor -T *sym-schema-parse-refactor * -T -sym-trunk * +P 6a8ad6e31e0d2b8a5ace38faf0efd805155ee5f3 +R bc8973ff15cc98898e96282e6b2f93e3 U drh -Z 80e5b841d301ef316c4772ca966c9795 +Z af325c6ab15f4448779a96c9a9fe8dd3 diff --git a/manifest.uuid b/manifest.uuid index 8ad8e8fd35..d2609b2f9d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6a8ad6e31e0d2b8a5ace38faf0efd805155ee5f3 \ No newline at end of file +211d5dde1f9c15048c65d1d700141aa7b2491011 \ No newline at end of file diff --git a/src/build.c b/src/build.c index c7cd6363d9..7c4735c063 100644 --- a/src/build.c +++ b/src/build.c @@ -408,6 +408,13 @@ void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){ assert(iDb==1 || (pDb->pBt && sqlite3BtreeHoldsMutex(pDb->pBt))); sqlite3SchemaFree(pDb->pSchema); } + /* If any database other than TEMP is reset, then also reset TEMP + ** since TEMP might be holding triggers that reference tables in the + ** other database. + */ + if( iDb!=1 && (pDb = &db->aDb[1])!=0 && pDb->pSchema ){ + sqlite3SchemaFree(pDb->pSchema); + } return; } /* Case 2 (from here to the end): Reset all schemas for all attached From b6ee66072ea24b06d91bedc74b64c2f795b3b9e5 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Apr 2011 13:40:53 +0000 Subject: [PATCH 03/14] Rename sqlite3SchemaFree() to sqlite3SchemaClear() to more accurately reflect its function. FossilOrigin-Name: 71d7440023f67760d0bff4bd7459fe88bd226f30 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 6 +++--- src/callback.c | 6 +++--- src/sqliteInt.h | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index bc2cf93e78..350d81657e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sin\sthe\slatest\schanges\sfrom\strunk. -D 2011-04-04T13:07:02.051 +C Rename\ssqlite3SchemaFree()\sto\ssqlite3SchemaClear()\sto\smore\saccurately\sreflect\nits\sfunction. +D 2011-04-04T13:40:53.775 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -124,8 +124,8 @@ F src/btmutex.c 3e595ee1bb99e3a1f16824137b435ffc97c98e5f F src/btree.c 107723ed4f9bdb55213ba6164c30c49af75f4bf9 F src/btree.h a840a20c1969391f98ee06960d5ee2dc460186b3 F src/btreeInt.h 6714ce2f5e879eb9a904a6a4575dc4faa4f29991 -F src/build.c 0dd1fd5a9d38534e99d7ed70c325647917e571c5 -F src/callback.c 5069f224882cbdccd559f591271d28d7f37745bc +F src/build.c 3377719d96750d6a64b46237f81c6763220e7662 +F src/callback.c 0425c6320730e6d3981acfb9202c1bed9016ad1a F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 F src/date.c 1548fdac51377e4e7833251de878b4058c148e1b @@ -180,7 +180,7 @@ F src/select.c d24406c45dd2442eb2eeaac413439066b149c944 F src/shell.c 9dc0b4bb59290c0a35256d278cab0f314987ad6a F src/sqlite.h.in e047f69a61d604d4f8be6cf1d1bdfc68be9ba7e5 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h d45b0b1db417d5308e3bf9c8983aaf2d06e7cd36 +F src/sqliteInt.h 56a866476ad9b6907ce1e12fef5e97288cb68b0f F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44 F src/status.c 4997380fbb915426fef9e500b4872e79c99267fc F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 0d99229a7a58da07748072326f6261c533c1958f 425e3edb146c497817855dd741878709a25c8b98 -R 0ccaf0f101b400777a3c1e84b0615efa +P 47b79c40cf07048f682c44bfef533d4764b20c4d +R 7d7c24df127ba94f05b0be76158e8cae U drh -Z 3368f164313f101c42a8e8263501ee32 +Z 2de83a94583ece938e6b46c216a1a66c diff --git a/manifest.uuid b/manifest.uuid index b7ce1af1d7..210b142d75 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -47b79c40cf07048f682c44bfef533d4764b20c4d \ No newline at end of file +71d7440023f67760d0bff4bd7459fe88bd226f30 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 39b6e84a75..41e7c799c4 100644 --- a/src/build.c +++ b/src/build.c @@ -406,14 +406,14 @@ void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){ Db *pDb = &db->aDb[iDb]; if( pDb->pSchema ){ assert(iDb==1 || (pDb->pBt && sqlite3BtreeHoldsMutex(pDb->pBt))); - sqlite3SchemaFree(pDb->pSchema); + sqlite3SchemaClear(pDb->pSchema); } /* If any database other than TEMP is reset, then also reset TEMP ** since TEMP might be holding triggers that reference tables in the ** other database. */ if( iDb!=1 && (pDb = &db->aDb[1])!=0 && pDb->pSchema ){ - sqlite3SchemaFree(pDb->pSchema); + sqlite3SchemaClear(pDb->pSchema); } return; } @@ -425,7 +425,7 @@ void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){ Db *pDb = &db->aDb[i]; if( pDb->pSchema ){ assert(i==1 || (pDb->pBt && sqlite3BtreeHoldsMutex(pDb->pBt))); - sqlite3SchemaFree(pDb->pSchema); + sqlite3SchemaClear(pDb->pSchema); } } db->flags &= ~SQLITE_InternChanges; diff --git a/src/callback.c b/src/callback.c index fdee9bc09c..ce849085c2 100644 --- a/src/callback.c +++ b/src/callback.c @@ -400,12 +400,12 @@ FuncDef *sqlite3FindFunction( /* ** Free all resources held by the schema structure. The void* argument points ** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the -** pointer itself, it just cleans up subsiduary resources (i.e. the contents +** pointer itself, it just cleans up subsidiary resources (i.e. the contents ** of the schema hash tables). ** ** The Schema.cache_size variable is not cleared. */ -void sqlite3SchemaFree(void *p){ +void sqlite3SchemaClear(void *p){ Hash temp1; Hash temp2; HashElem *pElem; @@ -440,7 +440,7 @@ void sqlite3SchemaFree(void *p){ Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ Schema * p; if( pBt ){ - p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaFree); + p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaClear); }else{ p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema)); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index ba5552dba4..f7700b740a 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2969,7 +2969,7 @@ void sqlite3DefaultRowEst(Index*); void sqlite3RegisterLikeFunctions(sqlite3*, int); int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*); void sqlite3MinimumFileFormat(Parse*, int, int); -void sqlite3SchemaFree(void *); +void sqlite3SchemaClear(void *); Schema *sqlite3SchemaGet(sqlite3 *, Btree *); int sqlite3SchemaToIndex(sqlite3 *db, Schema *); KeyInfo *sqlite3IndexKeyinfo(Parse *, Index *); From 68db57b6917e83ce4525e80d09a21f4436508b07 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 4 Apr 2011 14:03:58 +0000 Subject: [PATCH 04/14] Have test_syscall.c include "sqliteInt.h". Otherwise the SQLITE_OS_UNIX symbol may not be defined correctly. FossilOrigin-Name: fda8fadd837e399d3fab7a9e6894617a5788d679 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/test_syscall.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 65800fd981..7af2bb9e4b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Move\sthe\sexpired-statement\stest\sfor\sOP_Function\suntil\safter\sall\smemory\shas\nbeen\sfreed.\s\sThe\stest\sis\sstill\scommented\sout,\showever. -D 2011-04-04T12:29:20.265 +C Have\stest_syscall.c\sinclude\s"sqliteInt.h".\sOtherwise\sthe\sSQLITE_OS_UNIX\ssymbol\smay\snot\sbe\sdefined\scorrectly. +D 2011-04-04T14:03:58.599 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -222,7 +222,7 @@ F src/test_schema.c 8c06ef9ddb240c7a0fcd31bc221a6a2aade58bf0 F src/test_server.c bbba05c144b5fc4b52ff650a4328027b3fa5fcc6 F src/test_stat.c f682704b5d1ba8e1d4e7e882a6d7922e2dcf066c F src/test_superlock.c 2b97936ca127d13962c3605dbc9a4ef269c424cd -F src/test_syscall.c 34ce1be806cd180e241bc688ae3762e5e7825bda +F src/test_syscall.c 10ced09d6e9fba929531b25b46a8e5675f4f9940 F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa F src/test_thread.c bedd05cad673dba53326f3aa468cc803038896c0 F src/test_vfs.c 2ed8853c1e51ac6f9ea091f7ce4e0d618bba8b86 @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 4e996f36c73c5e768a954394fcbbf5e17576c807 -R 4c64876ffe2c0a670add1f1b62152ed8 -U drh -Z badc0ef9dd3fcc800ebaf4f50ec0d36c +P 425e3edb146c497817855dd741878709a25c8b98 +R bfbf218f3efb47247391ca878c887fe4 +U dan +Z 9616075d7db18b4b467697e48342db18 diff --git a/manifest.uuid b/manifest.uuid index 3a4413c91a..020dda7062 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -425e3edb146c497817855dd741878709a25c8b98 \ No newline at end of file +fda8fadd837e399d3fab7a9e6894617a5788d679 \ No newline at end of file diff --git a/src/test_syscall.c b/src/test_syscall.c index c570b71e81..e3cdcfdfce 100644 --- a/src/test_syscall.c +++ b/src/test_syscall.c @@ -75,6 +75,7 @@ #include #include +#include "sqliteInt.h" #ifdef SQLITE_OS_UNIX /* From test1.c */ From 6a64d6788452870759825dc74872f388c082599b Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 4 Apr 2011 15:38:16 +0000 Subject: [PATCH 05/14] Add the "--start=[permutation:][testfile]" option to tester.tcl. For starting quick.test or all.test at the nominated permutation and/or test file. FossilOrigin-Name: a97e8505f229e05bf97ef9edbe063a52b581f339 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/tester.tcl | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 7af2bb9e4b..e93961cb70 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\stest_syscall.c\sinclude\s"sqliteInt.h".\sOtherwise\sthe\sSQLITE_OS_UNIX\ssymbol\smay\snot\sbe\sdefined\scorrectly. -D 2011-04-04T14:03:58.599 +C Add\sthe\s"--start=[permutation:][testfile]"\soption\sto\stester.tcl.\sFor\sstarting\squick.test\sor\sall.test\sat\sthe\snominated\spermutation\sand/or\stest\sfile. +D 2011-04-04T15:38:16.948 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -685,7 +685,7 @@ F test/tclsqlite.test 8c154101e704170c2be10f137a5499ac2c6da8d3 F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/temptable.test f42121a0d29a62f00f93274464164177ab1cc24a F test/temptrigger.test b0273db072ce5f37cf19140ceb1f0d524bbe9f05 -F test/tester.tcl dafe0d30279f6d380d5d2a535781dda91b8cfc3f +F test/tester.tcl 6fa3d2f581b479a3a088b1b5b0d145e548ebe662 F test/thread001.test a3e6a7254d1cb057836cb3145b60c10bf5b7e60f F test/thread002.test afd20095e6e845b405df4f2c920cb93301ca69db F test/thread003.test b824d4f52b870ae39fc5bae4d8070eca73085dca @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 425e3edb146c497817855dd741878709a25c8b98 -R bfbf218f3efb47247391ca878c887fe4 +P fda8fadd837e399d3fab7a9e6894617a5788d679 +R 4b62570a0a31579c57911e1ba72815ed U dan -Z 9616075d7db18b4b467697e48342db18 +Z 8e0f703ae7b0d0dd238c3eeb189cec4d diff --git a/manifest.uuid b/manifest.uuid index 020dda7062..91c9c36fff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fda8fadd837e399d3fab7a9e6894617a5788d679 \ No newline at end of file +a97e8505f229e05bf97ef9edbe063a52b581f339 \ No newline at end of file diff --git a/test/tester.tcl b/test/tester.tcl index 4c7c10ed73..bae10530c6 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -154,6 +154,7 @@ if {[info exists cmdlinearg]==0} { # --backtrace=N # --binarylog=N # --soak=N + # --start=[$permutation:]$testfile # set cmdlinearg(soft-heap-limit) 0 set cmdlinearg(maxerror) 1000 @@ -161,6 +162,7 @@ if {[info exists cmdlinearg]==0} { set cmdlinearg(backtrace) 10 set cmdlinearg(binarylog) 0 set cmdlinearg(soak) 0 + set cmdlinearg(start) "" set leftover [list] foreach a $argv { @@ -195,6 +197,16 @@ if {[info exists cmdlinearg]==0} { foreach {dummy cmdlinearg(soak)} [split $a =] break set ::G(issoak) $cmdlinearg(soak) } + {^-+start=.+$} { + foreach {dummy cmdlinearg(start)} [split $a =] break + + set ::G(start:file) $cmdlinearg(start) + if {[regexp {(.*):(.*)} $cmdlinearg(start) -> s.perm s.file]} { + set ::G(start:permutation) ${s.perm} + set ::G(start:file) ${s.file} + } + if {$::G(start:file) == ""} {unset ::G(start:file)} + } default { lappend leftover $a } @@ -1325,6 +1337,15 @@ proc slave_test_script {script} { proc slave_test_file {zFile} { set tail [file tail $zFile] + if {[info exists ::G(start:permutation)]} { + if {[permutation] != $::G(start:permutation)} return + unset ::G(start:permutation) + } + if {[info exists ::G(start:file)]} { + if {$tail != $::G(start:file) && $tail!="$::G(start:file).test"} return + unset ::G(start:file) + } + # Remember the value of the shared-cache setting. So that it is possible # to check afterwards that it was not modified by the test script. # From 2120608e0f1186788a4f900f77b6c2418c3835e6 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Apr 2011 18:22:02 +0000 Subject: [PATCH 06/14] Add a description of access rules for the Schema object and lots of asserts to verify that the access rules are followed. FossilOrigin-Name: ae8374af057b6e6546e9265148cfffe32fcb0849 --- manifest | 38 +++++++++++++++++++------------------- manifest.uuid | 2 +- src/analyze.c | 4 +++- src/btmutex.c | 25 +++++++++++++++++++++++++ src/btree.h | 2 ++ src/build.c | 31 ++++++++++++++++++++++++++----- src/fkey.c | 1 + src/insert.c | 2 ++ src/pragma.c | 3 +++ src/prepare.c | 1 + src/sqliteInt.h | 14 ++++++++++++++ src/status.c | 2 ++ src/trigger.c | 10 +++++++++- src/vdbe.c | 3 +++ src/vtab.c | 1 + 15 files changed, 112 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index a0193c477f..d4526b8119 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\stest_syscall.c\sfix\sfrom\sthe\strunk. -D 2011-04-04T14:05:39.172 +C Add\sa\sdescription\sof\saccess\srules\sfor\sthe\sSchema\sobject\sand\slots\sof\sasserts\nto\sverify\sthat\sthe\saccess\srules\sare\sfollowed. +D 2011-04-04T18:22:02.782 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -115,16 +115,16 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc F sqlite3.pc.in ae6f59a76e862f5c561eb32a380228a02afc3cad F src/alter.c 280f5c04b11b492703a342222b3de0a999445280 -F src/analyze.c d0a673d303f611690fc7a3293aaefed57cccc5c8 +F src/analyze.c a1ad9f4d8aac055c4a4bbd99073e2e78fe66129c F src/attach.c 7cae2cf0c14762ce14c074a860ec52890a973a56 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c b7529a6691f0fd534ae8ff622203c46a7f1b626b F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef -F src/btmutex.c 3e595ee1bb99e3a1f16824137b435ffc97c98e5f +F src/btmutex.c b81062220a4f91b0bd785d13d57205d68449be88 F src/btree.c 107723ed4f9bdb55213ba6164c30c49af75f4bf9 -F src/btree.h a840a20c1969391f98ee06960d5ee2dc460186b3 +F src/btree.h c0e0ff5c85effe9fc757e3085bbdded6d1cca000 F src/btreeInt.h 6714ce2f5e879eb9a904a6a4575dc4faa4f29991 -F src/build.c 3377719d96750d6a64b46237f81c6763220e7662 +F src/build.c 63465c86f7d5919fddb112ec6d38342863e8e8b3 F src/callback.c 0425c6320730e6d3981acfb9202c1bed9016ad1a F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 @@ -132,13 +132,13 @@ F src/date.c 1548fdac51377e4e7833251de878b4058c148e1b F src/delete.c 7ed8a8c8b5f748ece92df173d7e0f7810c899ebd F src/expr.c 00817c672af554321fd67c44325afd7cef0e4648 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb -F src/fkey.c 418b840007c873975fd0d071746d952f8bca20ce +F src/fkey.c 387c9b458eba388538922591dddf4fa032a39dcb F src/func.c 3a8cb2fb2de3e3aed7f39106daf4878d9d17fcce F src/global.c 02335177cf6946fe5525c6f0755cf181140debf3 F src/hash.c 458488dcc159c301b8e7686280ab209f1fb915af F src/hash.h 2894c932d84d9f892d4b4023a75e501f83050970 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c 8ffb544ff516669aa84a6f13d05dbf5c93bdb1ea +F src/insert.c 081d0dc22f8264093057e6358365681036a95309 F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e @@ -170,8 +170,8 @@ F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050 F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e -F src/pragma.c 672c5e453d6321fdcfd76ffe346d99cae54fcddb -F src/prepare.c cec63cb151fcaeee00006ec5376698310caea56a +F src/pragma.c 36eec9129bfea2dbcdc1694d362f17330132697d +F src/prepare.c a4d8ac347b39e317d2f463c36b22c650e00b7126 F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 @@ -180,9 +180,9 @@ F src/select.c d24406c45dd2442eb2eeaac413439066b149c944 F src/shell.c 9dc0b4bb59290c0a35256d278cab0f314987ad6a F src/sqlite.h.in e047f69a61d604d4f8be6cf1d1bdfc68be9ba7e5 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h 56a866476ad9b6907ce1e12fef5e97288cb68b0f +F src/sqliteInt.h 9a944a2d9b12b30b186a0f1236a97eb01f1e50bb F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44 -F src/status.c 4997380fbb915426fef9e500b4872e79c99267fc +F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/tclsqlite.c 501c9a200fd998a268be475be5858febc90b725b F src/test1.c 9ca440e80e16e53920904a0a5ac7feffb9b2c9a1 @@ -230,12 +230,12 @@ F src/test_vfstrace.c 2265c9895f350c8d3c39b079998fbe7481505cc1 F src/test_wholenumber.c 6129adfbe7c7444f2e60cc785927f3aa74e12290 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/tokenize.c 604607d6813e9551cf5189d899e0a25c12681080 -F src/trigger.c ec4813709e990a169b6923293e839fa5dfd64282 +F src/trigger.c bb68c3d1feff3e1335c55a7acf195b9c96ae91ec F src/update.c 81911be16ece3c3e7716aa18565b4814ec41f8b9 F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c cd997077bad039efc0597eb027c929658f93c018 F src/vacuum.c 3b2b0998f4f277e4bc61469c2d78d8424d02899b -F src/vdbe.c 48fe95bd84b7cdeb155c4d2b825c7d19a65c5b3d +F src/vdbe.c 1e62a4f18500f86137fda77416c5e55f7336d1d1 F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 F src/vdbeInt.h 7e2f028ecc1a9faa6f253e7aa8d89cae03662bae F src/vdbeapi.c a09ad9164cafc505250d5dd6b69660c960f1308c @@ -243,7 +243,7 @@ F src/vdbeaux.c e1ea6edc07b4f33a339cc45a2fbe0a36067d2d8b F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 3ba13bc32bdf16d2bdea523245fd16736bed67b5 -F src/vtab.c 341ae69e949ce583c1729b0177f62ab821e8b42f +F src/vtab.c 672f8dadd6ce9ab984af81e3dfb1b5b38715e7b7 F src/wal.c 7334009b396285b658a95a3b6bc6d2b016a1f794 F src/wal.h 7a5fbb00114b7f2cd40c7e1003d4c41ce9d26840 F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 71d7440023f67760d0bff4bd7459fe88bd226f30 fda8fadd837e399d3fab7a9e6894617a5788d679 -R 3fc8950d604a8bfbce215b1e441b51de -U dan -Z 197ed95a6588fec32711fa656edc064b +P 1e1a23cc56563d512b28288256c34f05ea15b4aa +R 977144757d60ff253970ffcce55b348e +U drh +Z 03b0de28f2209300e8cd6e160282b5b5 diff --git a/manifest.uuid b/manifest.uuid index 7c08d4cfd5..1a879c861a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1e1a23cc56563d512b28288256c34f05ea15b4aa \ No newline at end of file +ae8374af057b6e6546e9265148cfffe32fcb0849 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 231d414314..fd040a7ec2 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -149,6 +149,7 @@ static void analyzeOneTable( assert( sqlite3BtreeHoldsAllMutexes(db) ); iDb = sqlite3SchemaToIndex(db, pTab->pSchema); assert( iDb>=0 ); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); #ifndef SQLITE_OMIT_AUTHORIZATION if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, db->aDb[iDb].zName ) ){ @@ -390,6 +391,7 @@ static void analyzeDatabase(Parse *pParse, int iDb){ pParse->nTab += 2; openStatTable(pParse, iDb, iStatCur, 0, 0); iMem = pParse->nMem+1; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ Table *pTab = (Table*)sqliteHashData(k); analyzeOneTable(pParse, pTab, 0, iStatCur, iMem); @@ -600,9 +602,9 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ assert( iDb>=0 && iDbnDb ); assert( db->aDb[iDb].pBt!=0 ); - assert( sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); /* Clear any prior statistics */ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ Index *pIdx = sqliteHashData(i); sqlite3DefaultRowEst(pIdx); diff --git a/src/btmutex.c b/src/btmutex.c index 42d0bdcbc7..33b9f86a0c 100644 --- a/src/btmutex.c +++ b/src/btmutex.c @@ -288,6 +288,31 @@ int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){ } #endif /* NDEBUG */ +#ifndef NDEBUG +/* +** Return true if the correct mutexes are held for accessing the +** db->aDb[iDb].pSchema structure. The mutexes required for schema +** access are: +** +** (1) The mutex on db +** (2) if iDb!=1, then the mutex on db->aDb[iDb].pBt. +** +** If pSchema is not NULL, then iDb is computed from pSchema and +** db using sqlite3SchemaToIndex(). +*/ +int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema){ + Btree *p; + assert( db!=0 ); + if( pSchema ) iDb = sqlite3SchemaToIndex(db, pSchema); + assert( iDb>=0 && iDbnDb ); + if( !sqlite3_mutex_held(db->mutex) ) return 0; + if( iDb==1 ) return 1; + p = db->aDb[iDb].pBt; + assert( p!=0 ); + return p->sharable==0 || p->locked==1; +} +#endif /* NDEBUG */ + #else /* SQLITE_THREADSAFE>0 above. SQLITE_THREADSAFE==0 below */ /* ** The following are special cases for mutex enter routines for use diff --git a/src/btree.h b/src/btree.h index 4fd4f67685..3eebfe20b5 100644 --- a/src/btree.h +++ b/src/btree.h @@ -220,6 +220,7 @@ void sqlite3BtreeCursorList(Btree*); /* These routines are used inside assert() statements only. */ int sqlite3BtreeHoldsMutex(Btree*); int sqlite3BtreeHoldsAllMutexes(sqlite3*); + int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*); u32 sqlite3BtreeMutexCounter(Btree*); #endif #else @@ -232,6 +233,7 @@ void sqlite3BtreeCursorList(Btree*); # define sqlite3BtreeHoldsMutex(X) 1 # define sqlite3BtreeHoldsAllMutexes(X) 1 +# define sqlite3BtreeSchemaMutexHeld(X,Y) 1 #endif diff --git a/src/build.c b/src/build.c index 41e7c799c4..51b790586b 100644 --- a/src/build.c +++ b/src/build.c @@ -156,6 +156,7 @@ void sqlite3FinishCoding(Parse *pParse){ sqlite3VdbeUsesBtree(v, iDb); sqlite3VdbeAddOp2(v,OP_Transaction, iDb, (mask & pParse->writeMask)!=0); if( db->init.busy==0 ){ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); sqlite3VdbeAddOp3(v, OP_VerifyCookie, iDb, pParse->cookieValue[iDb], db->aDb[iDb].pSchema->iGeneration); @@ -271,9 +272,12 @@ Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ int nName; assert( zName!=0 ); nName = sqlite3Strlen30(zName); + /* All mutexes are required for schema access. Make sure we hold them. */ + assert( zDatabase!=0 || sqlite3BtreeHoldsAllMutexes(db) ); for(i=OMIT_TEMPDB; inDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue; + assert( sqlite3SchemaMutexHeld(db, j, 0) ); p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, nName); if( p ) break; } @@ -333,11 +337,14 @@ Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){ Index *p = 0; int i; int nName = sqlite3Strlen30(zName); + /* All mutexes are required for schema access. Make sure we hold them. */ + assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); for(i=OMIT_TEMPDB; inDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ Schema *pSchema = db->aDb[j].pSchema; assert( pSchema ); if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue; + assert( sqlite3SchemaMutexHeld(db, j, 0) ); p = sqlite3HashFind(&pSchema->idxHash, zName, nName); if( p ) break; } @@ -364,8 +371,10 @@ static void freeIndex(sqlite3 *db, Index *p){ void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){ Index *pIndex; int len; - Hash *pHash = &db->aDb[iDb].pSchema->idxHash; + Hash *pHash; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pHash = &db->aDb[iDb].pSchema->idxHash; len = sqlite3Strlen30(zIdxName); pIndex = sqlite3HashInsert(pHash, zIdxName, len, 0); if( ALWAYS(pIndex) ){ @@ -404,15 +413,15 @@ void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){ if( iDb>=0 ){ /* Case 1: Reset the single schema identified by iDb */ Db *pDb = &db->aDb[iDb]; - if( pDb->pSchema ){ - assert(iDb==1 || (pDb->pBt && sqlite3BtreeHoldsMutex(pDb->pBt))); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( ALWAYS(pDb->pSchema) ){ sqlite3SchemaClear(pDb->pSchema); } /* If any database other than TEMP is reset, then also reset TEMP ** since TEMP might be holding triggers that reference tables in the ** other database. */ - if( iDb!=1 && (pDb = &db->aDb[1])!=0 && pDb->pSchema ){ + if( iDb!=1 && (pDb = &db->aDb[1])!=0 && ALWAYS(pDb->pSchema) ){ sqlite3SchemaClear(pDb->pSchema); } return; @@ -424,7 +433,6 @@ void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){ for(i=0; inDb; i++){ Db *pDb = &db->aDb[i]; if( pDb->pSchema ){ - assert(i==1 || (pDb->pBt && sqlite3BtreeHoldsMutex(pDb->pBt))); sqlite3SchemaClear(pDb->pSchema); } } @@ -513,6 +521,7 @@ void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ TESTONLY ( Index *pOld = ) sqlite3HashInsert( &pIndex->pSchema->idxHash, zName, sqlite3Strlen30(zName), 0 ); + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); assert( pOld==pIndex || pOld==0 ); } freeIndex(db, pIndex); @@ -547,6 +556,7 @@ void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){ assert( db!=0 ); assert( iDb>=0 && iDbnDb ); assert( zTabName ); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); testcase( zTabName[0]==0 ); /* Zero-length table names are allowed */ pDb = &db->aDb[iDb]; p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, @@ -831,6 +841,7 @@ void sqlite3StartTable( */ #ifndef SQLITE_OMIT_AUTOINCREMENT if( !pParse->nested && strcmp(zName, "sqlite_sequence")==0 ){ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); pTable->pSchema->pSeqTab = pTable; } #endif @@ -1291,6 +1302,7 @@ void sqlite3ChangeCookie(Parse *pParse, int iDb){ int r1 = sqlite3GetTempReg(pParse); sqlite3 *db = pParse->db; Vdbe *v = pParse->pVdbe; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); sqlite3VdbeAddOp2(v, OP_Integer, db->aDb[iDb].pSchema->schema_cookie+1, r1); sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, r1); sqlite3ReleaseTempReg(pParse, r1); @@ -1593,6 +1605,7 @@ void sqlite3EndTable( */ if( p->tabFlags & TF_Autoincrement ){ Db *pDb = &db->aDb[iDb]; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( pDb->pSchema->pSeqTab==0 ){ sqlite3NestedParse(pParse, "CREATE TABLE %Q.sqlite_sequence(name,seq)", @@ -1613,6 +1626,7 @@ void sqlite3EndTable( if( db->init.busy ){ Table *pOld; Schema *pSchema = p->pSchema; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, sqlite3Strlen30(p->zName),p); if( pOld ){ @@ -1797,6 +1811,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pSelTab->nCol = 0; pSelTab->aCol = 0; sqlite3DeleteTable(db, pSelTab); + assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) ); pTable->pSchema->flags |= DB_UnresetViews; }else{ pTable->nCol = 0; @@ -1817,6 +1832,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ */ static void sqliteViewResetAll(sqlite3 *db, int idx){ HashElem *i; + assert( sqlite3SchemaMutexHeld(db, idx, 0) ); if( !DbHasProperty(db, idx, DB_UnresetViews) ) return; for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){ Table *pTab = sqliteHashData(i); @@ -2227,6 +2243,7 @@ void sqlite3CreateForeignKey( pFKey->aAction[0] = (u8)(flags & 0xff); /* ON DELETE action */ pFKey->aAction[1] = (u8)((flags >> 8 ) & 0xff); /* ON UPDATE action */ + assert( sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash, pFKey->zTo, sqlite3Strlen30(pFKey->zTo), (void *)pFKey ); @@ -2582,6 +2599,7 @@ Index *sqlite3CreateIndex( pIndex->onError = (u8)onError; pIndex->autoIndex = (u8)(pName==0); pIndex->pSchema = db->aDb[iDb].pSchema; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); /* Check to see if we should honor DESC requests on index columns */ @@ -2711,6 +2729,7 @@ Index *sqlite3CreateIndex( */ if( db->init.busy ){ Index *p; + assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); p = sqlite3HashInsert(&pIndex->pSchema->idxHash, pIndex->zName, sqlite3Strlen30(pIndex->zName), pIndex); @@ -3464,6 +3483,7 @@ void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ assert( iDbnDb ); assert( db->aDb[iDb].pBt!=0 || iDb==1 ); assert( iDbcookieMask & mask)==0 ){ pToplevel->cookieMask |= mask; @@ -3591,6 +3611,7 @@ static void reindexDatabases(Parse *pParse, char const *zColl){ HashElem *k; /* For looping over tables in pDb */ Table *pTab; /* A table in the database */ + assert( sqlite3BtreeHoldsAllMutexes(db) ); /* Needed for schema access */ for(iDb=0, pDb=db->aDb; iDbnDb; iDb++, pDb++){ assert( pDb!=0 ); for(k=sqliteHashFirst(&pDb->pSchema->tblHash); k; k=sqliteHashNext(k)){ diff --git a/src/fkey.c b/src/fkey.c index 653cc1833a..14b2db5159 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -1154,6 +1154,7 @@ void sqlite3FkDelete(sqlite3 *db, Table *pTab){ FKey *pFKey; /* Iterator variable */ FKey *pNext; /* Copy of pFKey->pNextFrom */ + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); for(pFKey=pTab->pFKey; pFKey; pFKey=pNext){ /* Remove the FK from the fkeyHash hash table. */ diff --git a/src/insert.c b/src/insert.c index a4efcf2bf3..77f55822f9 100644 --- a/src/insert.c +++ b/src/insert.c @@ -237,6 +237,7 @@ void sqlite3AutoincrementBegin(Parse *pParse){ for(p = pParse->pAinc; p; p = p->pNext){ pDb = &db->aDb[p->iDb]; memId = p->regCtr; + assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead); addr = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp4(v, OP_String8, 0, memId-1, 0, p->pTab->zName, 0); @@ -287,6 +288,7 @@ void sqlite3AutoincrementEnd(Parse *pParse){ int memId = p->regCtr; iRec = sqlite3GetTempReg(pParse); + assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); j1 = sqlite3VdbeAddOp1(v, OP_NotNull, memId+1); j2 = sqlite3VdbeAddOp0(v, OP_Rewind); diff --git a/src/pragma.c b/src/pragma.c index 0a092e8c3e..5537bcf49e 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -388,6 +388,7 @@ void sqlite3Pragma( sqlite3BeginWriteOperation(pParse, 0, iDb); sqlite3VdbeAddOp2(v, OP_Integer, size, 1); sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, 1); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); pDb->pSchema->cache_size = size; sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); } @@ -690,6 +691,7 @@ void sqlite3Pragma( */ if( sqlite3StrICmp(zLeft,"cache_size")==0 ){ if( sqlite3ReadSchema(pParse) ) goto pragma_out; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( !zRight ){ returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size); }else{ @@ -1110,6 +1112,7 @@ void sqlite3Pragma( ** Begin by filling registers 2, 3, ... with the root pages numbers ** for all tables and indices in the database. */ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); pTbls = &db->aDb[i].pSchema->tblHash; for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ Table *pTab = sqliteHashData(x); diff --git a/src/prepare.c b/src/prepare.c index 0687ddea42..aad2bc0b6e 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -470,6 +470,7 @@ static void schemaIsValid(Parse *pParse){ ** value stored as part of the in-memory schema representation, ** set Parse.rc to SQLITE_SCHEMA. */ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){ pParse->rc = SQLITE_SCHEMA; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f7700b740a..ac6f76bda5 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -668,6 +668,20 @@ struct Db { /* ** An instance of the following structure stores a database schema. +** +** Most Schema objects are associated with a Btree. The exception is +** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing. +** In shared cache mode, a single Schema object can be shared by multiple +** Btrees that refer to the same underlying BtShared object. +** +** Schema objects are automatically deallocated when the last Btree that +** references them is destroyed. The TEMP Schema is manually freed by +** sqlite3_close(). +* +** A thread must be holding a mutex on the corresponding Btree in order +** to access Schema content. This implies that the thread must also be +** holding a mutex on the sqlite3 connection pointer that owns the Btree. +** For a TEMP Schema, on the connection mutex is required. */ struct Schema { int schema_cookie; /* Database schema version number for this file */ diff --git a/src/status.c b/src/status.c index 96759fda7e..b8c1d58df7 100644 --- a/src/status.c +++ b/src/status.c @@ -163,6 +163,7 @@ int sqlite3_db_status( int i; /* Used to iterate through schemas */ int nByte = 0; /* Used to accumulate return value */ + sqlite3BtreeEnterAll(db); db->pnBytesFreed = &nByte; for(i=0; inDb; i++){ Schema *pSchema = db->aDb[i].pSchema; @@ -189,6 +190,7 @@ int sqlite3_db_status( } } db->pnBytesFreed = 0; + sqlite3BtreeLeaveAll(db); *pHighwater = 0; *pCurrent = nByte; diff --git a/src/trigger.c b/src/trigger.c index f66833522b..38efd5d68b 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -54,6 +54,7 @@ Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ if( pTmpSchema!=pTab->pSchema ){ HashElem *p; + assert( sqlite3SchemaMutexHeld(pParse->db, 0, pTmpSchema) ); for(p=sqliteHashFirst(&pTmpSchema->trigHash); p; p=sqliteHashNext(p)){ Trigger *pTrig = (Trigger *)sqliteHashData(p); if( pTrig->pTabSchema==pTab->pSchema @@ -165,6 +166,7 @@ void sqlite3BeginTrigger( if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto trigger_cleanup; } + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash), zName, sqlite3Strlen30(zName)) ){ if( !noErr ){ @@ -304,6 +306,7 @@ void sqlite3FinishTrigger( if( db->init.busy ){ Trigger *pLink = pTrig; Hash *pHash = &db->aDb[iDb].pSchema->trigHash; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); pTrig = sqlite3HashInsert(pHash, zName, sqlite3Strlen30(zName), pTrig); if( pTrig ){ db->mallocFailed = 1; @@ -485,9 +488,11 @@ void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr){ zDb = pName->a[0].zDatabase; zName = pName->a[0].zName; nName = sqlite3Strlen30(zName); + assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); for(i=OMIT_TEMPDB; inDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ if( zDb && sqlite3StrICmp(db->aDb[j].zName, zDb) ) continue; + assert( sqlite3SchemaMutexHeld(db, j, 0) ); pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName, nName); if( pTrigger ) break; } @@ -576,8 +581,11 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ ** Remove a trigger from the hash tables of the sqlite* pointer. */ void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){ - Hash *pHash = &(db->aDb[iDb].pSchema->trigHash); Trigger *pTrigger; + Hash *pHash; + + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pHash = &(db->aDb[iDb].pSchema->trigHash); pTrigger = sqlite3HashInsert(pHash, zName, sqlite3Strlen30(zName), 0); if( ALWAYS(pTrigger) ){ if( pTrigger->pSchema==pTrigger->pTabSchema ){ diff --git a/src/vdbe.c b/src/vdbe.c index 560ca34319..6dc305dcc5 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2880,6 +2880,7 @@ case OP_SetCookie: { /* in3 */ assert( (p->btreeMask & (((yDbMask)1)<p1))!=0 ); pDb = &db->aDb[pOp->p1]; assert( pDb->pBt!=0 ); + assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); pIn3 = &aMem[pOp->p3]; sqlite3VdbeMemIntegerify(pIn3); /* See note about index shifting on OP_ReadCookie */ @@ -2926,6 +2927,7 @@ case OP_VerifyCookie: { assert( pOp->p1>=0 && pOp->p1nDb ); assert( (p->btreeMask & (((yDbMask)1)<p1))!=0 ); + assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); pBt = db->aDb[pOp->p1].pBt; if( pBt ){ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta); @@ -3036,6 +3038,7 @@ case OP_OpenWrite: { assert( pX!=0 ); if( pOp->opcode==OP_OpenWrite ){ wrFlag = 1; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( pDb->pSchema->file_format < p->minWriteFileFormat ){ p->minWriteFileFormat = pDb->pSchema->file_format; } diff --git a/src/vtab.c b/src/vtab.c index 30e302deaf..37a63af875 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -387,6 +387,7 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ Schema *pSchema = pTab->pSchema; const char *zName = pTab->zName; int nName = sqlite3Strlen30(zName); + assert( sqlite3SchemaMutexHeld(db, 0, pSchema) ); pOld = sqlite3HashInsert(&pSchema->tblHash, zName, nName, pTab); if( pOld ){ db->mallocFailed = 1; From 9bbc2e283e4a9212d9b85c82c8d1d3c6d03dadb8 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Apr 2011 20:40:22 +0000 Subject: [PATCH 07/14] Minor comment typo corrections. Simplify an assert. No functional changes. FossilOrigin-Name: 82c2316240345167a571507d9392dfb6445ef523 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/main.c | 1 + src/sqliteInt.h | 2 +- src/vtab.c | 7 +++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index d4526b8119..b3c7e0606a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sdescription\sof\saccess\srules\sfor\sthe\sSchema\sobject\sand\slots\sof\sasserts\nto\sverify\sthat\sthe\saccess\srules\sare\sfollowed. -D 2011-04-04T18:22:02.782 +C Minor\scomment\stypo\scorrections.\s\sSimplify\san\sassert.\s\sNo\sfunctional\schanges. +D 2011-04-04T20:40:22.086 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -143,7 +143,7 @@ F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e F src/loadext.c 8af9fcc75708d60b88636ccba38b4a7b3c155c3e -F src/main.c 14c019b381b76ea378ee8629d1ed861a3899e075 +F src/main.c 83cb6a9f1404d59b4dc06ef58cf20401ac1f2261 F src/malloc.c 92d59a007d7a42857d4e9454aa25b6b703286be1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206 @@ -180,7 +180,7 @@ F src/select.c d24406c45dd2442eb2eeaac413439066b149c944 F src/shell.c 9dc0b4bb59290c0a35256d278cab0f314987ad6a F src/sqlite.h.in e047f69a61d604d4f8be6cf1d1bdfc68be9ba7e5 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h 9a944a2d9b12b30b186a0f1236a97eb01f1e50bb +F src/sqliteInt.h 4db35e6a25a424d40bf19b0a818f3e9c78e9e7e2 F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44 F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -243,7 +243,7 @@ F src/vdbeaux.c e1ea6edc07b4f33a339cc45a2fbe0a36067d2d8b F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 3ba13bc32bdf16d2bdea523245fd16736bed67b5 -F src/vtab.c 672f8dadd6ce9ab984af81e3dfb1b5b38715e7b7 +F src/vtab.c b0abc931f95af94c9ffdf9f747eb191cda953123 F src/wal.c 7334009b396285b658a95a3b6bc6d2b016a1f794 F src/wal.h 7a5fbb00114b7f2cd40c7e1003d4c41ce9d26840 F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 1e1a23cc56563d512b28288256c34f05ea15b4aa -R 977144757d60ff253970ffcce55b348e +P ae8374af057b6e6546e9265148cfffe32fcb0849 +R b2220f2e44fb0854f9cc6a8a89a03fab U drh -Z 03b0de28f2209300e8cd6e160282b5b5 +Z 3ca4bebd3aef258bcff81de8a689c390 diff --git a/manifest.uuid b/manifest.uuid index 1a879c861a..fc406390db 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ae8374af057b6e6546e9265148cfffe32fcb0849 \ No newline at end of file +82c2316240345167a571507d9392dfb6445ef523 \ No newline at end of file diff --git a/src/main.c b/src/main.c index ca862edc7f..e05c3885b0 100644 --- a/src/main.c +++ b/src/main.c @@ -687,6 +687,7 @@ int sqlite3_close(sqlite3 *db){ } sqlite3_mutex_enter(db->mutex); + /* Force xDestroy calls on all virtual tables */ sqlite3ResetInternalSchema(db, -1); /* If a transaction is open, the ResetInternalSchema() call above diff --git a/src/sqliteInt.h b/src/sqliteInt.h index ac6f76bda5..1d8194a1eb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1198,7 +1198,7 @@ struct CollSeq { ** schema is shared, as the implementation often stores the database ** connection handle passed to it via the xConnect() or xCreate() method ** during initialization internally. This database connection handle may -** then used by the virtual table implementation to access real tables +** then be used by the virtual table implementation to access real tables ** within the database. So that they appear as part of the callers ** transaction, these accesses need to be made via the same database ** connection as that used to execute SQL operations on the virtual table. diff --git a/src/vtab.c b/src/vtab.c index 37a63af875..b052de23a5 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -145,10 +145,9 @@ static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ ** that contains table p is held by the caller. See header comments ** above function sqlite3VtabUnlockList() for an explanation of why ** this makes it safe to access the sqlite3.pDisconnect list of any - ** database connection that may have an entry in the p->pVTable list. */ - assert( db==0 || - sqlite3BtreeHoldsMutex(db->aDb[sqlite3SchemaToIndex(db, p->pSchema)].pBt) - ); + ** database connection that may have an entry in the p->pVTable list. + */ + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); while( pVTable ){ sqlite3 *db2 = pVTable->db; From cdf011dcc4bb61236e9664f299a177d41172e4be Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Apr 2011 21:25:28 +0000 Subject: [PATCH 08/14] Additional schema mutex checks for sqlite3RootPageMoved(). Reduce the scope of sqlite3ResetInternalSchema() in a few places. FossilOrigin-Name: 39c00907833413c0d97d3e06fdda967b825d23ea --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/build.c | 5 ++++- src/prepare.c | 4 +--- src/sqliteInt.h | 2 +- src/vdbe.c | 14 +++++++------- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index b3c7e0606a..c71c3e41f8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\scomment\stypo\scorrections.\s\sSimplify\san\sassert.\s\sNo\sfunctional\schanges. -D 2011-04-04T20:40:22.086 +C Additional\sschema\smutex\schecks\sfor\ssqlite3RootPageMoved().\nReduce\sthe\sscope\sof\ssqlite3ResetInternalSchema()\sin\sa\sfew\splaces. +D 2011-04-04T21:25:28.533 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -124,7 +124,7 @@ F src/btmutex.c b81062220a4f91b0bd785d13d57205d68449be88 F src/btree.c 107723ed4f9bdb55213ba6164c30c49af75f4bf9 F src/btree.h c0e0ff5c85effe9fc757e3085bbdded6d1cca000 F src/btreeInt.h 6714ce2f5e879eb9a904a6a4575dc4faa4f29991 -F src/build.c 63465c86f7d5919fddb112ec6d38342863e8e8b3 +F src/build.c d809f57250b10e83586bc23921de02055890b239 F src/callback.c 0425c6320730e6d3981acfb9202c1bed9016ad1a F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 @@ -171,7 +171,7 @@ F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050 F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e F src/pragma.c 36eec9129bfea2dbcdc1694d362f17330132697d -F src/prepare.c a4d8ac347b39e317d2f463c36b22c650e00b7126 +F src/prepare.c 206e1f06479fb5f756592bded468bd3ece3f41d4 F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 @@ -180,7 +180,7 @@ F src/select.c d24406c45dd2442eb2eeaac413439066b149c944 F src/shell.c 9dc0b4bb59290c0a35256d278cab0f314987ad6a F src/sqlite.h.in e047f69a61d604d4f8be6cf1d1bdfc68be9ba7e5 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h 4db35e6a25a424d40bf19b0a818f3e9c78e9e7e2 +F src/sqliteInt.h 7b0150bfdab049b11bb2d055d065051ff734d113 F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44 F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -235,7 +235,7 @@ F src/update.c 81911be16ece3c3e7716aa18565b4814ec41f8b9 F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c cd997077bad039efc0597eb027c929658f93c018 F src/vacuum.c 3b2b0998f4f277e4bc61469c2d78d8424d02899b -F src/vdbe.c 1e62a4f18500f86137fda77416c5e55f7336d1d1 +F src/vdbe.c 0140a57f9cbd50351219bfc4e44ef3de64bd65b8 F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 F src/vdbeInt.h 7e2f028ecc1a9faa6f253e7aa8d89cae03662bae F src/vdbeapi.c a09ad9164cafc505250d5dd6b69660c960f1308c @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P ae8374af057b6e6546e9265148cfffe32fcb0849 -R b2220f2e44fb0854f9cc6a8a89a03fab +P 82c2316240345167a571507d9392dfb6445ef523 +R 7c6dcb957e59966f9f4fd72f4c665ab1 U drh -Z 3ca4bebd3aef258bcff81de8a689c390 +Z 5433fdc0cc3ff75407dd2b1ee53a6522 diff --git a/manifest.uuid b/manifest.uuid index fc406390db..18b6d137fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -82c2316240345167a571507d9392dfb6445ef523 \ No newline at end of file +39c00907833413c0d97d3e06fdda967b825d23ea \ No newline at end of file diff --git a/src/build.c b/src/build.c index 51b790586b..7e73b6a8eb 100644 --- a/src/build.c +++ b/src/build.c @@ -1866,10 +1866,13 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){ ** in order to be certain that we got the right one. */ #ifndef SQLITE_OMIT_AUTOVACUUM -void sqlite3RootPageMoved(Db *pDb, int iFrom, int iTo){ +void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iTo){ HashElem *pElem; Hash *pHash; + Db *pDb; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pDb = &db->aDb[iDb]; pHash = &pDb->pSchema->tblHash; for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ Table *pTab = sqliteHashData(pElem); diff --git a/src/prepare.c b/src/prepare.c index aad2bc0b6e..b5edaf5032 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -472,6 +472,7 @@ static void schemaIsValid(Parse *pParse){ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){ + sqlite3ResetInternalSchema(db, iDb); pParse->rc = SQLITE_SCHEMA; } @@ -613,9 +614,6 @@ static int sqlite3Prepare( if( pParse->checkSchema ){ schemaIsValid(pParse); } - if( pParse->rc==SQLITE_SCHEMA ){ - sqlite3ResetInternalSchema(db, -1); - } if( db->mallocFailed ){ pParse->rc = SQLITE_NOMEM; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1d8194a1eb..b874c5e038 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2956,7 +2956,7 @@ extern SQLITE_WSD FuncDefHash sqlite3GlobalFunctions; extern int sqlite3PendingByte; #endif #endif -void sqlite3RootPageMoved(Db*, int, int); +void sqlite3RootPageMoved(sqlite3*, int, int, int); void sqlite3Reindex(Parse*, Token*, Token*); void sqlite3AlterFunctions(void); void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); diff --git a/src/vdbe.c b/src/vdbe.c index 6dc305dcc5..94fd0ff62b 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -551,7 +551,7 @@ int sqlite3VdbeExec( Op *pOp; /* Current operation */ int rc = SQLITE_OK; /* Value to return */ sqlite3 *db = p->db; /* The database */ - u8 resetSchemaOnFault = 0; /* Reset schema after an error if true */ + u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */ u8 encoding = ENC(db); /* The database encoding */ #ifndef SQLITE_OMIT_PROGRESS_CALLBACK int checkProgress; /* True if progress callbacks are enabled */ @@ -2953,7 +2953,6 @@ case OP_VerifyCookie: { */ if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ sqlite3ResetInternalSchema(db, pOp->p1); - sqlite3VdbeMutexResync(p); } p->expired = 1; @@ -4534,8 +4533,10 @@ case OP_Destroy: { /* out2-prerelease */ pOut->u.i = iMoved; #ifndef SQLITE_OMIT_AUTOVACUUM if( rc==SQLITE_OK && iMoved!=0 ){ - sqlite3RootPageMoved(&db->aDb[iDb], iMoved, pOp->p1); - resetSchemaOnFault = 1; + sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1); + /* All OP_Destroy operations occur on the same btree */ + assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 ); + resetSchemaOnFault = iDb+1; } #endif } @@ -5969,9 +5970,8 @@ vdbe_error_halt: sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1; rc = SQLITE_ERROR; - if( resetSchemaOnFault ){ - sqlite3ResetInternalSchema(db, 0); - sqlite3VdbeMutexResync(p); + if( resetSchemaOnFault>0 ){ + sqlite3ResetInternalSchema(db, resetSchemaOnFault-1); } /* This is the only way out of this procedure. We have to From 3a2d29f8f46554ba3c74bc17964a4dd844a9ac1d Mon Sep 17 00:00:00 2001 From: shaneh Date: Mon, 4 Apr 2011 21:48:01 +0000 Subject: [PATCH 09/14] Changes for consistent use of SQLITE_OS_UNIX and removal of legacy OS_UNIX from testfixture source; FossilOrigin-Name: 78b6eee200cab363be520d771375e44898f80e01 --- manifest | 28 ++++++++++++++-------------- manifest.uuid | 2 +- src/test4.c | 2 +- src/test7.c | 2 +- src/test_demovfs.c | 6 +++--- src/test_osinst.c | 4 ++-- src/test_server.c | 4 ++-- src/test_syscall.c | 2 +- src/test_thread.c | 8 ++++---- test/releasetest.tcl | 1 - 10 files changed, 29 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index e93961cb70..9b8d4f0d8e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"--start=[permutation:][testfile]"\soption\sto\stester.tcl.\sFor\sstarting\squick.test\sor\sall.test\sat\sthe\snominated\spermutation\sand/or\stest\sfile. -D 2011-04-04T15:38:16.948 +C Changes\sfor\sconsistent\suse\sof\sSQLITE_OS_UNIX\sand\sremoval\sof\slegacy\sOS_UNIX\sfrom\stestfixture\ssource; +D 2011-04-04T21:48:01.840 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -188,10 +188,10 @@ F src/tclsqlite.c 501c9a200fd998a268be475be5858febc90b725b F src/test1.c 9ca440e80e16e53920904a0a5ac7feffb9b2c9a1 F src/test2.c 80d323d11e909cf0eb1b6fbb4ac22276483bcf31 F src/test3.c 056093cfef69ff4227a6bdb9108564dc7f45e4bc -F src/test4.c 0528360b5025688002a5feb6be906ddce52eaaee +F src/test4.c d1e5a5e904d4b444cf572391fdcb017638e36ff7 F src/test5.c e1a19845625144caf038031234a12185e40d315c F src/test6.c c7256cc21d2409486d094277d5b017e8eced44ba -F src/test7.c d67f65d82815eb0b57699b122ca0145dbea55bbb +F src/test7.c 2e0781754905c8adc3268d8f0967e7633af58843 F src/test8.c 6b1d12912a04fe6fca8c45bb9c3ea022f4352228 F src/test9.c bea1e8cf52aa93695487badedd6e1886c321ea60 F src/test_async.c 0612a752896fad42d55c3999a5122af10dcf22ad @@ -199,7 +199,7 @@ F src/test_autoext.c 30e7bd98ab6d70a62bb9ba572e4c7df347fe645e F src/test_backup.c c129c91127e9b46e335715ae2e75756e25ba27de F src/test_btree.c 47cd771250f09cdc6e12dda5bc71bc0b3abc96e2 F src/test_config.c 62f0f8f934b1d5c7e4cd4f506ae453a1117b47d7 -F src/test_demovfs.c 0aed671636735116fc872c5b03706fd5612488b5 +F src/test_demovfs.c 31050680fa6925b4f677cfd4fa965b5f19195e50 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_func.c cbdec5cededa0761daedde5baf06004a9bf416b5 F src/test_fuzzer.c f884f6f32e8513d34248d6e1ac8a32047fead254 @@ -214,17 +214,17 @@ F src/test_multiplex.c fdabd793ee7a9642c5a8a470def2347144c46d05 F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec -F src/test_osinst.c f408c6a181f2fb04c56273afd5c3e1e82f60392c +F src/test_osinst.c 62b0b8ef21ce754cc94e17bb42377ed8795dba32 F src/test_pcache.c 7bf828972ac0d2403f5cfa4cd14da41f8ebe73d8 F src/test_quota.c b5576f17d701af461effd7ca1e71f0d100071192 F src/test_rtree.c 30c981837445a4e187ee850a49c4760d9642f7c3 F src/test_schema.c 8c06ef9ddb240c7a0fcd31bc221a6a2aade58bf0 -F src/test_server.c bbba05c144b5fc4b52ff650a4328027b3fa5fcc6 +F src/test_server.c 88caa13d33cb85a4f924229bd9693acd8e1429ba F src/test_stat.c f682704b5d1ba8e1d4e7e882a6d7922e2dcf066c F src/test_superlock.c 2b97936ca127d13962c3605dbc9a4ef269c424cd -F src/test_syscall.c 10ced09d6e9fba929531b25b46a8e5675f4f9940 +F src/test_syscall.c 162c4ec0137a549c009bb9ecab550527743cfc5d F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa -F src/test_thread.c bedd05cad673dba53326f3aa468cc803038896c0 +F src/test_thread.c 361ae0a0f1cbf5a28ad0388a258b104017a370c0 F src/test_vfs.c 2ed8853c1e51ac6f9ea091f7ce4e0d618bba8b86 F src/test_vfstrace.c 2265c9895f350c8d3c39b079998fbe7481505cc1 F src/test_wholenumber.c 6129adfbe7c7444f2e60cc785927f3aa74e12290 @@ -619,7 +619,7 @@ F test/randexpr1.test 1084050991e9ba22c1c10edd8d84673b501cc25a F test/rdonly.test c267d050a1d9a6a321de502b737daf28821a518d F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 F test/releasetest.mk 2eced2f9ae701fd0a29e714a241760503ccba25a -F test/releasetest.tcl 627ccd04a113a193c375594bd5d6d051d8220658 +F test/releasetest.tcl 02497b7fb9c53fa65fc8757de7675987cd571068 F test/rollback.test 1a83118ea6db4e7d8c10eaa63871b5e90502ffdc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test e58e0acef38b527ed1b0b70d3ada588f804af287 @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P fda8fadd837e399d3fab7a9e6894617a5788d679 -R 4b62570a0a31579c57911e1ba72815ed -U dan -Z 8e0f703ae7b0d0dd238c3eeb189cec4d +P a97e8505f229e05bf97ef9edbe063a52b581f339 +R 5b669314f67a239a5a132606db5a0d1b +U shaneh +Z 849485c22ade8d3120493afa3548d370 diff --git a/manifest.uuid b/manifest.uuid index 91c9c36fff..89ec5b7576 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a97e8505f229e05bf97ef9edbe063a52b581f339 \ No newline at end of file +78b6eee200cab363be520d771375e44898f80e01 \ No newline at end of file diff --git a/src/test4.c b/src/test4.c index 49447d351e..5c94370a3d 100644 --- a/src/test4.c +++ b/src/test4.c @@ -13,7 +13,7 @@ */ #include "sqliteInt.h" #include "tcl.h" -#if defined(SQLITE_OS_UNIX) && OS_UNIX==1 && SQLITE_THREADSAFE +#if SQLITE_OS_UNIX && SQLITE_THREADSAFE #include #include #include diff --git a/src/test7.c b/src/test7.c index 3383d868d3..852cd1db5e 100644 --- a/src/test7.c +++ b/src/test7.c @@ -20,7 +20,7 @@ ** the SQLITE_SERVER option. */ #if defined(SQLITE_SERVER) && !defined(SQLITE_OMIT_SHARED_CACHE) && \ - defined(SQLITE_OS_UNIX) && OS_UNIX && SQLITE_THREADSAFE + SQLITE_OS_UNIX && SQLITE_THREADSAFE #include #include diff --git a/src/test_demovfs.c b/src/test_demovfs.c index 8c51192b4c..e56e8065cf 100644 --- a/src/test_demovfs.c +++ b/src/test_demovfs.c @@ -115,7 +115,7 @@ ** operations. */ -#if !defined(SQLITE_TEST) || defined(SQLITE_OS_UNIX) +#if !defined(SQLITE_TEST) || SQLITE_OS_UNIX #include @@ -637,14 +637,14 @@ sqlite3_vfs *sqlite3_demovfs(void){ return &demovfs; } -#endif /* !defined(SQLITE_TEST) || defined(SQLITE_OS_UNIX) */ +#endif /* !defined(SQLITE_TEST) || SQLITE_OS_UNIX */ #ifdef SQLITE_TEST #include -#ifdef SQLITE_OS_UNIX +#if SQLITE_OS_UNIX static int register_demovfs( ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ diff --git a/src/test_osinst.c b/src/test_osinst.c index 25e9bcbfb0..50d6250e6c 100644 --- a/src/test_osinst.c +++ b/src/test_osinst.c @@ -213,14 +213,14 @@ static sqlite3_io_methods vfslog_io_methods = { vfslogShmUnmap /* xShmUnmap */ }; -#if defined(SQLITE_OS_UNIX) && !defined(NO_GETTOD) +#if SQLITE_OS_UNIX && !defined(NO_GETTOD) #include static sqlite3_uint64 vfslog_time(){ struct timeval sTime; gettimeofday(&sTime, 0); return sTime.tv_usec + (sqlite3_uint64)sTime.tv_sec * 1000000; } -#elif defined(SQLITE_OS_WIN) +#elif SQLITE_OS_WIN #include #include static sqlite3_uint64 vfslog_time(){ diff --git a/src/test_server.c b/src/test_server.c index 3eb7544428..f7b596c78a 100644 --- a/src/test_server.c +++ b/src/test_server.c @@ -206,7 +206,7 @@ ** and only if the SQLITE_SERVER macro is defined. */ #if defined(SQLITE_SERVER) && !defined(SQLITE_OMIT_SHARED_CACHE) -#if defined(SQLITE_OS_UNIX) && OS_UNIX && SQLITE_THREADSAFE +#if SQLITE_OS_UNIX && SQLITE_THREADSAFE /* ** We require only pthreads and the public interface of SQLite. @@ -487,5 +487,5 @@ void sqlite3_server_stop(void){ pthread_mutex_unlock(&g.serverMutex); } -#endif /* defined(SQLITE_OS_UNIX) && OS_UNIX && SQLITE_THREADSAFE */ +#endif /* SQLITE_OS_UNIX && SQLITE_THREADSAFE */ #endif /* defined(SQLITE_SERVER) */ diff --git a/src/test_syscall.c b/src/test_syscall.c index e3cdcfdfce..b8b05c5903 100644 --- a/src/test_syscall.c +++ b/src/test_syscall.c @@ -76,7 +76,7 @@ #include #include "sqliteInt.h" -#ifdef SQLITE_OS_UNIX +#if SQLITE_OS_UNIX /* From test1.c */ extern const char *sqlite3TestErrorName(int); diff --git a/src/test_thread.c b/src/test_thread.c index af38d91843..ef191bc2d7 100644 --- a/src/test_thread.c +++ b/src/test_thread.c @@ -53,7 +53,7 @@ struct EvalEvent { static Tcl_ObjCmdProc sqlthread_proc; static Tcl_ObjCmdProc clock_seconds_proc; -#if defined(SQLITE_OS_UNIX) && defined(SQLITE_ENABLE_UNLOCK_NOTIFY) +#if SQLITE_OS_UNIX && defined(SQLITE_ENABLE_UNLOCK_NOTIFY) static Tcl_ObjCmdProc blocking_step_proc; static Tcl_ObjCmdProc blocking_prepare_v2_proc; #endif @@ -116,7 +116,7 @@ static Tcl_ThreadCreateType tclScriptThread(ClientData pSqlThread){ interp = Tcl_CreateInterp(); Tcl_CreateObjCommand(interp, "clock_seconds", clock_seconds_proc, 0, 0); Tcl_CreateObjCommand(interp, "sqlthread", sqlthread_proc, pSqlThread, 0); -#if defined(SQLITE_OS_UNIX) && defined(SQLITE_ENABLE_UNLOCK_NOTIFY) +#if SQLITE_OS_UNIX && defined(SQLITE_ENABLE_UNLOCK_NOTIFY) Tcl_CreateObjCommand(interp, "sqlite3_blocking_step", blocking_step_proc,0,0); Tcl_CreateObjCommand(interp, "sqlite3_blocking_prepare_v2", blocking_prepare_v2_proc, (void *)1, 0); @@ -392,7 +392,7 @@ static int clock_seconds_proc( ** should be considered if these functions are to be extended (i.e. to ** support windows) in the future. */ -#if defined(SQLITE_OS_UNIX) && defined(SQLITE_ENABLE_UNLOCK_NOTIFY) +#if SQLITE_OS_UNIX && defined(SQLITE_ENABLE_UNLOCK_NOTIFY) /* BEGIN_SQLITE_BLOCKING_STEP */ /* This example uses the pthreads API */ @@ -614,7 +614,7 @@ static int blocking_prepare_v2_proc( int SqlitetestThread_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand(interp, "sqlthread", sqlthread_proc, 0, 0); Tcl_CreateObjCommand(interp, "clock_seconds", clock_seconds_proc, 0, 0); -#if defined(SQLITE_OS_UNIX) && defined(SQLITE_ENABLE_UNLOCK_NOTIFY) +#if SQLITE_OS_UNIX && defined(SQLITE_ENABLE_UNLOCK_NOTIFY) Tcl_CreateObjCommand(interp, "sqlite3_blocking_step", blocking_step_proc,0,0); Tcl_CreateObjCommand(interp, "sqlite3_blocking_prepare_v2", blocking_prepare_v2_proc, (void *)1, 0); diff --git a/test/releasetest.tcl b/test/releasetest.tcl index 71ad4311b5..788816b169 100644 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -64,7 +64,6 @@ array set ::Configs { -O2 -DSQLITE_ENABLE_UNLOCK_NOTIFY -DSQLITE_THREADSAFE - -DOS_UNIX -DSQLITE_TCL_DEFAULT_FULLMUTEX=1 } "Secure-Delete" { From 03faf63b57a76c925c0e46e8bcb3b86cfe098590 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Apr 2011 23:08:14 +0000 Subject: [PATCH 10/14] Add a comment to the VACUUM implementation explaining when all schemas are reset and not just the "main" schema. FossilOrigin-Name: 2aff1b0ca87a99b8ec80e696b9e8a48bb43db2c2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vacuum.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index c71c3e41f8..e06a7959a3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Additional\sschema\smutex\schecks\sfor\ssqlite3RootPageMoved().\nReduce\sthe\sscope\sof\ssqlite3ResetInternalSchema()\sin\sa\sfew\splaces. -D 2011-04-04T21:25:28.533 +C Add\sa\scomment\sto\sthe\sVACUUM\simplementation\sexplaining\swhen\sall\sschemas\sare\nreset\sand\snot\sjust\sthe\s"main"\sschema. +D 2011-04-04T23:08:14.941 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -234,7 +234,7 @@ F src/trigger.c bb68c3d1feff3e1335c55a7acf195b9c96ae91ec F src/update.c 81911be16ece3c3e7716aa18565b4814ec41f8b9 F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c cd997077bad039efc0597eb027c929658f93c018 -F src/vacuum.c 3b2b0998f4f277e4bc61469c2d78d8424d02899b +F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e F src/vdbe.c 0140a57f9cbd50351219bfc4e44ef3de64bd65b8 F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 F src/vdbeInt.h 7e2f028ecc1a9faa6f253e7aa8d89cae03662bae @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 82c2316240345167a571507d9392dfb6445ef523 -R 7c6dcb957e59966f9f4fd72f4c665ab1 +P 39c00907833413c0d97d3e06fdda967b825d23ea +R 649858c83395859d3a968f120123364a U drh -Z 5433fdc0cc3ff75407dd2b1ee53a6522 +Z 182c2bca240b7634d123c22091b55227 diff --git a/manifest.uuid b/manifest.uuid index 18b6d137fd..ac9178d675 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -39c00907833413c0d97d3e06fdda967b825d23ea \ No newline at end of file +2aff1b0ca87a99b8ec80e696b9e8a48bb43db2c2 \ No newline at end of file diff --git a/src/vacuum.c b/src/vacuum.c index 5ca39ae1e0..5a4ed32052 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -335,6 +335,8 @@ end_of_vacuum: pDb->pSchema = 0; } + /* This both clears the schemas and reduces the size of the db->aDb[] + ** array. */ sqlite3ResetInternalSchema(db, -1); return rc; From 6faa5fdfe1f84aef2c96d0386697a391447ff4f3 Mon Sep 17 00:00:00 2001 From: shaneh Date: Tue, 5 Apr 2011 02:21:04 +0000 Subject: [PATCH 11/14] Added ifcapable utf16 to a few test cases; FossilOrigin-Name: 57e0919b08e3b839b7c71011707a19ae2511a625 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/e_expr.test | 12 ++++++++++++ test/malloc.test | 2 +- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 9b8d4f0d8e..45c864c026 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sfor\sconsistent\suse\sof\sSQLITE_OS_UNIX\sand\sremoval\sof\slegacy\sOS_UNIX\sfrom\stestfixture\ssource; -D 2011-04-04T21:48:01.840 +C Added\sifcapable\sutf16\sto\sa\sfew\stest\scases; +D 2011-04-05T02:21:04.887 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -368,7 +368,7 @@ F test/e_createtable.test b40fc61bc4f1ad2a3c84590bd1d711507263d921 F test/e_delete.test 55d868b647acc091c261a10b9b0cb0ab660a6acb F test/e_droptrigger.test ddd4b28ed8a3d81bd5153fa0ab7559529a2ca03a F test/e_dropview.test b347bab30fc8de67b131594b3cd6f3d3bdaa753d -F test/e_expr.test 4e004d1f5187d4bbc9ca3d55660a8d164dd59f4e +F test/e_expr.test 9e8b9790803df4de23c2d68d566959934a6179d4 F test/e_fkey.test 38039b840ab19331000b0f0eb1d82baa7208a67a F test/e_fts3.test 75bb0aee26384ef586165e21018a17f7cd843469 F test/e_insert.test 7390c2da39f16a134dc9a439144768c727757d2c @@ -545,7 +545,7 @@ F test/lock_common.tcl d279887a0ab16cdb6d935c1203e64113c5a000e9 F test/lookaside.test 93f07bac140c5bb1d49f3892d2684decafdc7af2 F test/main.test 9d7bbfcc1b52c88ba7b2ba6554068ecf9939f252 F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9 -F test/malloc.test 927e6c8668a1d48c23aa6189bda02aff5a1b83de +F test/malloc.test e56c9c3358da2c18385aea15a42dc970913986c2 F test/malloc3.test 4128b1e6ffa506103b278ad97af89174f310c7ca F test/malloc4.test 957337613002b7058a85116493a262f679f3a261 F test/malloc5.test 4d16d1bb26d2deddd7c4f480deec341f9b2d0e22 @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P a97e8505f229e05bf97ef9edbe063a52b581f339 -R 5b669314f67a239a5a132606db5a0d1b +P 78b6eee200cab363be520d771375e44898f80e01 +R f54fb099162c6d5644e37dc8b0ce9ec9 U shaneh -Z 849485c22ade8d3120493afa3548d370 +Z afef9bcfe286e0cf65b249bd959c3b3b diff --git a/manifest.uuid b/manifest.uuid index 89ec5b7576..e3a4a1dab0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -78b6eee200cab363be520d771375e44898f80e01 \ No newline at end of file +57e0919b08e3b839b7c71011707a19ae2511a625 \ No newline at end of file diff --git a/test/e_expr.test b/test/e_expr.test index 437e88b1d8..1e7685352e 100644 --- a/test/e_expr.test +++ b/test/e_expr.test @@ -1444,16 +1444,20 @@ do_qexpr_test e_expr-27.4.2 { CAST(456 AS blob) } X'343536' do_qexpr_test e_expr-27.4.3 { CAST(1.78 AS blob) } X'312E3738' rename db db2 sqlite3 db :memory: +ifcapable {utf16} { db eval { PRAGMA encoding = 'utf-16le' } do_qexpr_test e_expr-27.4.4 { CAST('ghi' AS blob) } X'670068006900' do_qexpr_test e_expr-27.4.5 { CAST(456 AS blob) } X'340035003600' do_qexpr_test e_expr-27.4.6 { CAST(1.78 AS blob) } X'31002E0037003800' +} db close sqlite3 db :memory: db eval { PRAGMA encoding = 'utf-16be' } +ifcapable {utf16} { do_qexpr_test e_expr-27.4.7 { CAST('ghi' AS blob) } X'006700680069' do_qexpr_test e_expr-27.4.8 { CAST(456 AS blob) } X'003400350036' do_qexpr_test e_expr-27.4.9 { CAST(1.78 AS blob) } X'0031002E00370038' +} db close rename db2 db @@ -1466,8 +1470,10 @@ do_expr_test e_expr-28.1.2 { CAST (X'670068006900' AS text) } text g rename db db2 sqlite3 db :memory: db eval { PRAGMA encoding = 'utf-16le' } +ifcapable {utf16} { do_expr_test e_expr-28.1.3 { CAST (X'676869' AS text) == 'ghi' } integer 0 do_expr_test e_expr-28.1.4 { CAST (X'670068006900' AS text) } text ghi +} db close rename db2 db @@ -1493,6 +1499,7 @@ do_expr_test e_expr-29.1.3 { CAST (X'2D392E3837' AS REAL) } real -9.87 do_expr_test e_expr-29.1.4 { CAST (X'302E30303031' AS REAL) } real 0.0001 rename db db2 sqlite3 db :memory: +ifcapable {utf16} { db eval { PRAGMA encoding = 'utf-16le' } do_expr_test e_expr-29.1.5 { CAST (X'31002E0032003300' AS REAL) } real 1.23 @@ -1502,6 +1509,7 @@ do_expr_test e_expr-29.1.7 { CAST (X'2D0039002E0038003700' AS REAL) } real -9.87 do_expr_test e_expr-29.1.8 { CAST (X'30002E003000300030003100' AS REAL) } real 0.0001 +} db close rename db2 db @@ -1543,6 +1551,7 @@ do_expr_test e_expr-30.1.4 { rename db db2 sqlite3 db :memory: +ifcapable {utf16} { execsql { PRAGMA encoding = 'utf-16be' } do_expr_test e_expr-30.1.5 { CAST(X'003100320033' AS INTEGER) } integer 123 do_expr_test e_expr-30.1.6 { CAST(X'002D003600370038' AS INTEGER) } integer -678 @@ -1552,6 +1561,7 @@ do_expr_test e_expr-30.1.7 { do_expr_test e_expr-30.1.8 { CAST(X'002D0031003100320035003800390039003900300036003800340032003600320034' AS INTEGER) } integer -1125899906842624 +} db close rename db2 db @@ -1632,6 +1642,7 @@ do_expr_test e_expr-32.2.4 { # into a non-BLOB value may be different depending on whether the # database encoding is UTF-8, UTF-16be, or UTF-16le. # +ifcapable {utf16} { sqlite3 db1 :memory: ; db1 eval { PRAGMA encoding = 'utf-8' } sqlite3 db2 :memory: ; db2 eval { PRAGMA encoding = 'utf-16le' } sqlite3 db3 :memory: ; db3 eval { PRAGMA encoding = 'utf-16be' } @@ -1658,6 +1669,7 @@ foreach {tn castexpr differs} { db1 close db2 close db3 close +} #------------------------------------------------------------------------- # Test statements related to the EXISTS and NOT EXISTS operators. diff --git a/test/malloc.test b/test/malloc.test index f1eee17ecd..678b2be075 100644 --- a/test/malloc.test +++ b/test/malloc.test @@ -867,7 +867,7 @@ if {[db eval {PRAGMA locking_mode}]!="exclusive"} { catch { db2 close } } -ifcapable stat2 { +ifcapable stat2&&utf16 { do_malloc_test 38 -tclprep { add_test_collate db 0 0 1 execsql { From 14a7fa903439e0c30a77a7d7a8f776e2e5417364 Mon Sep 17 00:00:00 2001 From: shaneh Date: Tue, 5 Apr 2011 02:33:44 +0000 Subject: [PATCH 12/14] Added ifcapable wal to some test scripts; FossilOrigin-Name: 6b270381daad5d1a9ca5746cf439c90f9c735a1b --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/e_vacuum.test | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 45c864c026..3713310d8f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Added\sifcapable\sutf16\sto\sa\sfew\stest\scases; -D 2011-04-05T02:21:04.887 +C Added\sifcapable\swal\sto\ssome\stest\sscripts; +D 2011-04-05T02:33:44.856 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -377,7 +377,7 @@ F test/e_resolve.test dcce9308fb13b934ce29591105d031d3e14fbba6 F test/e_select.test bf385ae3aa0f014c4933ae66fd3e1302138493eb F test/e_select2.test 5c3d3da19c7b3e90ae444579db2b70098599ab92 F test/e_update.test 963d6876064e65f318d1c93aaed36a02b9b389bf -F test/e_vacuum.test 057cc29445746fc1d2542984ff0253d511a234bd +F test/e_vacuum.test 6c09c2af7f2f140518f371c5342100118f779dcf F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea F test/enc2.test 6d91a5286f59add0cfcbb2d0da913b76f2242398 F test/enc3.test 5c550d59ff31dccdba5d1a02ae11c7047d77c041 @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 78b6eee200cab363be520d771375e44898f80e01 -R f54fb099162c6d5644e37dc8b0ce9ec9 +P 57e0919b08e3b839b7c71011707a19ae2511a625 +R 92ae401439ab5ec163373abdec4908d5 U shaneh -Z afef9bcfe286e0cf65b249bd959c3b3b +Z 4749a579d5426b12c46df9b59dbb6167 diff --git a/manifest.uuid b/manifest.uuid index e3a4a1dab0..2bfa2c0e1d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -57e0919b08e3b839b7c71011707a19ae2511a625 \ No newline at end of file +6b270381daad5d1a9ca5746cf439c90f9c735a1b \ No newline at end of file diff --git a/test/e_vacuum.test b/test/e_vacuum.test index a7863c4568..414c854d11 100644 --- a/test/e_vacuum.test +++ b/test/e_vacuum.test @@ -175,6 +175,7 @@ do_test e_vacuum-1.3.2.1 { # EVIDENCE-OF: R-48521-51450 When in write-ahead log mode, only the # auto_vacuum support property can be changed using VACUUM. # +ifcapable wal { do_test e_vacuum-1.3.3.1 { execsql { PRAGMA journal_mode = wal } execsql { PRAGMA page_size ; PRAGMA auto_vacuum } @@ -185,6 +186,7 @@ do_test e_vacuum-1.3.3.2 { execsql VACUUM execsql { PRAGMA page_size ; PRAGMA auto_vacuum } } {2048 1} +} # EVIDENCE-OF: R-38001-03952 VACUUM only works on the main database. It # is not possible to VACUUM an attached database file. From 0bfc2d1cc88439b0c5ec6ad23c41b5a1fa8eedde Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Apr 2011 11:26:54 +0000 Subject: [PATCH 13/14] Improved comment on the sqlite3SrcListLookup function. FossilOrigin-Name: bcbc9ff568d1eb9f925574ebd22e5fdfa06daf6e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/delete.c | 15 ++++++++++++--- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 3713310d8f..0e36e58eee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Added\sifcapable\swal\sto\ssome\stest\sscripts; -D 2011-04-05T02:33:44.856 +C Improved\scomment\son\sthe\ssqlite3SrcListLookup\sfunction. +D 2011-04-05T11:26:54.833 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -129,7 +129,7 @@ F src/callback.c 5069f224882cbdccd559f591271d28d7f37745bc F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 F src/date.c 1548fdac51377e4e7833251de878b4058c148e1b -F src/delete.c 7ed8a8c8b5f748ece92df173d7e0f7810c899ebd +F src/delete.c 860c82c7db9b9d358bae607776bd7178b411fecc F src/expr.c 00817c672af554321fd67c44325afd7cef0e4648 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 418b840007c873975fd0d071746d952f8bca20ce @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 57e0919b08e3b839b7c71011707a19ae2511a625 -R 92ae401439ab5ec163373abdec4908d5 -U shaneh -Z 4749a579d5426b12c46df9b59dbb6167 +P 6b270381daad5d1a9ca5746cf439c90f9c735a1b +R 2ab6636865bc4ea8875ff28b858a8e0a +U drh +Z eac0ee404fcc8c2a7c0088a90c957b5e diff --git a/manifest.uuid b/manifest.uuid index 2bfa2c0e1d..4afebf1408 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6b270381daad5d1a9ca5746cf439c90f9c735a1b \ No newline at end of file +bcbc9ff568d1eb9f925574ebd22e5fdfa06daf6e \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index bd7ac3d1f3..c69615bde7 100644 --- a/src/delete.c +++ b/src/delete.c @@ -15,9 +15,18 @@ #include "sqliteInt.h" /* -** Look up every table that is named in pSrc. If any table is not found, -** add an error message to pParse->zErrMsg and return NULL. If all tables -** are found, return a pointer to the last table. +** While a SrcList can in general represent multiple tables and subqueries +** (as in the FROM clause of a SELECT statement) in this case it contains +** the name of a single table, as one might find in an INSERT, DELETE, +** or UPDATE statement. Look up that table in the symbol table and +** return a pointer. Set an error message and return NULL if the table +** name is not found or if any other error occurs. +** +** The following fields are initialized appropriate in pSrc: +** +** pSrc->a[0].pTab Pointer to the Table object +** pSrc->a[0].pIndex Pointer to the INDEXED BY index, if there is one +** */ Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ struct SrcList_item *pItem = pSrc->a; From 8d129422ed9a04bac684864ba127fa6278cc7513 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Apr 2011 12:25:19 +0000 Subject: [PATCH 14/14] Fix the P4_TRANSIENT constant so that it works correct - so that it really makes a copy of the string for the P4 argument. Use P4_TRANSIENT wherever appropriate. Change P4_STATICs of schema names to P4_TRANSIENT. FossilOrigin-Name: bf664b206bf6f5c1941da1986dfe2c0d1831d5e4 --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/delete.c | 4 ++-- src/expr.c | 2 +- src/fkey.c | 2 +- src/insert.c | 6 +++--- src/pragma.c | 4 ++-- src/trigger.c | 2 +- src/vdbe.h | 2 +- 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index 0e36e58eee..e39ffdd1bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scomment\son\sthe\ssqlite3SrcListLookup\sfunction. -D 2011-04-05T11:26:54.833 +C Fix\sthe\sP4_TRANSIENT\sconstant\sso\sthat\sit\sworks\scorrect\s-\sso\sthat\sit\sreally\nmakes\sa\scopy\sof\sthe\sstring\sfor\sthe\sP4\sargument.\s\sUse\sP4_TRANSIENT\swherever\nappropriate.\s\sChange\sP4_STATICs\sof\sschema\snames\sto\sP4_TRANSIENT. +D 2011-04-05T12:25:19.250 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -129,16 +129,16 @@ F src/callback.c 5069f224882cbdccd559f591271d28d7f37745bc F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 F src/date.c 1548fdac51377e4e7833251de878b4058c148e1b -F src/delete.c 860c82c7db9b9d358bae607776bd7178b411fecc -F src/expr.c 00817c672af554321fd67c44325afd7cef0e4648 +F src/delete.c 7a24fcc9a31664d145acb97ce56b6d9f249a25e4 +F src/expr.c e3cf0957c6b8faaaf7386a3bc69e53c0dc9705be F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb -F src/fkey.c 418b840007c873975fd0d071746d952f8bca20ce +F src/fkey.c 8ab7ace42f9be515e97202fc942e87c35309c05e F src/func.c 3a8cb2fb2de3e3aed7f39106daf4878d9d17fcce F src/global.c 02335177cf6946fe5525c6f0755cf181140debf3 F src/hash.c 458488dcc159c301b8e7686280ab209f1fb915af F src/hash.h 2894c932d84d9f892d4b4023a75e501f83050970 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c 8ffb544ff516669aa84a6f13d05dbf5c93bdb1ea +F src/insert.c 4083e8af5c7ca6faa32a56f8f2f80bac346b13a4 F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e @@ -170,7 +170,7 @@ F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050 F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e -F src/pragma.c 4221eb822d7cdb1fb69be555b189e15e5a24b6b5 +F src/pragma.c 65698dc369567de328cac4aaf020e417e5b8745d F src/prepare.c eb4944d9f7bfa13eb42a7416ed9aaed4de4d0bf3 F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 @@ -230,13 +230,13 @@ F src/test_vfstrace.c 2265c9895f350c8d3c39b079998fbe7481505cc1 F src/test_wholenumber.c 6129adfbe7c7444f2e60cc785927f3aa74e12290 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/tokenize.c 604607d6813e9551cf5189d899e0a25c12681080 -F src/trigger.c ec4813709e990a169b6923293e839fa5dfd64282 +F src/trigger.c 4c1ed08b8dca272e16112c837c64848c56b323e6 F src/update.c 81911be16ece3c3e7716aa18565b4814ec41f8b9 F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c cd997077bad039efc0597eb027c929658f93c018 F src/vacuum.c 924bd1bcee2dfb05376f79845bd3b4cec7b54b2f F src/vdbe.c 6488f759929602cbc3acea5e9c7c10e2d2cd00ed -F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 +F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbeInt.h 7e2f028ecc1a9faa6f253e7aa8d89cae03662bae F src/vdbeapi.c a09ad9164cafc505250d5dd6b69660c960f1308c F src/vdbeaux.c 010e4e67a5a577451b0220ea8903c9e279a43248 @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 6b270381daad5d1a9ca5746cf439c90f9c735a1b -R 2ab6636865bc4ea8875ff28b858a8e0a +P bcbc9ff568d1eb9f925574ebd22e5fdfa06daf6e +R 7427b4db22639678e80e85b7a7894dba U drh -Z eac0ee404fcc8c2a7c0088a90c957b5e +Z 8ac4b3854411b1d7191f15313f585b57 diff --git a/manifest.uuid b/manifest.uuid index 4afebf1408..13312505c3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bcbc9ff568d1eb9f925574ebd22e5fdfa06daf6e \ No newline at end of file +bf664b206bf6f5c1941da1986dfe2c0d1831d5e4 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index c69615bde7..e5389e2b6a 100644 --- a/src/delete.c +++ b/src/delete.c @@ -545,7 +545,7 @@ void sqlite3GenerateRowDelete( sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, 0); sqlite3VdbeAddOp2(v, OP_Delete, iCur, (count?OPFLAG_NCHANGE:0)); if( count ){ - sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_STATIC); + sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT); } } @@ -636,7 +636,7 @@ int sqlite3GenerateIndexKey( } if( doMakeRec ){ sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol+1, regOut); - sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), 0); + sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), P4_TRANSIENT); } sqlite3ReleaseTempRange(pParse, regBase, nCol+1); return regBase; diff --git a/src/expr.c b/src/expr.c index f80ae2ba2d..c0e9ba6fd5 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2345,7 +2345,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ assert( pExpr->u.zToken[0]!=0 ); sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); if( pExpr->u.zToken[1]!=0 ){ - sqlite3VdbeChangeP4(v, -1, pExpr->u.zToken, 0); + sqlite3VdbeChangeP4(v, -1, pExpr->u.zToken, P4_TRANSIENT); } break; } diff --git a/src/fkey.c b/src/fkey.c index 653cc1833a..ddd7b85573 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -398,7 +398,7 @@ static void fkLookupParent( } sqlite3VdbeAddOp3(v, OP_MakeRecord, regTemp, nCol, regRec); - sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), 0); + sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v,pIdx), P4_TRANSIENT); sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); sqlite3ReleaseTempReg(pParse, regRec); diff --git a/src/insert.c b/src/insert.c index a4efcf2bf3..0b7744651f 100644 --- a/src/insert.c +++ b/src/insert.c @@ -123,7 +123,7 @@ void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){ pTab->zColAff = zColAff; } - sqlite3VdbeChangeP4(v, -1, pTab->zColAff, 0); + sqlite3VdbeChangeP4(v, -1, pTab->zColAff, P4_TRANSIENT); } /* @@ -1327,7 +1327,7 @@ void sqlite3GenerateConstraintChecks( } sqlite3VdbeAddOp2(v, OP_SCopy, regRowid, regIdx+i); sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn+1, aRegIdx[iCur]); - sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), 0); + sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), P4_TRANSIENT); sqlite3ExprCacheAffinityChange(pParse, regIdx, pIdx->nColumn+1); #ifdef SQLITE_OMIT_UNIQUE_ENFORCEMENT @@ -1473,7 +1473,7 @@ void sqlite3CompleteInsertion( } sqlite3VdbeAddOp3(v, OP_Insert, baseCur, regRec, regRowid); if( !pParse->nested ){ - sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_STATIC); + sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT); } sqlite3VdbeChangeP5(v, pik_flags); } diff --git a/src/pragma.c b/src/pragma.c index db55e4bb41..9d3ec65f9e 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1175,7 +1175,7 @@ void sqlite3Pragma( addr = sqlite3VdbeAddOpList(v, ArraySize(idxErr), idxErr); sqlite3VdbeChangeP4(v, addr+1, "rowid ", P4_STATIC); sqlite3VdbeChangeP4(v, addr+3, " missing from index ", P4_STATIC); - sqlite3VdbeChangeP4(v, addr+4, pIdx->zName, P4_STATIC); + sqlite3VdbeChangeP4(v, addr+4, pIdx->zName, P4_TRANSIENT); sqlite3VdbeJumpHere(v, addr+9); sqlite3VdbeJumpHere(v, jmp2); } @@ -1205,7 +1205,7 @@ void sqlite3Pragma( sqlite3VdbeJumpHere(v, addr+4); sqlite3VdbeChangeP4(v, addr+6, "wrong # of entries in index ", P4_STATIC); - sqlite3VdbeChangeP4(v, addr+7, pIdx->zName, P4_STATIC); + sqlite3VdbeChangeP4(v, addr+7, pIdx->zName, P4_TRANSIENT); } } } diff --git a/src/trigger.c b/src/trigger.c index f66833522b..d6b61c77ba 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -561,7 +561,7 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ sqlite3BeginWriteOperation(pParse, 0, iDb); sqlite3OpenMasterTable(pParse, iDb); base = sqlite3VdbeAddOpList(v, ArraySize(dropTrigger), dropTrigger); - sqlite3VdbeChangeP4(v, base+1, pTrigger->zName, 0); + sqlite3VdbeChangeP4(v, base+1, pTrigger->zName, P4_TRANSIENT); sqlite3VdbeChangeP4(v, base+4, "trigger", P4_STATIC); sqlite3ChangeCookie(pParse, iDb); sqlite3VdbeAddOp2(v, OP_Close, 0, 0); diff --git a/src/vdbe.h b/src/vdbe.h index 71c871d52f..43044533f3 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -108,7 +108,7 @@ typedef struct VdbeOpList VdbeOpList; #define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */ #define P4_VDBEFUNC (-7) /* P4 is a pointer to a VdbeFunc structure */ #define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */ -#define P4_TRANSIENT (-9) /* P4 is a pointer to a transient string */ +#define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */ #define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */ #define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */ #define P4_REAL (-12) /* P4 is a 64-bit floating point value */