From 1b1f30bb5e9fe8e508c8953f4d29d29cb155a510 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 6 Dec 2013 15:37:35 +0000 Subject: [PATCH 01/43] Add code to detect if the database file is moved or deleted out from under SQLite and return an SQLITE_IOERR_NODB. FossilOrigin-Name: 8759a8e4d83b163e315eff316cf163f6ea42f2bb --- manifest | 27 ++++++++++++++------------- manifest.uuid | 2 +- src/os_win.c | 1 + src/pager.c | 25 +++++++++++++++++++++++++ src/sqlite.h.in | 6 +++++- src/test_vfstrace.c | 5 +++++ test/pager4.test | 33 +++++++++++++++++++++++++++++++++ 7 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 test/pager4.test diff --git a/manifest b/manifest index 264b3fc190..feb65446f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.8.2 -D 2013-12-06T14:53:30.888 +C Add\scode\sto\sdetect\sif\sthe\sdatabase\sfile\sis\smoved\sor\sdeleted\sout\sfrom\sunder\nSQLite\sand\sreturn\san\sSQLITE_IOERR_NODB. +D 2013-12-06T15:37:35.675 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -206,8 +206,8 @@ F src/os.c b4ad71336fd96f97776f75587cd9e8218288f5be F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c f076587029285554a3a65d30d0e71d50cd61f41f -F src/os_win.c 4323dd0bac4f7a7037fc4cf87fb4692d17f0b108 -F src/pager.c 2aa4444ffe86e9282d03bc349a4a5e49bd77c0e8 +F src/os_win.c f149798adb6f32db835b2c9f9fac83d86015e004 +F src/pager.c 3648e602d484020d10cb514b04ef8f445ed06f30 F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -221,7 +221,7 @@ F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758 -F src/sqlite.h.in baf55c31c4e15a4b626acfeaa792f2aaa566657f +F src/sqlite.h.in 4373b4a913ea460d91a9a4a54906ee18b350d573 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h f3a5d663fe9c6c0b2ee7fc2e20a6204eaea5bc7c @@ -272,7 +272,7 @@ F src/test_syscall.c 16dbe79fb320fadb5acd7a0a59f49e52ab2d2091 F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa F src/test_thread.c 1e133a40b50e9c035b00174035b846e7eef481cb F src/test_vfs.c e72f555ef7a59080f898fcf1a233deb9eb704ea9 -F src/test_vfstrace.c 34b544e80ba7fb77be15395a609c669df2e660a2 +F src/test_vfstrace.c 21b99a6fe3f4c8be13c0fe83006ee13873154d78 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4 F src/trigger.c d84e1f3669e9a217731a14a9d472b1c7b87c87ba @@ -726,6 +726,7 @@ F test/oserror.test 50417780d0e0d7cd23cf12a8277bb44024765df3 F test/pager1.test 1acbdb14c5952a72dd43129cabdbf69aaa3ed1fa F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f +F test/pager4.test 1848509f0aa83f99d438a2bae02c3fd64dd1afe6 F test/pagerfault.test 7285379906ab2f1108b8e82bbdf2d386cc8ff3ff F test/pagerfault2.test caf4c7facb914fd3b03a17b31ae2b180c8d6ca1f F test/pagerfault3.test 1003fcda009bf48a8e22a516e193b6ef0dd1bbd8 @@ -1145,10 +1146,10 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P c632567063d81c4be404ce58cbac0eff7412f565 -R 39f74301df16683d1c19ab7ca83b6451 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.8.2 * -U dan -Z bddf39b758268961698f9899546a37dd +P 27392118af4c38c5203a04b8013e1afdb1cebd0d +R 0833e0746c0a3bdbdf22e2e06343a85a +T *branch * detect-moved-db +T *sym-detect-moved-db * +T -sym-trunk * +U drh +Z 9ba43ea2faea1b2f751f5fd7fd1e8bc8 diff --git a/manifest.uuid b/manifest.uuid index 5097db9159..a2f643fbba 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -27392118af4c38c5203a04b8013e1afdb1cebd0d \ No newline at end of file +8759a8e4d83b163e315eff316cf163f6ea42f2bb \ No newline at end of file diff --git a/src/os_win.c b/src/os_win.c index 22052a3fe7..56b546fb47 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -3192,6 +3192,7 @@ static int winSectorSize(sqlite3_file *id){ static int winDeviceCharacteristics(sqlite3_file *id){ winFile *p = (winFile*)id; return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | + SQLITE_IOCAP_UNMOVABLE_WHEN_OPEN | ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); } diff --git a/src/pager.c b/src/pager.c index d675b85821..78cb78ab23 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4797,6 +4797,27 @@ int sqlite3PagerOpen( } +/* Verify that the database file has not be deleted or renamed out from +** under the pager. Return SQLITE_OK if the database is still were it ought +** to be on disk. Return non-zero (SQLITE_IOERR_NODB or some other error +** code from sqlite3OsAccess()) if the database has gone missing. +*/ +static int databaseIsUnmoved(Pager *pPager){ + const int fixedFlags = SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | + SQLITE_IOCAP_UNMOVABLE_WHEN_OPEN; + int dc; + int x = 0, rc; + + if( pPager->tempFile ) return SQLITE_OK; + if( pPager->dbSize==0 ) return SQLITE_OK; + assert( pPager->zFilename && pPager->zFilename[0] ); + dc = sqlite3OsDeviceCharacteristics(pPager->fd); + if( (dc&fixedFlags)==fixedFlags ) return SQLITE_OK; + rc = sqlite3OsAccess(pPager->pVfs, pPager->zFilename, SQLITE_ACCESS_EXISTS, &x); + if( rc==SQLITE_OK && !x ) rc = SQLITE_IOERR_NODB; + return rc; +} + /* ** This function is called after transitioning from PAGER_UNLOCK to @@ -4970,6 +4991,10 @@ int sqlite3PagerSharedLock(Pager *pPager){ goto failed; } + /* Verify that the database is unmoved and undeleted */ + rc = databaseIsUnmoved(pPager); + if( rc ) goto failed; + /* If a journal file exists, and there is no RESERVED lock on the ** database file, then it either needs to be played back or deleted. */ diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 98c89da322..de6b59b0b7 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -475,6 +475,7 @@ int sqlite3_exec( #define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) #define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) #define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) +#define SQLITE_IOERR_NODB (SQLITE_IOERR | (27<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) @@ -553,7 +554,9 @@ int sqlite3_exec( ** after reboot following a crash or power loss, the only bytes in a ** file that were written at the application level might have changed ** and that adjacent bytes, even bytes within the same sector are -** guaranteed to be unchanged. +** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN +** and SQLITE_IOCAP_UNMOVABLE_WHEN_OPEN flags indicate that a file +** cannot be deleted or renamed when open, respectively. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -568,6 +571,7 @@ int sqlite3_exec( #define SQLITE_IOCAP_SEQUENTIAL 0x00000400 #define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 +#define SQLITE_IOCAP_UNMOVABLE_WHEN_OPEN 0x00002000 /* ** CAPI3REF: File Locking Levels diff --git a/src/test_vfstrace.c b/src/test_vfstrace.c index 0aacc01fe4..8d56cf8946 100644 --- a/src/test_vfstrace.c +++ b/src/test_vfstrace.c @@ -258,6 +258,11 @@ static void vfstrace_print_errcode( case SQLITE_IOERR_SHMOPEN: zVal = "SQLITE_IOERR_SHMOPEN"; break; case SQLITE_IOERR_SHMSIZE: zVal = "SQLITE_IOERR_SHMSIZE"; break; case SQLITE_IOERR_SHMLOCK: zVal = "SQLITE_IOERR_SHMLOCK"; break; + case SQLITE_IOERR_SHMMAP: zVal = "SQLITE_IOERR_SHMMAP"; break; + case SQLITE_IOERR_SEEK: zVal = "SQLITE_IOERR_SEEK"; break; + case SQLITE_IOERR_GETTEMPPATH: zVal = "SQLITE_IOERR_GETTEMPPATH"; break; + case SQLITE_IOERR_CONVPATH: zVal = "SQLITE_IOERR_CONVPATH"; break; + case SQLITE_IOERR_NODB: zVal = "SQLITE_IOERR_NODB"; break; case SQLITE_LOCKED_SHAREDCACHE: zVal = "SQLITE_LOCKED_SHAREDCACHE"; break; case SQLITE_BUSY_RECOVERY: zVal = "SQLITE_BUSY_RECOVERY"; break; case SQLITE_CANTOPEN_NOTEMPDIR: zVal = "SQLITE_CANTOPEN_NOTEMPDIR"; break; diff --git a/test/pager4.test b/test/pager4.test new file mode 100644 index 0000000000..dbe9bf8195 --- /dev/null +++ b/test/pager4.test @@ -0,0 +1,33 @@ +# 2013-12-06 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Tests for the SQLITE_IOERR_NODB error condition: the database file file +# is unlinked or renamed out from under SQLite. +# + +if {$tcl_platform(platform)!="unix"} return + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +do_execsql_test pager4-1.1 { + CREATE TABLE t1(a,b,c); + INSERT INTO t1 VALUES(673,'stone','philips'); + SELECT * FROM t1; +} {673 stone philips} +file delete -force test-xyz.db +file rename test.db test-xyz.db +do_catchsql_test pager4-1.2 { + SELECT * FROM t1; +} {1 {disk I/O error}} + + +finish_test From 3fee8a63c8bea86450439c3320cb1d5f9050413a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 6 Dec 2013 17:23:38 +0000 Subject: [PATCH 02/43] Only error out on a database file move when attempting to start a write transaction. Assume read transactions are still safe. And make the error SQLITE_READONLY_DBMOVED instead of SQLITE_IOERR_NODB. FossilOrigin-Name: 28348f2ada98c616241a51aecb70b63e87e6ddbb --- manifest | 21 ++++++++---------- manifest.uuid | 2 +- src/pager.c | 28 ++++++++++++------------ src/sqlite.h.in | 2 +- src/test_vfstrace.c | 2 +- test/pager4.test | 52 ++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 78 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index feb65446f1..a5b6b1110c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\scode\sto\sdetect\sif\sthe\sdatabase\sfile\sis\smoved\sor\sdeleted\sout\sfrom\sunder\nSQLite\sand\sreturn\san\sSQLITE_IOERR_NODB. -D 2013-12-06T15:37:35.675 +C Only\serror\sout\son\sa\sdatabase\sfile\smove\swhen\sattempting\sto\sstart\sa\swrite\ntransaction.\s\sAssume\sread\stransactions\sare\sstill\ssafe.\s\sAnd\smake\sthe\serror\nSQLITE_READONLY_DBMOVED\sinstead\sof\sSQLITE_IOERR_NODB. +D 2013-12-06T17:23:38.532 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -207,7 +207,7 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c f076587029285554a3a65d30d0e71d50cd61f41f F src/os_win.c f149798adb6f32db835b2c9f9fac83d86015e004 -F src/pager.c 3648e602d484020d10cb514b04ef8f445ed06f30 +F src/pager.c 938874307e1b07a98a181cbab41c5625f2aa1666 F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -221,7 +221,7 @@ F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758 -F src/sqlite.h.in 4373b4a913ea460d91a9a4a54906ee18b350d573 +F src/sqlite.h.in 5ae0618d16a393ff8e66d1e373d3670892c2d254 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h f3a5d663fe9c6c0b2ee7fc2e20a6204eaea5bc7c @@ -272,7 +272,7 @@ F src/test_syscall.c 16dbe79fb320fadb5acd7a0a59f49e52ab2d2091 F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa F src/test_thread.c 1e133a40b50e9c035b00174035b846e7eef481cb F src/test_vfs.c e72f555ef7a59080f898fcf1a233deb9eb704ea9 -F src/test_vfstrace.c 21b99a6fe3f4c8be13c0fe83006ee13873154d78 +F src/test_vfstrace.c 3a0ab304682fecbceb689e7d9b904211fde11d78 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4 F src/trigger.c d84e1f3669e9a217731a14a9d472b1c7b87c87ba @@ -726,7 +726,7 @@ F test/oserror.test 50417780d0e0d7cd23cf12a8277bb44024765df3 F test/pager1.test 1acbdb14c5952a72dd43129cabdbf69aaa3ed1fa F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f -F test/pager4.test 1848509f0aa83f99d438a2bae02c3fd64dd1afe6 +F test/pager4.test afbffa3f6813bd9bf126eb5e66bc954717f36de5 F test/pagerfault.test 7285379906ab2f1108b8e82bbdf2d386cc8ff3ff F test/pagerfault2.test caf4c7facb914fd3b03a17b31ae2b180c8d6ca1f F test/pagerfault3.test 1003fcda009bf48a8e22a516e193b6ef0dd1bbd8 @@ -1146,10 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 27392118af4c38c5203a04b8013e1afdb1cebd0d -R 0833e0746c0a3bdbdf22e2e06343a85a -T *branch * detect-moved-db -T *sym-detect-moved-db * -T -sym-trunk * +P 8759a8e4d83b163e315eff316cf163f6ea42f2bb +R 2ad1eaf9a51016580f9868708a4f6a69 U drh -Z 9ba43ea2faea1b2f751f5fd7fd1e8bc8 +Z 59055776a0fdbfce14961d0c6b6be93f diff --git a/manifest.uuid b/manifest.uuid index a2f643fbba..a13ba15e4f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8759a8e4d83b163e315eff316cf163f6ea42f2bb \ No newline at end of file +28348f2ada98c616241a51aecb70b63e87e6ddbb \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 78cb78ab23..5803b2927d 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4799,7 +4799,7 @@ int sqlite3PagerOpen( /* Verify that the database file has not be deleted or renamed out from ** under the pager. Return SQLITE_OK if the database is still were it ought -** to be on disk. Return non-zero (SQLITE_IOERR_NODB or some other error +** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error ** code from sqlite3OsAccess()) if the database has gone missing. */ static int databaseIsUnmoved(Pager *pPager){ @@ -4814,7 +4814,7 @@ static int databaseIsUnmoved(Pager *pPager){ dc = sqlite3OsDeviceCharacteristics(pPager->fd); if( (dc&fixedFlags)==fixedFlags ) return SQLITE_OK; rc = sqlite3OsAccess(pPager->pVfs, pPager->zFilename, SQLITE_ACCESS_EXISTS, &x); - if( rc==SQLITE_OK && !x ) rc = SQLITE_IOERR_NODB; + if( rc==SQLITE_OK && !x ) rc = SQLITE_READONLY_DBMOVED; return rc; } @@ -4991,10 +4991,6 @@ int sqlite3PagerSharedLock(Pager *pPager){ goto failed; } - /* Verify that the database is unmoved and undeleted */ - rc = databaseIsUnmoved(pPager); - if( rc ) goto failed; - /* If a journal file exists, and there is no RESERVED lock on the ** database file, then it either needs to be played back or deleted. */ @@ -5498,13 +5494,19 @@ static int pager_open_journal(Pager *pPager){ (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL): (SQLITE_OPEN_MAIN_JOURNAL) ); - #ifdef SQLITE_ENABLE_ATOMIC_WRITE - rc = sqlite3JournalOpen( - pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) - ); - #else - rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); - #endif + + /* Verify that the database still has the same name as it did when + ** it was originally opened. */ + rc = databaseIsUnmoved(pPager); + if( rc==SQLITE_OK ){ +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + rc = sqlite3JournalOpen( + pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) + ); +#else + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); +#endif + } } assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index de6b59b0b7..f4692f286a 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -475,7 +475,6 @@ int sqlite3_exec( #define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) #define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) #define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) -#define SQLITE_IOERR_NODB (SQLITE_IOERR | (27<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) @@ -487,6 +486,7 @@ int sqlite3_exec( #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) +#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) #define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) #define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) diff --git a/src/test_vfstrace.c b/src/test_vfstrace.c index 8d56cf8946..c1792f116e 100644 --- a/src/test_vfstrace.c +++ b/src/test_vfstrace.c @@ -262,7 +262,7 @@ static void vfstrace_print_errcode( case SQLITE_IOERR_SEEK: zVal = "SQLITE_IOERR_SEEK"; break; case SQLITE_IOERR_GETTEMPPATH: zVal = "SQLITE_IOERR_GETTEMPPATH"; break; case SQLITE_IOERR_CONVPATH: zVal = "SQLITE_IOERR_CONVPATH"; break; - case SQLITE_IOERR_NODB: zVal = "SQLITE_IOERR_NODB"; break; + case SQLITE_READONLY_DBMOVED: zVal = "SQLITE_READONLY_DBMOVED"; break; case SQLITE_LOCKED_SHAREDCACHE: zVal = "SQLITE_LOCKED_SHAREDCACHE"; break; case SQLITE_BUSY_RECOVERY: zVal = "SQLITE_BUSY_RECOVERY"; break; case SQLITE_CANTOPEN_NOTEMPDIR: zVal = "SQLITE_CANTOPEN_NOTEMPDIR"; break; diff --git a/test/pager4.test b/test/pager4.test index dbe9bf8195..e757dbe171 100644 --- a/test/pager4.test +++ b/test/pager4.test @@ -18,16 +18,66 @@ if {$tcl_platform(platform)!="unix"} return set testdir [file dirname $argv0] source $testdir/tester.tcl +# Create a database file for testing +# do_execsql_test pager4-1.1 { CREATE TABLE t1(a,b,c); INSERT INTO t1 VALUES(673,'stone','philips'); SELECT * FROM t1; } {673 stone philips} + +# After renaming the database file while it is open, one can still +# read from the database, but writing returns a READONLY error. +# file delete -force test-xyz.db file rename test.db test-xyz.db do_catchsql_test pager4-1.2 { SELECT * FROM t1; -} {1 {disk I/O error}} +} {0 {673 stone philips}} +do_catchsql_test pager4-1.3 { + UPDATE t1 SET a=537; +} {1 {attempt to write a readonly database}} + +# Changing the name back clears the READONLY error +# +file rename test-xyz.db test.db +do_catchsql_test pager4-1.4 { + SELECT * FROM t1; +} {0 {673 stone philips}} +do_catchsql_test pager4-1.5 { + UPDATE t1 SET a=537; + SELECT * FROM t1; +} {0 {537 stone philips}} + +# We can write to a renamed database if journal_mode=OFF or +# journal_mode=MEMORY. +# +file rename test.db test-xyz.db +do_catchsql_test pager4-1.6 { + PRAGMA journal_mode=OFF; + UPDATE t1 SET a=107; + SELECT * FROM t1; +} {0 {off 107 stone philips}} +do_catchsql_test pager4-1.7 { + PRAGMA journal_mode=MEMORY; + UPDATE t1 SET b='magpie'; + SELECT * FROM t1; +} {0 {memory 107 magpie philips}} + +# Any other journal mode gives a READONLY error +# +do_catchsql_test pager4-1.8 { + PRAGMA journal_mode=DELETE; + UPDATE t1 SET c='jaguar'; +} {1 {attempt to write a readonly database}} +do_catchsql_test pager4-1.9 { + PRAGMA journal_mode=TRUNCATE; + UPDATE t1 SET c='jaguar'; +} {1 {attempt to write a readonly database}} +do_catchsql_test pager4-1.10 { + PRAGMA journal_mode=PERSIST; + UPDATE t1 SET c='jaguar'; +} {1 {attempt to write a readonly database}} finish_test From 091a81b91d600159e6ddb3da3d83915513ab4c7e Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 6 Dec 2013 19:58:32 +0000 Subject: [PATCH 03/43] Add the SQLITE_READONLY_DBMOVED error code to the sqlite3ErrName() function. FossilOrigin-Name: 7789f801d720db5394117e764675cd4bbe6b2da1 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/main.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a5b6b1110c..d7e2f42853 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Only\serror\sout\son\sa\sdatabase\sfile\smove\swhen\sattempting\sto\sstart\sa\swrite\ntransaction.\s\sAssume\sread\stransactions\sare\sstill\ssafe.\s\sAnd\smake\sthe\serror\nSQLITE_READONLY_DBMOVED\sinstead\sof\sSQLITE_IOERR_NODB. -D 2013-12-06T17:23:38.532 +C Add\sthe\sSQLITE_READONLY_DBMOVED\serror\scode\sto\sthe\ssqlite3ErrName()\sfunction. +D 2013-12-06T19:58:32.556 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -188,7 +188,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303 -F src/main.c 74bdee8f574588868e67c25cd377df7cba80102e +F src/main.c 355fc9ab213b43a4d8a96aadf2a84622e6668f0a F src/malloc.c 543a8eb5508eaf4cadf55a9b503379eba2088128 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 8759a8e4d83b163e315eff316cf163f6ea42f2bb -R 2ad1eaf9a51016580f9868708a4f6a69 -U drh -Z 59055776a0fdbfce14961d0c6b6be93f +P 28348f2ada98c616241a51aecb70b63e87e6ddbb +R 9bc31534cba9a5ca27509c106713cf4f +U mistachkin +Z 53877e3b824403e5e8a560ad04bec5a4 diff --git a/manifest.uuid b/manifest.uuid index a13ba15e4f..37578fbff0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28348f2ada98c616241a51aecb70b63e87e6ddbb \ No newline at end of file +7789f801d720db5394117e764675cd4bbe6b2da1 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 69a399f385..1ba555fde8 100644 --- a/src/main.c +++ b/src/main.c @@ -1086,6 +1086,7 @@ const char *sqlite3ErrName(int rc){ case SQLITE_READONLY_RECOVERY: zName = "SQLITE_READONLY_RECOVERY"; break; case SQLITE_READONLY_CANTLOCK: zName = "SQLITE_READONLY_CANTLOCK"; break; case SQLITE_READONLY_ROLLBACK: zName = "SQLITE_READONLY_ROLLBACK"; break; + case SQLITE_READONLY_DBMOVED: zName = "SQLITE_READONLY_DBMOVED"; break; case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break; From 72b8ef6ce3ee4f91e27c8bd86d5c7228ef4108f0 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 6 Dec 2013 22:44:51 +0000 Subject: [PATCH 04/43] Remove some commented-out code from sqlite3BtreeMovetoUnpacked() to try to make it more readable. FossilOrigin-Name: 2d62d1131f8bbc4e1f8f7aeaf0d91e3237fe3b7c --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/btree.c | 5 +---- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 264b3fc190..c9d25efc91 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.8.2 -D 2013-12-06T14:53:30.888 +C Remove\ssome\scommented-out\scode\sfrom\ssqlite3BtreeMovetoUnpacked()\sto\stry\sto\smake\nit\smore\sreadable. +D 2013-12-06T22:44:51.968 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,7 +166,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c fe6c95c57fd14ed4b3329f4b5bb08132fe7c322d +F src/btree.c 1c1228bfeff3142c3d30f37f41c62e1e1456a04b F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/build.c 1965c7b596ca6295b7ca59541ad186c57564b8f7 @@ -1145,10 +1145,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P c632567063d81c4be404ce58cbac0eff7412f565 -R 39f74301df16683d1c19ab7ca83b6451 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.8.2 * -U dan -Z bddf39b758268961698f9899546a37dd +P 27392118af4c38c5203a04b8013e1afdb1cebd0d +R 37ccd3e8b8d51b4fffcef9ee439c7da2 +U drh +Z b12a0af0516653b272442a79b4596fc8 diff --git a/manifest.uuid b/manifest.uuid index 5097db9159..3816e1f6cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -27392118af4c38c5203a04b8013e1afdb1cebd0d \ No newline at end of file +2d62d1131f8bbc4e1f8f7aeaf0d91e3237fe3b7c \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 30fdf4256f..e93eeffb36 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4716,9 +4716,7 @@ int sqlite3BtreeMovetoUnpacked( ** 2 bytes of the cell. */ nCell = pCell[0]; - if( nCell<=pPage->max1bytePayload - /* && (pCell+nCell)aDataEnd */ - ){ + if( nCell<=pPage->max1bytePayload ){ /* This branch runs if the record-size field of the cell is a ** single byte varint and the record fits entirely on the main ** b-tree page. */ @@ -4726,7 +4724,6 @@ int sqlite3BtreeMovetoUnpacked( c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[1], pIdxKey); }else if( !(pCell[1] & 0x80) && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal - /* && (pCell+nCell+2)<=pPage->aDataEnd */ ){ /* The record-size field is a 2 byte varint and the record ** fits entirely on the main b-tree page. */ From b8a9bb4fb93253103e09507e706caab4410a9d72 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 6 Dec 2013 22:45:31 +0000 Subject: [PATCH 05/43] Use memcmp() instead of the BINARY collating function where possible, for a performance boost. FossilOrigin-Name: c5a3a1af3c7bd34886e944a1fef2f6340ded24a0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c9d25efc91..af9d22779a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\ssome\scommented-out\scode\sfrom\ssqlite3BtreeMovetoUnpacked()\sto\stry\sto\smake\nit\smore\sreadable. -D 2013-12-06T22:44:51.968 +C Use\smemcmp()\sinstead\sof\sthe\sBINARY\scollating\sfunction\swhere\spossible,\sfor\na\sperformance\sboost. +D 2013-12-06T22:45:31.452 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -169,7 +169,7 @@ F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 F src/btree.c 1c1228bfeff3142c3d30f37f41c62e1e1456a04b F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 -F src/build.c 1965c7b596ca6295b7ca59541ad186c57564b8f7 +F src/build.c 9b40580b62916612678bdb69ce0286e39c29a862 F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd @@ -1145,7 +1145,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 27392118af4c38c5203a04b8013e1afdb1cebd0d -R 37ccd3e8b8d51b4fffcef9ee439c7da2 +P 2d62d1131f8bbc4e1f8f7aeaf0d91e3237fe3b7c +R 64ecaeb699cffb8c7d50ef92ad2b85dd U drh -Z b12a0af0516653b272442a79b4596fc8 +Z 924fa8368d7b3d9057325dee3400f3cb diff --git a/manifest.uuid b/manifest.uuid index 3816e1f6cf..cff17acb92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2d62d1131f8bbc4e1f8f7aeaf0d91e3237fe3b7c \ No newline at end of file +c5a3a1af3c7bd34886e944a1fef2f6340ded24a0 \ No newline at end of file diff --git a/src/build.c b/src/build.c index fd512358bc..a7d5a29946 100644 --- a/src/build.c +++ b/src/build.c @@ -4183,8 +4183,9 @@ KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ assert( sqlite3KeyInfoIsWriteable(pKey) ); for(i=0; iazColl[i]; - if( NEVER(zColl==0) ) zColl = "BINARY"; - pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl); + assert( zColl!=0 ); + pKey->aColl[i] = strcmp(zColl,"BINARY")==0 ? 0 : + sqlite3LocateCollSeq(pParse, zColl); pKey->aSortOrder[i] = pIdx->aSortOrder[i]; } if( pParse->nErr ){ From 4e8fe3ff910f0a2a3605a0596339b1682736e030 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 6 Dec 2013 23:25:27 +0000 Subject: [PATCH 06/43] Performance optimization to the moveToRoot() subroutine in btree.c. FossilOrigin-Name: b5842a70f8e26456a8f0d39539bc266f097480a4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 16 ++++++---------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index af9d22779a..029d04e994 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\smemcmp()\sinstead\sof\sthe\sBINARY\scollating\sfunction\swhere\spossible,\sfor\na\sperformance\sboost. -D 2013-12-06T22:45:31.452 +C Performance\soptimization\sto\sthe\smoveToRoot()\ssubroutine\sin\sbtree.c. +D 2013-12-06T23:25:27.601 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,7 +166,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 1c1228bfeff3142c3d30f37f41c62e1e1456a04b +F src/btree.c 4037f58ef3f4459d0b9bb1fc1aee1136277d9ba6 F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/build.c 9b40580b62916612678bdb69ce0286e39c29a862 @@ -1145,7 +1145,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 2d62d1131f8bbc4e1f8f7aeaf0d91e3237fe3b7c -R 64ecaeb699cffb8c7d50ef92ad2b85dd +P c5a3a1af3c7bd34886e944a1fef2f6340ded24a0 +R 12065e363c2320b45db52efcb2788f0d U drh -Z 924fa8368d7b3d9057325dee3400f3cb +Z 6564d15f297e6c8ddf25ac421a3f69fc diff --git a/manifest.uuid b/manifest.uuid index cff17acb92..5fac78a151 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c5a3a1af3c7bd34886e944a1fef2f6340ded24a0 \ No newline at end of file +b5842a70f8e26456a8f0d39539bc266f097480a4 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e93eeffb36..a0b6c6ba24 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4395,8 +4395,6 @@ static void moveToParent(BtCursor *pCur){ static int moveToRoot(BtCursor *pCur){ MemPage *pRoot; int rc = SQLITE_OK; - Btree *p = pCur->pBtree; - BtShared *pBt = p->pBt; assert( cursorHoldsMutex(pCur) ); assert( CURSOR_INVALID < CURSOR_REQUIRESEEK ); @@ -4411,16 +4409,12 @@ static int moveToRoot(BtCursor *pCur){ } if( pCur->iPage>=0 ){ - int i; - for(i=1; i<=pCur->iPage; i++){ - releasePage(pCur->apPage[i]); - } - pCur->iPage = 0; + while( pCur->iPage ) releasePage(pCur->apPage[pCur->iPage--]); }else if( pCur->pgnoRoot==0 ){ pCur->eState = CURSOR_INVALID; return SQLITE_OK; }else{ - rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->apPage[0], + rc = getAndInitPage(pCur->pBtree->pBt, pCur->pgnoRoot, &pCur->apPage[0], pCur->wrFlag==0 ? PAGER_GET_READONLY : 0); if( rc!=SQLITE_OK ){ pCur->eState = CURSOR_INVALID; @@ -4453,14 +4447,16 @@ static int moveToRoot(BtCursor *pCur){ pCur->atLast = 0; pCur->validNKey = 0; - if( pRoot->nCell==0 && !pRoot->leaf ){ + if( pRoot->nCell>0 ){ + pCur->eState = CURSOR_VALID; + }else if( !pRoot->leaf ){ Pgno subpage; if( pRoot->pgno!=1 ) return SQLITE_CORRUPT_BKPT; subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]); pCur->eState = CURSOR_VALID; rc = moveToChild(pCur, subpage); }else{ - pCur->eState = ((pRoot->nCell>0)?CURSOR_VALID:CURSOR_INVALID); + pCur->eState = CURSOR_INVALID; } return rc; } From b959a017b697e7432a65989ace42d1db92430f93 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 7 Dec 2013 12:29:22 +0000 Subject: [PATCH 07/43] Actually look at i-node numbers to determine whether or not the database file has moved. FossilOrigin-Name: 2b1884dc14f9a04a04eebb3245fbe0daaff399eb --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/os_unix.c | 18 ++++++++++++++---- src/pager.c | 7 ++++--- src/sqlite.h.in | 7 +++++++ test/pager4.test | 25 ++++++++++++++++++------- 6 files changed, 54 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index d7e2f42853..adb35d7204 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_READONLY_DBMOVED\serror\scode\sto\sthe\ssqlite3ErrName()\sfunction. -D 2013-12-06T19:58:32.556 +C Actually\slook\sat\si-node\snumbers\sto\sdetermine\swhether\sor\snot\sthe\sdatabase\nfile\shas\smoved. +D 2013-12-07T12:29:22.514 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -205,9 +205,9 @@ F src/notify.c 976dd0f6171d4588e89e874fcc765e92914b6d30 F src/os.c b4ad71336fd96f97776f75587cd9e8218288f5be F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 -F src/os_unix.c f076587029285554a3a65d30d0e71d50cd61f41f +F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c f149798adb6f32db835b2c9f9fac83d86015e004 -F src/pager.c 938874307e1b07a98a181cbab41c5625f2aa1666 +F src/pager.c 6aa7d8eca75cac90f90f4c2619fb6c47153756e6 F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -221,7 +221,7 @@ F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758 -F src/sqlite.h.in 5ae0618d16a393ff8e66d1e373d3670892c2d254 +F src/sqlite.h.in eea3f417059c203f450ec64acbb19e6201063c0c F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h f3a5d663fe9c6c0b2ee7fc2e20a6204eaea5bc7c @@ -726,7 +726,7 @@ F test/oserror.test 50417780d0e0d7cd23cf12a8277bb44024765df3 F test/pager1.test 1acbdb14c5952a72dd43129cabdbf69aaa3ed1fa F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f -F test/pager4.test afbffa3f6813bd9bf126eb5e66bc954717f36de5 +F test/pager4.test b40ecb4cc7dff957ee7916e41ab21d1ed702a642 F test/pagerfault.test 7285379906ab2f1108b8e82bbdf2d386cc8ff3ff F test/pagerfault2.test caf4c7facb914fd3b03a17b31ae2b180c8d6ca1f F test/pagerfault3.test 1003fcda009bf48a8e22a516e193b6ef0dd1bbd8 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 28348f2ada98c616241a51aecb70b63e87e6ddbb -R 9bc31534cba9a5ca27509c106713cf4f -U mistachkin -Z 53877e3b824403e5e8a560ad04bec5a4 +P 7789f801d720db5394117e764675cd4bbe6b2da1 +R 3bce36f2564839cff6784053e8b7c283 +U drh +Z 80f483ee05b71fc1e6bab9b86a396c28 diff --git a/manifest.uuid b/manifest.uuid index 37578fbff0..b80938c565 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7789f801d720db5394117e764675cd4bbe6b2da1 \ No newline at end of file +2b1884dc14f9a04a04eebb3245fbe0daaff399eb \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index ab657dc7bd..485b32fd90 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1315,6 +1315,15 @@ static int findInodeInfo( return SQLITE_OK; } +/* +** Return TRUE if pFile has been renamed or unlinked since it was first opened. +*/ +static int fileHasMoved(unixFile *pFile){ + struct stat buf; + return pFile->pInode!=0 && + (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino); +} + /* ** Check a unixFile that is a database. Verify the following: @@ -1349,10 +1358,7 @@ static void verifyDbFile(unixFile *pFile){ pFile->ctrlFlags |= UNIXFILE_WARNED; return; } - if( pFile->pInode!=0 - && ((rc = osStat(pFile->zPath, &buf))!=0 - || buf.st_ino!=pFile->pInode->fileId.ino) - ){ + if( fileHasMoved(pFile) ){ sqlite3_log(SQLITE_WARNING, "file renamed while open: %s", pFile->zPath); pFile->ctrlFlags |= UNIXFILE_WARNED; return; @@ -3801,6 +3807,10 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ } return SQLITE_OK; } + case SQLITE_FCNTL_HAS_MOVED: { + *(int*)pArg = fileHasMoved(pFile); + return SQLITE_OK; + } #if SQLITE_MAX_MMAP_SIZE>0 case SQLITE_FCNTL_MMAP_SIZE: { i64 newLimit = *(i64*)pArg; diff --git a/src/pager.c b/src/pager.c index 5803b2927d..297b7bd534 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4806,15 +4806,16 @@ static int databaseIsUnmoved(Pager *pPager){ const int fixedFlags = SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | SQLITE_IOCAP_UNMOVABLE_WHEN_OPEN; int dc; - int x = 0, rc; + int bHasMoved = 0; + int rc; if( pPager->tempFile ) return SQLITE_OK; if( pPager->dbSize==0 ) return SQLITE_OK; assert( pPager->zFilename && pPager->zFilename[0] ); dc = sqlite3OsDeviceCharacteristics(pPager->fd); if( (dc&fixedFlags)==fixedFlags ) return SQLITE_OK; - rc = sqlite3OsAccess(pPager->pVfs, pPager->zFilename, SQLITE_ACCESS_EXISTS, &x); - if( rc==SQLITE_OK && !x ) rc = SQLITE_READONLY_DBMOVED; + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); + if( rc==SQLITE_OK && bHasMoved ) rc = SQLITE_READONLY_DBMOVED; return rc; } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f4692f286a..fb6fa462ec 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -920,6 +920,12 @@ struct sqlite3_io_methods { ** SQLite stack may generate instances of this file control if ** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. ** +**
  • [[SQLITE_FCNTL_HAS_MOVED]] +** The [SQLITE_FCNTL_HAS_MOVED] file control interprets its argument as a +** pointer to an integer and it writes a boolean into that integer depending +** on whether or not the file has been renamed, moved, or deleted since it +** was first opened. +** ** */ #define SQLITE_FCNTL_LOCKSTATE 1 @@ -940,6 +946,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_TEMPFILENAME 16 #define SQLITE_FCNTL_MMAP_SIZE 18 #define SQLITE_FCNTL_TRACE 19 +#define SQLITE_FCNTL_HAS_MOVED 20 /* ** CAPI3REF: Mutex Handle diff --git a/test/pager4.test b/test/pager4.test index e757dbe171..edfd2660c2 100644 --- a/test/pager4.test +++ b/test/pager4.test @@ -38,13 +38,24 @@ do_catchsql_test pager4-1.3 { UPDATE t1 SET a=537; } {1 {attempt to write a readonly database}} +# Creating a different database file with the same name of the original +# is detected and still leaves the database read-only. +# +sqlite3 db2 test.db +db2 eval {CREATE TABLE t2(x,y,z)} +do_catchsql_test pager4-1.4 { + UPDATE t1 SET a=948; +} {1 {attempt to write a readonly database}} + # Changing the name back clears the READONLY error # +db2 close +file delete -force test.db file rename test-xyz.db test.db -do_catchsql_test pager4-1.4 { +do_catchsql_test pager4-1.5 { SELECT * FROM t1; } {0 {673 stone philips}} -do_catchsql_test pager4-1.5 { +do_catchsql_test pager4-1.6 { UPDATE t1 SET a=537; SELECT * FROM t1; } {0 {537 stone philips}} @@ -53,12 +64,12 @@ do_catchsql_test pager4-1.5 { # journal_mode=MEMORY. # file rename test.db test-xyz.db -do_catchsql_test pager4-1.6 { +do_catchsql_test pager4-1.7 { PRAGMA journal_mode=OFF; UPDATE t1 SET a=107; SELECT * FROM t1; } {0 {off 107 stone philips}} -do_catchsql_test pager4-1.7 { +do_catchsql_test pager4-1.8 { PRAGMA journal_mode=MEMORY; UPDATE t1 SET b='magpie'; SELECT * FROM t1; @@ -66,15 +77,15 @@ do_catchsql_test pager4-1.7 { # Any other journal mode gives a READONLY error # -do_catchsql_test pager4-1.8 { +do_catchsql_test pager4-1.9 { PRAGMA journal_mode=DELETE; UPDATE t1 SET c='jaguar'; } {1 {attempt to write a readonly database}} -do_catchsql_test pager4-1.9 { +do_catchsql_test pager4-1.10 { PRAGMA journal_mode=TRUNCATE; UPDATE t1 SET c='jaguar'; } {1 {attempt to write a readonly database}} -do_catchsql_test pager4-1.10 { +do_catchsql_test pager4-1.11 { PRAGMA journal_mode=PERSIST; UPDATE t1 SET c='jaguar'; } {1 {attempt to write a readonly database}} From a9c19f935cf5e653da10ef517611b48107d83fff Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 7 Dec 2013 16:45:05 +0000 Subject: [PATCH 08/43] Back out the new device capability. The determination of whether or not a file has moved is now done strictly using a file-control. FossilOrigin-Name: 9c59f5af7ac4908583fab85d37241f200c40f02d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/os_win.c | 1 - src/pager.c | 14 ++++++++------ src/sqlite.h.in | 4 +--- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index adb35d7204..af17b57a3f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Actually\slook\sat\si-node\snumbers\sto\sdetermine\swhether\sor\snot\sthe\sdatabase\nfile\shas\smoved. -D 2013-12-07T12:29:22.514 +C Back\sout\sthe\snew\sdevice\scapability.\s\sThe\sdetermination\sof\swhether\sor\snot\sa\nfile\shas\smoved\sis\snow\sdone\sstrictly\susing\sa\sfile-control. +D 2013-12-07T16:45:05.762 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -206,8 +206,8 @@ F src/os.c b4ad71336fd96f97776f75587cd9e8218288f5be F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f -F src/os_win.c f149798adb6f32db835b2c9f9fac83d86015e004 -F src/pager.c 6aa7d8eca75cac90f90f4c2619fb6c47153756e6 +F src/os_win.c 4323dd0bac4f7a7037fc4cf87fb4692d17f0b108 +F src/pager.c d27dc8aaeac16c90eb0c859c074683bfc4533c41 F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -221,7 +221,7 @@ F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758 -F src/sqlite.h.in eea3f417059c203f450ec64acbb19e6201063c0c +F src/sqlite.h.in 125dc0b76f0116f1cd6f13536db52ba981e1c5bd F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h f3a5d663fe9c6c0b2ee7fc2e20a6204eaea5bc7c @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 7789f801d720db5394117e764675cd4bbe6b2da1 -R 3bce36f2564839cff6784053e8b7c283 +P 2b1884dc14f9a04a04eebb3245fbe0daaff399eb +R 4150eee10eaa0b472e8e9f4c3fd71eac U drh -Z 80f483ee05b71fc1e6bab9b86a396c28 +Z f90de22ca9080d17b19aebd5c1cb9da5 diff --git a/manifest.uuid b/manifest.uuid index b80938c565..d9c23f55bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2b1884dc14f9a04a04eebb3245fbe0daaff399eb \ No newline at end of file +9c59f5af7ac4908583fab85d37241f200c40f02d \ No newline at end of file diff --git a/src/os_win.c b/src/os_win.c index 56b546fb47..22052a3fe7 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -3192,7 +3192,6 @@ static int winSectorSize(sqlite3_file *id){ static int winDeviceCharacteristics(sqlite3_file *id){ winFile *p = (winFile*)id; return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | - SQLITE_IOCAP_UNMOVABLE_WHEN_OPEN | ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); } diff --git a/src/pager.c b/src/pager.c index 297b7bd534..3138035cd5 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4803,19 +4803,21 @@ int sqlite3PagerOpen( ** code from sqlite3OsAccess()) if the database has gone missing. */ static int databaseIsUnmoved(Pager *pPager){ - const int fixedFlags = SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | - SQLITE_IOCAP_UNMOVABLE_WHEN_OPEN; - int dc; int bHasMoved = 0; int rc; if( pPager->tempFile ) return SQLITE_OK; if( pPager->dbSize==0 ) return SQLITE_OK; assert( pPager->zFilename && pPager->zFilename[0] ); - dc = sqlite3OsDeviceCharacteristics(pPager->fd); - if( (dc&fixedFlags)==fixedFlags ) return SQLITE_OK; rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); - if( rc==SQLITE_OK && bHasMoved ) rc = SQLITE_READONLY_DBMOVED; + if( rc==SQLITE_NOTFOUND ){ + /* If the HAS_MOVED file-control is unimplemented, assume that the file + ** has not been moved. That is the historical behavior of SQLite: prior to + ** version 3.8.3, it never checked */ + rc = SQLITE_OK; + }else if( rc==SQLITE_OK && bHasMoved ){ + rc = SQLITE_READONLY_DBMOVED; + } return rc; } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index fb6fa462ec..1ad181e740 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -555,8 +555,7 @@ int sqlite3_exec( ** file that were written at the application level might have changed ** and that adjacent bytes, even bytes within the same sector are ** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN -** and SQLITE_IOCAP_UNMOVABLE_WHEN_OPEN flags indicate that a file -** cannot be deleted or renamed when open, respectively. +** flag indicate that a file cannot be deleted when open. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -571,7 +570,6 @@ int sqlite3_exec( #define SQLITE_IOCAP_SEQUENTIAL 0x00000400 #define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 -#define SQLITE_IOCAP_UNMOVABLE_WHEN_OPEN 0x00002000 /* ** CAPI3REF: File Locking Levels From 9dcc7cd5276bcf371016b2387881718a591b4064 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 7 Dec 2013 17:01:23 +0000 Subject: [PATCH 09/43] Increase the version number to 3.8.3. FossilOrigin-Name: 23d00f22872a907a8ebf5b80689ff7aa66686a07 --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 15 +++++++-------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/VERSION b/VERSION index a08ffae0ca..269aa9c86d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.8.2 +3.8.3 diff --git a/configure b/configure index d4bbd2d9be..2403018bb8 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.62 for sqlite 3.8.2. +# Generated by GNU Autoconf 2.62 for sqlite 3.8.3. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. @@ -743,8 +743,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.8.2' -PACKAGE_STRING='sqlite 3.8.2' +PACKAGE_VERSION='3.8.3' +PACKAGE_STRING='sqlite 3.8.3' PACKAGE_BUGREPORT='' # Factoring default headers for most tests. @@ -1483,7 +1483,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.8.2 to adapt to many kinds of systems. +\`configure' configures sqlite 3.8.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1548,7 +1548,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.8.2:";; + short | recursive ) echo "Configuration of sqlite 3.8.3:";; esac cat <<\_ACEOF @@ -1664,7 +1664,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.8.2 +sqlite configure 3.8.3 generated by GNU Autoconf 2.62 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1678,7 +1678,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.8.2, which was +It was created by sqlite $as_me 3.8.3, which was generated by GNU Autoconf 2.62. Invocation command line was $ $0 $@ @@ -14021,7 +14021,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.8.2, which was +This file was extended by sqlite $as_me 3.8.3, which was generated by GNU Autoconf 2.62. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -14074,7 +14074,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ -sqlite config.status 3.8.2 +sqlite config.status 3.8.3 configured by $0, generated by GNU Autoconf 2.62, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/manifest b/manifest index 9d96e87ef3..7cdbd89e49 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C At\sthe\sstart\sof\seach\swrite\stransaction,\scheck\sto\ssee\sif\sthe\sdatabase\sfile\shas\nbeen\smoved,\sand\sif\sit\shas\srefuse\sto\sstart\sthe\stransaction,\sreturning\san\nSQLITE_READONLY_DBMOVED\serror\scode. -D 2013-12-07T16:56:09.769 +C Increase\sthe\sversion\snumber\sto\s3.8.3. +D 2013-12-07T17:01:23.631 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.msc bb1f271c8ee9773489c89be00f3f8ad7ed7ae8e0 F Makefile.vxworks db21ed42a01d5740e656b16f92cb5d8d5e5dd315 F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6 -F VERSION 52f7e22bfcec71a462e34194b4ae1671380fde59 +F VERSION 8ed548d87d0a27fd7d7620476f9e25f9fa742d73 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F addopcodes.awk 87ca612393d0f439550634bd2c156ea9ff6195ae F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 @@ -38,7 +38,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 0921066a13130082764ab4ab6456f7b5bebe56de F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure f97b17cd80fa428e5df4e70a36ed5b4ed21100c2 x +F configure 1673bc402f8fc95015f72c279adc5a9a668ee237 x F configure.ac 4cf9f60785143fa141b10962ccc885d973792e9a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/lemon.html 334dbf6621b8fb8790297ec1abf3cfa4621709d1 @@ -1146,8 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P b5842a70f8e26456a8f0d39539bc266f097480a4 9c59f5af7ac4908583fab85d37241f200c40f02d -R b5502e212abebd79211cbde2351c1e6b -T +closed 9c59f5af7ac4908583fab85d37241f200c40f02d +P 369a23e00644f3ff8b6a2d2ed73b8cb65e9f124b +R 0fdea442d6dfa8b801d4e6d289982778 U drh -Z aeb423432b55400118887674a2a0ba39 +Z 0e445b98f25b8020cec84ec084909f7b diff --git a/manifest.uuid b/manifest.uuid index c01ba35b04..0d9cda82d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -369a23e00644f3ff8b6a2d2ed73b8cb65e9f124b \ No newline at end of file +23d00f22872a907a8ebf5b80689ff7aa66686a07 \ No newline at end of file From 1e98310a14be3f121afe7e5cd9b1280697b9ccbe Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 8 Dec 2013 19:54:52 +0000 Subject: [PATCH 10/43] Interchange two conditions in an "if" statment in sqlite3PagerAcquire() for very slight (0.06%) overall performance increase. FossilOrigin-Name: fbcc1a3ebb016225c3580181c908a2904cc184a5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7cdbd89e49..872cd35469 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Increase\sthe\sversion\snumber\sto\s3.8.3. -D 2013-12-07T17:01:23.631 +C Interchange\stwo\sconditions\sin\san\s"if"\sstatment\sin\ssqlite3PagerAcquire()\sfor\nvery\sslight\s(0.06%)\soverall\sperformance\sincrease. +D 2013-12-08T19:54:52.040 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -207,7 +207,7 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 4323dd0bac4f7a7037fc4cf87fb4692d17f0b108 -F src/pager.c d27dc8aaeac16c90eb0c859c074683bfc4533c41 +F src/pager.c 061d0b41354a8446256f5d765771e2a026ec8ed2 F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 369a23e00644f3ff8b6a2d2ed73b8cb65e9f124b -R 0fdea442d6dfa8b801d4e6d289982778 +P 23d00f22872a907a8ebf5b80689ff7aa66686a07 +R 8a0ad68f8a597479c8d7ee9e24cd34ea U drh -Z 0e445b98f25b8020cec84ec084909f7b +Z ef2f6bbda3376e1ee20657f75cafac8c diff --git a/manifest.uuid b/manifest.uuid index 0d9cda82d6..300c775222 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23d00f22872a907a8ebf5b80689ff7aa66686a07 \ No newline at end of file +fbcc1a3ebb016225c3580181c908a2904cc184a5 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 3138035cd5..7f79bd7eca 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5292,7 +5292,7 @@ int sqlite3PagerAcquire( if( rc!=SQLITE_OK ) goto pager_acquire_err; } - if( iFrame==0 && bMmapOk ){ + if( bMmapOk && iFrame==0 ){ void *pData = 0; rc = sqlite3OsFetch(pPager->fd, From 2a242876395de5fd87afe92c6f32b71ef90f02ae Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 8 Dec 2013 22:59:29 +0000 Subject: [PATCH 11/43] Avoid unnecessary calls to sqlite3VarintLen() from the OP_MakeRecord opcode. FossilOrigin-Name: 7a234fc3c5e7970ffe0b8d6ac33c26acb64b5c4d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 13 +++++++++---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 872cd35469..19fb8c1241 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Interchange\stwo\sconditions\sin\san\s"if"\sstatment\sin\ssqlite3PagerAcquire()\sfor\nvery\sslight\s(0.06%)\soverall\sperformance\sincrease. -D 2013-12-08T19:54:52.040 +C Avoid\sunnecessary\scalls\sto\ssqlite3VarintLen()\sfrom\sthe\sOP_MakeRecord\sopcode. +D 2013-12-08T22:59:29.482 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -280,7 +280,7 @@ F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c 54894fde8dc806d259e015ac7c9680145e725835 +F src/vdbe.c 7f51e9d422aefe6bcbaf7bf680e0d4ca9f6288cb F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 F src/vdbeInt.h 05fbda0e061dbc4aaa2709a8cccf3515c245b263 F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 23d00f22872a907a8ebf5b80689ff7aa66686a07 -R 8a0ad68f8a597479c8d7ee9e24cd34ea +P fbcc1a3ebb016225c3580181c908a2904cc184a5 +R 09b58c480760cc431d5e01573bf9e4b3 U drh -Z ef2f6bbda3376e1ee20657f75cafac8c +Z 1bf421a053293bdaa5254a0efb062c9a diff --git a/manifest.uuid b/manifest.uuid index 300c775222..d22393ad7f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbcc1a3ebb016225c3580181c908a2904cc184a5 \ No newline at end of file +7a234fc3c5e7970ffe0b8d6ac33c26acb64b5c4d \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 8ae4ce484c..b0b56c4567 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2608,7 +2608,7 @@ case OP_MakeRecord: { serial_type = sqlite3VdbeSerialType(pRec, file_format); len = sqlite3VdbeSerialTypeLen(serial_type); nData += len; - nHdr += sqlite3VarintLen(serial_type); + nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type); if( pRec->flags & MEM_Zero ){ /* Only pure zero-filled BLOBs can be input to this Opcode. ** We do not allow blobs with a prefix and a zero-filled tail. */ @@ -2619,9 +2619,14 @@ case OP_MakeRecord: { } /* Add the initial header varint and total the size */ - nHdr += nVarint = sqlite3VarintLen(nHdr); - if( nVarintdb->aLimit[SQLITE_LIMIT_LENGTH] ){ From 59bf00cb54fa87425444013fb732f68be69f71a1 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 8 Dec 2013 23:33:28 +0000 Subject: [PATCH 12/43] Another simplification to the OP_MakeRecord opcode, making it slightly faster and very slightly smaller. FossilOrigin-Name: f2f5a3ce9d075c4b1ac586c5db3a623d9035402d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 29 +++++++++++++++++++---------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 19fb8c1241..65c6431388 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sunnecessary\scalls\sto\ssqlite3VarintLen()\sfrom\sthe\sOP_MakeRecord\sopcode. -D 2013-12-08T22:59:29.482 +C Another\ssimplification\sto\sthe\sOP_MakeRecord\sopcode,\smaking\sit\sslightly\nfaster\sand\svery\sslightly\ssmaller. +D 2013-12-08T23:33:28.824 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -280,7 +280,7 @@ F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c 7f51e9d422aefe6bcbaf7bf680e0d4ca9f6288cb +F src/vdbe.c 6ccb107de55a34b7676a9eaa0aeb827015723fa4 F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 F src/vdbeInt.h 05fbda0e061dbc4aaa2709a8cccf3515c245b263 F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P fbcc1a3ebb016225c3580181c908a2904cc184a5 -R 09b58c480760cc431d5e01573bf9e4b3 +P 7a234fc3c5e7970ffe0b8d6ac33c26acb64b5c4d +R 57ac1272f14efea499bd7c6c07bb251b U drh -Z 1bf421a053293bdaa5254a0efb062c9a +Z f1f04177179428a44e2d9de7658a5211 diff --git a/manifest.uuid b/manifest.uuid index d22393ad7f..2faf99014f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7a234fc3c5e7970ffe0b8d6ac33c26acb64b5c4d \ No newline at end of file +f2f5a3ce9d075c4b1ac586c5db3a623d9035402d \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index b0b56c4567..5133591e3c 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2560,7 +2560,8 @@ case OP_MakeRecord: { int nField; /* Number of fields in the record */ char *zAffinity; /* The affinity string for the record */ int file_format; /* File format to use for encoding */ - int i; /* Space used in zNewRecord[] */ + int i; /* Space used in zNewRecord[] header */ + int j; /* Space used in zNewRecord[] content */ int len; /* Length of a field */ /* Assuming the record contains N fields, the record format looks @@ -2597,17 +2598,21 @@ case OP_MakeRecord: { /* Loop through the elements that will make up the record to figure ** out how much space is required for the new record. */ - for(pRec=pData0; pRec<=pLast; pRec++){ + assert( pData0<=pLast ); + pRec = pData0; + do{ assert( memIsValid(pRec) ); if( zAffinity ){ applyAffinity(pRec, zAffinity[pRec-pData0], encoding); } - if( pRec->flags&MEM_Zero && pRec->n>0 ){ + if( (pRec->flags&MEM_Zero)!=0 && pRec->n>0 ){ sqlite3VdbeMemExpandBlob(pRec); } serial_type = sqlite3VdbeSerialType(pRec, file_format); len = sqlite3VdbeSerialTypeLen(serial_type); nData += len; + testcase( serial_type==127 ); + testcase( serial_type==128 ); nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type); if( pRec->flags & MEM_Zero ){ /* Only pure zero-filled BLOBs can be input to this Opcode. @@ -2616,9 +2621,11 @@ case OP_MakeRecord: { }else if( len ){ nZero = 0; } - } + }while( (++pRec)<=pLast ); /* Add the initial header varint and total the size */ + testcase( nHdr==126 ); + testcase( nHdr==127 ); if( nHdr<=126 ){ /* The common case */ nHdr += 1; @@ -2645,14 +2652,16 @@ case OP_MakeRecord: { /* Write the record */ i = putVarint32(zNewRecord, nHdr); - for(pRec=pData0; pRec<=pLast; pRec++){ + j = nHdr; + assert( pData0<=pLast ); + pRec = pData0; + do{ serial_type = sqlite3VdbeSerialType(pRec, file_format); i += putVarint32(&zNewRecord[i], serial_type); /* serial type */ - } - for(pRec=pData0; pRec<=pLast; pRec++){ /* serial data */ - i += sqlite3VdbeSerialPut(&zNewRecord[i], (int)(nByte-i), pRec,file_format); - } - assert( i==nByte ); + j += sqlite3VdbeSerialPut(&zNewRecord[j], (int)(nByte-j), pRec,file_format); + }while( (++pRec)<=pLast ); + assert( i==nHdr ); + assert( j==nByte ); assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); pOut->n = (int)nByte; From 7599d4aa44a0fec270bc744457d4b3a94927d366 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 00:47:11 +0000 Subject: [PATCH 13/43] Use putVarint32() instead of putVarint() for a quantity that can never exceed 2GiB - 1. FossilOrigin-Name: 6996fb34445adedf463b66ed1f339ee1f27ce6e5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 65c6431388..d9dba027d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Another\ssimplification\sto\sthe\sOP_MakeRecord\sopcode,\smaking\sit\sslightly\nfaster\sand\svery\sslightly\ssmaller. -D 2013-12-08T23:33:28.824 +C Use\sputVarint32()\sinstead\sof\sputVarint()\sfor\sa\squantity\sthat\scan\snever\nexceed\s2GiB\s-\s1. +D 2013-12-09T00:47:11.109 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,7 +166,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 4037f58ef3f4459d0b9bb1fc1aee1136277d9ba6 +F src/btree.c 6a5f69e455804d4ace172075d284124bc816edde F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/build.c 9b40580b62916612678bdb69ce0286e39c29a862 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 7a234fc3c5e7970ffe0b8d6ac33c26acb64b5c4d -R 57ac1272f14efea499bd7c6c07bb251b +P f2f5a3ce9d075c4b1ac586c5db3a623d9035402d +R bafb04b65bbcbde5a371c6f9a8f01895 U drh -Z f1f04177179428a44e2d9de7658a5211 +Z 59e808481ed95c39c5c7f4147ae52c5f diff --git a/manifest.uuid b/manifest.uuid index 2faf99014f..7df5beacca 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f2f5a3ce9d075c4b1ac586c5db3a623d9035402d \ No newline at end of file +6996fb34445adedf463b66ed1f339ee1f27ce6e5 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index a0b6c6ba24..103093521d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5543,7 +5543,7 @@ static int fillInCell( nHeader += 4; } if( pPage->hasData ){ - nHeader += putVarint(&pCell[nHeader], nData+nZero); + nHeader += putVarint32(&pCell[nHeader], nData+nZero); }else{ nData = nZero = 0; } From 29f2bad6f0c94564522093a9feb6878fd8d893da Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 01:04:54 +0000 Subject: [PATCH 14/43] Avoid unnecessary no-op calls from getAndInitPage() to btreeInitPage() in the btree.c logic. FossilOrigin-Name: 81f5ae13b2e23daee03151d32515387b7f5ba5e5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d9dba027d2..a15d84d948 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sputVarint32()\sinstead\sof\sputVarint()\sfor\sa\squantity\sthat\scan\snever\nexceed\s2GiB\s-\s1. -D 2013-12-09T00:47:11.109 +C Avoid\sunnecessary\sno-op\scalls\sfrom\sgetAndInitPage()\sto\sbtreeInitPage()\s\nin\sthe\sbtree.c\slogic. +D 2013-12-09T01:04:54.208 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,7 +166,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 6a5f69e455804d4ace172075d284124bc816edde +F src/btree.c 368d2eaeea81254d5c7bf7e3d6c1737e08e1e10e F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/build.c 9b40580b62916612678bdb69ce0286e39c29a862 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P f2f5a3ce9d075c4b1ac586c5db3a623d9035402d -R bafb04b65bbcbde5a371c6f9a8f01895 +P 6996fb34445adedf463b66ed1f339ee1f27ce6e5 +R a6e3d012f7b111fe3cf762bd37b890b8 U drh -Z 59e808481ed95c39c5c7f4147ae52c5f +Z 69daab0d3610fce7f9ad3f7d6b1dfdc6 diff --git a/manifest.uuid b/manifest.uuid index 7df5beacca..e4ff31ef4a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6996fb34445adedf463b66ed1f339ee1f27ce6e5 \ No newline at end of file +81f5ae13b2e23daee03151d32515387b7f5ba5e5 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 103093521d..7f4e83f5f6 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1652,7 +1652,7 @@ static int getAndInitPage( rc = SQLITE_CORRUPT_BKPT; }else{ rc = btreeGetPage(pBt, pgno, ppPage, bReadonly); - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && (*ppPage)->isInit==0 ){ rc = btreeInitPage(*ppPage); if( rc!=SQLITE_OK ){ releasePage(*ppPage); From 9bb7c4ff4ff132ba7bfda7ac27c2fdf617ed64cd Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 01:58:11 +0000 Subject: [PATCH 15/43] Use memmove() rather than a home-made copy loop in dropCell() of btree.c, for a size reduction and performance improvement. FossilOrigin-Name: 78e1706804e88a0dd5dc40bee838a3a504cfa53b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 8 +------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index a15d84d948..ee8f50545e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sunnecessary\sno-op\scalls\sfrom\sgetAndInitPage()\sto\sbtreeInitPage()\s\nin\sthe\sbtree.c\slogic. -D 2013-12-09T01:04:54.208 +C Use\smemmove()\srather\sthan\sa\shome-made\scopy\sloop\sin\sdropCell()\sof\sbtree.c,\nfor\sa\ssize\sreduction\sand\sperformance\simprovement. +D 2013-12-09T01:58:11.109 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,7 +166,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 368d2eaeea81254d5c7bf7e3d6c1737e08e1e10e +F src/btree.c ac25a91a1ec94b361b09fdd99253b248ab0bbefc F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/build.c 9b40580b62916612678bdb69ce0286e39c29a862 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 6996fb34445adedf463b66ed1f339ee1f27ce6e5 -R a6e3d012f7b111fe3cf762bd37b890b8 +P 81f5ae13b2e23daee03151d32515387b7f5ba5e5 +R dff255530828faccbaffbe7aa2a8b29a U drh -Z 69daab0d3610fce7f9ad3f7d6b1dfdc6 +Z 8d4fe309cbbd963b83317f42164d5ecb diff --git a/manifest.uuid b/manifest.uuid index e4ff31ef4a..ad3f97d213 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -81f5ae13b2e23daee03151d32515387b7f5ba5e5 \ No newline at end of file +78e1706804e88a0dd5dc40bee838a3a504cfa53b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 7f4e83f5f6..df53050373 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5671,7 +5671,6 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ u32 pc; /* Offset to cell content of cell being deleted */ u8 *data; /* pPage->aData */ u8 *ptr; /* Used to move bytes around within data[] */ - u8 *endPtr; /* End of loop */ int rc; /* The return code */ int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */ @@ -5696,13 +5695,8 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ *pRC = rc; return; } - endPtr = &pPage->aCellIdx[2*pPage->nCell - 2]; - assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */ - while( ptrnCell--; + memmove(ptr, ptr+2, 2*(pPage->nCell - idx)); put2byte(&data[hdr+3], pPage->nCell); pPage->nFree += 2; } From 8f518837f952dd40930b9ed3c026c4fd6d7453ac Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 02:32:19 +0000 Subject: [PATCH 16/43] Use memmove() rather than a home-made copy loop in insertCell() too. FossilOrigin-Name: a3d796b1673ca68ced247d63c22ddcfb1f9d56ea --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 11 +---------- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index ee8f50545e..4c5b561fae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\smemmove()\srather\sthan\sa\shome-made\scopy\sloop\sin\sdropCell()\sof\sbtree.c,\nfor\sa\ssize\sreduction\sand\sperformance\simprovement. -D 2013-12-09T01:58:11.109 +C Use\smemmove()\srather\sthan\sa\shome-made\scopy\sloop\sin\sinsertCell()\stoo. +D 2013-12-09T02:32:19.333 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,7 +166,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c ac25a91a1ec94b361b09fdd99253b248ab0bbefc +F src/btree.c 432c3e22ff76e8ee1caf57ff88ba9f8af1fcfc30 F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/build.c 9b40580b62916612678bdb69ce0286e39c29a862 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 81f5ae13b2e23daee03151d32515387b7f5ba5e5 -R dff255530828faccbaffbe7aa2a8b29a +P 78e1706804e88a0dd5dc40bee838a3a504cfa53b +R 3d219561bfa9f63d670ef18564ca91c7 U drh -Z 8d4fe309cbbd963b83317f42164d5ecb +Z a11cf025d0d9777faa558f3c1da4ce10 diff --git a/manifest.uuid b/manifest.uuid index ad3f97d213..cf1f8b8cea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -78e1706804e88a0dd5dc40bee838a3a504cfa53b \ No newline at end of file +a3d796b1673ca68ced247d63c22ddcfb1f9d56ea \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index df53050373..4974d57ee5 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5733,9 +5733,6 @@ static void insertCell( int ins; /* Index in data[] where new cell pointer is inserted */ int cellOffset; /* Address of first cell pointer in data[] */ u8 *data; /* The content of the whole page */ - u8 *ptr; /* Used for moving information around in data[] */ - u8 *endPtr; /* End of the loop */ - int nSkip = (iChild ? 4 : 0); if( *pRC ) return; @@ -5786,13 +5783,7 @@ static void insertCell( if( iChild ){ put4byte(&data[idx], iChild); } - ptr = &data[end]; - endPtr = &data[ins]; - assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */ - while( ptr>endPtr ){ - *(u16*)ptr = *(u16*)&ptr[-2]; - ptr -= 2; - } + memmove(&data[ins+2], &data[ins], end-ins); put2byte(&data[ins], idx); put2byte(&data[pPage->hdrOffset+3], pPage->nCell); #ifndef SQLITE_OMIT_AUTOVACUUM From 7250c547a560edae9cbeb4f1fe666194a91fea3e Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 03:07:21 +0000 Subject: [PATCH 17/43] Avoid unnecessary (no-op) calls to sqlite3DbFree() from sqlite3VdbeMemRelease(). FossilOrigin-Name: 2d6dd7c2eb5a64f8994162b564a99ef0014b7460 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 8 +++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 4c5b561fae..643699b1c1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\smemmove()\srather\sthan\sa\shome-made\scopy\sloop\sin\sinsertCell()\stoo. -D 2013-12-09T02:32:19.333 +C Avoid\sunnecessary\s(no-op)\scalls\sto\ssqlite3DbFree()\sfrom\ssqlite3VdbeMemRelease(). +D 2013-12-09T03:07:21.713 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -286,7 +286,7 @@ F src/vdbeInt.h 05fbda0e061dbc4aaa2709a8cccf3515c245b263 F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed F src/vdbeaux.c 09b79d475f5af2b3b5068f639609d88e0ced9d95 F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde -F src/vdbemem.c 20e349d2ca928802fc8f2d42a2cc488fd6981d3f +F src/vdbemem.c f12d087d92f57fc302028ac1b45374bf8a454d7e F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 78e1706804e88a0dd5dc40bee838a3a504cfa53b -R 3d219561bfa9f63d670ef18564ca91c7 +P a3d796b1673ca68ced247d63c22ddcfb1f9d56ea +R 92833625552491c74b69254824111a37 U drh -Z a11cf025d0d9777faa558f3c1da4ce10 +Z 1f5af3845443b6f278035b5de234203a diff --git a/manifest.uuid b/manifest.uuid index cf1f8b8cea..5464ad75ae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a3d796b1673ca68ced247d63c22ddcfb1f9d56ea \ No newline at end of file +2d6dd7c2eb5a64f8994162b564a99ef0014b7460 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 51f20d4cc7..8a3acd5308 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -295,10 +295,12 @@ void sqlite3VdbeMemReleaseExternal(Mem *p){ */ void sqlite3VdbeMemRelease(Mem *p){ VdbeMemRelease(p); - sqlite3DbFree(p->db, p->zMalloc); + if( p->zMalloc ){ + sqlite3DbFree(p->db, p->zMalloc); + p->zMalloc = 0; + } p->z = 0; - p->zMalloc = 0; - p->xDel = 0; + assert( p->xDel==0 ); /* Zeroed by VdbeMemRelease() above */ } /* From 195134c6c3471f193708010244f85c83d440be8e Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 12:24:23 +0000 Subject: [PATCH 18/43] Fix an incorrect test number in the output of the speedtest1.c program. No changes to the test algorithms. FossilOrigin-Name: fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 643699b1c1..eb6e212626 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sunnecessary\s(no-op)\scalls\sto\ssqlite3DbFree()\sfrom\ssqlite3VdbeMemRelease(). -D 2013-12-09T03:07:21.713 +C Fix\san\sincorrect\stest\snumber\sin\sthe\soutput\sof\sthe\sspeedtest1.c\sprogram.\s\sNo\nchanges\sto\sthe\stest\salgorithms. +D 2013-12-09T12:24:23.629 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -821,7 +821,7 @@ F test/speed3.test d32043614c08c53eafdc80f33191d5bd9b920523 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b -F test/speedtest1.c 4f1e34b6af9af0b59ca11b57d62c3cd851990fba +F test/speedtest1.c bb3a4cc62b6cf29f5bc72c85d2bee5991e207be7 F test/spellfix.test 8c40b169b104086d8795781f670ba3c786d6d8be F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298 F test/stat.test c8eccfe8fcd3f3cfc864ce22d5b9e803a3c69940 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P a3d796b1673ca68ced247d63c22ddcfb1f9d56ea -R 92833625552491c74b69254824111a37 +P 2d6dd7c2eb5a64f8994162b564a99ef0014b7460 +R 9b7d54400c77029a626c96270fd35702 U drh -Z 1f5af3845443b6f278035b5de234203a +Z a893e863f82f8a1033dbfe922fa06c0b diff --git a/manifest.uuid b/manifest.uuid index 5464ad75ae..7d8b23433a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2d6dd7c2eb5a64f8994162b564a99ef0014b7460 \ No newline at end of file +fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 \ No newline at end of file diff --git a/test/speedtest1.c b/test/speedtest1.c index f3e79ec816..0e6b1a99c8 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -665,7 +665,7 @@ void testset_main(void){ n = sz/5; - speedtest1_begin_test(290, "%d four-ways joins", n); + speedtest1_begin_test(300, "%d four-ways joins", n); speedtest1_exec("BEGIN"); speedtest1_prepare( "SELECT t1.c FROM t1, t2, t3, t4\n" From a6353a3f64584ac73a11b4afbe5147244a64f8aa Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 19:03:26 +0000 Subject: [PATCH 19/43] Performance optimizations for sqlite3VXPrintf(). FossilOrigin-Name: 9227ad48e1612b32a3a3e9551c49890f93abc0a7 --- manifest | 20 +++++++++---------- manifest.uuid | 2 +- src/btree.c | 2 +- src/build.c | 4 ++-- src/printf.c | 52 +++++++++++++++++++++++++++++++------------------ src/sqliteInt.h | 1 + src/where.c | 4 ++-- 7 files changed, 50 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index eb6e212626..029bbd9b38 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\stest\snumber\sin\sthe\soutput\sof\sthe\sspeedtest1.c\sprogram.\s\sNo\nchanges\sto\sthe\stest\salgorithms. -D 2013-12-09T12:24:23.629 +C Performance\soptimizations\sfor\ssqlite3VXPrintf(). +D 2013-12-09T19:03:26.813 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,10 +166,10 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 432c3e22ff76e8ee1caf57ff88ba9f8af1fcfc30 +F src/btree.c 44a44aa21ee24763ddda98d9a41bd85498359ae2 F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 -F src/build.c 9b40580b62916612678bdb69ce0286e39c29a862 +F src/build.c 47ef8209e56d840d2b35b8a243c6ee567ad52bda F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd @@ -215,7 +215,7 @@ F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 -F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b +F src/printf.c aacd7f73018122689dbbe89d85c2e37f737b931f F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 @@ -224,7 +224,7 @@ F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758 F src/sqlite.h.in 125dc0b76f0116f1cd6f13536db52ba981e1c5bd F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc -F src/sqliteInt.h f3a5d663fe9c6c0b2ee7fc2e20a6204eaea5bc7c +F src/sqliteInt.h c59b756b3aebefdce24ff44c4a7b3c155a3c26ee F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -293,7 +293,7 @@ F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 -F src/where.c e6a4e713abe6f995495ea53dd6a5e48f88b53883 +F src/where.c b8f3aab1e5843012895b89a183dcdd6cef0708db F src/whereInt.h 96a75c61f1d2b9d4a8e4bb17d89deb0cf7cba358 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 2d6dd7c2eb5a64f8994162b564a99ef0014b7460 -R 9b7d54400c77029a626c96270fd35702 +P fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 +R b8ab7b74939c13b89c303e9a6e5110d1 U drh -Z a893e863f82f8a1033dbfe922fa06c0b +Z 3687c2e0d19ee741a7e8e3f49ed7da21 diff --git a/manifest.uuid b/manifest.uuid index 7d8b23433a..e6e97065a9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 \ No newline at end of file +9227ad48e1612b32a3a3e9551c49890f93abc0a7 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 4974d57ee5..a03737701e 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7745,7 +7745,7 @@ static void checkAppendMsg( sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1); } if( zMsg1 ){ - sqlite3StrAccumAppend(&pCheck->errMsg, zMsg1, -1); + sqlite3StrAccumAppendAll(&pCheck->errMsg, zMsg1); } sqlite3VXPrintf(&pCheck->errMsg, 1, zFormat, ap); va_end(ap); diff --git a/src/build.c b/src/build.c index a7d5a29946..c83ce57cfa 100644 --- a/src/build.c +++ b/src/build.c @@ -3989,9 +3989,9 @@ void sqlite3UniqueConstraint( for(j=0; jnKeyCol; j++){ char *zCol = pTab->aCol[pIdx->aiColumn[j]].zName; if( j ) sqlite3StrAccumAppend(&errMsg, ", ", 2); - sqlite3StrAccumAppend(&errMsg, pTab->zName, -1); + sqlite3StrAccumAppendAll(&errMsg, pTab->zName); sqlite3StrAccumAppend(&errMsg, ".", 1); - sqlite3StrAccumAppend(&errMsg, zCol, -1); + sqlite3StrAccumAppendAll(&errMsg, zCol); } zErr = sqlite3StrAccumFinish(&errMsg); sqlite3HaltConstraint(pParse, diff --git a/src/printf.c b/src/printf.c index f9e5c6406d..011eecdfaa 100644 --- a/src/printf.c +++ b/src/printf.c @@ -148,6 +148,14 @@ void sqlite3AppendSpace(StrAccum *pAccum, int N){ } } +/* +** Set the StrAccum object to an error mode. +*/ +void setStrAccumError(StrAccum *p, u8 eError){ + p->accError = eError; + p->nAlloc = 0; +} + /* ** On machines with a small stack size, you can redefine the ** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired. @@ -359,7 +367,7 @@ void sqlite3VXPrintf( nOut = precision + 10; zOut = zExtra = sqlite3Malloc( nOut ); if( zOut==0 ){ - pAccum->accError = STRACCUM_NOMEM; + setStrAccumError(pAccum, STRACCUM_NOMEM); return; } } @@ -471,7 +479,7 @@ void sqlite3VXPrintf( if( MAX(e2,0)+precision+width > etBUFSIZE - 15 ){ bufpt = zExtra = sqlite3Malloc( MAX(e2,0)+precision+width+15 ); if( bufpt==0 ){ - pAccum->accError = STRACCUM_NOMEM; + setStrAccumError(pAccum, STRACCUM_NOMEM); return; } } @@ -606,7 +614,7 @@ void sqlite3VXPrintf( if( n>etBUFSIZE ){ bufpt = zExtra = sqlite3Malloc( n ); if( bufpt==0 ){ - pAccum->accError = STRACCUM_NOMEM; + setStrAccumError(pAccum, STRACCUM_NOMEM); return; } }else{ @@ -641,10 +649,10 @@ void sqlite3VXPrintf( struct SrcList_item *pItem = &pSrc->a[k]; assert( k>=0 && knSrc ); if( pItem->zDatabase ){ - sqlite3StrAccumAppend(pAccum, pItem->zDatabase, -1); + sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase); sqlite3StrAccumAppend(pAccum, ".", 1); } - sqlite3StrAccumAppend(pAccum, pItem->zName, -1); + sqlite3StrAccumAppendAll(pAccum, pItem->zName); length = width = 0; break; } @@ -684,21 +692,19 @@ void sqlite3VXPrintf( */ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ assert( z!=0 || N==0 ); - if( p->accError ){ - testcase(p->accError==STRACCUM_TOOBIG); - testcase(p->accError==STRACCUM_NOMEM); - return; - } - assert( p->zText!=0 || p->nChar==0 ); - if( N<=0 ){ - if( N==0 || z[0]==0 ) return; - N = sqlite3Strlen30(z); - } + assert( p->zText!=0 || p->nChar==0 || p->accError ); + assert( N>=0 ); + assert( p->accError==0 || p->nAlloc==0 ); if( p->nChar+N >= p->nAlloc ){ char *zNew; + if( p->accError ){ + testcase(p->accError==STRACCUM_TOOBIG); + testcase(p->accError==STRACCUM_NOMEM); + return; + } if( !p->useMalloc ){ - p->accError = STRACCUM_TOOBIG; N = p->nAlloc - p->nChar - 1; + setStrAccumError(p, STRACCUM_TOOBIG); if( N<=0 ){ return; } @@ -708,7 +714,7 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ szNew += N + 1; if( szNew > p->mxAlloc ){ sqlite3StrAccumReset(p); - p->accError = STRACCUM_TOOBIG; + setStrAccumError(p, STRACCUM_TOOBIG); return; }else{ p->nAlloc = (int)szNew; @@ -722,8 +728,8 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ if( zOld==0 && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar); p->zText = zNew; }else{ - p->accError = STRACCUM_NOMEM; sqlite3StrAccumReset(p); + setStrAccumError(p, STRACCUM_NOMEM); return; } } @@ -733,6 +739,14 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ p->nChar += N; } +/* +** Append the complete text of zero-terminated string z[] to the p string. +*/ +void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){ + return sqlite3StrAccumAppend(p, z, sqlite3Strlen30(z)); +} + + /* ** Finish off a string by making sure it is zero-terminated. ** Return a pointer to the resulting string. Return a NULL @@ -750,7 +764,7 @@ char *sqlite3StrAccumFinish(StrAccum *p){ if( p->zText ){ memcpy(p->zText, p->zBase, p->nChar+1); }else{ - p->accError = STRACCUM_NOMEM; + setStrAccumError(p, STRACCUM_NOMEM); } } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 8bf05a9c8e..1f10c31cb5 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3222,6 +3222,7 @@ int sqlite3OpenTempDatabase(Parse *); void sqlite3StrAccumInit(StrAccum*, char*, int, int); void sqlite3StrAccumAppend(StrAccum*,const char*,int); +void sqlite3StrAccumAppendAll(StrAccum*,const char*); void sqlite3AppendSpace(StrAccum*,int); char *sqlite3StrAccumFinish(StrAccum*); void sqlite3StrAccumReset(StrAccum*); diff --git a/src/where.c b/src/where.c index 7d3ec48dac..afe664aa02 100644 --- a/src/where.c +++ b/src/where.c @@ -2568,7 +2568,7 @@ static void explainAppendTerm( const char *zOp /* Name of the operator */ ){ if( iTerm ) sqlite3StrAccumAppend(pStr, " AND ", 5); - sqlite3StrAccumAppend(pStr, zColumn, -1); + sqlite3StrAccumAppendAll(pStr, zColumn); sqlite3StrAccumAppend(pStr, zOp, 1); sqlite3StrAccumAppend(pStr, "?", 1); } @@ -2614,7 +2614,7 @@ static char *explainIndexRange(sqlite3 *db, WhereLoop *pLoop, Table *pTab){ }else{ if( i ) sqlite3StrAccumAppend(&txt, " AND ", 5); sqlite3StrAccumAppend(&txt, "ANY(", 4); - sqlite3StrAccumAppend(&txt, z, -1); + sqlite3StrAccumAppendAll(&txt, z); sqlite3StrAccumAppend(&txt, ")", 1); } } From c65faab2e126c0c6c650420f498adf40589ee602 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 19:25:28 +0000 Subject: [PATCH 20/43] Minor performance optimizations in pager.c. FossilOrigin-Name: ba9eef5f5293633d1479e1d877bf338edb2a9471 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 14 ++++---------- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 029bbd9b38..9713b269fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimizations\sfor\ssqlite3VXPrintf(). -D 2013-12-09T19:03:26.813 +C Minor\sperformance\soptimizations\sin\spager.c. +D 2013-12-09T19:25:28.392 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -207,7 +207,7 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 4323dd0bac4f7a7037fc4cf87fb4692d17f0b108 -F src/pager.c 061d0b41354a8446256f5d765771e2a026ec8ed2 +F src/pager.c 19203eff37c099271189bf8b378a1143847b92e3 F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 -R b8ab7b74939c13b89c303e9a6e5110d1 +P 9227ad48e1612b32a3a3e9551c49890f93abc0a7 +R 2aecb7bab925cdbd0159d9e849c7e955 U drh -Z 3687c2e0d19ee741a7e8e3f49ed7da21 +Z 455daaba8769a2d87fdc74aa6d107f2c diff --git a/manifest.uuid b/manifest.uuid index e6e97065a9..c5695949d4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9227ad48e1612b32a3a3e9551c49890f93abc0a7 \ No newline at end of file +ba9eef5f5293633d1479e1d877bf338edb2a9471 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 7f79bd7eca..8cbb50ce3c 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5643,14 +5643,8 @@ static int pager_write(PgHdr *pPg){ || pPager->eState==PAGER_WRITER_DBMOD ); assert( assert_pager_state(pPager) ); - - /* If an error has been previously detected, report the same error - ** again. This should not happen, but the check provides robustness. */ - if( NEVER(pPager->errCode) ) return pPager->errCode; - - /* Higher-level routines never call this function if database is not - ** writable. But check anyway, just for robustness. */ - if( NEVER(pPager->readOnly) ) return SQLITE_PERM; + assert( pPager->errCode==0 ); + assert( pPager->readOnly==0 ); CHECK_PAGE(pPg); @@ -5779,19 +5773,19 @@ int sqlite3PagerWrite(DbPage *pDbPage){ PgHdr *pPg = pDbPage; Pager *pPager = pPg->pPager; - Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); assert( (pPg->flags & PGHDR_MMAP)==0 ); assert( pPager->eState>=PAGER_WRITER_LOCKED ); assert( pPager->eState!=PAGER_ERROR ); assert( assert_pager_state(pPager) ); - if( nPagePerSector>1 ){ + if( pPager->sectorSize > pPager->pageSize ){ Pgno nPageCount; /* Total number of pages in database file */ Pgno pg1; /* First page of the sector pPg is located on. */ int nPage = 0; /* Number of pages starting at pg1 to journal */ int ii; /* Loop counter */ int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */ + Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); /* Set the doNotSpill NOSYNC bit to 1. This is because we cannot allow ** a journal header to be written between the pages journaled by From 999cd08aae0e93ac3890f8dcf065a70378d7bb67 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 9 Dec 2013 20:42:03 +0000 Subject: [PATCH 21/43] Modify the way some internal file-controls are invoked. In order to support multi-file transactions in the zipvfs extension. FossilOrigin-Name: 32fb1784af4594161d954343e3787db702000a4d --- manifest | 27 +++++++++++++++------------ manifest.uuid | 2 +- src/backup.c | 2 +- src/pager.c | 24 +++++++++++++++--------- src/pager.h | 2 +- src/sqlite.h.in | 2 ++ src/test6.c | 8 ++++++-- test/tester.tcl | 5 ++++- 8 files changed, 45 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index eb6e212626..49f2c98b68 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\stest\snumber\sin\sthe\soutput\sof\sthe\sspeedtest1.c\sprogram.\s\sNo\nchanges\sto\sthe\stest\salgorithms. -D 2013-12-09T12:24:23.629 +C Modify\sthe\sway\ssome\sinternal\sfile-controls\sare\sinvoked.\sIn\sorder\sto\ssupport\smulti-file\stransactions\sin\sthe\szipvfs\sextension. +D 2013-12-09T20:42:03.163 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -163,7 +163,7 @@ F src/alter.c 2af0330bb1b601af7a7789bf7229675fd772a083 F src/analyze.c 581d5c18ce89c6f45d4dca65914d0de5b4dad41f F src/attach.c 0a17c9364895316ca4f52d06a97a72c0af1ae8b3 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 -F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 +F src/backup.c 6cb4c4ee1d302621eb18ad93a4216fed387b2568 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 F src/btree.c 432c3e22ff76e8ee1caf57ff88ba9f8af1fcfc30 @@ -207,8 +207,8 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 4323dd0bac4f7a7037fc4cf87fb4692d17f0b108 -F src/pager.c 061d0b41354a8446256f5d765771e2a026ec8ed2 -F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c +F src/pager.c b28711af0f595414a7017f6993d4e6f90a3d2114 +F src/pager.h 6a790b64a9ea79bc2c849bdefdd39e2344bca94a F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 @@ -221,7 +221,7 @@ F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758 -F src/sqlite.h.in 125dc0b76f0116f1cd6f13536db52ba981e1c5bd +F src/sqlite.h.in 767b7475655de093182ec3d7b1f66a0cf5f1c390 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h f3a5d663fe9c6c0b2ee7fc2e20a6204eaea5bc7c @@ -234,7 +234,7 @@ F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35 F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df F src/test5.c a6d1ac55ac054d0b2b8f37b5e655b6c92645a013 -F src/test6.c 4f958b71334695e65746d357dac77709732b28db +F src/test6.c 6884dcfb1d04c26083ffb441ab329043967c09e5 F src/test7.c 72b732baa5642f795655ba1126ea032af46ecfd2 F src/test8.c c7aab1d9fbbf54fc33d43b73aa24aa55f9eaf534 F src/test9.c bea1e8cf52aa93695487badedd6e1886c321ea60 @@ -841,7 +841,7 @@ F test/tclsqlite.test 37a61c2da7e3bfe3b8c1a2867199f6b860df5d43 F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptrigger.test 8ec228b0db5d7ebc4ee9b458fc28cb9e7873f5e1 -F test/tester.tcl 2a7cce4abf404557c09323a84a2444b189835d0f +F test/tester.tcl 08e9f317afe60d398fa900993503ecaef3295bad F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5 F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1146,7 +1146,10 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 2d6dd7c2eb5a64f8994162b564a99ef0014b7460 -R 9b7d54400c77029a626c96270fd35702 -U drh -Z a893e863f82f8a1033dbfe922fa06c0b +P fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 +R e8a2a861e9953d868791659025627e6a +T *branch * zipvfs-multifile-commit +T *sym-zipvfs-multifile-commit * +T -sym-trunk * +U dan +Z 19770b8e4b3ab930c64ec8e320e02ae3 diff --git a/manifest.uuid b/manifest.uuid index 7d8b23433a..c4279a2bfe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 \ No newline at end of file +32fb1784af4594161d954343e3787db702000a4d \ No newline at end of file diff --git a/src/backup.c b/src/backup.c index 1bac821f3f..292f3f456c 100644 --- a/src/backup.c +++ b/src/backup.c @@ -526,7 +526,7 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){ /* Sync the database file to disk. */ if( rc==SQLITE_OK ){ - rc = sqlite3PagerSync(pDestPager); + rc = sqlite3PagerSync(pDestPager, 0); } }else{ sqlite3PagerTruncateImage(pDestPager, nDestTruncate); diff --git a/src/pager.c b/src/pager.c index 7f79bd7eca..3a59ca29e1 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1249,6 +1249,7 @@ static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){ || szJ<16 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) || len>=nMaster + || len==0 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) || memcmp(aMagic, aJournalMagic, 8) @@ -2018,6 +2019,11 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ rc = pager_truncate(pPager, pPager->dbSize); } + if( rc==SQLITE_OK && bCommit && isOpen(pPager->fd) ){ + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + } + if( !pPager->exclusiveMode && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) ){ @@ -2831,7 +2837,7 @@ end_playback: if( rc==SQLITE_OK && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) ){ - rc = sqlite3PagerSync(pPager); + rc = sqlite3PagerSync(pPager, 0); } if( rc==SQLITE_OK ){ rc = pager_end_transaction(pPager, zMaster[0]!='\0', 0); @@ -6006,17 +6012,17 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ ** If successful, or if called on a pager for which it is a no-op, this ** function returns SQLITE_OK. Otherwise, an IO error code is returned. */ -int sqlite3PagerSync(Pager *pPager){ +int sqlite3PagerSync(Pager *pPager, const char *zMaster){ int rc = SQLITE_OK; + + if( isOpen(pPager->fd) ){ + void *pArg = (void*)zMaster; + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, pArg); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + } if( !pPager->noSync ){ assert( !MEMDB ); rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); - }else if( isOpen(pPager->fd) ){ - assert( !MEMDB ); - rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, 0); - if( rc==SQLITE_NOTFOUND ){ - rc = SQLITE_OK; - } } return rc; } @@ -6215,7 +6221,7 @@ int sqlite3PagerCommitPhaseOne( /* Finally, sync the database file. */ if( !noSync ){ - rc = sqlite3PagerSync(pPager); + rc = sqlite3PagerSync(pPager, zMaster); } IOTRACE(("DBSYNC %p\n", pPager)) } diff --git a/src/pager.h b/src/pager.h index 7851d28345..55988a8486 100644 --- a/src/pager.h +++ b/src/pager.h @@ -150,7 +150,7 @@ void sqlite3PagerPagecount(Pager*, int*); int sqlite3PagerBegin(Pager*, int exFlag, int); int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); int sqlite3PagerExclusiveLock(Pager*); -int sqlite3PagerSync(Pager *pPager); +int sqlite3PagerSync(Pager *pPager, const char *zMaster); int sqlite3PagerCommitPhaseTwo(Pager*); int sqlite3PagerRollback(Pager*); int sqlite3PagerOpenSavepoint(Pager *pPager, int n); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 1ad181e740..9616adcd38 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -946,6 +946,8 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_TRACE 19 #define SQLITE_FCNTL_HAS_MOVED 20 +#define SQLITE_FCNTL_COMMIT_PHASETWO 21 + /* ** CAPI3REF: Mutex Handle ** diff --git a/src/test6.c b/src/test6.c index 6ea03b0f1c..fb94363c36 100644 --- a/src/test6.c +++ b/src/test6.c @@ -409,13 +409,17 @@ static int cfRead( sqlite_int64 iOfst ){ CrashFile *pCrash = (CrashFile *)pFile; + int nCopy = (int)MIN((i64)iAmt, (pCrash->iSize - iOfst)); + + if( nCopy>0 ){ + memcpy(zBuf, &pCrash->zData[iOfst], nCopy); + } /* Check the file-size to see if this is a short-read */ - if( pCrash->iSize<(iOfst+iAmt) ){ + if( nCopyzData[iOfst], iAmt); return SQLITE_OK; } diff --git a/test/tester.tcl b/test/tester.tcl index 771ca91442..109fb310a9 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -1251,6 +1251,7 @@ proc crashsql {args} { set blocksize "" set crashdelay 1 set prngseed 0 + set opendb { sqlite3 db test.db -vfs crash } set tclbody {} set crashfile "" set dc "" @@ -1262,6 +1263,7 @@ proc crashsql {args} { set z2 [lindex $args [expr $ii+1]] if {$n>1 && [string first $z -delay]==0} {set crashdelay $z2} \ + elseif {$n>1 && [string first $z -opendb]==0} {set opendb $z2} \ elseif {$n>1 && [string first $z -seed]==0} {set prngseed $z2} \ elseif {$n>1 && [string first $z -file]==0} {set crashfile $z2} \ elseif {$n>1 && [string first $z -tclbody]==0} {set tclbody $z2} \ @@ -1283,7 +1285,7 @@ proc crashsql {args} { puts $f "sqlite3_crash_enable 1" puts $f "sqlite3_crashparams $blocksize $dc $crashdelay $cfile" puts $f "sqlite3_test_control_pending_byte $::sqlite_pending_byte" - puts $f "sqlite3 db test.db -vfs crash" + puts $f $opendb # This block sets the cache size of the main database to 10 # pages. This is done in case the build is configured to omit @@ -1291,6 +1293,7 @@ proc crashsql {args} { puts $f {db eval {SELECT * FROM sqlite_master;}} puts $f {set bt [btree_from_db db]} puts $f {btree_set_cache_size $bt 10} + if {$prngseed} { set seed [expr {$prngseed%10007+1}] # puts seed=$seed From 2a8d2261ed2859b08f5423c1d0c3903498f71d9d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 20:43:22 +0000 Subject: [PATCH 22/43] Simplify the sqlite3BtreeKeyFetch() and sqlite3BtreeDataFetch() interfaces to the storage engine. FossilOrigin-Name: bf97598592ff60fab2a06d8b31b0201200b91684 --- manifest | 12 +++++------ manifest.uuid | 2 +- src/btree.c | 56 +++++++++++---------------------------------------- 3 files changed, 19 insertions(+), 51 deletions(-) diff --git a/manifest b/manifest index 9713b269fb..63d41eac58 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sperformance\soptimizations\sin\spager.c. -D 2013-12-09T19:25:28.392 +C Simplify\sthe\ssqlite3BtreeKeyFetch()\sand\ssqlite3BtreeDataFetch()\sinterfaces\nto\sthe\sstorage\sengine. +D 2013-12-09T20:43:22.965 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,7 +166,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 44a44aa21ee24763ddda98d9a41bd85498359ae2 +F src/btree.c 09285d6ffe7d819b9656ea9b7ecf1ab949a926fb F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/build.c 47ef8209e56d840d2b35b8a243c6ee567ad52bda @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 9227ad48e1612b32a3a3e9551c49890f93abc0a7 -R 2aecb7bab925cdbd0159d9e849c7e955 +P ba9eef5f5293633d1479e1d877bf338edb2a9471 +R 11cbe9b8d7b59f7bcb32cf4280072bce U drh -Z 455daaba8769a2d87fdc74aa6d107f2c +Z c873c3f777f880d8ffd5cf3f18630860 diff --git a/manifest.uuid b/manifest.uuid index c5695949d4..4b979d210e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ba9eef5f5293633d1479e1d877bf338edb2a9471 \ No newline at end of file +bf97598592ff60fab2a06d8b31b0201200b91684 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index a03737701e..da1b91940d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4192,10 +4192,10 @@ int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ /* ** Return a pointer to payload information from the entry that the ** pCur cursor is pointing to. The pointer is to the beginning of -** the key if skipKey==0 and it points to the beginning of data if -** skipKey==1. The number of bytes of available key/data is written -** into *pAmt. If *pAmt==0, then the value returned will not be -** a valid pointer. +** the key if index btrees (pPage->intKey==0) and is the data for +** table btrees (pPage->intKey==1). The number of bytes of available +** key/data is written into *pAmt. If *pAmt==0, then the value +** returned will not be a valid pointer. ** ** This routine is an optimization. It is common for the entire key ** and data to fit on the local page and for there to be no overflow @@ -4208,41 +4208,21 @@ int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ ** page of the database. The data might change or move the next time ** any btree routine is called. */ -static const unsigned char *fetchPayload( +static const void *fetchPayload( BtCursor *pCur, /* Cursor pointing to entry to read from */ - u32 *pAmt, /* Write the number of available bytes here */ - int skipKey /* read beginning at data if this is true */ + u32 *pAmt /* Write the number of available bytes here */ ){ - unsigned char *aPayload; - MemPage *pPage; - u32 nKey; - u32 nLocal; - assert( pCur!=0 && pCur->iPage>=0 && pCur->apPage[pCur->iPage]); assert( pCur->eState==CURSOR_VALID ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); assert( cursorHoldsMutex(pCur) ); - pPage = pCur->apPage[pCur->iPage]; - assert( pCur->aiIdx[pCur->iPage]nCell ); + assert( pCur->aiIdx[pCur->iPage]apPage[pCur->iPage]->nCell ); if( pCur->info.nSize==0 ){ btreeParseCell(pCur->apPage[pCur->iPage], pCur->aiIdx[pCur->iPage], &pCur->info); } - aPayload = pCur->info.pCell; - aPayload += pCur->info.nHeader; - if( pPage->intKey ){ - nKey = 0; - }else{ - nKey = (int)pCur->info.nKey; - } - if( skipKey ){ - aPayload += nKey; - nLocal = pCur->info.nLocal - nKey; - }else{ - nLocal = pCur->info.nLocal; - assert( nLocal<=nKey ); - } - *pAmt = nLocal; - return aPayload; + *pAmt = pCur->info.nLocal; + return (void*)(pCur->info.pCell + pCur->info.nHeader); } @@ -4261,22 +4241,10 @@ static const unsigned char *fetchPayload( ** in the common case where no overflow pages are used. */ const void *sqlite3BtreeKeyFetch(BtCursor *pCur, u32 *pAmt){ - const void *p = 0; - assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); - assert( cursorHoldsMutex(pCur) ); - if( ALWAYS(pCur->eState==CURSOR_VALID) ){ - p = (const void*)fetchPayload(pCur, pAmt, 0); - } - return p; + return fetchPayload(pCur, pAmt); } const void *sqlite3BtreeDataFetch(BtCursor *pCur, u32 *pAmt){ - const void *p = 0; - assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); - assert( cursorHoldsMutex(pCur) ); - if( ALWAYS(pCur->eState==CURSOR_VALID) ){ - p = (const void*)fetchPayload(pCur, pAmt, 1); - } - return p; + return fetchPayload(pCur, pAmt); } From a2a3028d5fd74f5fc4be57ff058cfe8761240c66 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 21:06:46 +0000 Subject: [PATCH 23/43] Reduce the number of times that OP_Column calls sqlite3VdbeMemMakeWriteable(). FossilOrigin-Name: 6b51863553e51334880fb322bdf74e51e35d0e61 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 63d41eac58..60ea04f4fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\ssqlite3BtreeKeyFetch()\sand\ssqlite3BtreeDataFetch()\sinterfaces\nto\sthe\sstorage\sengine. -D 2013-12-09T20:43:22.965 +C Reduce\sthe\snumber\sof\stimes\sthat\sOP_Column\scalls\ssqlite3VdbeMemMakeWriteable(). +D 2013-12-09T21:06:46.044 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -280,7 +280,7 @@ F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c 6ccb107de55a34b7676a9eaa0aeb827015723fa4 +F src/vdbe.c 5338567d17c055b26b9b3d280bdd8aa4e8e13d3f F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 F src/vdbeInt.h 05fbda0e061dbc4aaa2709a8cccf3515c245b263 F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P ba9eef5f5293633d1479e1d877bf338edb2a9471 -R 11cbe9b8d7b59f7bcb32cf4280072bce +P bf97598592ff60fab2a06d8b31b0201200b91684 +R 30f9bdfbb15779200abce614661249ba U drh -Z c873c3f777f880d8ffd5cf3f18630860 +Z 09a9fc22866f6b8bd3a17a9239808986 diff --git a/manifest.uuid b/manifest.uuid index 4b979d210e..65b1e84f6e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bf97598592ff60fab2a06d8b31b0201200b91684 \ No newline at end of file +6b51863553e51334880fb322bdf74e51e35d0e61 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 5133591e3c..1108a85341 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2496,7 +2496,7 @@ case OP_Column: { pDest->enc = encoding; op_column_out: - rc = sqlite3VdbeMemMakeWriteable(pDest); + Deephemeralize(pDest); op_column_error: UPDATE_MAX_BLOBSIZE(pDest); REGISTER_TRACE(pOp->p3, pDest); From 401387553d0c92b6452b22e4769bdf616c34c7de Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 9 Dec 2013 21:48:49 +0000 Subject: [PATCH 24/43] Correct the VFS name as reported by the file control when explicitly using the 'win32-longpath' VFS. FossilOrigin-Name: c43b59dac1fbb67ec3a9d921005543046ad416ce --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/os_win.c | 2 +- test/win32longpath.test | 16 ++++++++++++---- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 60ea04f4fb..c03216855d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reduce\sthe\snumber\sof\stimes\sthat\sOP_Column\scalls\ssqlite3VdbeMemMakeWriteable(). -D 2013-12-09T21:06:46.044 +C Correct\sthe\sVFS\sname\sas\sreported\sby\sthe\sfile\scontrol\swhen\sexplicitly\susing\sthe\s'win32-longpath'\sVFS. +D 2013-12-09T21:48:49.439 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -206,7 +206,7 @@ F src/os.c b4ad71336fd96f97776f75587cd9e8218288f5be F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f -F src/os_win.c 4323dd0bac4f7a7037fc4cf87fb4692d17f0b108 +F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07 F src/pager.c 19203eff37c099271189bf8b378a1143847b92e3 F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c F src/parse.y acee1a9958539e21263362b194594c5255ad2fca @@ -1088,7 +1088,7 @@ F test/wherelimit.test 5e9fd41e79bb2b2d588ed999d641d9c965619b31 F test/wild001.test bca33f499866f04c24510d74baf1e578d4e44b1c F test/win32heap.test ea19770974795cff26e11575e12d422dbd16893c F test/win32lock.test 7a6bd73a5dcdee39b5bb93e92395e1773a194361 -F test/win32longpath.test e2aafc07e6990fe86c69be22a3d1a0e210cd329b +F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/without_rowid1.test aaa26da19d543cd8d3d2d0e686dfa255556c15c8 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 F test/without_rowid3.test eac3d5c8a1924725b58503a368f2cbd24fd6c8a0 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P bf97598592ff60fab2a06d8b31b0201200b91684 -R 30f9bdfbb15779200abce614661249ba -U drh -Z 09a9fc22866f6b8bd3a17a9239808986 +P 6b51863553e51334880fb322bdf74e51e35d0e61 +R 02366bc03c0aa38f7c8d01b5c92fd1d6 +U mistachkin +Z d9c38f842954179c02eb8030f4c6e2c4 diff --git a/manifest.uuid b/manifest.uuid index 65b1e84f6e..de251e1a19 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6b51863553e51334880fb322bdf74e51e35d0e61 \ No newline at end of file +c43b59dac1fbb67ec3a9d921005543046ad416ce \ No newline at end of file diff --git a/src/os_win.c b/src/os_win.c index 22052a3fe7..faa60569c9 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -3119,7 +3119,7 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ return SQLITE_OK; } case SQLITE_FCNTL_VFSNAME: { - *(char**)pArg = sqlite3_mprintf("win32"); + *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); return SQLITE_OK; } diff --git a/test/win32longpath.test b/test/win32longpath.test index 0a6a8f98e6..9e9ed359c6 100644 --- a/test/win32longpath.test +++ b/test/win32longpath.test @@ -19,11 +19,19 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix win32longpath +do_test 1.0 { + file_control_vfsname db +} win32 + db close set path [file nativename [get_pwd]] sqlite3 db [file join $path test.db] -vfs win32-longpath do_test 1.1 { + file_control_vfsname db +} win32-longpath + +do_test 1.2 { db eval { BEGIN EXCLUSIVE; CREATE TABLE t1(x); @@ -47,13 +55,13 @@ make_win32_dir $longPath(3) set fileName $longPath(3)\\test.db -do_test 1.2 { +do_test 1.3 { list [catch {sqlite3 db2 [string range $fileName 4 end]} msg] $msg } {1 {unable to open database file}} sqlite3 db3 $fileName -vfs win32-longpath -do_test 1.3 { +do_test 1.4 { db3 eval { BEGIN EXCLUSIVE; CREATE TABLE t1(x); @@ -71,13 +79,13 @@ db3 close sqlite3 db3 $fileName -vfs win32-longpath -do_test 1.4 { +do_test 1.5 { db3 eval { PRAGMA journal_mode = WAL; } } {wal} -do_test 1.5 { +do_test 1.6 { db3 eval { BEGIN EXCLUSIVE; INSERT INTO t1 VALUES(9); From 038b7bc4efec2bd7bf30c441164b3d422012453d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 9 Dec 2013 23:17:22 +0000 Subject: [PATCH 25/43] Simplifications to the OP_MakeRecord opcode and the sqlite3VdbeSerialPut() helper function. FossilOrigin-Name: 7277a769694787e0332d1a4efc02041834661e2a --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/vdbe.c | 28 +++++++++++++--------------- src/vdbeInt.h | 2 +- src/vdbeaux.c | 23 ++++------------------- src/vdbemem.c | 2 +- 6 files changed, 30 insertions(+), 47 deletions(-) diff --git a/manifest b/manifest index c03216855d..6901566020 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correct\sthe\sVFS\sname\sas\sreported\sby\sthe\sfile\scontrol\swhen\sexplicitly\susing\sthe\s'win32-longpath'\sVFS. -D 2013-12-09T21:48:49.439 +C Simplifications\sto\sthe\sOP_MakeRecord\sopcode\sand\sthe\ssqlite3VdbeSerialPut()\nhelper\sfunction. +D 2013-12-09T23:17:22.886 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -280,13 +280,13 @@ F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c 5338567d17c055b26b9b3d280bdd8aa4e8e13d3f +F src/vdbe.c 4bfb1fe75a0ad08646e9b82670691c62699bc5ee F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 -F src/vdbeInt.h 05fbda0e061dbc4aaa2709a8cccf3515c245b263 +F src/vdbeInt.h 7e38eef8f4bd7141e1638b0eacaebf9bc41b26bc F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed -F src/vdbeaux.c 09b79d475f5af2b3b5068f639609d88e0ced9d95 +F src/vdbeaux.c d64bc2a057e77aef3e2a4bc6670b80f516a36d55 F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde -F src/vdbemem.c f12d087d92f57fc302028ac1b45374bf8a454d7e +F src/vdbemem.c 2293b66374f4adf54bbdcd662c05a003318600e1 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 6b51863553e51334880fb322bdf74e51e35d0e61 -R 02366bc03c0aa38f7c8d01b5c92fd1d6 -U mistachkin -Z d9c38f842954179c02eb8030f4c6e2c4 +P c43b59dac1fbb67ec3a9d921005543046ad416ce +R c11616a6774c1e84bdec6602d7be1c45 +U drh +Z 4d30567758bc854237be3d93d5ebeaed diff --git a/manifest.uuid b/manifest.uuid index de251e1a19..fae0da29de 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c43b59dac1fbb67ec3a9d921005543046ad416ce \ No newline at end of file +7277a769694787e0332d1a4efc02041834661e2a \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 1108a85341..a0a69e8a5c 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2599,29 +2599,27 @@ case OP_MakeRecord: { ** out how much space is required for the new record. */ assert( pData0<=pLast ); - pRec = pData0; + pRec = pLast; do{ assert( memIsValid(pRec) ); if( zAffinity ){ applyAffinity(pRec, zAffinity[pRec-pData0], encoding); } - if( (pRec->flags&MEM_Zero)!=0 && pRec->n>0 ){ - sqlite3VdbeMemExpandBlob(pRec); - } serial_type = sqlite3VdbeSerialType(pRec, file_format); len = sqlite3VdbeSerialTypeLen(serial_type); + if( pRec->flags & MEM_Zero ){ + if( nData ){ + sqlite3VdbeMemExpandBlob(pRec); + }else{ + nZero += pRec->u.nZero; + len -= pRec->u.nZero; + } + } nData += len; testcase( serial_type==127 ); testcase( serial_type==128 ); nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type); - if( pRec->flags & MEM_Zero ){ - /* Only pure zero-filled BLOBs can be input to this Opcode. - ** We do not allow blobs with a prefix and a zero-filled tail. */ - nZero += pRec->u.nZero; - }else if( len ){ - nZero = 0; - } - }while( (++pRec)<=pLast ); + }while( (--pRec)>=pData0 ); /* Add the initial header varint and total the size */ testcase( nHdr==126 ); @@ -2635,7 +2633,7 @@ case OP_MakeRecord: { nHdr += nVarint; if( nVarintdb->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } @@ -2657,8 +2655,8 @@ case OP_MakeRecord: { pRec = pData0; do{ serial_type = sqlite3VdbeSerialType(pRec, file_format); - i += putVarint32(&zNewRecord[i], serial_type); /* serial type */ - j += sqlite3VdbeSerialPut(&zNewRecord[j], (int)(nByte-j), pRec,file_format); + i += putVarint32(&zNewRecord[i], serial_type); /* serial type */ + j += sqlite3VdbeSerialPut(&zNewRecord[j], pRec, file_format); /* content */ }while( (++pRec)<=pLast ); assert( i==nHdr ); assert( j==nByte ); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 371c4d6dc1..b01af20188 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -389,7 +389,7 @@ void sqlite3VdbePrintOp(FILE*, int, Op*); #endif u32 sqlite3VdbeSerialTypeLen(u32); u32 sqlite3VdbeSerialType(Mem*, int); -u32 sqlite3VdbeSerialPut(unsigned char*, int, Mem*, int); +u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, int); u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); void sqlite3VdbeDeleteAuxData(Vdbe*, int, int); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 5b5d82aed8..c610de4562 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2827,20 +2827,15 @@ static u64 floatSwap(u64 in){ ** buf. It is assumed that the caller has allocated sufficient space. ** Return the number of bytes written. ** -** nBuf is the amount of space left in buf[]. nBuf must always be -** large enough to hold the entire field. Except, if the field is -** a blob with a zero-filled tail, then buf[] might be just the right -** size to hold everything except for the zero-filled tail. If buf[] -** is only big enough to hold the non-zero prefix, then only write that -** prefix into buf[]. But if buf[] is large enough to hold both the -** prefix and the tail then write the prefix and set the tail to all -** zeros. +** nBuf is the amount of space left in buf[]. The caller is responsible +** for allocating enough space to buf[] to hold the entire field, exclusive +** of the pMem->u.nZero bytes for a MEM_Zero value. ** ** Return the number of bytes actually written into buf[]. The number ** of bytes in the zero-filled tail is included in the return value only ** if those bytes were zeroed in buf[]. */ -u32 sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_format){ +u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, int file_format){ u32 serial_type = sqlite3VdbeSerialType(pMem, file_format); u32 len; @@ -2856,7 +2851,6 @@ u32 sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_format){ v = pMem->u.i; } len = i = sqlite3VdbeSerialTypeLen(serial_type); - assert( len<=(u32)nBuf ); while( i-- ){ buf[i] = (u8)(v&0xFF); v >>= 8; @@ -2868,17 +2862,8 @@ u32 sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_format){ if( serial_type>=12 ){ assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0) == (int)sqlite3VdbeSerialTypeLen(serial_type) ); - assert( pMem->n<=nBuf ); len = pMem->n; memcpy(buf, pMem->z, len); - if( pMem->flags & MEM_Zero ){ - len += pMem->u.nZero; - assert( nBuf>=0 ); - if( len > (u32)nBuf ){ - len = (u32)nBuf; - } - memset(&buf[pMem->n], 0, len-pMem->n); - } return len; } diff --git a/src/vdbemem.c b/src/vdbemem.c index 8a3acd5308..451744291f 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1221,7 +1221,7 @@ static void recordFunc( }else{ aRet[0] = nSerial+1; sqlite3PutVarint(&aRet[1], iSerial); - sqlite3VdbeSerialPut(&aRet[1+nSerial], nVal, argv[0], file_format); + sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], file_format); sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT); sqlite3DbFree(db, aRet); } From a01abc302d98fb65239b7e6d1eda8b9e6b7ed1d5 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 10 Dec 2013 16:27:59 +0000 Subject: [PATCH 26/43] Fix handling of errors returned by the SQLITE_FCNTL_OMIT_SYNCED file-control. FossilOrigin-Name: d9a5f44f4a27336d41e60b6c3791bd018fbbff6f --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/pager.c | 6 ++++-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 49f2c98b68..5aed39add3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Modify\sthe\sway\ssome\sinternal\sfile-controls\sare\sinvoked.\sIn\sorder\sto\ssupport\smulti-file\stransactions\sin\sthe\szipvfs\sextension. -D 2013-12-09T20:42:03.163 +C Fix\shandling\sof\serrors\sreturned\sby\sthe\sSQLITE_FCNTL_OMIT_SYNCED\sfile-control. +D 2013-12-10T16:27:59.750 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -207,7 +207,7 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 4323dd0bac4f7a7037fc4cf87fb4692d17f0b108 -F src/pager.c b28711af0f595414a7017f6993d4e6f90a3d2114 +F src/pager.c 994fc67f465f4e9159263aa1489cbe608e17d236 F src/pager.h 6a790b64a9ea79bc2c849bdefdd39e2344bca94a F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -1146,10 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 -R e8a2a861e9953d868791659025627e6a -T *branch * zipvfs-multifile-commit -T *sym-zipvfs-multifile-commit * -T -sym-trunk * +P 32fb1784af4594161d954343e3787db702000a4d +R 821341bcc4c1c23a6ba2875fa8192ed8 U dan -Z 19770b8e4b3ab930c64ec8e320e02ae3 +Z 4f103f173d76892892a97e68b335b863 diff --git a/manifest.uuid b/manifest.uuid index c4279a2bfe..b73efe0768 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -32fb1784af4594161d954343e3787db702000a4d \ No newline at end of file +d9a5f44f4a27336d41e60b6c3791bd018fbbff6f \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 3a59ca29e1..395fe0070a 100644 --- a/src/pager.c +++ b/src/pager.c @@ -6020,7 +6020,7 @@ int sqlite3PagerSync(Pager *pPager, const char *zMaster){ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, pArg); if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; } - if( !pPager->noSync ){ + if( rc==SQLITE_OK && !pPager->noSync ){ assert( !MEMDB ); rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); } @@ -6350,7 +6350,9 @@ int sqlite3PagerRollback(Pager *pPager){ assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); assert( rc==SQLITE_OK || rc==SQLITE_FULL || rc==SQLITE_CORRUPT - || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR ); + || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR + || rc==SQLITE_CANTOPEN + ); /* If an error occurs during a ROLLBACK, we can no longer trust the pager ** cache. So call pager_error() on the way out to make any error persistent. From 6f68f1640d59118de8086dfad5a8d66b708125c4 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 10 Dec 2013 17:34:53 +0000 Subject: [PATCH 27/43] Use SQLITE_FCNTL_SYNC instead of SQLITE_FCNTL_SYNC_OMITTED. Add documentation in for FCNTL_SYNC and FCNTL_COMMIT_PHASETWO. FossilOrigin-Name: 46231af985a1a872d1dc3418591cbaacb0b7c249 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 2 +- src/sqlite.h.in | 36 +++++++++++++++++++++++++----------- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index dd877e2a84..c2e2f5f1bb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\schanges\sfrom\sthe\strunk. -D 2013-12-10T16:35:42.772 +C Use\sSQLITE_FCNTL_SYNC\sinstead\sof\sSQLITE_FCNTL_SYNC_OMITTED.\sAdd\sdocumentation\sin\sfor\sFCNTL_SYNC\sand\sFCNTL_COMMIT_PHASETWO. +D 2013-12-10T17:34:53.300 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -207,7 +207,7 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07 -F src/pager.c 458c580b63f7f023e9863050f938dcd6eaae026f +F src/pager.c 994b3ee3716c89707952051115d72e0bd877e7b9 F src/pager.h 6a790b64a9ea79bc2c849bdefdd39e2344bca94a F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -221,7 +221,7 @@ F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758 -F src/sqlite.h.in 767b7475655de093182ec3d7b1f66a0cf5f1c390 +F src/sqlite.h.in 592057b6b3881573c2d516bad30fb20171f16b05 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h c59b756b3aebefdce24ff44c4a7b3c155a3c26ee @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P d9a5f44f4a27336d41e60b6c3791bd018fbbff6f 7277a769694787e0332d1a4efc02041834661e2a -R 7fad7524df4e460d9aeda5901ac3e435 +P 3ee736a39d1fc175a297c5fdd0d2e1c5a9b5b18e +R 00ff1143b8ee30f4eb0b986958de8c12 U dan -Z 4d74f8c53424c0d52f5bb5be0f7994e7 +Z 4539dd639fdb6689f35ca693fd45b226 diff --git a/manifest.uuid b/manifest.uuid index 55d9c7de58..5e83f3adb2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3ee736a39d1fc175a297c5fdd0d2e1c5a9b5b18e \ No newline at end of file +46231af985a1a872d1dc3418591cbaacb0b7c249 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 36a3c762a5..d2f16d1be5 100644 --- a/src/pager.c +++ b/src/pager.c @@ -6011,7 +6011,7 @@ int sqlite3PagerSync(Pager *pPager, const char *zMaster){ if( isOpen(pPager->fd) ){ void *pArg = (void*)zMaster; - rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, pArg); + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg); if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; } if( rc==SQLITE_OK && !pPager->noSync ){ diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 9616adcd38..b9f4defed7 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -786,15 +786,29 @@ struct sqlite3_io_methods { ** additional information. ** **
  • [[SQLITE_FCNTL_SYNC_OMITTED]] -** ^(The [SQLITE_FCNTL_SYNC_OMITTED] opcode is generated internally by -** SQLite and sent to all VFSes in place of a call to the xSync method -** when the database connection has [PRAGMA synchronous] set to OFF.)^ -** Some specialized VFSes need this signal in order to operate correctly -** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most -** VFSes do not need this signal and should silently ignore this opcode. -** Applications should not call [sqlite3_file_control()] with this -** opcode as doing so may disrupt the operation of the specialized VFSes -** that do require it. +** No longer in use. +** +**
  • [[SQLITE_FCNTL_SYNC]] +** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and +** sent to the VFS immediately before the xSync method is invoked on a +** database file descriptor. Or, if the xSync method is not invoked +** because the user has configured SQLite with +** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place +** of the xSync method. In most cases, the pointer argument passed with +** this file-control is NULL. However, if the database file is being synced +** as part of a multi-database commit, the argument points to a nul-terminated +** string containing the transactions master-journal file name. VFSes that +** do not need this signal should silently ignore this opcode. Applications +** should not call [sqlite3_file_control()] with this opcode as doing so may +** disrupt the operation of the specialized VFSes that do require it. +** +**
  • [[SQLITE_FCNTL_COMMIT_PHASETWO]] +** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite +** and sent to the VFS after a transaction has been committed immediately +** but before the database is unlocked. VFSes that do not need this signal +** should silently ignore this opcode. Applications should not call +** [sqlite3_file_control()] with this opcode as doing so may disrupt the +** operation of the specialized VFSes that do require it. ** **
  • [[SQLITE_FCNTL_WIN32_AV_RETRY]] ** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic @@ -945,8 +959,8 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_MMAP_SIZE 18 #define SQLITE_FCNTL_TRACE 19 #define SQLITE_FCNTL_HAS_MOVED 20 - -#define SQLITE_FCNTL_COMMIT_PHASETWO 21 +#define SQLITE_FCNTL_SYNC 21 +#define SQLITE_FCNTL_COMMIT_PHASETWO 22 /* ** CAPI3REF: Mutex Handle From b0e7704e9f4bff5ad5213921b9e8c5a5d77698af Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 10 Dec 2013 19:49:00 +0000 Subject: [PATCH 28/43] Simplify and improve the performance of the sqlite3VdbeMemGrow() routine. FossilOrigin-Name: 48ecf18774ba9572d86696c60d87007a619d9f53 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/main.c | 3 ++- src/malloc.c | 7 ++++--- src/vdbemem.c | 46 ++++++++++++++++++++++------------------------ 5 files changed, 37 insertions(+), 37 deletions(-) diff --git a/manifest b/manifest index 6901566020..1bdefb7a11 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplifications\sto\sthe\sOP_MakeRecord\sopcode\sand\sthe\ssqlite3VdbeSerialPut()\nhelper\sfunction. -D 2013-12-09T23:17:22.886 +C Simplify\sand\simprove\sthe\sperformance\sof\sthe\ssqlite3VdbeMemGrow()\sroutine. +D 2013-12-10T19:49:00.802 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -188,8 +188,8 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303 -F src/main.c 355fc9ab213b43a4d8a96aadf2a84622e6668f0a -F src/malloc.c 543a8eb5508eaf4cadf55a9b503379eba2088128 +F src/main.c a79c8ca051a914e50d6b221d56801d47835714d8 +F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b F src/mem2.c dce31758da87ec2cfa52ba4c5df1aed6e07d8e8f @@ -286,7 +286,7 @@ F src/vdbeInt.h 7e38eef8f4bd7141e1638b0eacaebf9bc41b26bc F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed F src/vdbeaux.c d64bc2a057e77aef3e2a4bc6670b80f516a36d55 F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde -F src/vdbemem.c 2293b66374f4adf54bbdcd662c05a003318600e1 +F src/vdbemem.c a381254caef0d102b091923a309c4c3a06a65393 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P c43b59dac1fbb67ec3a9d921005543046ad416ce -R c11616a6774c1e84bdec6602d7be1c45 +P 7277a769694787e0332d1a4efc02041834661e2a +R 3ef0e61f6611b17b108322b8d504b195 U drh -Z 4d30567758bc854237be3d93d5ebeaed +Z 641e108686357e5c2dc6bc5a433b2dd9 diff --git a/manifest.uuid b/manifest.uuid index fae0da29de..fd40777301 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7277a769694787e0332d1a4efc02041834661e2a \ No newline at end of file +48ecf18774ba9572d86696c60d87007a619d9f53 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 1ba555fde8..3e9f4e0171 100644 --- a/src/main.c +++ b/src/main.c @@ -588,7 +588,8 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ db->lookaside.bEnabled = 1; db->lookaside.bMalloced = pBuf==0 ?1:0; }else{ - db->lookaside.pEnd = 0; + db->lookaside.pStart = db; + db->lookaside.pEnd = db; db->lookaside.bEnabled = 0; db->lookaside.bMalloced = 0; } diff --git a/src/malloc.c b/src/malloc.c index 799f0485d4..9c11d07767 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -433,7 +433,7 @@ void sqlite3ScratchFree(void *p){ */ #ifndef SQLITE_OMIT_LOOKASIDE static int isLookaside(sqlite3 *db, void *p){ - return p && p>=db->lookaside.pStart && plookaside.pEnd; + return p>=db->lookaside.pStart && plookaside.pEnd; } #else #define isLookaside(A,B) 0 @@ -449,8 +449,9 @@ int sqlite3MallocSize(void *p){ return sqlite3GlobalConfig.m.xSize(p); } int sqlite3DbMallocSize(sqlite3 *db, void *p){ - assert( db==0 || sqlite3_mutex_held(db->mutex) ); - if( db && isLookaside(db, p) ){ + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + if( isLookaside(db, p) ){ return db->lookaside.sz; }else{ assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) ); diff --git a/src/vdbemem.c b/src/vdbemem.c index 451744291f..6a0a66ead2 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -59,18 +59,14 @@ int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ /* ** Make sure pMem->z points to a writable allocation of at least -** n bytes. +** min(n,32) bytes. ** -** If the third argument passed to this function is true, then memory -** cell pMem must contain a string or blob. In this case the content is -** preserved. Otherwise, if the third parameter to this function is false, -** any current string or blob value may be discarded. -** -** This function sets the MEM_Dyn flag and clears any xDel callback. -** It also clears MEM_Ephem and MEM_Static. If the preserve flag is -** not set, Mem.n is zeroed. +** If the bPreserve argument is true, then copy of the content of +** pMem->z into the new allocation. pMem must be either a string or +** blob if bPreserve is true. If bPreserve is false, any prior content +** in pMem->z is discarded. */ -int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){ +int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ assert( 1 >= ((pMem->zMalloc && pMem->zMalloc==pMem->z) ? 1 : 0) + (((pMem->flags&MEM_Dyn)&&pMem->xDel) ? 1 : 0) + @@ -79,37 +75,39 @@ int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){ ); assert( (pMem->flags&MEM_RowSet)==0 ); - /* If the preserve flag is set to true, then the memory cell must already + /* If the bPreserve flag is set to true, then the memory cell must already ** contain a valid string or blob value. */ - assert( preserve==0 || pMem->flags&(MEM_Blob|MEM_Str) ); + assert( bPreserve==0 || pMem->flags&(MEM_Blob|MEM_Str) ); + testcase( bPreserve && pMem->z==0 ); - if( n<32 ) n = 32; - if( sqlite3DbMallocSize(pMem->db, pMem->zMalloc)z==pMem->zMalloc ){ + if( pMem->zMalloc==0 || sqlite3DbMallocSize(pMem->db, pMem->zMalloc)z==pMem->zMalloc ){ pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); - preserve = 0; + bPreserve = 0; }else{ sqlite3DbFree(pMem->db, pMem->zMalloc); pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); } + if( pMem->zMalloc==0 ){ + sqlite3VdbeMemRelease(pMem); + pMem->flags = MEM_Null; + return SQLITE_NOMEM; + } } - if( pMem->z && preserve && pMem->zMalloc && pMem->z!=pMem->zMalloc ){ + if( pMem->z && bPreserve && pMem->z!=pMem->zMalloc ){ memcpy(pMem->zMalloc, pMem->z, pMem->n); } - if( pMem->flags&MEM_Dyn && pMem->xDel ){ + if( (pMem->flags&MEM_Dyn)!=0 && pMem->xDel ){ assert( pMem->xDel!=SQLITE_DYNAMIC ); pMem->xDel((void *)(pMem->z)); } pMem->z = pMem->zMalloc; - if( pMem->z==0 ){ - pMem->flags = MEM_Null; - }else{ - pMem->flags &= ~(MEM_Ephem|MEM_Static); - } + pMem->flags &= ~(MEM_Ephem|MEM_Static); pMem->xDel = 0; - return (pMem->z ? SQLITE_OK : SQLITE_NOMEM); + return SQLITE_OK; } /* From 3e6c060fac1a56a67b130b49a47cc731e13125d0 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 10 Dec 2013 20:53:01 +0000 Subject: [PATCH 29/43] In the OP_MakeRecord opcode, factor out affinity changes into separate loop, for a slight performance advantage. FossilOrigin-Name: 1c6ee9b85f61e5cdb5d9b7815cddf526dc78aaa7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 14 ++++++++++---- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 1bdefb7a11..28544906b3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sand\simprove\sthe\sperformance\sof\sthe\ssqlite3VdbeMemGrow()\sroutine. -D 2013-12-10T19:49:00.802 +C In\sthe\sOP_MakeRecord\sopcode,\sfactor\sout\saffinity\schanges\sinto\sseparate\sloop,\nfor\sa\sslight\sperformance\sadvantage. +D 2013-12-10T20:53:01.865 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -280,7 +280,7 @@ F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c 4bfb1fe75a0ad08646e9b82670691c62699bc5ee +F src/vdbe.c c5b17309048f28ff79e0b65aeb72d365a3a415a1 F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 F src/vdbeInt.h 7e38eef8f4bd7141e1638b0eacaebf9bc41b26bc F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 7277a769694787e0332d1a4efc02041834661e2a -R 3ef0e61f6611b17b108322b8d504b195 +P 48ecf18774ba9572d86696c60d87007a619d9f53 +R 8c35d8f315102eab592f6f641be2ff5b U drh -Z 641e108686357e5c2dc6bc5a433b2dd9 +Z ddd4b5e4f3e2f25b93fe4a6cd498d64a diff --git a/manifest.uuid b/manifest.uuid index fd40777301..6ce25cfed9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -48ecf18774ba9572d86696c60d87007a619d9f53 \ No newline at end of file +1c6ee9b85f61e5cdb5d9b7815cddf526dc78aaa7 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index a0a69e8a5c..37851802ce 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2595,16 +2595,22 @@ case OP_MakeRecord: { pOut = &aMem[pOp->p3]; memAboutToChange(p, pOut); + /* Apply the requested affinity to all inputs + */ + assert( pData0<=pLast ); + if( zAffinity ){ + pRec = pData0; + do{ + applyAffinity(pRec, *(zAffinity++), encoding); + }while( (++pRec)<=pLast ); + } + /* Loop through the elements that will make up the record to figure ** out how much space is required for the new record. */ - assert( pData0<=pLast ); pRec = pLast; do{ assert( memIsValid(pRec) ); - if( zAffinity ){ - applyAffinity(pRec, zAffinity[pRec-pData0], encoding); - } serial_type = sqlite3VdbeSerialType(pRec, file_format); len = sqlite3VdbeSerialTypeLen(serial_type); if( pRec->flags & MEM_Zero ){ From 024045fe6ee141bb981b882e645f3f83481af12b Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 10 Dec 2013 21:38:08 +0000 Subject: [PATCH 30/43] Avoid unnecessary calls to sqlite3VdbeSerialType() from within sqlite3VdbeSerialPut(). FossilOrigin-Name: 079c04a5013074b68f7d90f1ce8bf8e7092ad8a2 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/vdbe.c | 2 +- src/vdbeInt.h | 2 +- src/vdbeaux.c | 3 +-- src/vdbemem.c | 2 +- 6 files changed, 14 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 28544906b3..73f5c3738b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sOP_MakeRecord\sopcode,\sfactor\sout\saffinity\schanges\sinto\sseparate\sloop,\nfor\sa\sslight\sperformance\sadvantage. -D 2013-12-10T20:53:01.865 +C Avoid\sunnecessary\scalls\sto\ssqlite3VdbeSerialType()\sfrom\swithin\nsqlite3VdbeSerialPut(). +D 2013-12-10T21:38:08.728 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -280,13 +280,13 @@ F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c c5b17309048f28ff79e0b65aeb72d365a3a415a1 +F src/vdbe.c 02fac31f3921b0238d0ca72c90db31eb0c91e358 F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 -F src/vdbeInt.h 7e38eef8f4bd7141e1638b0eacaebf9bc41b26bc +F src/vdbeInt.h e103e9223787cb11e0de48cefb1cdb9fef18e2e8 F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed -F src/vdbeaux.c d64bc2a057e77aef3e2a4bc6670b80f516a36d55 +F src/vdbeaux.c a66fde9e0ecf1d8b7fe60162d28bb6b95f2f6c30 F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde -F src/vdbemem.c a381254caef0d102b091923a309c4c3a06a65393 +F src/vdbemem.c dedc9ee05a9d5f7c4913ee623db8d41bdb24363f F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 48ecf18774ba9572d86696c60d87007a619d9f53 -R 8c35d8f315102eab592f6f641be2ff5b +P 1c6ee9b85f61e5cdb5d9b7815cddf526dc78aaa7 +R 362b67923e10115892fb8388984a2dc3 U drh -Z ddd4b5e4f3e2f25b93fe4a6cd498d64a +Z 43fa988f600d23d399ec0be485c6471b diff --git a/manifest.uuid b/manifest.uuid index 6ce25cfed9..f11bb639e2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c6ee9b85f61e5cdb5d9b7815cddf526dc78aaa7 \ No newline at end of file +079c04a5013074b68f7d90f1ce8bf8e7092ad8a2 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 37851802ce..7568048492 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2662,7 +2662,7 @@ case OP_MakeRecord: { do{ serial_type = sqlite3VdbeSerialType(pRec, file_format); i += putVarint32(&zNewRecord[i], serial_type); /* serial type */ - j += sqlite3VdbeSerialPut(&zNewRecord[j], pRec, file_format); /* content */ + j += sqlite3VdbeSerialPut(&zNewRecord[j], pRec, serial_type, file_format); }while( (++pRec)<=pLast ); assert( i==nHdr ); assert( j==nByte ); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index b01af20188..e493e5b85e 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -389,7 +389,7 @@ void sqlite3VdbePrintOp(FILE*, int, Op*); #endif u32 sqlite3VdbeSerialTypeLen(u32); u32 sqlite3VdbeSerialType(Mem*, int); -u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, int); +u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32, int); u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); void sqlite3VdbeDeleteAuxData(Vdbe*, int, int); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index c610de4562..a41b222950 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2835,8 +2835,7 @@ static u64 floatSwap(u64 in){ ** of bytes in the zero-filled tail is included in the return value only ** if those bytes were zeroed in buf[]. */ -u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, int file_format){ - u32 serial_type = sqlite3VdbeSerialType(pMem, file_format); +u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type, int file_format){ u32 len; /* Integer and Real */ diff --git a/src/vdbemem.c b/src/vdbemem.c index 6a0a66ead2..1d0feb6216 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1219,7 +1219,7 @@ static void recordFunc( }else{ aRet[0] = nSerial+1; sqlite3PutVarint(&aRet[1], iSerial); - sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], file_format); + sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial, file_format); sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT); sqlite3DbFree(db, aRet); } From 2dc0648a80dae86e6393f58e670336ae8f514485 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 11 Dec 2013 00:59:10 +0000 Subject: [PATCH 31/43] Do not run the tool/vdbe-compress.tcl script that generates the vdbeExecUnion object that reduces the size of the sqlite3VdbeExec() stack frame unless the SQLITE_SMALL_STACK compile-time option is specified as on of the OPTS in the makefile. The vdbeExecUnion object gets in the way of C-compiler optimizer and results in slightly slower code. FossilOrigin-Name: 4d0781473a465b4ab0a307914014f3d2ddd0ce33 --- Makefile.in | 2 +- Makefile.msc | 2 +- main.mk | 2 +- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/vdbe.c | 4 ++++ tool/vdbe-compress.tcl | 12 +++++++++++- 7 files changed, 29 insertions(+), 15 deletions(-) diff --git a/Makefile.in b/Makefile.in index a0217c4343..31e30ffc48 100644 --- a/Makefile.in +++ b/Makefile.in @@ -534,7 +534,7 @@ mptester$(EXE): sqlite3.c $(TOP)/mptest/mptest.c mkdir tsrc cp -f $(SRC) tsrc rm tsrc/sqlite.h.in tsrc/parse.y - $(TCLSH_CMD) $(TOP)/tool/vdbe-compress.tcl vdbe.new + $(TCLSH_CMD) $(TOP)/tool/vdbe-compress.tcl $(OPTS) vdbe.new mv vdbe.new tsrc/vdbe.c touch .target_source diff --git a/Makefile.msc b/Makefile.msc index 34059ea2f3..94cd38d0ae 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -911,7 +911,7 @@ mptester.exe: $(TOP)\mptest\mptest.c libsqlite3.lib $(LIBRESOBJS) sqlite3.h -mkdir tsrc for %i in ($(SRC)) do copy /Y %i tsrc del /Q tsrc\sqlite.h.in tsrc\parse.y - $(TCLSH_CMD) $(TOP)\tool\vdbe-compress.tcl < tsrc\vdbe.c > vdbe.new + $(TCLSH_CMD) $(TOP)\tool\vdbe-compress.tcl $(OPTS) < tsrc\vdbe.c > vdbe.new move vdbe.new tsrc\vdbe.c echo > .target_source diff --git a/main.mk b/main.mk index 41d1743832..a53727c904 100644 --- a/main.mk +++ b/main.mk @@ -402,7 +402,7 @@ target_source: $(SRC) $(TOP)/tool/vdbe-compress.tcl mkdir tsrc cp -f $(SRC) tsrc rm tsrc/sqlite.h.in tsrc/parse.y - tclsh $(TOP)/tool/vdbe-compress.tcl vdbe.new + tclsh $(TOP)/tool/vdbe-compress.tcl $(OPTS) vdbe.new mv vdbe.new tsrc/vdbe.c touch target_source diff --git a/manifest b/manifest index 73f5c3738b..4035017719 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Avoid\sunnecessary\scalls\sto\ssqlite3VdbeSerialType()\sfrom\swithin\nsqlite3VdbeSerialPut(). -D 2013-12-10T21:38:08.728 +C Do\snot\srun\sthe\stool/vdbe-compress.tcl\sscript\sthat\sgenerates\sthe\nvdbeExecUnion\sobject\sthat\sreduces\sthe\ssize\sof\sthe\ssqlite3VdbeExec()\nstack\sframe\sunless\sthe\sSQLITE_SMALL_STACK\scompile-time\soption\sis\nspecified\sas\son\sof\sthe\sOPTS\sin\sthe\smakefile.\s\sThe\svdbeExecUnion\sobject\ngets\sin\sthe\sway\sof\sC-compiler\soptimizer\sand\sresults\sin\sslightly\sslower\scode. +D 2013-12-11T00:59:10.395 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b +F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc bb1f271c8ee9773489c89be00f3f8ad7ed7ae8e0 +F Makefile.msc 4d4ead6b71d1bf03028fbd61da0ba0ec5e1556e1 F Makefile.vxworks db21ed42a01d5740e656b16f92cb5d8d5e5dd315 F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6 F VERSION 8ed548d87d0a27fd7d7620476f9e25f9fa742d73 @@ -142,7 +142,7 @@ F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt f439556c5ce01ced70987e5ee86549a45165d9ff -F main.mk 82fd90375561d7b66287ae5a8b09e1e027394019 +F main.mk 9f091ea7920f8b15e48c7b6e5b6fb0182577ab2e F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f F mkextw.sh d2a981497b404d6498f5ff3e3b1f3816bdfcb338 @@ -280,7 +280,7 @@ F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c 02fac31f3921b0238d0ca72c90db31eb0c91e358 +F src/vdbe.c bdc4a981fb14843e09e0a369b6b5b40b54c92489 F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 F src/vdbeInt.h e103e9223787cb11e0de48cefb1cdb9fef18e2e8 F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed @@ -1142,11 +1142,11 @@ F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43 F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d F tool/symbols.sh fec58532668296d7c7dc48be9c87f75ccdb5814f F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 -F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 +F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 1c6ee9b85f61e5cdb5d9b7815cddf526dc78aaa7 -R 362b67923e10115892fb8388984a2dc3 +P 079c04a5013074b68f7d90f1ce8bf8e7092ad8a2 +R 97669e12d755118ec7d7d468b1255e81 U drh -Z 43fa988f600d23d399ec0be485c6471b +Z 0e355cefa23a2e0a8bf13198eee4bf26 diff --git a/manifest.uuid b/manifest.uuid index f11bb639e2..ced68a138a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -079c04a5013074b68f7d90f1ce8bf8e7092ad8a2 \ No newline at end of file +4d0781473a465b4ab0a307914014f3d2ddd0ce33 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 7568048492..92c3c40fa6 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2694,6 +2694,7 @@ case OP_Count: { /* out2-prerelease */ pCrsr = p->apCsr[pOp->p1]->pCursor; assert( pCrsr ); + nEntry = 0; /* Not needed. Only used to silence a warning. */ rc = sqlite3BtreeCount(pCrsr, &nEntry); pOut->u.i = nEntry; break; @@ -4654,6 +4655,7 @@ case OP_IdxRowid: { /* out2-prerelease */ assert( pC->deferredMoveto==0 ); assert( pC->isTable==0 ); if( !pC->nullRow ){ + rowid = 0; /* Not needed. Only used to silence a warning. */ rc = sqlite3VdbeIdxRowid(db, pCrsr, &rowid); if( rc!=SQLITE_OK ){ goto abort_due_to_error; @@ -4717,6 +4719,7 @@ case OP_IdxGE: { /* jump */ #ifdef SQLITE_DEBUG { int i; for(i=0; iopcode==OP_IdxLT ){ res = -res; @@ -4777,6 +4780,7 @@ case OP_Destroy: { /* out2-prerelease */ iDb = pOp->p3; assert( iCnt==1 ); assert( (p->btreeMask & (((yDbMask)1)<aDb[iDb].pBt, pOp->p1, &iMoved); pOut->flags = MEM_Int; pOut->u.i = iMoved; diff --git a/tool/vdbe-compress.tcl b/tool/vdbe-compress.tcl index 95cc1ebf5a..a349830bcf 100644 --- a/tool/vdbe-compress.tcl +++ b/tool/vdbe-compress.tcl @@ -13,7 +13,7 @@ # Script usage: # # mv vdbe.c vdbe.c.template -# tclsh vdbe-compress.tcl vdbe.c +# tclsh vdbe-compress.tcl $CFLAGS vdbe.c # # Modifications made: # @@ -42,6 +42,16 @@ set unionDef {} ;# C code of the union set afterUnion {} ;# C code after the union set sCtr 0 ;# Context counter +# If the SQLITE_SMALL_STACK compile-time option is missing, then +# this transformation becomes a no-op. +# +if {![regexp {SQLITE_SMALL_STACK} $argv]} { + while {![eof stdin]} { + puts [gets stdin] + } + exit +} + # Read program text up to the spot where the union should be # inserted. # From 53cd96464894a49b22899455f20f76b86aef5acf Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 11 Dec 2013 02:21:19 +0000 Subject: [PATCH 32/43] Fix harmless compiler warning. FossilOrigin-Name: 2525296d919245ebb01077aad541e4ae6eab7940 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/printf.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4035017719..b7423b983a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\srun\sthe\stool/vdbe-compress.tcl\sscript\sthat\sgenerates\sthe\nvdbeExecUnion\sobject\sthat\sreduces\sthe\ssize\sof\sthe\ssqlite3VdbeExec()\nstack\sframe\sunless\sthe\sSQLITE_SMALL_STACK\scompile-time\soption\sis\nspecified\sas\son\sof\sthe\sOPTS\sin\sthe\smakefile.\s\sThe\svdbeExecUnion\sobject\ngets\sin\sthe\sway\sof\sC-compiler\soptimizer\sand\sresults\sin\sslightly\sslower\scode. -D 2013-12-11T00:59:10.395 +C Fix\sharmless\scompiler\swarning. +D 2013-12-11T02:21:19.102 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -215,7 +215,7 @@ F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 -F src/printf.c aacd7f73018122689dbbe89d85c2e37f737b931f +F src/printf.c e2f78b695b8053c23394e9ff79e3364e7308c5e4 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 079c04a5013074b68f7d90f1ce8bf8e7092ad8a2 -R 97669e12d755118ec7d7d468b1255e81 -U drh -Z 0e355cefa23a2e0a8bf13198eee4bf26 +P 4d0781473a465b4ab0a307914014f3d2ddd0ce33 +R 10ffd50a76f97bbe2373fb173610ea36 +U mistachkin +Z 53d10f2a6e8878035ff79985bd9a3564 diff --git a/manifest.uuid b/manifest.uuid index ced68a138a..522742f674 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d0781473a465b4ab0a307914014f3d2ddd0ce33 \ No newline at end of file +2525296d919245ebb01077aad541e4ae6eab7940 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index 011eecdfaa..a3c7462d55 100644 --- a/src/printf.c +++ b/src/printf.c @@ -743,7 +743,7 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ ** Append the complete text of zero-terminated string z[] to the p string. */ void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){ - return sqlite3StrAccumAppend(p, z, sqlite3Strlen30(z)); + sqlite3StrAccumAppend(p, z, sqlite3Strlen30(z)); } From a9ab481fca8e4828771c098d8ce77a0efd52684a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 11 Dec 2013 11:00:44 +0000 Subject: [PATCH 33/43] Fix harmless compiler warnings. FossilOrigin-Name: a7e5fcd66659750eb2f4675082df324e7cf35427 --- manifest | 28 ++++++++++++++-------------- manifest.uuid | 2 +- src/func.c | 4 ++-- src/pager.c | 2 +- src/printf.c | 4 ++-- src/vdbe.c | 5 ++--- src/vdbeInt.h | 2 +- src/vdbeaux.c | 2 +- src/vdbemem.c | 2 +- src/vdbetrace.c | 4 +++- 10 files changed, 28 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index b7423b983a..d9a2b68c9a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarning. -D 2013-12-11T02:21:19.102 +C Fix\sharmless\scompiler\swarnings. +D 2013-12-11T11:00:44.250 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -178,7 +178,7 @@ F src/delete.c b36db1f79ee50eaca979660c9dd36437f5410b93 F src/expr.c 31a2b65339f6c3795d4cfa5e99798cd72f9fdfdf F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 2ab0f5384b70594468ef3ac5c7ed8ca24bfd17d5 -F src/func.c ef30d26ae4d79bbc7300c74e77fd117a0ba30235 +F src/func.c fed87f35cf4da4a798b726d84abefc209b48d831 F src/global.c 1d7bb7ea8254ae6a68ed9bfaf65fcb3d1690b486 F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4 F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22 @@ -207,7 +207,7 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07 -F src/pager.c 19203eff37c099271189bf8b378a1143847b92e3 +F src/pager.c 9bca84722e29d141089881937743daf8b5f74a2b F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -215,7 +215,7 @@ F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 -F src/printf.c e2f78b695b8053c23394e9ff79e3364e7308c5e4 +F src/printf.c b2778aa160ef792ba51c9f11b743bfc015b66679 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 @@ -280,15 +280,15 @@ F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c bdc4a981fb14843e09e0a369b6b5b40b54c92489 +F src/vdbe.c 919422843c859a1db08db0c88189912dbf625fc7 F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 -F src/vdbeInt.h e103e9223787cb11e0de48cefb1cdb9fef18e2e8 +F src/vdbeInt.h a7bc268f844d75be48bb7ae16f77b418fd3c641c F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed -F src/vdbeaux.c a66fde9e0ecf1d8b7fe60162d28bb6b95f2f6c30 +F src/vdbeaux.c 74f3ad068f91d60ff56179a22610e7b0ef71e5d6 F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde -F src/vdbemem.c dedc9ee05a9d5f7c4913ee623db8d41bdb24363f +F src/vdbemem.c ac71e169dc056936f7a26ccaa808cd17456ffab1 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 -F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc +F src/vdbetrace.c 92c3d4f7a98ff59d44bf8351356ef82072f40517 F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 4d0781473a465b4ab0a307914014f3d2ddd0ce33 -R 10ffd50a76f97bbe2373fb173610ea36 -U mistachkin -Z 53d10f2a6e8878035ff79985bd9a3564 +P 2525296d919245ebb01077aad541e4ae6eab7940 +R 24f899fa4dbed59efbcdd4778a6b73ec +U drh +Z 35945f2f4af25cff5df7e46d8c3b59e8 diff --git a/manifest.uuid b/manifest.uuid index 522742f674..8281671249 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2525296d919245ebb01077aad541e4ae6eab7940 \ No newline at end of file +a7e5fcd66659750eb2f4675082df324e7cf35427 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 46c606ac06..951af97b35 100644 --- a/src/func.c +++ b/src/func.c @@ -1511,11 +1511,11 @@ static void groupConcatStep( zSep = ","; nSep = 1; } - sqlite3StrAccumAppend(pAccum, zSep, nSep); + if( nSep ) sqlite3StrAccumAppend(pAccum, zSep, nSep); } zVal = (char*)sqlite3_value_text(argv[0]); nVal = sqlite3_value_bytes(argv[0]); - sqlite3StrAccumAppend(pAccum, zVal, nVal); + if( nVal ) sqlite3StrAccumAppend(pAccum, zVal, nVal); } } static void groupConcatFinalize(sqlite3_context *context){ diff --git a/src/pager.c b/src/pager.c index 8cbb50ce3c..443a523267 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5779,7 +5779,7 @@ int sqlite3PagerWrite(DbPage *pDbPage){ assert( pPager->eState!=PAGER_ERROR ); assert( assert_pager_state(pPager) ); - if( pPager->sectorSize > pPager->pageSize ){ + if( pPager->sectorSize > (u32)pPager->pageSize ){ Pgno nPageCount; /* Total number of pages in database file */ Pgno pg1; /* First page of the sector pPg is located on. */ int nPage = 0; /* Number of pages starting at pg1 to journal */ diff --git a/src/printf.c b/src/printf.c index a3c7462d55..9be0fc9404 100644 --- a/src/printf.c +++ b/src/printf.c @@ -637,7 +637,7 @@ void sqlite3VXPrintf( } case etTOKEN: { Token *pToken = va_arg(ap, Token*); - if( pToken ){ + if( pToken && pToken->n ){ sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n); } length = width = 0; @@ -691,7 +691,7 @@ void sqlite3VXPrintf( ** Append N bytes of text from z to the StrAccum object. */ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ - assert( z!=0 || N==0 ); + assert( z!=0 ); assert( p->zText!=0 || p->nChar==0 || p->accError ); assert( N>=0 ); assert( p->accError==0 || p->nAlloc==0 ); diff --git a/src/vdbe.c b/src/vdbe.c index 92c3c40fa6..3361120933 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2662,7 +2662,7 @@ case OP_MakeRecord: { do{ serial_type = sqlite3VdbeSerialType(pRec, file_format); i += putVarint32(&zNewRecord[i], serial_type); /* serial type */ - j += sqlite3VdbeSerialPut(&zNewRecord[j], pRec, serial_type, file_format); + j += sqlite3VdbeSerialPut(&zNewRecord[j], pRec, serial_type); /* content */ }while( (++pRec)<=pLast ); assert( i==nHdr ); assert( j==nByte ); @@ -3715,7 +3715,6 @@ case OP_Found: { /* jump, in3 */ if( pOp->opcode!=OP_NoConflict ) sqlite3_found_count++; #endif - alreadyExists = 0; assert( pOp->p1>=0 && pOp->p1nCursor ); assert( pOp->p4type==P4_INT32 ); pC = p->apCsr[pOp->p1]; @@ -3723,6 +3722,7 @@ case OP_Found: { /* jump, in3 */ pIn3 = &aMem[pOp->p3]; assert( pC->pCursor!=0 ); assert( pC->isTable==0 ); + pFree = 0; /* Not needed. Only used to suppress a compiler warning. */ if( pOp->p4.i>0 ){ r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)pOp->p4.i; @@ -5353,7 +5353,6 @@ case OP_FkIfZero: { /* jump */ ** an integer. */ case OP_MemMax: { /* in2 */ - Mem *pIn1; VdbeFrame *pFrame; if( p->pFrame ){ for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index e493e5b85e..d6d71a3957 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -389,7 +389,7 @@ void sqlite3VdbePrintOp(FILE*, int, Op*); #endif u32 sqlite3VdbeSerialTypeLen(u32); u32 sqlite3VdbeSerialType(Mem*, int); -u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32, int); +u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); void sqlite3VdbeDeleteAuxData(Vdbe*, int, int); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index a41b222950..9e1eb581f0 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2835,7 +2835,7 @@ static u64 floatSwap(u64 in){ ** of bytes in the zero-filled tail is included in the return value only ** if those bytes were zeroed in buf[]. */ -u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type, int file_format){ +u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ u32 len; /* Integer and Real */ diff --git a/src/vdbemem.c b/src/vdbemem.c index 1d0feb6216..d5901b439a 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1219,7 +1219,7 @@ static void recordFunc( }else{ aRet[0] = nSerial+1; sqlite3PutVarint(&aRet[1], iSerial); - sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial, file_format); + sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial); sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT); sqlite3DbFree(db, aRet); } diff --git a/src/vdbetrace.c b/src/vdbetrace.c index 0a767261f0..d79763e9e4 100644 --- a/src/vdbetrace.c +++ b/src/vdbetrace.c @@ -90,9 +90,11 @@ char *sqlite3VdbeExpandSql( if( db->nVdbeExec>1 ){ while( *zRawSql ){ const char *zStart = zRawSql; + int n; while( *(zRawSql++)!='\n' && *zRawSql ); sqlite3StrAccumAppend(&out, "-- ", 3); - sqlite3StrAccumAppend(&out, zStart, (int)(zRawSql-zStart)); + n = (int)(zRawSql - zStart); + if( n ) sqlite3StrAccumAppend(&out, zStart, n); } }else{ while( zRawSql[0] ){ From 1d8b85bed183517991ec87e1df99bce768e4d913 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 11 Dec 2013 11:03:19 +0000 Subject: [PATCH 34/43] Have the crash-test infrastructure code in test6.c read and write the 512-byte block containing the pending-byte lock as normal. Earlier versions did not access this part of the file in order to avoid triggering an assert in os_unix.c. But the assert() has since been removed. And not reading/writing this part of the file causes problems for multiplexor tests. FossilOrigin-Name: fdc3f3fa3de1481860e1e2a819db2d6c4eb05658 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/test6.c | 4 ---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index c2e2f5f1bb..8b592a7952 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sSQLITE_FCNTL_SYNC\sinstead\sof\sSQLITE_FCNTL_SYNC_OMITTED.\sAdd\sdocumentation\sin\sfor\sFCNTL_SYNC\sand\sFCNTL_COMMIT_PHASETWO. -D 2013-12-10T17:34:53.300 +C Have\sthe\scrash-test\sinfrastructure\scode\sin\stest6.c\sread\sand\swrite\sthe\s512-byte\sblock\scontaining\sthe\spending-byte\slock\sas\snormal.\sEarlier\sversions\sdid\snot\saccess\sthis\spart\sof\sthe\sfile\sin\sorder\sto\savoid\striggering\san\sassert\sin\sos_unix.c.\sBut\sthe\sassert()\shas\ssince\sbeen\sremoved.\sAnd\snot\sreading/writing\sthis\spart\sof\sthe\sfile\scauses\sproblems\sfor\smultiplexor\stests. +D 2013-12-11T11:03:19.250 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -234,7 +234,7 @@ F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35 F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df F src/test5.c a6d1ac55ac054d0b2b8f37b5e655b6c92645a013 -F src/test6.c 6884dcfb1d04c26083ffb441ab329043967c09e5 +F src/test6.c 0c8fdf2e875ab23bb7fab6dee1a2c4c4ff03f5b0 F src/test7.c 72b732baa5642f795655ba1126ea032af46ecfd2 F src/test8.c c7aab1d9fbbf54fc33d43b73aa24aa55f9eaf534 F src/test9.c bea1e8cf52aa93695487badedd6e1886c321ea60 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 3ee736a39d1fc175a297c5fdd0d2e1c5a9b5b18e -R 00ff1143b8ee30f4eb0b986958de8c12 +P 46231af985a1a872d1dc3418591cbaacb0b7c249 +R cf82896d56fef77694a1be0de6074b9d U dan -Z 4539dd639fdb6689f35ca693fd45b226 +Z ff5d29c735004d7eb85a84bef2a95faa diff --git a/manifest.uuid b/manifest.uuid index 5e83f3adb2..fe1cfc392c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -46231af985a1a872d1dc3418591cbaacb0b7c249 \ No newline at end of file +fdc3f3fa3de1481860e1e2a819db2d6c4eb05658 \ No newline at end of file diff --git a/src/test6.c b/src/test6.c index fb94363c36..0d0cf2c2f1 100644 --- a/src/test6.c +++ b/src/test6.c @@ -173,9 +173,6 @@ static void *crash_realloc(void *p, int n){ static int writeDbFile(CrashFile *p, u8 *z, i64 iAmt, i64 iOff){ int rc = SQLITE_OK; int iSkip = 0; - if( iOff==PENDING_BYTE && (p->flags&SQLITE_OPEN_MAIN_DB) ){ - iSkip = 512; - } if( (iAmt-iSkip)>0 ){ rc = sqlite3OsWrite(p->pRealFile, &z[iSkip], (int)(iAmt-iSkip), iOff+iSkip); } @@ -643,7 +640,6 @@ static int cfOpen( for(iOff=0; iOffiSize; iOff += 512){ int nRead = (int)(pWrapper->iSize - iOff); if( nRead>512 ) nRead = 512; - if( isDb && iOff==PENDING_BYTE ) continue; rc = sqlite3OsRead(pReal, &pWrapper->zData[iOff], nRead, iOff); } }else{ From 39325bac1bc966b700270943ebb1842fc78d01be Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 11 Dec 2013 12:02:55 +0000 Subject: [PATCH 35/43] Remove an unreachable conditional inserted by the previous check-in. FossilOrigin-Name: 3e1d55f0bd84810a035bd6c54583eb373784a9a3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbetrace.c | 5 ++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index d9a2b68c9a..c1b2794c47 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2013-12-11T11:00:44.250 +C Remove\san\sunreachable\sconditional\sinserted\sby\sthe\sprevious\scheck-in. +D 2013-12-11T12:02:55.839 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -288,7 +288,7 @@ F src/vdbeaux.c 74f3ad068f91d60ff56179a22610e7b0ef71e5d6 F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde F src/vdbemem.c ac71e169dc056936f7a26ccaa808cd17456ffab1 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 -F src/vdbetrace.c 92c3d4f7a98ff59d44bf8351356ef82072f40517 +F src/vdbetrace.c f7eb148eb3b4fa3401b20024630dcb43d322e73c F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 2525296d919245ebb01077aad541e4ae6eab7940 -R 24f899fa4dbed59efbcdd4778a6b73ec +P a7e5fcd66659750eb2f4675082df324e7cf35427 +R 67c3fc3c4877c3d23735c8e7af689974 U drh -Z 35945f2f4af25cff5df7e46d8c3b59e8 +Z 7b01fedab63512666d5da7a3d79c1ff6 diff --git a/manifest.uuid b/manifest.uuid index 8281671249..5f6a386d43 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a7e5fcd66659750eb2f4675082df324e7cf35427 \ No newline at end of file +3e1d55f0bd84810a035bd6c54583eb373784a9a3 \ No newline at end of file diff --git a/src/vdbetrace.c b/src/vdbetrace.c index d79763e9e4..a7ff0a685d 100644 --- a/src/vdbetrace.c +++ b/src/vdbetrace.c @@ -90,11 +90,10 @@ char *sqlite3VdbeExpandSql( if( db->nVdbeExec>1 ){ while( *zRawSql ){ const char *zStart = zRawSql; - int n; while( *(zRawSql++)!='\n' && *zRawSql ); sqlite3StrAccumAppend(&out, "-- ", 3); - n = (int)(zRawSql - zStart); - if( n ) sqlite3StrAccumAppend(&out, zStart, n); + assert( (zRawSql - zStart) > 0 ); + sqlite3StrAccumAppend(&out, zStart, (int)(zRawSql-zStart)); } }else{ while( zRawSql[0] ){ From a81ad1758c7cc9ab8dc8e78ceacc8878db77ef52 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 11 Dec 2013 14:00:04 +0000 Subject: [PATCH 36/43] Fix a bug in the shell ".import" command: Do not end the field when an escaped double-quote occurs at the end of a CRNL line. FossilOrigin-Name: 5e239ecda0f7835ce037b38b04627a574b5854cd --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c | 7 ++++--- test/shell5.test | 19 +++++++++++++++++++ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index c1b2794c47..058f299285 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunreachable\sconditional\sinserted\sby\sthe\sprevious\scheck-in. -D 2013-12-11T12:02:55.839 +C Fix\sa\sbug\sin\sthe\sshell\s".import"\scommand:\s\sDo\snot\send\sthe\sfield\nwhen\san\sescaped\sdouble-quote\soccurs\sat\sthe\send\sof\sa\sCRNL\sline. +D 2013-12-11T14:00:04.667 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -220,7 +220,7 @@ F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a -F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758 +F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e F src/sqlite.h.in 125dc0b76f0116f1cd6f13536db52ba981e1c5bd F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc @@ -804,7 +804,7 @@ F test/shell1.test e7c0b9ebda25d5e78f0a3ea0dc4e31bb6d8098c0 F test/shell2.test e1d3790f064e50b2f973502f45750012667486df F test/shell3.test 5e8545ec72c4413a0e8d4c6be56496e3c257ca29 F test/shell4.test aa4eef8118b412d1a01477a53426ece169ea86a9 -F test/shell5.test 46c8c18d62732415c4fe084816c13d559831705e +F test/shell5.test cee83b4385f842fec1f2a0bec9ea811f35386edf F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868 F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P a7e5fcd66659750eb2f4675082df324e7cf35427 -R 67c3fc3c4877c3d23735c8e7af689974 +P 3e1d55f0bd84810a035bd6c54583eb373784a9a3 +R 7d1fbc3502ae32ded8a54ca8c1f54c36 U drh -Z 7b01fedab63512666d5da7a3d79c1ff6 +Z 2736aa335da363db578416e90c12bc54 diff --git a/manifest.uuid b/manifest.uuid index 5f6a386d43..c859518640 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e1d55f0bd84810a035bd6c54583eb373784a9a3 \ No newline at end of file +5e239ecda0f7835ce037b38b04627a574b5854cd \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 480ec5b455..7826fdf204 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1836,7 +1836,7 @@ static void csv_append_char(CSVReader *p, int c){ ** + Report syntax errors on stderr */ static char *csv_read_one_field(CSVReader *p){ - int c, pc; + int c, pc, ppc; int cSep = p->cSeparator; p->n = 0; c = fgetc(p->in); @@ -1847,7 +1847,7 @@ static char *csv_read_one_field(CSVReader *p){ if( c=='"' ){ int startLine = p->nLine; int cQuote = c; - pc = 0; + pc = ppc = 0; while( 1 ){ c = fgetc(p->in); if( c=='\n' ) p->nLine++; @@ -1859,7 +1859,7 @@ static char *csv_read_one_field(CSVReader *p){ } if( (c==cSep && pc==cQuote) || (c=='\n' && pc==cQuote) - || (c=='\n' && pc=='\r' && p->n>=2 && p->z[p->n-2]==cQuote) + || (c=='\n' && pc=='\r' && ppc==cQuote) || (c==EOF && pc==cQuote) ){ do{ p->n--; }while( p->z[p->n]!=cQuote ); @@ -1877,6 +1877,7 @@ static char *csv_read_one_field(CSVReader *p){ break; } csv_append_char(p, c); + ppc = pc; pc = c; } }else{ diff --git a/test/shell5.test b/test/shell5.test index cd3d471031..ce05a303ca 100644 --- a/test/shell5.test +++ b/test/shell5.test @@ -268,4 +268,23 @@ do_test shell5-1.9 { } {1 {} 11 | 2 x 22 | 3 {"} 33 | 4 hello 44 | 5 55 {} | 6 66 x | 7 77 {"} | 8 88 hello | {} 9 99 | x 10 110 | {"} 11 121 | hello 12 132 |} db close +# Import columns containing quoted strings +do_test shell5-1.10 { + set out [open shell5.csv w] + fconfigure $out -translation lf + puts $out {column1,column2,column3,column4} + puts $out "field1,field2,\"x3 \"\"\r\ndata\"\" 3\",field4" + puts $out "x1,x2,\"x3 \"\"\ndata\"\" 3\",x4" + close $out + forcedelete test.db + catchcmd test.db {.mode csv + CREATE TABLE t1(a,b,c,d); +.import shell5.csv t1 + } + sqlite3 db test.db + db eval {SELECT hex(c) FROM t1 ORDER BY rowid} +} {636F6C756D6E33 783320220D0A64617461222033 783320220A64617461222033} + +db close + finish_test From a3cc007df47198f501b2ae02eeafbb64d6ff0097 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2013 16:23:55 +0000 Subject: [PATCH 37/43] Simplication and optimization of error message handling. FossilOrigin-Name: 9d347f547e7ba9590b0c68edf50a14ad94a2bb92 --- manifest | 27 +++++++++++++-------------- manifest.uuid | 2 +- src/backup.c | 6 +++--- src/main.c | 10 +++------- src/sqliteInt.h | 1 + src/util.c | 23 +++++++++++------------ src/vdbeapi.c | 3 ++- src/vdbeaux.c | 4 ++-- src/vdbemem.c | 3 +++ test/capi3.test | 1 + 10 files changed, 40 insertions(+), 40 deletions(-) diff --git a/manifest b/manifest index c46916bc45..51d6982489 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_FCNTL_SYNC\sand\sSQLITE_FCNTL_COMMIT_PHASETWO\sfile-controls\nand\shave\sthe\spager\scall\sthem\sat\sappropriate\stimes.\s\sThis\sis\sneeded\sin\sorder\nto\senable\sZIPVFS\sto\sdo\smulti-file\satomic\scommits. -D 2013-12-11T15:47:39.590 +C Simplication\sand\soptimization\sof\serror\smessage\shandling. +D 2013-12-13T16:23:55.861 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -163,7 +163,7 @@ F src/alter.c 2af0330bb1b601af7a7789bf7229675fd772a083 F src/analyze.c 581d5c18ce89c6f45d4dca65914d0de5b4dad41f F src/attach.c 0a17c9364895316ca4f52d06a97a72c0af1ae8b3 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 -F src/backup.c 6cb4c4ee1d302621eb18ad93a4216fed387b2568 +F src/backup.c a729e63cf5cd1829507cb7b8e89f99b95141bb53 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 F src/btree.c 09285d6ffe7d819b9656ea9b7ecf1ab949a926fb @@ -188,7 +188,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303 -F src/main.c a79c8ca051a914e50d6b221d56801d47835714d8 +F src/main.c fafd3cd2a6c1211c29b9ef36b4af978ef01279ef F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b @@ -224,7 +224,7 @@ F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e F src/sqlite.h.in 592057b6b3881573c2d516bad30fb20171f16b05 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc -F src/sqliteInt.h c59b756b3aebefdce24ff44c4a7b3c155a3c26ee +F src/sqliteInt.h 3c1c14a551b019c94e1addcb67d92dd14a62e058 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -278,15 +278,15 @@ F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4 F src/trigger.c d84e1f3669e9a217731a14a9d472b1c7b87c87ba F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 -F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49 +F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 F src/vdbe.c 919422843c859a1db08db0c88189912dbf625fc7 F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 F src/vdbeInt.h a7bc268f844d75be48bb7ae16f77b418fd3c641c -F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed -F src/vdbeaux.c 74f3ad068f91d60ff56179a22610e7b0ef71e5d6 +F src/vdbeapi.c ce4e68ea4842cc6081046f533d088dcf01d247ad +F src/vdbeaux.c a22cbd91b24503b82690cb03324ffec9f4ef63f6 F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde -F src/vdbemem.c ac71e169dc056936f7a26ccaa808cd17456ffab1 +F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 F src/vdbetrace.c f7eb148eb3b4fa3401b20024630dcb43d322e73c F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd @@ -364,7 +364,7 @@ F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3 F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0 F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de F test/capi2.test 011c16da245fdc0106a2785035de6b242c05e738 -F test/capi3.test 56ab450125ead38846cbae7e5b6a216686c3cffa +F test/capi3.test f5eab498a0927d498e6d75c14567addb995ceccb F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 93d24621c9ff84da9da060f30431e0453db1cdb0 F test/capi3d.test 6d0fc0a86d73f42dd19a7d8b7761ab9bc02277d0 @@ -1146,8 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 5e239ecda0f7835ce037b38b04627a574b5854cd 9ff4dfe1e36b40e386858b03f36cfab8f6806fdd -R 13a0878650f79a2d1e381d073556388e -T +closed 9ff4dfe1e36b40e386858b03f36cfab8f6806fdd +P 552f94d50f08cf11f33205730fde52bc2f06cff6 +R ab0976577ee6877312e7ddd6286ed77d U drh -Z b8733cc6e30d13ae991531254c7c0f0a +Z 888310640adcc5f651502c7cdb27c0d3 diff --git a/manifest.uuid b/manifest.uuid index b6a4ded46b..b1625e6376 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -552f94d50f08cf11f33205730fde52bc2f06cff6 \ No newline at end of file +9d347f547e7ba9590b0c68edf50a14ad94a2bb92 \ No newline at end of file diff --git a/src/backup.c b/src/backup.c index 292f3f456c..4a6bc7493c 100644 --- a/src/backup.c +++ b/src/backup.c @@ -601,10 +601,10 @@ int sqlite3_backup_finish(sqlite3_backup *p){ /* Set the error code of the destination database handle. */ rc = (p->rc==SQLITE_DONE) ? SQLITE_OK : p->rc; - sqlite3Error(p->pDestDb, rc, 0); - - /* Exit the mutexes and free the backup context structure. */ if( p->pDestDb ){ + sqlite3Error(p->pDestDb, rc, 0); + + /* Exit the mutexes and free the backup context structure. */ sqlite3LeaveMutexAndCloseZombie(p->pDestDb); } sqlite3BtreeLeave(p->pSrc); diff --git a/src/main.c b/src/main.c index 3e9f4e0171..09e3bb879f 100644 --- a/src/main.c +++ b/src/main.c @@ -987,9 +987,7 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ #endif sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */ - if( db->pErr ){ - sqlite3ValueFree(db->pErr); - } + sqlite3ValueFree(db->pErr); sqlite3CloseExtensions(db); db->magic = SQLITE_MAGIC_ERROR; @@ -1871,6 +1869,7 @@ const char *sqlite3_errmsg(sqlite3 *db){ if( db->mallocFailed ){ z = sqlite3ErrStr(SQLITE_NOMEM); }else{ + testcase( db->pErr==0 ); z = (char*)sqlite3_value_text(db->pErr); assert( !db->mallocFailed ); if( z==0 ){ @@ -1912,8 +1911,7 @@ const void *sqlite3_errmsg16(sqlite3 *db){ }else{ z = sqlite3_value_text16(db->pErr); if( z==0 ){ - sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode), - SQLITE_UTF8, SQLITE_STATIC); + sqlite3Error(db, db->errCode, sqlite3ErrStr(db->errCode)); z = sqlite3_value_text16(db->pErr); } /* A malloc() may have failed within the call to sqlite3_value_text16() @@ -2627,8 +2625,6 @@ static int openDatabase( } #endif - sqlite3Error(db, rc, 0); - /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking ** mode. Doing nothing at all also makes NORMAL the default. diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1f10c31cb5..8e1436efd3 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3157,6 +3157,7 @@ const void *sqlite3ValueText(sqlite3_value*, u8); int sqlite3ValueBytes(sqlite3_value*, u8); void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, void(*)(void*)); +void sqlite3ValueSetNull(sqlite3_value*); void sqlite3ValueFree(sqlite3_value*); sqlite3_value *sqlite3ValueNew(sqlite3 *); char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); diff --git a/src/util.c b/src/util.c index 9fa2a0fbd8..362a5d8970 100644 --- a/src/util.c +++ b/src/util.c @@ -115,18 +115,17 @@ int sqlite3Strlen30(const char *z){ ** to NULL. */ void sqlite3Error(sqlite3 *db, int err_code, const char *zFormat, ...){ - if( db && (db->pErr || (db->pErr = sqlite3ValueNew(db))!=0) ){ - db->errCode = err_code; - if( zFormat ){ - char *z; - va_list ap; - va_start(ap, zFormat); - z = sqlite3VMPrintf(db, zFormat, ap); - va_end(ap); - sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC); - }else{ - sqlite3ValueSetStr(db->pErr, 0, 0, SQLITE_UTF8, SQLITE_STATIC); - } + assert( db!=0 ); + db->errCode = err_code; + if( zFormat && (db->pErr || (db->pErr = sqlite3ValueNew(db))!=0) ){ + char *z; + va_list ap; + va_start(ap, zFormat); + z = sqlite3VMPrintf(db, zFormat, ap); + va_end(ap); + sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC); + }else if( db->pErr ){ + sqlite3ValueSetNull(db->pErr); } } diff --git a/src/vdbeapi.c b/src/vdbeapi.c index d512562174..ea383dffda 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -486,7 +486,7 @@ int sqlite3_step(sqlite3_stmt *pStmt){ v->doingRerun = 1; assert( v->expired==0 ); } - if( rc2!=SQLITE_OK && ALWAYS(v->isPrepareV2) && ALWAYS(db->pErr) ){ + if( rc2!=SQLITE_OK ){ /* This case occurs after failing to recompile an sql statement. ** The error message from the SQL compiler has already been loaded ** into the database handle. This block copies the error message @@ -496,6 +496,7 @@ int sqlite3_step(sqlite3_stmt *pStmt){ ** sqlite3_errmsg() and sqlite3_errcode(). */ const char *zErr = (const char *)sqlite3_value_text(db->pErr); + assert( zErr!=0 || db->mallocFailed ); sqlite3DbFree(db, v->zErrMsg); if( !db->mallocFailed ){ v->zErrMsg = sqlite3DbStrDup(db, zErr); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 9e1eb581f0..6344c4c8fa 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2420,6 +2420,7 @@ int sqlite3VdbeTransferError(Vdbe *p){ if( p->zErrMsg ){ u8 mallocFailed = db->mallocFailed; sqlite3BeginBenignMalloc(); + if( db->pErr==0 ) db->pErr = sqlite3ValueNew(db); sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT); sqlite3EndBenignMalloc(); db->mallocFailed = mallocFailed; @@ -2488,8 +2489,7 @@ int sqlite3VdbeReset(Vdbe *p){ ** to sqlite3_step(). For consistency (since sqlite3_step() was ** called), set the database error in this case as well. */ - sqlite3Error(db, p->rc, 0); - sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT); + sqlite3Error(db, p->rc, p->zErrMsg ? "%s" : 0, p->zErrMsg); sqlite3DbFree(db, p->zErrMsg); p->zErrMsg = 0; } diff --git a/src/vdbemem.c b/src/vdbemem.c index d5901b439a..3beccd92db 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -482,6 +482,9 @@ void sqlite3VdbeMemSetNull(Mem *pMem){ MemSetTypeFlag(pMem, MEM_Null); pMem->type = SQLITE_NULL; } +void sqlite3ValueSetNull(sqlite3_value *p){ + sqlite3VdbeMemSetNull((Mem*)p); +} /* ** Delete any previous value and set the value to be a BLOB of length diff --git a/test/capi3.test b/test/capi3.test index 9d7434d25d..2dbc298fa4 100644 --- a/test/capi3.test +++ b/test/capi3.test @@ -1191,6 +1191,7 @@ do_test capi3-18.2 { sqlite3_reset $STMT sqlite3_errcode db } {SQLITE_SCHEMA} +breakpoint do_test capi3-18.3 { sqlite3_errmsg db } {database schema has changed} From 40f22bed06e6002a73a2049a8bb6abd844f2aaf1 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2013 16:42:18 +0000 Subject: [PATCH 38/43] Avoid unnecessary calls to sqlite3_free() from within sqlite3VXPrintf(). FossilOrigin-Name: e2a8b280e84c1f8fd6106d9427e1ad6cbcfccd10 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/printf.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 51d6982489..9255f89b3a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplication\sand\soptimization\sof\serror\smessage\shandling. -D 2013-12-13T16:23:55.861 +C Avoid\sunnecessary\scalls\sto\ssqlite3_free()\sfrom\swithin\ssqlite3VXPrintf(). +D 2013-12-13T16:42:18.070 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -215,7 +215,7 @@ F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 -F src/printf.c b2778aa160ef792ba51c9f11b743bfc015b66679 +F src/printf.c ba8b28e9d4ce984430e9f33f6ef1c85a1826d1dd F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 552f94d50f08cf11f33205730fde52bc2f06cff6 -R ab0976577ee6877312e7ddd6286ed77d +P 9d347f547e7ba9590b0c68edf50a14ad94a2bb92 +R b5a32784d4c7409fae006d7d9202782e U drh -Z 888310640adcc5f651502c7cdb27c0d3 +Z f8a864e171b1e45dee7c898a5141e356 diff --git a/manifest.uuid b/manifest.uuid index b1625e6376..604bc728a0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9d347f547e7ba9590b0c68edf50a14ad94a2bb92 \ No newline at end of file +e2a8b280e84c1f8fd6106d9427e1ad6cbcfccd10 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index 9be0fc9404..3279a54f21 100644 --- a/src/printf.c +++ b/src/printf.c @@ -683,7 +683,7 @@ void sqlite3VXPrintf( sqlite3AppendSpace(pAccum, nspace); } } - sqlite3_free(zExtra); + if( zExtra ) sqlite3_free(zExtra); }/* End for loop over the format string */ } /* End of function */ From 5d56dd2867c242e9868def654cddc2a160c77c7f Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2013 18:50:40 +0000 Subject: [PATCH 39/43] Enhance the pcache1PinPage() routine so that it called much less often and runs much faster in the cases when it is actually called. FossilOrigin-Name: a845779cd31aec3204a6a9c776bd9c9f7d47dd24 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pcache1.c | 53 ++++++++++++++++++++++++++++++--------------------- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 9255f89b3a..89fa59f993 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sunnecessary\scalls\sto\ssqlite3_free()\sfrom\swithin\ssqlite3VXPrintf(). -D 2013-12-13T16:42:18.070 +C Enhance\sthe\spcache1PinPage()\sroutine\sso\sthat\sit\scalled\smuch\sless\soften\sand\nruns\smuch\sfaster\sin\sthe\scases\swhen\sit\sis\sactually\scalled. +D 2013-12-13T18:50:40.859 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -212,7 +212,7 @@ F src/pager.h 6a790b64a9ea79bc2c849bdefdd39e2344bca94a F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 -F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 +F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 F src/printf.c ba8b28e9d4ce984430e9f33f6ef1c85a1826d1dd @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 9d347f547e7ba9590b0c68edf50a14ad94a2bb92 -R b5a32784d4c7409fae006d7d9202782e +P e2a8b280e84c1f8fd6106d9427e1ad6cbcfccd10 +R 47d549dcdf3ed528411247342cb19e3a U drh -Z f8a864e171b1e45dee7c898a5141e356 +Z da9f1c1b1e757ffeeb8c40974d788c01 diff --git a/manifest.uuid b/manifest.uuid index 604bc728a0..18544568b9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e2a8b280e84c1f8fd6106d9427e1ad6cbcfccd10 \ No newline at end of file +a845779cd31aec3204a6a9c776bd9c9f7d47dd24 \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index df9d877537..f173e23fe3 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -96,6 +96,7 @@ struct PCache1 { struct PgHdr1 { sqlite3_pcache_page page; unsigned int iKey; /* Key value (page number) */ + u8 isPinned; /* Page in use, not on the LRU list */ PgHdr1 *pNext; /* Next in hash table chain */ PCache1 *pCache; /* Cache that currently owns this page */ PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ @@ -424,34 +425,32 @@ static int pcache1ResizeHash(PCache1 *p){ ** LRU list, then this function is a no-op. ** ** The PGroup mutex must be held when this function is called. -** -** If pPage is NULL then this routine is a no-op. */ static void pcache1PinPage(PgHdr1 *pPage){ PCache1 *pCache; PGroup *pGroup; - if( pPage==0 ) return; + assert( pPage!=0 ); + assert( pPage->isPinned==0 ); pCache = pPage->pCache; pGroup = pCache->pGroup; + assert( pPage->pLruNext || pPage==pGroup->pLruTail ); + assert( pPage->pLruPrev || pPage==pGroup->pLruHead ); assert( sqlite3_mutex_held(pGroup->mutex) ); - if( pPage->pLruNext || pPage==pGroup->pLruTail ){ - if( pPage->pLruPrev ){ - pPage->pLruPrev->pLruNext = pPage->pLruNext; - } - if( pPage->pLruNext ){ - pPage->pLruNext->pLruPrev = pPage->pLruPrev; - } - if( pGroup->pLruHead==pPage ){ - pGroup->pLruHead = pPage->pLruNext; - } - if( pGroup->pLruTail==pPage ){ - pGroup->pLruTail = pPage->pLruPrev; - } - pPage->pLruNext = 0; - pPage->pLruPrev = 0; - pPage->pCache->nRecyclable--; + if( pPage->pLruPrev ){ + pPage->pLruPrev->pLruNext = pPage->pLruNext; + }else{ + pGroup->pLruHead = pPage->pLruNext; } + if( pPage->pLruNext ){ + pPage->pLruNext->pLruPrev = pPage->pLruPrev; + }else{ + pGroup->pLruTail = pPage->pLruPrev; + } + pPage->pLruNext = 0; + pPage->pLruPrev = 0; + pPage->isPinned = 1; + pCache->nRecyclable--; } @@ -483,6 +482,7 @@ static void pcache1EnforceMaxPage(PGroup *pGroup){ while( pGroup->nCurrentPage>pGroup->nMaxPage && pGroup->pLruTail ){ PgHdr1 *p = pGroup->pLruTail; assert( p->pCache->pGroup==pGroup ); + assert( p->isPinned==0 ); pcache1PinPage(p); pcache1RemoveFromHash(p); pcache1FreePage(p); @@ -510,7 +510,7 @@ static void pcache1TruncateUnsafe( if( pPage->iKey>=iLimit ){ pCache->nPage--; *pp = pPage->pNext; - pcache1PinPage(pPage); + if( !pPage->isPinned ) pcache1PinPage(pPage); pcache1FreePage(pPage); }else{ pp = &pPage->pNext; @@ -733,8 +733,11 @@ static sqlite3_pcache_page *pcache1Fetch( } /* Step 2: Abort if no existing page is found and createFlag is 0 */ - if( pPage || createFlag==0 ){ - pcache1PinPage(pPage); + if( pPage ){ + if( !pPage->isPinned ) pcache1PinPage(pPage); + goto fetch_out; + } + if( createFlag==0 ){ goto fetch_out; } @@ -775,6 +778,7 @@ static sqlite3_pcache_page *pcache1Fetch( )){ PCache1 *pOther; pPage = pGroup->pLruTail; + assert( pPage->isPinned==0 ); pcache1RemoveFromHash(pPage); pcache1PinPage(pPage); pOther = pPage->pCache; @@ -811,6 +815,7 @@ static sqlite3_pcache_page *pcache1Fetch( pPage->pCache = pCache; pPage->pLruPrev = 0; pPage->pLruNext = 0; + pPage->isPinned = 1; *(void **)pPage->page.pExtra = 0; pCache->apHash[h] = pPage; } @@ -846,6 +851,7 @@ static void pcache1Unpin( */ assert( pPage->pLruPrev==0 && pPage->pLruNext==0 ); assert( pGroup->pLruHead!=pPage && pGroup->pLruTail!=pPage ); + assert( pPage->isPinned==1 ); if( reuseUnlikely || pGroup->nCurrentPage>pGroup->nMaxPage ){ pcache1RemoveFromHash(pPage); @@ -861,6 +867,7 @@ static void pcache1Unpin( pGroup->pLruHead = pPage; } pCache->nRecyclable++; + pPage->isPinned = 0; } pcache1LeaveMutex(pCache->pGroup); @@ -987,6 +994,7 @@ int sqlite3PcacheReleaseMemory(int nReq){ #ifdef SQLITE_PCACHE_SEPARATE_HEADER nFree += sqlite3MemSize(p); #endif + assert( p->isPinned==0 ); pcache1PinPage(p); pcache1RemoveFromHash(p); pcache1FreePage(p); @@ -1011,6 +1019,7 @@ void sqlite3PcacheStats( PgHdr1 *p; int nRecyclable = 0; for(p=pcache1.grp.pLruHead; p; p=p->pLruNext){ + assert( p->isPinned==0 ); nRecyclable++; } *pnCurrent = pcache1.grp.nCurrentPage; From da8a330a03671577a982a5f1769d49f4016c1bb9 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2013 19:35:21 +0000 Subject: [PATCH 40/43] Create and use a new pager interface sqlite3PagerUnrefNotNull() that works just like sqlite3PagerUnref() but guarantees that its argument is not a NULL pointer. FossilOrigin-Name: e00f37e2333cac5b53e17cf764ab56c4fcd5f617 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 3 ++- src/pager.c | 35 +++++++++++++++++++---------------- src/pager.h | 1 + 5 files changed, 31 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index 89fa59f993..fd21bd9f9c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\spcache1PinPage()\sroutine\sso\sthat\sit\scalled\smuch\sless\soften\sand\nruns\smuch\sfaster\sin\sthe\scases\swhen\sit\sis\sactually\scalled. -D 2013-12-13T18:50:40.859 +C Create\sand\suse\sa\snew\spager\sinterface\ssqlite3PagerUnrefNotNull()\sthat\sworks\njust\slike\ssqlite3PagerUnref()\sbut\sguarantees\sthat\sits\sargument\sis\snot\sa\nNULL\spointer. +D 2013-12-13T19:35:21.600 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -166,7 +166,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c a729e63cf5cd1829507cb7b8e89f99b95141bb53 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 09285d6ffe7d819b9656ea9b7ecf1ab949a926fb +F src/btree.c 11e29ef8cf16a42925fde036bcffbeffd9cc82df F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/build.c 47ef8209e56d840d2b35b8a243c6ee567ad52bda @@ -207,8 +207,8 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07 -F src/pager.c 95a568497d789d5729927fca93fec653c485df45 -F src/pager.h 6a790b64a9ea79bc2c849bdefdd39e2344bca94a +F src/pager.c 4757194b2f1ffd65a5fc45a3df4d38acc41fb7b3 +F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428 F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P e2a8b280e84c1f8fd6106d9427e1ad6cbcfccd10 -R 47d549dcdf3ed528411247342cb19e3a +P a845779cd31aec3204a6a9c776bd9c9f7d47dd24 +R 0519b15291565e2dff816e0cb01e063b U drh -Z da9f1c1b1e757ffeeb8c40974d788c01 +Z 0b683c4f7d4e0f307681d123364409c6 diff --git a/manifest.uuid b/manifest.uuid index 18544568b9..012c3325a0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a845779cd31aec3204a6a9c776bd9c9f7d47dd24 \ No newline at end of file +e00f37e2333cac5b53e17cf764ab56c4fcd5f617 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index da1b91940d..20bed057e1 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1673,10 +1673,11 @@ static void releasePage(MemPage *pPage){ if( pPage ){ assert( pPage->aData ); assert( pPage->pBt ); + assert( pPage->pDbPage!=0 ); assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - sqlite3PagerUnref(pPage->pDbPage); + sqlite3PagerUnrefNotNull(pPage->pDbPage); } } diff --git a/src/pager.c b/src/pager.c index b4988cece7..caa41fe9eb 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1990,7 +1990,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ PgHdr *p = pager_lookup(pPager, 1); if( p ){ p->pageHash = 0; - sqlite3PagerUnref(p); + sqlite3PagerUnrefNotNull(p); } } #endif @@ -2983,7 +2983,7 @@ static int pagerUndoCallback(void *pCtx, Pgno iPg){ if( rc==SQLITE_OK ){ pPager->xReiniter(pPg); } - sqlite3PagerUnref(pPg); + sqlite3PagerUnrefNotNull(pPg); } } @@ -5439,16 +5439,19 @@ DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ ** are released, a rollback occurs and the lock on the database is ** removed. */ -void sqlite3PagerUnref(DbPage *pPg){ - if( pPg ){ - Pager *pPager = pPg->pPager; - if( pPg->flags & PGHDR_MMAP ){ - pagerReleaseMapPage(pPg); - }else{ - sqlite3PcacheRelease(pPg); - } - pagerUnlockIfUnused(pPager); +void sqlite3PagerUnrefNotNull(DbPage *pPg){ + Pager *pPager; + assert( pPg!=0 ); + pPager = pPg->pPager; + if( pPg->flags & PGHDR_MMAP ){ + pagerReleaseMapPage(pPg); + }else{ + sqlite3PcacheRelease(pPg); } + pagerUnlockIfUnused(pPager); +} +void sqlite3PagerUnref(DbPage *pPg){ + if( pPg ) sqlite3PagerUnrefNotNull(pPg); } /* @@ -5830,14 +5833,14 @@ int sqlite3PagerWrite(DbPage *pDbPage){ if( pPage->flags&PGHDR_NEED_SYNC ){ needSync = 1; } - sqlite3PagerUnref(pPage); + sqlite3PagerUnrefNotNull(pPage); } } }else if( (pPage = pager_lookup(pPager, pg))!=0 ){ if( pPage->flags&PGHDR_NEED_SYNC ){ needSync = 1; } - sqlite3PagerUnref(pPage); + sqlite3PagerUnrefNotNull(pPage); } } @@ -5853,7 +5856,7 @@ int sqlite3PagerWrite(DbPage *pDbPage){ PgHdr *pPage = pager_lookup(pPager, pg1+ii); if( pPage ){ pPage->flags |= PGHDR_NEED_SYNC; - sqlite3PagerUnref(pPage); + sqlite3PagerUnrefNotNull(pPage); } } } @@ -6783,7 +6786,7 @@ int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){ if( MEMDB ){ assert( pPgOld ); sqlite3PcacheMove(pPgOld, origPgno); - sqlite3PagerUnref(pPgOld); + sqlite3PagerUnrefNotNull(pPgOld); } if( needSyncPgno ){ @@ -6812,7 +6815,7 @@ int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){ } pPgHdr->flags |= PGHDR_NEED_SYNC; sqlite3PcacheMakeDirty(pPgHdr); - sqlite3PagerUnref(pPgHdr); + sqlite3PagerUnrefNotNull(pPgHdr); } return SQLITE_OK; diff --git a/src/pager.h b/src/pager.h index 55988a8486..c9ca8553b9 100644 --- a/src/pager.h +++ b/src/pager.h @@ -136,6 +136,7 @@ int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); void sqlite3PagerRef(DbPage*); void sqlite3PagerUnref(DbPage*); +void sqlite3PagerUnrefNotNull(DbPage*); /* Operations on page references. */ int sqlite3PagerWrite(DbPage*); From 16f9a81125792f2356b91a7fc966e1943fbbbf5e Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2013 19:48:04 +0000 Subject: [PATCH 41/43] Reduce the number of calls to the subjRequiresPage() routine inside of pager. FossilOrigin-Name: e50ff39a93a51b5a5be4f0e82a76104b81c9e2a4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 15 ++++++--------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index fd21bd9f9c..c110182bd6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Create\sand\suse\sa\snew\spager\sinterface\ssqlite3PagerUnrefNotNull()\sthat\sworks\njust\slike\ssqlite3PagerUnref()\sbut\sguarantees\sthat\sits\sargument\sis\snot\sa\nNULL\spointer. -D 2013-12-13T19:35:21.600 +C Reduce\sthe\snumber\sof\scalls\sto\sthe\ssubjRequiresPage()\sroutine\sinside\sof\spager. +D 2013-12-13T19:48:04.970 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -207,7 +207,7 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07 -F src/pager.c 4757194b2f1ffd65a5fc45a3df4d38acc41fb7b3 +F src/pager.c 3436cc9cce915e3fbcf9ae26a877816c2e6158f1 F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428 F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P a845779cd31aec3204a6a9c776bd9c9f7d47dd24 -R 0519b15291565e2dff816e0cb01e063b +P e00f37e2333cac5b53e17cf764ab56c4fcd5f617 +R f4a7260efd0973fe242850b07fa047a9 U drh -Z 0b683c4f7d4e0f307681d123364409c6 +Z 2c603ffc4b31451da49fbf26e09993c0 diff --git a/manifest.uuid b/manifest.uuid index 012c3325a0..cd03c5e940 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e00f37e2333cac5b53e17cf764ab56c4fcd5f617 \ No newline at end of file +e50ff39a93a51b5a5be4f0e82a76104b81c9e2a4 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index caa41fe9eb..c1675b73e3 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1024,15 +1024,12 @@ static char *print_pager_state(Pager *p){ static int subjRequiresPage(PgHdr *pPg){ Pager *pPager = pPg->pPager; PagerSavepoint *p; - Pgno pgno; + Pgno pgno = pPg->pgno; int i; - if( pPager->nSavepoint ){ - pgno = pPg->pgno; - for(i=0; inSavepoint; i++){ - p = &pPager->aSavepoint[i]; - if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){ - return 1; - } + for(i=0; inSavepoint; i++){ + p = &pPager->aSavepoint[i]; + if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){ + return 1; } } return 0; @@ -5677,7 +5674,7 @@ static int pager_write(PgHdr *pPg){ ** to the journal then we can return right away. */ sqlite3PcacheMakeDirty(pPg); - if( pageInJournal(pPg) && !subjRequiresPage(pPg) ){ + if( pageInJournal(pPg) && (pPager->nSavepoint==0 || !subjRequiresPage(pPg)) ){ assert( !pagerUseWal(pPager) ); }else{ From 5dee6afcac2e58c92d4681c33dcdc092176dc691 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2013 20:45:50 +0000 Subject: [PATCH 42/43] Performance optimizations in the pager_write() routine of pager.c. FossilOrigin-Name: bc5febef921bd12ca7760e9d07d3be0e67140320 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 19 ++++++++++--------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index c110182bd6..1c9fdc8401 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reduce\sthe\snumber\sof\scalls\sto\sthe\ssubjRequiresPage()\sroutine\sinside\sof\spager. -D 2013-12-13T19:48:04.970 +C Performance\soptimizations\sin\sthe\spager_write()\sroutine\sof\spager.c. +D 2013-12-13T20:45:50.607 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -207,7 +207,7 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07 -F src/pager.c 3436cc9cce915e3fbcf9ae26a877816c2e6158f1 +F src/pager.c efa923693e958696eee69b205a20bfbc402c8480 F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428 F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P e00f37e2333cac5b53e17cf764ab56c4fcd5f617 -R f4a7260efd0973fe242850b07fa047a9 +P e50ff39a93a51b5a5be4f0e82a76104b81c9e2a4 +R 5bf1150c318417a348672020b2f63094 U drh -Z 2c603ffc4b31451da49fbf26e09993c0 +Z 1b9c31d5f496c5b0319085d207729750 diff --git a/manifest.uuid b/manifest.uuid index cd03c5e940..1ecaf09f41 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e50ff39a93a51b5a5be4f0e82a76104b81c9e2a4 \ No newline at end of file +bc5febef921bd12ca7760e9d07d3be0e67140320 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index c1675b73e3..954ba7f1e5 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1038,8 +1038,8 @@ static int subjRequiresPage(PgHdr *pPg){ /* ** Return true if the page is already in the journal file. */ -static int pageInJournal(PgHdr *pPg){ - return sqlite3BitvecTest(pPg->pPager->pInJournal, pPg->pgno); +static int pageInJournal(Pager *pPager, PgHdr *pPg){ + return sqlite3BitvecTest(pPager->pInJournal, pPg->pgno); } /* @@ -4335,7 +4335,7 @@ static int subjournalPage(PgHdr *pPg){ assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); assert( pagerUseWal(pPager) - || pageInJournal(pPg) + || pageInJournal(pPager, pPg) || pPg->pgno>pPager->dbOrigSize ); rc = openSubJournal(pPager); @@ -5636,9 +5636,9 @@ int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ ** of any open savepoints as appropriate. */ static int pager_write(PgHdr *pPg){ - void *pData = pPg->pData; Pager *pPager = pPg->pPager; int rc = SQLITE_OK; + int inJournal; /* This routine is not called unless a write-transaction has already ** been started. The journal file may or may not be open at this point. @@ -5674,7 +5674,8 @@ static int pager_write(PgHdr *pPg){ ** to the journal then we can return right away. */ sqlite3PcacheMakeDirty(pPg); - if( pageInJournal(pPg) && (pPager->nSavepoint==0 || !subjRequiresPage(pPg)) ){ + inJournal = pageInJournal(pPager, pPg); + if( inJournal && (pPager->nSavepoint==0 || !subjRequiresPage(pPg)) ){ assert( !pagerUseWal(pPager) ); }else{ @@ -5682,7 +5683,7 @@ static int pager_write(PgHdr *pPg){ ** EXCLUSIVE lock on the main database file. Write the current page to ** the transaction journal if it is not there already. */ - if( !pageInJournal(pPg) && !pagerUseWal(pPager) ){ + if( !inJournal && !pagerUseWal(pPager) ){ assert( pagerUseWal(pPager)==0 ); if( pPg->pgno<=pPager->dbOrigSize && isOpen(pPager->jfd) ){ u32 cksum; @@ -5695,7 +5696,7 @@ static int pager_write(PgHdr *pPg){ assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); assert( pPager->journalHdr<=pPager->journalOff ); - CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); + CODEC2(pPager, pPg->pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); cksum = pager_cksum(pPager, (u8*)pData2); /* Even if an IO or diskfull error occurs while journalling the @@ -5747,7 +5748,7 @@ static int pager_write(PgHdr *pPg){ ** the statement journal format differs from the standard journal format ** in that it omits the checksums and the header. */ - if( subjRequiresPage(pPg) ){ + if( pPager->nSavepoint>0 && subjRequiresPage(pPg) ){ rc = subjournalPage(pPg); } } @@ -6749,7 +6750,7 @@ int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){ if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){ needSyncPgno = pPg->pgno; assert( pPager->journalMode==PAGER_JOURNALMODE_OFF || - pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize ); + pageInJournal(pPager, pPg) || pPg->pgno>pPager->dbOrigSize ); assert( pPg->flags&PGHDR_DIRTY ); } From 4a8ee3dfe2afb5f0478b1bcdf94202cdf98a469d Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 14 Dec 2013 13:44:22 +0000 Subject: [PATCH 43/43] Allow the SQLITE_DETERMINISTIC flag to be ORed into the preferred text encoding of application-defined functions, to mark the function as deterministic. FossilOrigin-Name: 5716fc2341ddd8cf64139e7168597f864da4e10b --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/callback.c | 1 - src/main.c | 12 +++++++++--- src/sqlite.h.in | 35 +++++++++++++++++++++++++++-------- src/test1.c | 37 +++++++++++++++++++++++++++++++------ test/func5.test | 36 +++++++++++++++++++++++++++++++++--- 7 files changed, 111 insertions(+), 32 deletions(-) diff --git a/manifest b/manifest index 1c9fdc8401..92e7b53f9f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimizations\sin\sthe\spager_write()\sroutine\sof\spager.c. -D 2013-12-13T20:45:50.607 +C Allow\sthe\sSQLITE_DETERMINISTIC\sflag\sto\sbe\sORed\sinto\sthe\spreferred\stext\sencoding\nof\sapplication-defined\sfunctions,\sto\smark\sthe\sfunction\sas\sdeterministic. +D 2013-12-14T13:44:22.886 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -170,7 +170,7 @@ F src/btree.c 11e29ef8cf16a42925fde036bcffbeffd9cc82df F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/build.c 47ef8209e56d840d2b35b8a243c6ee567ad52bda -F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2 +F src/callback.c 174e3c8656bc29f91d710ab61550d16eea34be98 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd F src/date.c 593c744b2623971e45affd0bde347631bdfa4625 @@ -188,7 +188,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303 -F src/main.c fafd3cd2a6c1211c29b9ef36b4af978ef01279ef +F src/main.c 45e08d8ca4808625c4512a14898e9c61553e3d2a F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b @@ -221,7 +221,7 @@ F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e -F src/sqlite.h.in 592057b6b3881573c2d516bad30fb20171f16b05 +F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h 3c1c14a551b019c94e1addcb67d92dd14a62e058 @@ -229,7 +229,7 @@ F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/tclsqlite.c 651b10698c87bbc3ae5772e2491e3444c5bbf153 -F src/test1.c 760e0419705f712d80595f47199568cd7e3b57a4 +F src/test1.c 633e5e6a116acf4473b9289240bcceb5320a9d93 F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35 F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df @@ -577,7 +577,7 @@ F test/func.test 00667bbeac044d007f6f021af1b9f6150f0c7ff8 F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f F test/func3.test dbccee9133cfef1473c59ec07b5f0262b9d72f9a F test/func4.test 6beacdfcb0e18c358e6c2dcacf1b65d1fa80955f -F test/func5.test 1435dd313c0bae70d6af089c97a2a997fc5d0e53 +F test/func5.test cdd224400bc3e48d891827cc913a57051a426fa4 F test/fuzz-oss1.test 4912e528ec9cf2f42134456933659d371c9e0d74 F test/fuzz.test 77fd50afc12847af50fcf1941679d90adebadde6 F test/fuzz2.test 207d0f9d06db3eaf47a6b7bfc835b8e2fc397167 @@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P e50ff39a93a51b5a5be4f0e82a76104b81c9e2a4 -R 5bf1150c318417a348672020b2f63094 +P bc5febef921bd12ca7760e9d07d3be0e67140320 +R 08fd6b0f6ffb77c364a2bec4efb57810 U drh -Z 1b9c31d5f496c5b0319085d207729750 +Z d2313ea9b793ebbfa6428f7e8b022d58 diff --git a/manifest.uuid b/manifest.uuid index 1ecaf09f41..0d64591d7b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc5febef921bd12ca7760e9d07d3be0e67140320 \ No newline at end of file +5716fc2341ddd8cf64139e7168597f864da4e10b \ No newline at end of file diff --git a/src/callback.c b/src/callback.c index 66fa490894..260fe806bb 100644 --- a/src/callback.c +++ b/src/callback.c @@ -357,7 +357,6 @@ FuncDef *sqlite3FindFunction( assert( nArg>=(-2) ); assert( nArg>=(-1) || createFlag==0 ); - assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % ArraySize(db->aFunc.a); /* First search for a match amongst the application-defined functions. diff --git a/src/main.c b/src/main.c index 09e3bb879f..32e4dee7f0 100644 --- a/src/main.c +++ b/src/main.c @@ -1370,6 +1370,7 @@ int sqlite3CreateFunc( ){ FuncDef *p; int nName; + int extraFlags; assert( sqlite3_mutex_held(db->mutex) ); if( zFunctionName==0 || @@ -1380,6 +1381,10 @@ int sqlite3CreateFunc( (255<(nName = sqlite3Strlen30( zFunctionName))) ){ return SQLITE_MISUSE_BKPT; } + + assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); + extraFlags = enc & SQLITE_DETERMINISTIC; + enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); #ifndef SQLITE_OMIT_UTF16 /* If SQLITE_UTF16 is specified as the encoding type, transform this @@ -1393,10 +1398,10 @@ int sqlite3CreateFunc( enc = SQLITE_UTF16NATIVE; }else if( enc==SQLITE_ANY ){ int rc; - rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8, + rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8|extraFlags, pUserData, xFunc, xStep, xFinal, pDestructor); if( rc==SQLITE_OK ){ - rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE, + rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE|extraFlags, pUserData, xFunc, xStep, xFinal, pDestructor); } if( rc!=SQLITE_OK ){ @@ -1439,7 +1444,8 @@ int sqlite3CreateFunc( pDestructor->nRef++; } p->pDestructor = pDestructor; - p->funcFlags &= SQLITE_FUNC_ENCMASK; + p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; + testcase( p->funcFlags & SQLITE_DETERMINISTIC ); p->xFunc = xFunc; p->xStep = xStep; p->xFinalize = xFinal; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index b9f4defed7..7b0e648bfc 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3977,15 +3977,24 @@ int sqlite3_reset(sqlite3_stmt *pStmt); ** ** ^The fourth parameter, eTextRep, specifies what ** [SQLITE_UTF8 | text encoding] this SQL function prefers for -** its parameters. Every SQL function implementation must be able to work -** with UTF-8, UTF-16le, or UTF-16be. But some implementations may be -** more efficient with one encoding than another. ^An application may -** invoke sqlite3_create_function() or sqlite3_create_function16() multiple -** times with the same function but with different values of eTextRep. +** its parameters. The application should set this parameter to +** [SQLITE_UTF16LE] if the function implementation invokes +** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the +** implementation invokes [sqlite3_value_text16be()] on an input, or +** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] +** otherwise. ^The same SQL function may be registered multiple times using +** different preferred text encodings, with different implementations for +** each encoding. ** ^When multiple implementations of the same function are available, SQLite ** will pick the one that involves the least amount of data conversion. -** If there is only a single implementation which does not care what text -** encoding is used, then the fourth argument should be [SQLITE_ANY]. +** +** ^The fourth parameter may optionally be ORed with [SQLITE_DETERMINISTIC] +** to signal that the function will always return the same result given +** the same inputs within a single SQL statement. Most SQL functions are +** deterministic. The built-in [random()] SQL function is an example of a +** function that is not deterministic. The SQLite query planner is able to +** perform additional optimizations on deterministic functions, so use +** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. ** ** ^(The fifth parameter is an arbitrary pointer. The implementation of the ** function can gain access to this pointer using [sqlite3_user_data()].)^ @@ -4071,9 +4080,19 @@ int sqlite3_create_function_v2( #define SQLITE_UTF16LE 2 #define SQLITE_UTF16BE 3 #define SQLITE_UTF16 4 /* Use native byte order */ -#define SQLITE_ANY 5 /* sqlite3_create_function only */ +#define SQLITE_ANY 5 /* Deprecated */ #define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ +/* +** CAPI3REF: Function Flags +** +** These constants may be ORed together with the +** [SQLITE_UTF8 | preferred text encoding] as the fourth argument +** to [sqlite3_create_function()], [sqlite3_create_function16()], or +** [sqlite3_create_function_v2()]. +*/ +#define SQLITE_DETERMINISTIC 0x800 + /* ** CAPI3REF: Deprecated Functions ** DEPRECATED diff --git a/src/test1.c b/src/test1.c index e0c16e13ae..a96b298661 100644 --- a/src/test1.c +++ b/src/test1.c @@ -942,9 +942,21 @@ static void ptrChngFunction( sqlite3_result_int(context, p1!=p2); } +/* +** This SQL function returns a different answer each time it is called, even if +** the arguments are the same. +*/ +static void nondeterministicFunction( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + static int cnt = 0; + sqlite3_result_int(context, cnt++); +} /* -** Usage: sqlite_test_create_function DB +** Usage: sqlite3_create_function DB ** ** Call the sqlite3_create_function API on the given database in order ** to create a function named "x_coalesce". This function does the same thing @@ -973,16 +985,16 @@ static int test_create_function( return TCL_ERROR; } if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; - rc = sqlite3_create_function(db, "x_coalesce", -1, SQLITE_ANY, 0, + rc = sqlite3_create_function(db, "x_coalesce", -1, SQLITE_UTF8, 0, t1_ifnullFunc, 0, 0); if( rc==SQLITE_OK ){ - rc = sqlite3_create_function(db, "hex8", 1, SQLITE_ANY, 0, - hex8Func, 0, 0); + rc = sqlite3_create_function(db, "hex8", 1, SQLITE_UTF8 | SQLITE_DETERMINISTIC, + 0, hex8Func, 0, 0); } #ifndef SQLITE_OMIT_UTF16 if( rc==SQLITE_OK ){ - rc = sqlite3_create_function(db, "hex16", 1, SQLITE_ANY, 0, - hex16Func, 0, 0); + rc = sqlite3_create_function(db, "hex16", 1, SQLITE_UTF16 | SQLITE_DETERMINISTIC, + 0, hex16Func, 0, 0); } #endif if( rc==SQLITE_OK ){ @@ -994,6 +1006,19 @@ static int test_create_function( ptrChngFunction, 0, 0); } + /* Functions counter1() and counter2() have the same implementation - they + ** both return an ascending integer with each call. But counter1() is marked + ** as non-deterministic and counter2() is marked as deterministic. + */ + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "counter1", -1, SQLITE_UTF8, + 0, nondeterministicFunction, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "counter2", -1, SQLITE_UTF8|SQLITE_DETERMINISTIC, + 0, nondeterministicFunction, 0, 0); + } + #ifndef SQLITE_OMIT_UTF16 /* Use the sqlite3_create_function16() API here. Mainly for fun, but also ** because it is not tested anywhere else. */ diff --git a/test/func5.test b/test/func5.test index 83ecb785db..bfd545b4e3 100644 --- a/test/func5.test +++ b/test/func5.test @@ -9,13 +9,15 @@ # #************************************************************************* # -# Verify that constant string expressions that get factored into initializing -# code are not reused between function parameters and other values in the -# VDBE program, as the function might have changed the encoding. +# Testing of function factoring and the SQLITE_DETERMINISTIC flag. # set testdir [file dirname $argv0] source $testdir/tester.tcl +# Verify that constant string expressions that get factored into initializing +# code are not reused between function parameters and other values in the +# VDBE program, as the function might have changed the encoding. +# do_execsql_test func5-1.1 { PRAGMA encoding=UTF16le; CREATE TABLE t1(x,a,b,c); @@ -30,4 +32,32 @@ do_execsql_test func5-1.2 { SELECT x FROM t1 WHERE a='abcdefg' OR c=instr('abcdefg',b) ORDER BY +x; } {2 4} +# Verify that SQLITE_DETERMINISTIC functions get factored out of the +# evaluation loop whereas non-deterministic functions do not. counter1() +# is marked as non-deterministic and so is not factored out of the loop, +# and it really is non-deterministic, returning a different result each +# time. But counter2() is marked as deterministic, so it does get factored +# out of the loop. counter2() has the same implementation as counter1(), +# returning a different result on each invocation, but because it is +# only invoked once outside of the loop, it appears to return the same +# result multiple times. +# +do_execsql_test func5-2.1 { + CREATE TABLE t2(x,y); + INSERT INTO t2 VALUES(1,2),(3,4),(5,6),(7,8); + SELECT x, y FROM t2 WHERE x+5=5+x ORDER BY +x; +} {1 2 3 4 5 6 7 8} +sqlite3_create_function db +do_execsql_test func5-2.2 { + SELECT x, y FROM t2 + WHERE x+counter1('hello')=counter1('hello')+x + ORDER BY +x; +} {} +do_execsql_test func5-2.3 { + SELECT x, y FROM t2 + WHERE x+counter2('hello')=counter2('hello')+x + ORDER BY +x; +} {1 2 3 4 5 6 7 8} + + finish_test