From 55fc08f154f4e3aaecf09618bd5235f8859e226f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 11 May 2011 19:00:10 +0000 Subject: [PATCH 01/38] URI filename documentation updates. FossilOrigin-Name: 8885c8677b239d4cbef24b9409a1736e1ae97a3f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 44 +++++++++++++++++++++++++++----------------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index aa9682ca60..4d23d290be 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sflags\spassed\sto\ssqlite3_open_v2()\sapply\sto\sthe\smain\sand\sany\sattached\sdatabases.\sAnd\schange\sthings\sso\sthat\sany\s"mode=xxx"\sor\s"cache=xxx"\soptions\sspecified\sas\spart\sof\sa\sURI\sfor\sthe\smain\sdatabase\sdo\snot\salso\sapply\sto\sattached\sdatabases. -D 2011-05-10T18:39:10.068 +C URI\sfilename\sdocumentation\supdates. +D 2011-05-11T19:00:10.252 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -179,7 +179,7 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79 -F src/sqlite.h.in 6e1af9733864bacbb4b5b821290f5395319f3259 +F src/sqlite.h.in 901b70703bb444d2c13b085e2cd2258b6a707e94 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d @@ -935,7 +935,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 5bde568028216f5bbf76fa0b61bf5b736699f4b1 -R 109bc7e0fff78b0c6554d3e5815c2cd8 -U dan -Z 5955a7caf010dc14908da2de85096565 +P 3e490915301216e242a5cdeb0febaff12ed53cb9 +R 40dc9cb79fe8b80783836d3c92828f73 +U drh +Z 8f56eea92b6efe4821fb2550b72615e0 diff --git a/manifest.uuid b/manifest.uuid index 2b5e8e05a9..adb4494110 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e490915301216e242a5cdeb0febaff12ed53cb9 \ No newline at end of file +8885c8677b239d4cbef24b9409a1736e1ae97a3f \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index c83d0d70d4..26dab45cfe 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2366,7 +2366,7 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** sqlite3_open_v2() can take one of ** the following three values, optionally combined with the ** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], -** and/or [SQLITE_OPEN_PRIVATECACHE] flags:)^ +** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ ** **
** ^(
[SQLITE_OPEN_READONLY]
@@ -2385,9 +2385,8 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); **
** ** If the 3rd parameter to sqlite3_open_v2() is not one of the -** combinations shown above or one of the combinations shown above combined -** with the [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], -** [SQLITE_OPEN_SHAREDCACHE] and/or [SQLITE_OPEN_PRIVATECACHE] flags, +** combinations shown above optionally combined with other +** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] ** then the behavior is undefined. ** ** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection @@ -2419,27 +2418,36 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** on-disk database will be created. ^This private database will be ** automatically deleted as soon as the database connection is closed. ** -** ^If URI filename interpretation is enabled, and the filename argument +** [[URI filenames in sqlite3_open()]]

URI Filenames

+** +** ^If [URI filename] interpretation is enabled, and the filename argument ** begins with "file:", then the filename is interpreted as a URI. ^URI ** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is ** is set in the fourth argument to sqlite3_open_v2(), or if it has ** been enabled globally using the [SQLITE_CONFIG_URI] option with the -** [sqlite3_config()] method. +** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. +** As of SQLite version 3.7.7, URI filename interpretation is turned off +** by default, but future releases of SQLite might enable URI filename +** intepretation by default. See "[URI filenames]" for additional +** information. ** -** URI filenames are parsed according to RFC 1738. If the URI contains an -** 'authority', then it must be either an empty string or the string +** URI filenames are parsed according to RFC 3986. ^If the URI contains an +** authority, then it must be either an empty string or the string ** "localhost". ^If the authority is not an empty string or "localhost", an -** error is returned to the caller. ^The 'fragment' component of a URI, if -** present, is always ignored. +** error is returned to the caller. ^The fragment component of a URI, if +** present, is ignored. ** -** ^SQLite uses the 'path' component of the URI as the path to the database file -** to open. ^If the path begins with a '/' character, then it is interpreted as -** an absolute path. ^If it does not begin with a '/', it is interpreted as a -** relative path. ^On windows, the first component of an absolute path +** ^SQLite uses the path component of the URI as the name of the disk file +** which contains the database. ^If the path begins with a '/' character, +** then it is interpreted as an absolute path. ^If the path does not begin +** with a '/' (meaning that the authority section is omitted from the URI) +** then the path is interpreted as a relative path. +** ^On windows, the first component of an absolute path ** is a drive specification (e.g. "C:"). ** +** [[core URI query parameters]] ** The query component of a URI may contain parameters that are interpreted -** either by SQLite itself, or by a [sqlite3_vfs | custom VFS implementation]. +** either by SQLite itself, or by a [VFS | custom VFS implementation]. ** SQLite interprets the following three query parameters: ** ** ** ** ^Specifying an unknown parameter in the query component of a URI is not an -** error. +** error. Future versions of SQLite might understand additional query +** parameters. See "[query parameters with special meaning to SQLite]" for +** additional information. ** -** URI filename examples: +** [[URI filename examples]]

URI filename examples

** ** **
URI filenames Results From b706fe58ab4da3e1dd0d47377c05c2c02379f6d9 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 11 May 2011 20:54:32 +0000 Subject: [PATCH 02/38] Improvements to documentation hyperlinks. Change the value of SQLITE_OPEN_URI to an unreserved value. FossilOrigin-Name: 851ab75d5f5d64d95d6237c28658bbc32145b78b --- manifest | 12 ++-- manifest.uuid | 2 +- src/sqlite.h.in | 146 +++++++++++++++++++++++++++--------------------- 3 files changed, 89 insertions(+), 71 deletions(-) diff --git a/manifest b/manifest index 4d23d290be..9ed32b67a9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C URI\sfilename\sdocumentation\supdates. -D 2011-05-11T19:00:10.252 +C Improvements\sto\sdocumentation\shyperlinks.\s\sChange\sthe\svalue\sof\nSQLITE_OPEN_URI\sto\san\sunreserved\svalue. +D 2011-05-11T20:54:32.761 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -179,7 +179,7 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79 -F src/sqlite.h.in 901b70703bb444d2c13b085e2cd2258b6a707e94 +F src/sqlite.h.in 26f123aa6f23b6cbd84d4ef6df3b8210a23a3b0b F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d @@ -935,7 +935,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 3e490915301216e242a5cdeb0febaff12ed53cb9 -R 40dc9cb79fe8b80783836d3c92828f73 +P 8885c8677b239d4cbef24b9409a1736e1ae97a3f +R 4c0850c5e479c451c0b9f9d3c09b6b6d U drh -Z 8f56eea92b6efe4821fb2550b72615e0 +Z d48f7732010e4bf6308d6bb0dacbdaca diff --git a/manifest.uuid b/manifest.uuid index adb4494110..c35fe83711 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8885c8677b239d4cbef24b9409a1736e1ae97a3f \ No newline at end of file +851ab75d5f5d64d95d6237c28658bbc32145b78b \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 26dab45cfe..8e041ac750 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -459,8 +459,7 @@ int sqlite3_exec( ** ** These bit values are intended for use in the ** 3rd parameter to the [sqlite3_open_v2()] interface and -** in the 4th parameter to the xOpen method of the -** [sqlite3_vfs] object. +** in the 4th parameter to the [sqlite3_vfs.xOpen] method. */ #define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ @@ -468,6 +467,7 @@ int sqlite3_exec( #define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ #define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ #define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ +#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ #define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ #define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ @@ -480,7 +480,6 @@ int sqlite3_exec( #define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ #define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ -#define SQLITE_OPEN_URI 0x00100000 /* Ok for sqlite3_open_v2() */ /* Reserved: 0x00F00000 */ @@ -579,17 +578,18 @@ struct sqlite3_file { /* ** CAPI3REF: OS Interface File Virtual Methods Object ** -** Every file opened by the [sqlite3_vfs] xOpen method populates an +** Every file opened by the [sqlite3_vfs.xOpen] method populates an ** [sqlite3_file] object (or, more commonly, a subclass of the ** [sqlite3_file] object) with a pointer to an instance of this object. ** This object defines the methods used to perform various operations ** against the open file represented by the [sqlite3_file] object. ** -** If the xOpen method sets the sqlite3_file.pMethods element +** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element ** to a non-NULL pointer, then the sqlite3_io_methods.xClose method -** may be invoked even if the xOpen reported that it failed. The -** only way to prevent a call to xClose following a failed xOpen -** is for the xOpen to set the sqlite3_file.pMethods element to NULL. +** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The +** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] +** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element +** to NULL. ** ** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or ** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). @@ -791,6 +791,7 @@ typedef struct sqlite3_mutex sqlite3_mutex; ** The zName field holds the name of the VFS module. The name must ** be unique across all VFS modules. ** +** [[sqlite3_vfs.xOpen]] ** ^SQLite guarantees that the zFilename parameter to xOpen ** is either a NULL pointer or string obtained ** from xFullPathname() with an optional suffix added. @@ -868,6 +869,7 @@ typedef struct sqlite3_mutex sqlite3_mutex; ** element will be valid after xOpen returns regardless of the success ** or failure of the xOpen call. ** +** [[sqlite3_vfs.xAccess]] ** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] ** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to ** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] @@ -1114,9 +1116,9 @@ int sqlite3_os_end(void); ** implementation of an application-defined [sqlite3_os_init()]. ** ** The first argument to sqlite3_config() is an integer -** [SQLITE_CONFIG_SINGLETHREAD | configuration option] that determines +** [configuration option] that determines ** what property of SQLite is to be configured. Subsequent arguments -** vary depending on the [SQLITE_CONFIG_SINGLETHREAD | configuration option] +** vary depending on the [configuration option] ** in the first argument. ** ** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. @@ -1226,6 +1228,7 @@ struct sqlite3_mem_methods { /* ** CAPI3REF: Configuration Options +** KEYWORDS: {configuration option} ** ** These constants are the available integer configuration options that ** can be passed as the first argument to the [sqlite3_config()] interface. @@ -1238,7 +1241,7 @@ struct sqlite3_mem_methods { ** is invoked. ** **
-**
SQLITE_CONFIG_SINGLETHREAD
+** [[SQLITE_CONFIG_SINGLETHREAD]]
SQLITE_CONFIG_SINGLETHREAD
**
There are no arguments to this option. ^This option sets the ** [threading mode] to Single-thread. In other words, it disables ** all mutexing and puts SQLite into a mode where it can only be used @@ -1249,7 +1252,7 @@ struct sqlite3_mem_methods { ** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD ** configuration option.
** -**
SQLITE_CONFIG_MULTITHREAD
+** [[SQLITE_CONFIG_MULTITHREAD]]
SQLITE_CONFIG_MULTITHREAD
**
There are no arguments to this option. ^This option sets the ** [threading mode] to Multi-thread. In other words, it disables ** mutexing on [database connection] and [prepared statement] objects. @@ -1263,7 +1266,7 @@ struct sqlite3_mem_methods { ** [sqlite3_config()] will return [SQLITE_ERROR] if called with the ** SQLITE_CONFIG_MULTITHREAD configuration option.
** -**
SQLITE_CONFIG_SERIALIZED
+** [[SQLITE_CONFIG_SERIALIZED]]
SQLITE_CONFIG_SERIALIZED
**
There are no arguments to this option. ^This option sets the ** [threading mode] to Serialized. In other words, this option enables ** all mutexes including the recursive @@ -1279,7 +1282,7 @@ struct sqlite3_mem_methods { ** [sqlite3_config()] will return [SQLITE_ERROR] if called with the ** SQLITE_CONFIG_SERIALIZED configuration option.
** -**
SQLITE_CONFIG_MALLOC
+** [[SQLITE_CONFIG_MALLOC]]
SQLITE_CONFIG_MALLOC
**
^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mem_methods] structure. The argument specifies ** alternative low-level memory allocation routines to be used in place of @@ -1287,7 +1290,7 @@ struct sqlite3_mem_methods { ** its own private copy of the content of the [sqlite3_mem_methods] structure ** before the [sqlite3_config()] call returns.
** -**
SQLITE_CONFIG_GETMALLOC
+** [[SQLITE_CONFIG_GETMALLOC]]
SQLITE_CONFIG_GETMALLOC
**
^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods] ** structure is filled with the currently defined memory allocation routines.)^ @@ -1295,7 +1298,7 @@ struct sqlite3_mem_methods { ** routines with a wrapper that simulations memory allocation failure or ** tracks memory usage, for example.
** -**
SQLITE_CONFIG_MEMSTATUS
+** [[SQLITE_CONFIG_MEMSTATUS]]
SQLITE_CONFIG_MEMSTATUS
**
^This option takes single argument of type int, interpreted as a ** boolean, which enables or disables the collection of memory allocation ** statistics. ^(When memory allocation statistics are disabled, the @@ -1311,7 +1314,7 @@ struct sqlite3_mem_methods { ** allocation statistics are disabled by default. **
** -**
SQLITE_CONFIG_SCRATCH
+** [[SQLITE_CONFIG_SCRATCH]]
SQLITE_CONFIG_SCRATCH
**
^This option specifies a static memory buffer that SQLite can use for ** scratch memory. There are three arguments: A pointer an 8-byte ** aligned memory buffer from which the scratch allocations will be @@ -1327,7 +1330,7 @@ struct sqlite3_mem_methods { ** scratch memory beyond what is provided by this configuration option, then ** [sqlite3_malloc()] will be used to obtain the memory needed.
** -**
SQLITE_CONFIG_PAGECACHE
+** [[SQLITE_CONFIG_PAGECACHE]]
SQLITE_CONFIG_PAGECACHE
**
^This option specifies a static memory buffer that SQLite can use for ** the database page cache with the default page cache implemenation. ** This configuration should not be used if an application-define page @@ -1348,7 +1351,7 @@ struct sqlite3_mem_methods { ** be aligned to an 8-byte boundary or subsequent behavior of SQLite ** will be undefined.
** -**
SQLITE_CONFIG_HEAP
+** [[SQLITE_CONFIG_HEAP]]
SQLITE_CONFIG_HEAP
**
^This option specifies a static memory buffer that SQLite will use ** for all of its dynamic memory allocation needs beyond those provided ** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. @@ -1365,7 +1368,7 @@ struct sqlite3_mem_methods { ** The minimum allocation size is capped at 2^12. Reasonable values ** for the minimum allocation size are 2^5 through 2^8.
** -**
SQLITE_CONFIG_MUTEX
+** [[SQLITE_CONFIG_MUTEX]]
SQLITE_CONFIG_MUTEX
**
^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mutex_methods] structure. The argument specifies ** alternative low-level mutex routines to be used in place @@ -1377,7 +1380,7 @@ struct sqlite3_mem_methods { ** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will ** return [SQLITE_ERROR].
** -**
SQLITE_CONFIG_GETMUTEX
+** [[SQLITE_CONFIG_GETMUTEX]]
SQLITE_CONFIG_GETMUTEX
**
^(This option takes a single argument which is a pointer to an ** instance of the [sqlite3_mutex_methods] structure. The ** [sqlite3_mutex_methods] @@ -1390,7 +1393,7 @@ struct sqlite3_mem_methods { ** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will ** return [SQLITE_ERROR].
** -**
SQLITE_CONFIG_LOOKASIDE
+** [[SQLITE_CONFIG_LOOKASIDE]]
SQLITE_CONFIG_LOOKASIDE
**
^(This option takes two arguments that determine the default ** memory allocation for the lookaside memory allocator on each ** [database connection]. The first argument is the @@ -1400,18 +1403,18 @@ struct sqlite3_mem_methods { ** verb to [sqlite3_db_config()] can be used to change the lookaside ** configuration on individual connections.)^
** -**
SQLITE_CONFIG_PCACHE
+** [[SQLITE_CONFIG_PCACHE]]
SQLITE_CONFIG_PCACHE
**
^(This option takes a single argument which is a pointer to ** an [sqlite3_pcache_methods] object. This object specifies the interface ** to a custom page cache implementation.)^ ^SQLite makes a copy of the ** object and uses it for page cache memory allocations.
** -**
SQLITE_CONFIG_GETPCACHE
+** [[SQLITE_CONFIG_GETPCACHE]]
SQLITE_CONFIG_GETPCACHE
**
^(This option takes a single argument which is a pointer to an ** [sqlite3_pcache_methods] object. SQLite copies of the current ** page cache implementation into that object.)^
** -**
SQLITE_CONFIG_LOG
+** [[SQLITE_CONFIG_LOG]]
SQLITE_CONFIG_LOG
**
^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a ** function with a call signature of void(*)(void*,int,const char*), ** and a pointer to void. ^If the function pointer is not NULL, it is @@ -1429,7 +1432,7 @@ struct sqlite3_mem_methods { ** In a multi-threaded application, the application-defined logger ** function must be threadsafe.
** -**
SQLITE_CONFIG_URI +** [[SQLITE_CONFIG_URI]]
SQLITE_CONFIG_URI **
This option takes a single argument of type int. If non-zero, then ** URI handling is globally enabled. If the parameter is zero, then URI handling ** is globally disabled. If URI handling is globally enabled, all filenames @@ -2660,43 +2663,45 @@ int sqlite3_limit(sqlite3*, int id, int newVal); ** Additional information is available at [limits | Limits in SQLite]. ** **
-** ^(
SQLITE_LIMIT_LENGTH
+** [[SQLITE_LIMIT_LENGTH]] ^(
SQLITE_LIMIT_LENGTH
**
The maximum size of any string or BLOB or table row, in bytes.
)^ ** -** ^(
SQLITE_LIMIT_SQL_LENGTH
+** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
SQLITE_LIMIT_SQL_LENGTH
**
The maximum length of an SQL statement, in bytes.
)^ ** -** ^(
SQLITE_LIMIT_COLUMN
+** [[SQLITE_LIMIT_COLUMN]] ^(
SQLITE_LIMIT_COLUMN
**
The maximum number of columns in a table definition or in the ** result set of a [SELECT] or the maximum number of columns in an index ** or in an ORDER BY or GROUP BY clause.
)^ ** -** ^(
SQLITE_LIMIT_EXPR_DEPTH
+** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
SQLITE_LIMIT_EXPR_DEPTH
**
The maximum depth of the parse tree on any expression.
)^ ** -** ^(
SQLITE_LIMIT_COMPOUND_SELECT
+** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
SQLITE_LIMIT_COMPOUND_SELECT
**
The maximum number of terms in a compound SELECT statement.
)^ ** -** ^(
SQLITE_LIMIT_VDBE_OP
+** [[SQLITE_LIMIT_VDBE_OP]] ^(
SQLITE_LIMIT_VDBE_OP
**
The maximum number of instructions in a virtual machine program ** used to implement an SQL statement. This limit is not currently ** enforced, though that might be added in some future release of ** SQLite.
)^ ** -** ^(
SQLITE_LIMIT_FUNCTION_ARG
+** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
SQLITE_LIMIT_FUNCTION_ARG
**
The maximum number of arguments on a function.
)^ ** -** ^(
SQLITE_LIMIT_ATTACHED
+** [[SQLITE_LIMIT_ATTACHED]] ^(
SQLITE_LIMIT_ATTACHED
**
The maximum number of [ATTACH | attached databases].)^
** +** [[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]] ** ^(
SQLITE_LIMIT_LIKE_PATTERN_LENGTH
**
The maximum length of the pattern argument to the [LIKE] or ** [GLOB] operators.
)^ ** +** [[SQLITE_LIMIT_VARIABLE_NUMBER]] ** ^(
SQLITE_LIMIT_VARIABLE_NUMBER
**
The maximum index number of any [parameter] in an SQL statement.)^ ** -** ^(
SQLITE_LIMIT_TRIGGER_DEPTH
+** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
SQLITE_LIMIT_TRIGGER_DEPTH
**
The maximum depth of recursion for triggers.
)^ **
*/ @@ -5550,7 +5555,7 @@ int sqlite3_test_control(int op, ...); ** about the performance of SQLite, and optionally to reset various ** highwater marks. ^The first argument is an integer code for ** the specific parameter to measure. ^(Recognized integer codes -** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...].)^ +** are of the form [status parameters | SQLITE_STATUS_...].)^ ** ^The current value of the parameter is returned into *pCurrent. ** ^The highest recorded value is returned in *pHighwater. ^If the ** resetFlag is true, then the highest record value is reset after @@ -5577,12 +5582,13 @@ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); /* ** CAPI3REF: Status Parameters +** KEYWORDS: {status parameters} ** ** These integer constants designate various run-time status parameters ** that can be returned by [sqlite3_status()]. ** **
-** ^(
SQLITE_STATUS_MEMORY_USED
+** [[SQLITE_STATUS_MEMORY_USED]] ^(
SQLITE_STATUS_MEMORY_USED
**
This parameter is the current amount of memory checked out ** using [sqlite3_malloc()], either directly or indirectly. The ** figure includes calls made to [sqlite3_malloc()] by the application @@ -5592,23 +5598,24 @@ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); ** this parameter. The amount returned is the sum of the allocation ** sizes as reported by the xSize method in [sqlite3_mem_methods].
)^ ** -** ^(
SQLITE_STATUS_MALLOC_SIZE
+** [[SQLITE_STATUS_MALLOC_SIZE]] ^(
SQLITE_STATUS_MALLOC_SIZE
**
This parameter records the largest memory allocation request ** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their ** internal equivalents). Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. ** The value written into the *pCurrent parameter is undefined.
)^ ** -** ^(
SQLITE_STATUS_MALLOC_COUNT
+** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
SQLITE_STATUS_MALLOC_COUNT
**
This parameter records the number of separate memory allocations ** currently checked out.
)^ ** -** ^(
SQLITE_STATUS_PAGECACHE_USED
+** [[SQLITE_STATUS_PAGECACHE_USED]] ^(
SQLITE_STATUS_PAGECACHE_USED
**
This parameter returns the number of pages used out of the ** [pagecache memory allocator] that was configured using ** [SQLITE_CONFIG_PAGECACHE]. The ** value returned is in pages, not in bytes.
)^ ** +** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] ** ^(
SQLITE_STATUS_PAGECACHE_OVERFLOW
**
This parameter returns the number of bytes of page cache ** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] @@ -5618,13 +5625,13 @@ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); ** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because ** no space was left in the page cache.
)^ ** -** ^(
SQLITE_STATUS_PAGECACHE_SIZE
+** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
SQLITE_STATUS_PAGECACHE_SIZE
**
This parameter records the largest memory allocation request ** handed to [pagecache memory allocator]. Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. ** The value written into the *pCurrent parameter is undefined.
)^ ** -** ^(
SQLITE_STATUS_SCRATCH_USED
+** [[SQLITE_STATUS_SCRATCH_USED]] ^(
SQLITE_STATUS_SCRATCH_USED
**
This parameter returns the number of allocations used out of the ** [scratch memory allocator] configured using ** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not @@ -5632,7 +5639,7 @@ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); ** outstanding at time, this parameter also reports the number of threads ** using scratch memory at the same time.
)^ ** -** ^(
SQLITE_STATUS_SCRATCH_OVERFLOW
+** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
SQLITE_STATUS_SCRATCH_OVERFLOW
**
This parameter returns the number of bytes of scratch memory ** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] ** buffer and where forced to overflow to [sqlite3_malloc()]. The values @@ -5642,13 +5649,13 @@ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); ** slots were available. **
)^ ** -** ^(
SQLITE_STATUS_SCRATCH_SIZE
+** [[SQLITE_STATUS_SCRATCH_SIZE]] ^(
SQLITE_STATUS_SCRATCH_SIZE
**
This parameter records the largest memory allocation request ** handed to [scratch memory allocator]. Only the value returned in the ** *pHighwater parameter to [sqlite3_status()] is of interest. ** The value written into the *pCurrent parameter is undefined.
)^ ** -** ^(
SQLITE_STATUS_PARSER_STACK
+** [[SQLITE_STATUS_PARSER_STACK]] ^(
SQLITE_STATUS_PARSER_STACK
**
This parameter records the deepest parser stack. It is only ** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
)^ **
@@ -5673,9 +5680,9 @@ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); ** about a single [database connection]. ^The first argument is the ** database connection object to be interrogated. ^The second argument ** is an integer constant, taken from the set of -** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros, that +** [SQLITE_DBSTATUS options], that ** determines the parameter to interrogate. The set of -** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros is likely +** [SQLITE_DBSTATUS options] is likely ** to grow in future releases of SQLite. ** ** ^The current value of the requested parameter is written into *pCur @@ -5692,6 +5699,7 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); /* ** CAPI3REF: Status Parameters for database connections +** KEYWORDS: {SQLITE_DBSTATUS options} ** ** These constants are the available integer "verbs" that can be passed as ** the second argument to the [sqlite3_db_status()] interface. @@ -5703,15 +5711,16 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); ** if a discontinued or unsupported verb is invoked. ** **
-** ^(
SQLITE_DBSTATUS_LOOKASIDE_USED
+** [[SQLITE_DBSTATUS_LOOKASIDE_USED]] ^(
SQLITE_DBSTATUS_LOOKASIDE_USED
**
This parameter returns the number of lookaside memory slots currently ** checked out.
)^ ** -** ^(
SQLITE_DBSTATUS_LOOKASIDE_HIT
+** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
SQLITE_DBSTATUS_LOOKASIDE_HIT
**
This parameter returns the number malloc attempts that were ** satisfied using lookaside memory. Only the high-water value is meaningful; ** the current value is always zero.)^ ** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] ** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
**
This parameter returns the number malloc attempts that might have ** been satisfied using lookaside memory but failed due to the amount of @@ -5719,6 +5728,7 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); ** Only the high-water value is meaningful; ** the current value is always zero.)^ ** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] ** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
**
This parameter returns the number malloc attempts that might have ** been satisfied using lookaside memory but failed due to all lookaside @@ -5726,12 +5736,12 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); ** Only the high-water value is meaningful; ** the current value is always zero.)^ ** -** ^(
SQLITE_DBSTATUS_CACHE_USED
+** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
SQLITE_DBSTATUS_CACHE_USED
**
This parameter returns the approximate number of of bytes of heap ** memory used by all pager caches associated with the database connection.)^ ** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. ** -** ^(
SQLITE_DBSTATUS_SCHEMA_USED
+** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
SQLITE_DBSTATUS_SCHEMA_USED
**
This parameter returns the approximate number of of bytes of heap ** memory used to store the schema for all databases associated ** with the connection - main, temp, and any [ATTACH]-ed databases.)^ @@ -5740,7 +5750,7 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); ** [shared cache mode] being enabled. ** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. ** -** ^(
SQLITE_DBSTATUS_STMT_USED
+** [[SQLITE_DBSTATUS_STMT_USED]] ^(
SQLITE_DBSTATUS_STMT_USED
**
This parameter returns the approximate number of of bytes of heap ** and lookaside memory used by all prepared statements associated with ** the database connection.)^ @@ -5762,7 +5772,7 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); ** CAPI3REF: Prepared Statement Status ** ** ^(Each prepared statement maintains various -** [SQLITE_STMTSTATUS_SORT | counters] that measure the number +** [SQLITE_STMTSTATUS counters] that measure the number ** of times it has performed specific operations.)^ These counters can ** be used to monitor the performance characteristics of the prepared ** statements. For example, if the number of table steps greatly exceeds @@ -5773,7 +5783,7 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); ** ^(This interface is used to retrieve and reset counter values from ** a [prepared statement]. The first argument is the prepared statement ** object to be interrogated. The second argument -** is an integer code for a specific [SQLITE_STMTSTATUS_SORT | counter] +** is an integer code for a specific [SQLITE_STMTSTATUS counter] ** to be interrogated.)^ ** ^The current value of the requested counter is returned. ** ^If the resetFlg is true, then the counter is reset to zero after this @@ -5785,24 +5795,25 @@ int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); /* ** CAPI3REF: Status Parameters for prepared statements +** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} ** ** These preprocessor macros define integer codes that name counter ** values associated with the [sqlite3_stmt_status()] interface. ** The meanings of the various counters are as follows: ** **
-**
SQLITE_STMTSTATUS_FULLSCAN_STEP
+** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
SQLITE_STMTSTATUS_FULLSCAN_STEP
**
^This is the number of times that SQLite has stepped forward in ** a table as part of a full table scan. Large numbers for this counter ** may indicate opportunities for performance improvement through ** careful use of indices.
** -**
SQLITE_STMTSTATUS_SORT
+** [[SQLITE_STMTSTATUS_SORT]]
SQLITE_STMTSTATUS_SORT
**
^This is the number of sort operations that have occurred. ** A non-zero value in this counter may indicate an opportunity to ** improvement performance through careful use of indices.
** -**
SQLITE_STMTSTATUS_AUTOINDEX
+** [[SQLITE_STMTSTATUS_AUTOINDEX]]
SQLITE_STMTSTATUS_AUTOINDEX
**
^This is the number of rows inserted into transient indices that ** were created automatically in order to help joins run faster. ** A non-zero value in this counter may indicate an opportunity to @@ -5853,6 +5864,7 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** the application may discard the parameter after the call to ** [sqlite3_config()] returns.)^ ** +** [[the xInit() page cache method]] ** ^(The xInit() method is called once for each effective ** call to [sqlite3_initialize()])^ ** (usually only once during the lifetime of the process). ^(The xInit() @@ -5863,6 +5875,7 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** built-in default page cache is used instead of the application defined ** page cache.)^ ** +** [[the xShutdown() page cache method]] ** ^The xShutdown() method is called by [sqlite3_shutdown()]. ** It can be used to clean up ** any outstanding resources before process shutdown, if required. @@ -5877,6 +5890,7 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** ^SQLite will never invoke xInit() more than once without an intervening ** call to xShutdown(). ** +** [[the xCreate() page cache methods]] ** ^SQLite invokes the xCreate() method to construct a new cache instance. ** SQLite will typically create one cache instance for each open database file, ** though this is not guaranteed. ^The @@ -5901,6 +5915,7 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** ^Hence, a cache created with bPurgeable false will ** never contain any unpinned pages. ** +** [[the xCachesize() page cache method]] ** ^(The xCachesize() method may be called at any time by SQLite to set the ** suggested maximum cache-size (number of pages stored by) the cache ** instance passed as the first argument. This is the value configured using @@ -5908,9 +5923,11 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** parameter, the implementation is not required to do anything with this ** value; it is advisory only. ** +** [[the xPagecount() page cache methods]] ** The xPagecount() method must return the number of pages currently ** stored in the cache, both pinned and unpinned. ** +** [[the xFetch() page cache methods]] ** The xFetch() method locates a page in the cache and returns a pointer to ** the page, or a NULL pointer. ** A "page", in this context, means a buffer of szPage bytes aligned at an @@ -5939,6 +5956,7 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** attempt to unpin one or more cache pages by spilling the content of ** pinned pages to disk and synching the operating system disk cache. ** +** [[the xUnpin() page cache method]] ** ^xUnpin() is called by SQLite with a pointer to a currently pinned page ** as its second argument. If the third parameter, discard, is non-zero, ** then the page must be evicted from the cache. @@ -5951,6 +5969,7 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** call to xUnpin() unpins the page regardless of the number of prior calls ** to xFetch(). ** +** [[the xRekey() page cache methods]] ** The xRekey() method is used to change the key value associated with the ** page passed as the second argument. If the cache ** previously contains an entry associated with newKey, it must be @@ -5963,6 +5982,7 @@ typedef struct sqlite3_pcache sqlite3_pcache; ** of these pages are pinned, they are implicitly unpinned, meaning that ** they can be safely discarded. ** +** [[the xDestroy() page cache method]] ** ^The xDestroy() method is used to delete a cache allocated by xCreate(). ** All resources associated with the specified cache should be freed. ^After ** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] @@ -6025,7 +6045,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** There should be exactly one call to sqlite3_backup_finish() for each ** successful call to sqlite3_backup_init(). ** -** sqlite3_backup_init() +** [[sqlite3_backup_init()]] sqlite3_backup_init() ** ** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the ** [database connection] associated with the destination database @@ -6052,7 +6072,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** sqlite3_backup_finish() functions to perform the specified backup ** operation. ** -** sqlite3_backup_step() +** [[sqlite3_backup_step()]] sqlite3_backup_step() ** ** ^Function sqlite3_backup_step(B,N) will copy up to N pages between ** the source and destination databases specified by [sqlite3_backup] object B. @@ -6109,7 +6129,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** by the backup operation, then the backup database is automatically ** updated at the same time. ** -** sqlite3_backup_finish() +** [[sqlite3_backup_finish()]] sqlite3_backup_finish() ** ** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the ** application wishes to abandon the backup operation, the application @@ -6132,7 +6152,8 @@ typedef struct sqlite3_backup sqlite3_backup; ** is not a permanent error and does not affect the return value of ** sqlite3_backup_finish(). ** -** sqlite3_backup_remaining(), sqlite3_backup_pagecount() +** [[sqlite3_backup__remaining()]] [[sqlite3_backup_pagecount()]] +** sqlite3_backup_remaining() and sqlite3_backup_pagecount() ** ** ^Each call to sqlite3_backup_step() sets two values inside ** the [sqlite3_backup] object: the number of pages still to be backed @@ -6513,9 +6534,6 @@ int sqlite3_wal_checkpoint_v2( ** [sqlite3_wal_checkpoint_v2()]. See the [sqlite3_wal_checkpoint_v2()] ** documentation for additional information about the meaning and use of ** each of these values. -** -**
SQLITE_CONFIG_GETMUTEX
-**
^(This option takes a single argument which is a pointer to an */ #define SQLITE_CHECKPOINT_PASSIVE 0 #define SQLITE_CHECKPOINT_FULL 1 From 671b52242b48bb1e5a99c8937a7ff4cf9e283c59 Mon Sep 17 00:00:00 2001 From: shaneh Date: Thu, 12 May 2011 21:01:12 +0000 Subject: [PATCH 03/38] Add fts3_term.c to amalg gen script and configure input files. FossilOrigin-Name: 6ee0773290a4c4aac2b2b5e1741e65170e08a8bb --- Makefile.in | 11 ++++++++--- manifest | 16 ++++++++-------- manifest.uuid | 2 +- tool/mksqlite3c.tcl | 1 + 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Makefile.in b/Makefile.in index f3239f3d79..01c4010b8e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -166,7 +166,7 @@ LIBOBJS0 = alter.lo analyze.lo attach.lo auth.lo \ callback.lo complete.lo ctime.lo date.lo delete.lo \ expr.lo fault.lo fkey.lo \ fts3.lo fts3_aux.lo fts3_expr.lo fts3_hash.lo fts3_icu.lo fts3_porter.lo \ - fts3_snippet.lo fts3_tokenizer.lo fts3_tokenizer1.lo fts3_write.lo \ + fts3_snippet.lo fts3_term.lo fts3_tokenizer.lo fts3_tokenizer1.lo fts3_write.lo \ func.lo global.lo hash.lo \ icu.lo insert.lo journal.lo legacy.lo loadext.lo \ main.lo malloc.lo mem0.lo mem1.lo mem2.lo mem3.lo mem5.lo \ @@ -313,6 +313,7 @@ SRC += \ $(TOP)/ext/fts3/fts3_icu.c \ $(TOP)/ext/fts3/fts3_porter.c \ $(TOP)/ext/fts3/fts3_snippet.c \ + $(TOP)/ext/fts3/fts3_term.c \ $(TOP)/ext/fts3/fts3_tokenizer.h \ $(TOP)/ext/fts3/fts3_tokenizer.c \ $(TOP)/ext/fts3/fts3_tokenizer1.c \ @@ -420,6 +421,7 @@ TESTSRC2 = \ $(TOP)/ext/fts3/fts3.c \ $(TOP)/ext/fts3/fts3_aux.c \ $(TOP)/ext/fts3/fts3_expr.c \ + $(TOP)/ext/fts3/fts3_term.c \ $(TOP)/ext/fts3/fts3_tokenizer.c \ $(TOP)/ext/fts3/fts3_write.c \ $(TOP)/ext/async/sqlite3async.c @@ -828,11 +830,14 @@ fts3_hash.lo: $(TOP)/ext/fts3/fts3_hash.c $(HDR) $(EXTHDR) fts3_icu.lo: $(TOP)/ext/fts3/fts3_icu.c $(HDR) $(EXTHDR) $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_icu.c +fts3_porter.lo: $(TOP)/ext/fts3/fts3_porter.c $(HDR) $(EXTHDR) + $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_porter.c + fts3_snippet.lo: $(TOP)/ext/fts3/fts3_snippet.c $(HDR) $(EXTHDR) $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_snippet.c -fts3_porter.lo: $(TOP)/ext/fts3/fts3_porter.c $(HDR) $(EXTHDR) - $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_porter.c +fts3_term.lo: $(TOP)/ext/fts3/fts3_term.c $(HDR) $(EXTHDR) + $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_term.c fts3_tokenizer.lo: $(TOP)/ext/fts3/fts3_tokenizer.c $(HDR) $(EXTHDR) $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_tokenizer.c diff --git a/manifest b/manifest index 9ed32b67a9..1415b061f0 100644 --- a/manifest +++ b/manifest @@ -1,7 +1,7 @@ -C Improvements\sto\sdocumentation\shyperlinks.\s\sChange\sthe\svalue\sof\nSQLITE_OPEN_URI\sto\san\sunreserved\svalue. -D 2011-05-11T20:54:32.761 +C Add\sfts3_term.c\sto\samalg\sgen\sscript\sand\sconfigure\sinput\sfiles. +D 2011-05-12T21:01:12.782 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 +F Makefile.in 4a7ed220f2e9a068fd0f0b2ec451439f63e629fc F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.vxworks c85ec1d8597fe2f7bc225af12ac1666e21379151 F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6 @@ -910,7 +910,7 @@ F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc F tool/mkkeywordhash.c d2e6b4a5965e23afb80fbe74bb54648cd371f309 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 -F tool/mksqlite3c.tcl 623e26cc8c83322e4151d3ad85ac69d41221bae8 +F tool/mksqlite3c.tcl d171512b785283690b6f80997bee974c80087a23 F tool/mksqlite3h.tcl d76c226a5e8e1f3b5f6593bcabe5e98b3b1ec9ff F tool/mksqlite3internalh.tcl 7b43894e21bcb1bb39e11547ce7e38a063357e87 F tool/omittest.tcl b1dd290c1596e0f31fd335160a74ec5dfea3df4a @@ -935,7 +935,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 8885c8677b239d4cbef24b9409a1736e1ae97a3f -R 4c0850c5e479c451c0b9f9d3c09b6b6d -U drh -Z d48f7732010e4bf6308d6bb0dacbdaca +P 851ab75d5f5d64d95d6237c28658bbc32145b78b +R f2444b92fe2cfe7d047908f98416ca93 +U shaneh +Z aec7145a879a050a92e29403b1ef0483 diff --git a/manifest.uuid b/manifest.uuid index c35fe83711..f29a126a22 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -851ab75d5f5d64d95d6237c28658bbc32145b78b \ No newline at end of file +6ee0773290a4c4aac2b2b5e1741e65170e08a8bb \ No newline at end of file diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index fa99f2df7b..f88ca08887 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -298,6 +298,7 @@ foreach file { fts3_expr.c fts3_hash.c fts3_porter.c + fts3_term.c fts3_tokenizer.c fts3_tokenizer1.c fts3_write.c From 79d0e1c0a73f27735029a64879d84a6652ea567c Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 May 2011 17:11:20 +0000 Subject: [PATCH 04/38] Also add fts3_term.c to main.mk. FossilOrigin-Name: 966f2d2c1f01b6345eab5df87a40d337ced1c087 --- main.mk | 8 ++++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/main.mk b/main.mk index 3df069a71d..0035743003 100644 --- a/main.mk +++ b/main.mk @@ -54,8 +54,8 @@ LIBOBJ+= alter.o analyze.o attach.o auth.o \ backup.o bitvec.o btmutex.o btree.o build.o \ callback.o complete.o ctime.o date.o delete.o expr.o fault.o fkey.o \ fts3.o fts3_aux.o fts3_expr.o fts3_hash.o fts3_icu.o fts3_porter.o \ - fts3_snippet.o fts3_tokenizer.o fts3_tokenizer1.o fts3_write.o \ - func.o global.o hash.o \ + fts3_snippet.o fts3_term.o fts3_tokenizer.o fts3_tokenizer1.o \ + fts3_write.o func.o global.o hash.o \ icu.o insert.o journal.o legacy.o loadext.o \ main.o malloc.o mem0.o mem1.o mem2.o mem3.o mem5.o \ memjournal.o \ @@ -194,6 +194,7 @@ SRC += \ $(TOP)/ext/fts3/fts3_icu.c \ $(TOP)/ext/fts3/fts3_porter.c \ $(TOP)/ext/fts3/fts3_snippet.c \ + $(TOP)/ext/fts3/fts3_term.c \ $(TOP)/ext/fts3/fts3_tokenizer.h \ $(TOP)/ext/fts3/fts3_tokenizer.c \ $(TOP)/ext/fts3/fts3_tokenizer1.c \ @@ -483,6 +484,9 @@ fts3_icu.o: $(TOP)/ext/fts3/fts3_icu.c $(HDR) $(EXTHDR) fts3_snippet.o: $(TOP)/ext/fts3/fts3_snippet.c $(HDR) $(EXTHDR) $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_snippet.c +fts3_term.o: $(TOP)/ext/fts3/fts3_term.c $(HDR) $(EXTHDR) + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_term.c + fts3_porter.o: $(TOP)/ext/fts3/fts3_porter.c $(HDR) $(EXTHDR) $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_porter.c diff --git a/manifest b/manifest index 1415b061f0..87e21c9908 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sfts3_term.c\sto\samalg\sgen\sscript\sand\sconfigure\sinput\sfiles. -D 2011-05-12T21:01:12.782 +C Also\sadd\sfts3_term.c\sto\smain.mk. +D 2011-05-13T17:11:20.942 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4a7ed220f2e9a068fd0f0b2ec451439f63e629fc F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -102,7 +102,7 @@ F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 -F main.mk 496cec8b7890e39127532294e28e5e1d1b1beae1 +F main.mk bedd9fb5f843eab5d575275ef7d906a1e58c30a2 F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f F mkextw.sh 4123480947681d9b434a5e7b1ee08135abe409ac @@ -935,7 +935,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 851ab75d5f5d64d95d6237c28658bbc32145b78b -R f2444b92fe2cfe7d047908f98416ca93 -U shaneh -Z aec7145a879a050a92e29403b1ef0483 +P 6ee0773290a4c4aac2b2b5e1741e65170e08a8bb +R e29a65a14e0a90ae39fc424e77122ad0 +U drh +Z 4626b21df75720896779227cd4b29fbb diff --git a/manifest.uuid b/manifest.uuid index f29a126a22..8352adc09a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6ee0773290a4c4aac2b2b5e1741e65170e08a8bb \ No newline at end of file +966f2d2c1f01b6345eab5df87a40d337ced1c087 \ No newline at end of file From 99a66928c21a159697fc09e58ca1b0f1969491a7 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 May 2011 18:51:42 +0000 Subject: [PATCH 05/38] Make arrangements so that virtual table inserts into shadow tables do not modify the sqlite3_last_insert_rowid() return. Document that this is how sqlite3_last_insert_rowid() works. FossilOrigin-Name: e569f18b989aef853c9d71eaf73d6967f0a8c583 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 14 +++++++++----- src/vdbe.c | 13 +++++++++---- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 87e21c9908..e52173bba4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Also\sadd\sfts3_term.c\sto\smain.mk. -D 2011-05-13T17:11:20.942 +C Make\sarrangements\sso\sthat\svirtual\stable\sinserts\sinto\sshadow\stables\sdo\nnot\smodify\sthe\ssqlite3_last_insert_rowid()\sreturn.\s\sDocument\sthat\sthis\nis\show\ssqlite3_last_insert_rowid()\sworks. +D 2011-05-13T18:51:42.945 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4a7ed220f2e9a068fd0f0b2ec451439f63e629fc F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -179,7 +179,7 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79 -F src/sqlite.h.in 26f123aa6f23b6cbd84d4ef6df3b8210a23a3b0b +F src/sqlite.h.in d7cc9050446a5ed9eb896362dd264e6e10e0cc03 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d @@ -236,7 +236,7 @@ F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c 914e860d21496b19a912cd14f6f7a889a22f44e1 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e -F src/vdbe.c b2070c926a896e59234e27412a45e261fe752235 +F src/vdbe.c 343a068e8daeb8475e66776feb9f2974046e95c5 F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1 @@ -935,7 +935,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 6ee0773290a4c4aac2b2b5e1741e65170e08a8bb -R e29a65a14e0a90ae39fc424e77122ad0 +P 966f2d2c1f01b6345eab5df87a40d337ced1c087 +R bc50f0e830166d8298c23030a9099063 U drh -Z 4626b21df75720896779227cd4b29fbb +Z 667528c5e659a82acf6d9a2a3fcf251b diff --git a/manifest.uuid b/manifest.uuid index 8352adc09a..033c321dcb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -966f2d2c1f01b6345eab5df87a40d337ced1c087 \ No newline at end of file +e569f18b989aef853c9d71eaf73d6967f0a8c583 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 8e041ac750..dbc4a45a6c 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -1548,13 +1548,17 @@ int sqlite3_extended_result_codes(sqlite3*, int onoff); ** ** ^This routine returns the [rowid] of the most recent ** successful [INSERT] into the database from the [database connection] -** in the first argument. ^If no successful [INSERT]s +** in the first argument. ^As of SQLite version 3.7.7, this routines +** records the last insert rowid of both ordinary tables and [virtual tables]. +** ^If no successful [INSERT]s ** have ever occurred on that database connection, zero is returned. ** -** ^(If an [INSERT] occurs within a trigger, then the [rowid] of the inserted -** row is returned by this routine as long as the trigger is running. -** But once the trigger terminates, the value returned by this routine -** reverts to the last value inserted before the trigger fired.)^ +** ^(If an [INSERT] occurs within a trigger or within a [virtual table] +** method, then this routine will return the [rowid] of the inserted +** row as long as the trigger or virtual table method is running. +** But once the trigger or virtual table method ends, the value returned +** by this routine reverts to what it was before the trigger or virtual +** table method began.)^ ** ** ^An [INSERT] that fails due to a constraint violation is not a ** successful [INSERT] and does not change the value returned by this diff --git a/src/vdbe.c b/src/vdbe.c index c409fdd83b..cac0906998 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -564,6 +564,7 @@ int sqlite3VdbeExec( Mem *pOut = 0; /* Output operand */ int iCompare = 0; /* Result of last OP_Compare operation */ int *aPermute = 0; /* Permutation of columns for OP_Compare */ + i64 lastRowid = db->lastRowid; /* Saved value of the last insert ROWID */ #ifdef VDBE_PROFILE u64 start; /* CPU clock count at start of opcode */ int origPc; /* Program counter at start of opcode */ @@ -833,6 +834,7 @@ case OP_Halt: { p->nFrame--; sqlite3VdbeSetChanges(db, p->nChange); pc = sqlite3VdbeFrameRestore(pFrame); + lastRowid = db->lastRowid; if( pOp->p2==OE_Ignore ){ /* Instruction pc is the OP_Program that invoked the sub-program ** currently being halted. If the p2 instruction of this OP_Halt @@ -1393,7 +1395,9 @@ case OP_Function: { assert( pOp[-1].opcode==OP_CollSeq ); ctx.pColl = pOp[-1].p4.pColl; } + db->lastRowid = lastRowid; (*ctx.pFunc->xFunc)(&ctx, n, apVal); /* IMP: R-24505-23230 */ + lastRowid = db->lastRowid; if( db->mallocFailed ){ /* Even though a malloc() has failed, the implementation of the ** user function may have called an sqlite3_result_XXX() function @@ -3809,7 +3813,7 @@ case OP_NewRowid: { /* out2-prerelease */ assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is ** an AUTOINCREMENT table. */ /* on the first attempt, simply do one more than previous */ - v = db->lastRowid; + v = lastRowid; v &= (MAX_ROWID>>1); /* ensure doesn't go negative */ v++; /* ensure non-zero */ cnt = 0; @@ -3919,7 +3923,7 @@ case OP_InsertInt: { } if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; - if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = iKey; + if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = iKey; if( pData->flags & MEM_Null ){ pData->z = 0; pData->n = 0; @@ -5007,7 +5011,7 @@ case OP_Program: { /* jump */ p->nFrame++; pFrame->pParent = p->pFrame; - pFrame->lastRowid = db->lastRowid; + pFrame->lastRowid = lastRowid; pFrame->nChange = p->nChange; p->nChange = 0; p->pFrame = pFrame; @@ -5814,7 +5818,7 @@ case OP_VUpdate: { importVtabErrMsg(p, pVtab); if( rc==SQLITE_OK && pOp->p1 ){ assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) ); - db->lastRowid = rowid; + db->lastRowid = lastRowid = rowid; } if( rc==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){ if( pOp->p5==OE_Ignore ){ @@ -5972,6 +5976,7 @@ vdbe_error_halt: ** release the mutexes on btrees that were acquired at the ** top. */ vdbe_return: + db->lastRowid = lastRowid; sqlite3VdbeLeave(p); return rc; From 85a837558066fdf758d19b905e024690076bb09b Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 16 May 2011 21:00:27 +0000 Subject: [PATCH 06/38] Enhance WAL mode so that the WAL file honors the journal size limit set by PRAGMA journal_size_limit. FossilOrigin-Name: db7e500f69faf1906a84991ba67d26a195f02ae5 --- manifest | 17 +++---- manifest.uuid | 2 +- src/pager.c | 4 +- src/wal.c | 26 +++++++++++ src/wal.h | 6 ++- test/wal7.test | 118 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 162 insertions(+), 11 deletions(-) create mode 100644 test/wal7.test diff --git a/manifest b/manifest index e52173bba4..4a39930802 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sarrangements\sso\sthat\svirtual\stable\sinserts\sinto\sshadow\stables\sdo\nnot\smodify\sthe\ssqlite3_last_insert_rowid()\sreturn.\s\sDocument\sthat\sthis\nis\show\ssqlite3_last_insert_rowid()\sworks. -D 2011-05-13T18:51:42.945 +C Enhance\sWAL\smode\sso\sthat\sthe\sWAL\sfile\shonors\sthe\sjournal\ssize\slimit\sset\nby\sPRAGMA\sjournal_size_limit. +D 2011-05-16T21:00:27.928 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4a7ed220f2e9a068fd0f0b2ec451439f63e629fc F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -165,7 +165,7 @@ F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440 F src/os_unix.c 2c67d126874b78eb427371db4793f0e8fbc7448b F src/os_win.c ff0e14615a5086fa5ba6926e4ec0dc9cfb5a1a84 -F src/pager.c 24b689bc3639d534f5fb292d2c68038b1e720527 +F src/pager.c ebf0411b037fbc6dec272520be55fc11423e789a F src/pager.h 3f8c783de1d4706b40b1ac15b64f5f896bcc78d1 F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa @@ -245,8 +245,8 @@ F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 F src/vtab.c 48dcef8bc757c2e7b488f68b5ddebb1650da2450 -F src/wal.c 7334009b396285b658a95a3b6bc6d2b016a1f794 -F src/wal.h 7a5fbb00114b7f2cd40c7e1003d4c41ce9d26840 +F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66 +F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f F src/where.c 55403ce19c506be6a321c7f129aff693d6103db5 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 @@ -873,6 +873,7 @@ F test/wal3.test 5c396cc22497244d627306f4c1d360167353f8dd F test/wal4.test 3404b048fa5e10605facaf70384e6d2943412e30 F test/wal5.test 1bbfaa316dc2a1d0d1fac3f4500c38a90055a41b F test/wal6.test 07aa31ca8892d0527f2c5c5a9a2a87aa421dfaa8 +F test/wal7.test 09bc8de3d11949571d6f7a4188b308059cec27e5 F test/wal_common.tcl a98f17fba96206122eff624db0ab13ec377be4fe F test/walbak.test 4df1c7369da0301caeb9a48fa45997fd592380e4 F test/walbig.test e882bc1d014afffbfa2b6ba36e0f07d30a633ad0 @@ -935,7 +936,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 966f2d2c1f01b6345eab5df87a40d337ced1c087 -R bc50f0e830166d8298c23030a9099063 +P e569f18b989aef853c9d71eaf73d6967f0a8c583 +R cf1687694ba42845f8565b086734fa2b U drh -Z 667528c5e659a82acf6d9a2a3fcf251b +Z b788aa40bf13c0a5b33fd90cecbf33e8 diff --git a/manifest.uuid b/manifest.uuid index 033c321dcb..8a54fcea5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e569f18b989aef853c9d71eaf73d6967f0a8c583 \ No newline at end of file +db7e500f69faf1906a84991ba67d26a195f02ae5 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 8ad6984f8a..24db850273 100644 --- a/src/pager.c +++ b/src/pager.c @@ -6607,6 +6607,7 @@ int sqlite3PagerOkToChangeJournalMode(Pager *pPager){ i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){ if( iLimit>=-1 ){ pPager->journalSizeLimit = iLimit; + sqlite3WalLimit(pPager->pWal, iLimit); } return pPager->journalSizeLimit; } @@ -6698,7 +6699,8 @@ static int pagerOpenWal(Pager *pPager){ */ if( rc==SQLITE_OK ){ rc = sqlite3WalOpen(pPager->pVfs, - pPager->fd, pPager->zWal, pPager->exclusiveMode, &pPager->pWal + pPager->fd, pPager->zWal, pPager->exclusiveMode, + pPager->journalSizeLimit, &pPager->pWal ); } diff --git a/src/wal.c b/src/wal.c index 51ea18fb21..1222660985 100644 --- a/src/wal.c +++ b/src/wal.c @@ -412,6 +412,7 @@ struct Wal { sqlite3_file *pDbFd; /* File handle for the database file */ sqlite3_file *pWalFd; /* File handle for WAL file */ u32 iCallback; /* Value to pass to log callback (or 0) */ + i64 mxWalSize; /* Truncate WAL to this size upon reset */ int nWiData; /* Size of array apWiData */ volatile u32 **apWiData; /* Pointer to wal-index content in memory */ u32 szPage; /* Database page size */ @@ -1234,6 +1235,7 @@ int sqlite3WalOpen( sqlite3_file *pDbFd, /* The open database file */ const char *zWalName, /* Name of the WAL file */ int bNoShm, /* True to run in heap-memory mode */ + i64 mxWalSize, /* Truncate WAL to this size on reset */ Wal **ppWal /* OUT: Allocated Wal handle */ ){ int rc; /* Return Code */ @@ -1266,6 +1268,7 @@ int sqlite3WalOpen( pRet->pWalFd = (sqlite3_file *)&pRet[1]; pRet->pDbFd = pDbFd; pRet->readLock = -1; + pRet->mxWalSize = mxWalSize; pRet->zWalName = zWalName; pRet->exclusiveMode = (bNoShm ? WAL_HEAPMEMORY_MODE: WAL_NORMAL_MODE); @@ -1287,6 +1290,13 @@ int sqlite3WalOpen( return rc; } +/* +** Change the size to which the WAL file is trucated on each reset. +*/ +void sqlite3WalLimit(Wal *pWal, i64 iLimit){ + if( pWal ) pWal->mxWalSize = iLimit; +} + /* ** Find the smallest page number out of all pages held in the WAL that ** has not been returned by any prior invocation of this method on the @@ -2522,6 +2532,22 @@ static int walRestartLog(Wal *pWal){ */ int i; /* Loop counter */ u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */ + + /* Limit the size of WAL file if the journal_size_limit PRAGMA is + ** set to a non-negative value. Log errors encountered + ** during the truncation attempt. */ + if( pWal->mxWalSize>=0 ){ + i64 sz; + int rx; + rx = sqlite3OsFileSize(pWal->pWalFd, &sz); + if( rx==SQLITE_OK && (sz > pWal->mxWalSize) ){ + rx = sqlite3OsTruncate(pWal->pWalFd, pWal->mxWalSize); + } + if( rx ){ + sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName); + } + } + pWal->nCkpt++; pWal->hdr.mxFrame = 0; sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0])); diff --git a/src/wal.h b/src/wal.h index 2039c701cf..a62b23bbdc 100644 --- a/src/wal.h +++ b/src/wal.h @@ -21,6 +21,7 @@ #ifdef SQLITE_OMIT_WAL # define sqlite3WalOpen(x,y,z) 0 +# define sqlite3WalLimit(x,y) # define sqlite3WalClose(w,x,y,z) 0 # define sqlite3WalBeginReadTransaction(y,z) 0 # define sqlite3WalEndReadTransaction(z) @@ -46,9 +47,12 @@ typedef struct Wal Wal; /* Open and close a connection to a write-ahead log. */ -int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *zName, int, Wal**); +int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *, int, i64, Wal**); int sqlite3WalClose(Wal *pWal, int sync_flags, int, u8 *); +/* Set the limiting size of a WAL file. */ +void sqlite3WalLimit(Wal*, i64); + /* Used by readers to open (lock) and close (unlock) a snapshot. A ** snapshot is like a read-transaction. It is the state of the database ** at an instant in time. sqlite3WalOpenSnapshot gets a read lock and diff --git a/test/wal7.test b/test/wal7.test new file mode 100644 index 0000000000..cfe2d7b8b0 --- /dev/null +++ b/test/wal7.test @@ -0,0 +1,118 @@ +# 2011 May 16 +# +# 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. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this file is testing the PRAGMA journal_size_limit when +# in WAL mode. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +ifcapable !wal {finish_test ; return } + +# Case 1: No size limit. Journal can get large. +# +do_test wal7-1.0 { + db close + forcedelete test.db + sqlite3 db test.db + db eval { + PRAGMA page_size=1024; + PRAGMA journal_mode=WAL; + PRAGMA wal_autocheckpoint=50; -- 50 pages + CREATE TABLE t1(x, y UNIQUE); + INSERT INTO t1 VALUES(1,2); + INSERT INTO t1 VALUES(zeroblob(200000),4); + CREATE TABLE t2(z); + DELETE FROM t1; + INSERT INTO t2 SELECT x FROM t1; + } + expr {[file size test.db-wal]>50*1100} +} 1 +do_test wal7-1.1 { + db eval {PRAGMA wal_checkpoint} + expr {[file size test.db-wal]>50*1100} +} 1 +do_test wal7-1.2 { + db eval {INSERT INTO t2 VALUES('hi');} + expr {[file size test.db-wal]>50*1100} +} 1 + +# Case 2: Size limit at half the autocheckpoint size. +# +do_test wal7-2.0 { + db close + forcedelete test.db + sqlite3 db test.db + db eval { + PRAGMA page_size=1024; + PRAGMA journal_mode=WAL; + PRAGMA wal_autocheckpoint=50; -- 50 pages + PRAGMA journal_size_limit=25000; + CREATE TABLE t1(x, y UNIQUE); + INSERT INTO t1 VALUES(1,2); + INSERT INTO t1 VALUES(zeroblob(200000),4); + CREATE TABLE t2(z); + DELETE FROM t1; + INSERT INTO t2 SELECT x FROM t1; + } + file size test.db-wal +} 25000 + + +# Case 3: Size limit of zero. +# +do_test wal7-3.0 { + db close + forcedelete test.db + sqlite3 db test.db + db eval { + PRAGMA page_size=1024; + PRAGMA journal_mode=WAL; + PRAGMA wal_autocheckpoint=50; -- 50 pages + PRAGMA journal_size_limit=0; + CREATE TABLE t1(x, y UNIQUE); + INSERT INTO t1 VALUES(1,2); + INSERT INTO t1 VALUES(zeroblob(200000),4); + CREATE TABLE t2(z); + DELETE FROM t1; + INSERT INTO t2 SELECT x FROM t1; + } + set sz [file size test.db-wal] + expr {$sz>0 && $sz<10000} +} 1 + + +# Case 4: Size limit set before going WAL +# +do_test wal7-4.0 { + db close + forcedelete test.db + sqlite3 db test.db + db eval { + PRAGMA page_size=1024; + PRAGMA journal_size_limit=25000; + PRAGMA journal_mode=WAL; + PRAGMA wal_autocheckpoint=50; -- 50 pages + CREATE TABLE t1(x, y UNIQUE); + INSERT INTO t1 VALUES(1,2); + INSERT INTO t1 VALUES(zeroblob(200000),4); + CREATE TABLE t2(z); + DELETE FROM t1; + INSERT INTO t2 SELECT x FROM t1; + } + set sz [file size test.db-wal] +} 25000 + + + + + +finish_test From 807d0fcabaf60274201cbc306b70bf93ba4f78b1 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 17 May 2011 14:41:36 +0000 Subject: [PATCH 07/38] Avoid including fts3_term.c in the amalgamation, as it contains test code only. FossilOrigin-Name: f392b7ae0266b4c694836583cb91b10f2b6c0752 --- Makefile.in | 9 +++------ ext/fts3/fts3Int.h | 1 + main.mk | 6 +----- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- tool/mksqlite3c.tcl | 1 - 6 files changed, 16 insertions(+), 23 deletions(-) diff --git a/Makefile.in b/Makefile.in index 01c4010b8e..b0871ad940 100644 --- a/Makefile.in +++ b/Makefile.in @@ -166,7 +166,7 @@ LIBOBJS0 = alter.lo analyze.lo attach.lo auth.lo \ callback.lo complete.lo ctime.lo date.lo delete.lo \ expr.lo fault.lo fkey.lo \ fts3.lo fts3_aux.lo fts3_expr.lo fts3_hash.lo fts3_icu.lo fts3_porter.lo \ - fts3_snippet.lo fts3_term.lo fts3_tokenizer.lo fts3_tokenizer1.lo fts3_write.lo \ + fts3_snippet.lo fts3_tokenizer.lo fts3_tokenizer1.lo fts3_write.lo \ func.lo global.lo hash.lo \ icu.lo insert.lo journal.lo legacy.lo loadext.lo \ main.lo malloc.lo mem0.lo mem1.lo mem2.lo mem3.lo mem5.lo \ @@ -313,7 +313,6 @@ SRC += \ $(TOP)/ext/fts3/fts3_icu.c \ $(TOP)/ext/fts3/fts3_porter.c \ $(TOP)/ext/fts3/fts3_snippet.c \ - $(TOP)/ext/fts3/fts3_term.c \ $(TOP)/ext/fts3/fts3_tokenizer.h \ $(TOP)/ext/fts3/fts3_tokenizer.c \ $(TOP)/ext/fts3/fts3_tokenizer1.c \ @@ -379,7 +378,8 @@ TESTSRC = \ $(TOP)/src/test_thread.c \ $(TOP)/src/test_vfs.c \ $(TOP)/src/test_wholenumber.c \ - $(TOP)/src/test_wsd.c + $(TOP)/src/test_wsd.c \ + $(TOP)/ext/fts3/fts3_term.c # Source code to the library files needed by the test fixture # @@ -836,9 +836,6 @@ fts3_porter.lo: $(TOP)/ext/fts3/fts3_porter.c $(HDR) $(EXTHDR) fts3_snippet.lo: $(TOP)/ext/fts3/fts3_snippet.c $(HDR) $(EXTHDR) $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_snippet.c -fts3_term.lo: $(TOP)/ext/fts3/fts3_term.c $(HDR) $(EXTHDR) - $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_term.c - fts3_tokenizer.lo: $(TOP)/ext/fts3/fts3_tokenizer.c $(HDR) $(EXTHDR) $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_tokenizer.c diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index b843fe9dc6..8d1e15737d 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -381,6 +381,7 @@ int sqlite3Fts3ExprParse(sqlite3_tokenizer *, void sqlite3Fts3ExprFree(Fts3Expr *); #ifdef SQLITE_TEST int sqlite3Fts3ExprInitTestInterface(sqlite3 *db); +int sqlite3Fts3InitTerm(sqlite3 *db); #endif /* fts3_aux.c */ diff --git a/main.mk b/main.mk index 0035743003..f84e0dea8b 100644 --- a/main.mk +++ b/main.mk @@ -54,7 +54,7 @@ LIBOBJ+= alter.o analyze.o attach.o auth.o \ backup.o bitvec.o btmutex.o btree.o build.o \ callback.o complete.o ctime.o date.o delete.o expr.o fault.o fkey.o \ fts3.o fts3_aux.o fts3_expr.o fts3_hash.o fts3_icu.o fts3_porter.o \ - fts3_snippet.o fts3_term.o fts3_tokenizer.o fts3_tokenizer1.o \ + fts3_snippet.o fts3_tokenizer.o fts3_tokenizer1.o \ fts3_write.o func.o global.o hash.o \ icu.o insert.o journal.o legacy.o loadext.o \ main.o malloc.o mem0.o mem1.o mem2.o mem3.o mem5.o \ @@ -194,7 +194,6 @@ SRC += \ $(TOP)/ext/fts3/fts3_icu.c \ $(TOP)/ext/fts3/fts3_porter.c \ $(TOP)/ext/fts3/fts3_snippet.c \ - $(TOP)/ext/fts3/fts3_term.c \ $(TOP)/ext/fts3/fts3_tokenizer.h \ $(TOP)/ext/fts3/fts3_tokenizer.c \ $(TOP)/ext/fts3/fts3_tokenizer1.c \ @@ -484,9 +483,6 @@ fts3_icu.o: $(TOP)/ext/fts3/fts3_icu.c $(HDR) $(EXTHDR) fts3_snippet.o: $(TOP)/ext/fts3/fts3_snippet.c $(HDR) $(EXTHDR) $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_snippet.c -fts3_term.o: $(TOP)/ext/fts3/fts3_term.c $(HDR) $(EXTHDR) - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_term.c - fts3_porter.o: $(TOP)/ext/fts3/fts3_porter.c $(HDR) $(EXTHDR) $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_porter.c diff --git a/manifest b/manifest index 4a39930802..5d38b63563 100644 --- a/manifest +++ b/manifest @@ -1,7 +1,7 @@ -C Enhance\sWAL\smode\sso\sthat\sthe\sWAL\sfile\shonors\sthe\sjournal\ssize\slimit\sset\nby\sPRAGMA\sjournal_size_limit. -D 2011-05-16T21:00:27.928 +C Avoid\sincluding\sfts3_term.c\sin\sthe\samalgamation,\sas\sit\scontains\stest\scode\sonly. +D 2011-05-17T14:41:36.521 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 4a7ed220f2e9a068fd0f0b2ec451439f63e629fc +F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.vxworks c85ec1d8597fe2f7bc225af12ac1666e21379151 F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6 @@ -63,7 +63,7 @@ F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c 0077bd07395d2aabafa1ed1b104552619ecad34a F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 8c2ac39ee17362571c58ab2c4f0667324c31f738 +F ext/fts3/fts3Int.h 05d145152620e7849c452bd919f2cc3e2d75309f F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf F ext/fts3/fts3_expr.c 5f49e0deaf723724b08100bb3ff40aab02ad0c93 F ext/fts3/fts3_hash.c 3c8f6387a4a7f5305588b203fa7c887d753e1f1c @@ -102,7 +102,7 @@ F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 -F main.mk bedd9fb5f843eab5d575275ef7d906a1e58c30a2 +F main.mk 6111163d4e9720e4212ef288e967b4aa2c2ce379 F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f F mkextw.sh 4123480947681d9b434a5e7b1ee08135abe409ac @@ -911,7 +911,7 @@ F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc F tool/mkkeywordhash.c d2e6b4a5965e23afb80fbe74bb54648cd371f309 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 -F tool/mksqlite3c.tcl d171512b785283690b6f80997bee974c80087a23 +F tool/mksqlite3c.tcl 623e26cc8c83322e4151d3ad85ac69d41221bae8 F tool/mksqlite3h.tcl d76c226a5e8e1f3b5f6593bcabe5e98b3b1ec9ff F tool/mksqlite3internalh.tcl 7b43894e21bcb1bb39e11547ce7e38a063357e87 F tool/omittest.tcl b1dd290c1596e0f31fd335160a74ec5dfea3df4a @@ -936,7 +936,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P e569f18b989aef853c9d71eaf73d6967f0a8c583 -R cf1687694ba42845f8565b086734fa2b -U drh -Z b788aa40bf13c0a5b33fd90cecbf33e8 +P db7e500f69faf1906a84991ba67d26a195f02ae5 +R ae580e6a17ad522b073057ba8349f079 +U dan +Z c7b8c78d63b81a588c33ebb0305a0680 diff --git a/manifest.uuid b/manifest.uuid index 8a54fcea5d..608d6308f7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db7e500f69faf1906a84991ba67d26a195f02ae5 \ No newline at end of file +f392b7ae0266b4c694836583cb91b10f2b6c0752 \ No newline at end of file diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index f88ca08887..fa99f2df7b 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -298,7 +298,6 @@ foreach file { fts3_expr.c fts3_hash.c fts3_porter.c - fts3_term.c fts3_tokenizer.c fts3_tokenizer1.c fts3_write.c From fc24373999eacec97d42a9148affd6a3b52c33c0 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 May 2011 15:21:56 +0000 Subject: [PATCH 08/38] Avoid exceeding array bounds when reading a corrupt database file in autovacuum mode. Fixes a problem discovered by John Regehr and Peng Li using a customized clang compiler. FossilOrigin-Name: f7c525f5fc31e909721df2b1e66fc62dfb105718 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5d38b63563..0cb8889843 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sincluding\sfts3_term.c\sin\sthe\samalgamation,\sas\sit\scontains\stest\scode\sonly. -D 2011-05-17T14:41:36.521 +C Avoid\sexceeding\sarray\sbounds\swhen\sreading\sa\scorrupt\sdatabase\sfile\sin\nautovacuum\smode.\s\sFixes\sa\sproblem\sdiscovered\sby\sJohn\sRegehr\sand\sPeng\sLi\nusing\sa\scustomized\sclang\scompiler. +D 2011-05-17T15:21:56.657 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -122,7 +122,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 986c15232757f2873dff35ee3b35cbf935fc573c F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 26f8a9d6169413c5682b89b5397d20437b653154 +F src/btree.c 975ad691a57eb1fb60f1ec76ad0b6571eace62f9 F src/btree.h f5d775cd6cfc7ac32a2535b70e8d2af48ef5f2ce F src/btreeInt.h 67978c014fa4f7cc874032dd3aacadd8db656bc3 F src/build.c 0132bc6631fa617a1d28ef805921f6dbac18a514 @@ -936,7 +936,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P db7e500f69faf1906a84991ba67d26a195f02ae5 -R ae580e6a17ad522b073057ba8349f079 -U dan -Z c7b8c78d63b81a588c33ebb0305a0680 +P f392b7ae0266b4c694836583cb91b10f2b6c0752 +R cf53219bce3a7dbccc0e0612301125fc +U drh +Z 6f0c0bbdb12e972d7467056dbeea9264 diff --git a/manifest.uuid b/manifest.uuid index 608d6308f7..7f322c90bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f392b7ae0266b4c694836583cb91b10f2b6c0752 \ No newline at end of file +f7c525f5fc31e909721df2b1e66fc62dfb105718 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index d021893241..df75053743 100644 --- a/src/btree.c +++ b/src/btree.c @@ -788,6 +788,7 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ *pRC = SQLITE_CORRUPT_BKPT; goto ptrmap_exit; } + assert( offset <= (int)pBt->usableSize-5 ); pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ @@ -827,6 +828,11 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); offset = PTRMAP_PTROFFSET(iPtrmap, key); + if( offset<0 ){ + sqlite3PagerUnref(pDbPage); + return SQLITE_CORRUPT_BKPT; + } + assert( offset <= (int)pBt->usableSize-5 ); assert( pEType!=0 ); *pEType = pPtrmap[offset]; if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]); From 133d7dab17f1a82fbbfa7f0710b6c2dc008d9407 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 17 May 2011 15:56:16 +0000 Subject: [PATCH 09/38] Add extended return code SQLITE_CORRUPT_VTAB. Returned when the tcontents of the sqlite tables used internally by a virtual table module are invalid or inconsistent. FossilOrigin-Name: 8844e8bfb87314fb40ecb92705e8fff88f72bb38 --- ext/fts3/fts3.c | 6 +++--- ext/fts3/fts3_snippet.c | 4 ++-- ext/fts3/fts3_write.c | 10 +++++----- ext/rtree/rtree.c | 14 +++++++------- manifest | 26 +++++++++++++------------- manifest.uuid | 2 +- src/sqlite.h.in | 1 + src/test1.c | 2 ++ test/fts3corrupt.test | 7 +++++++ 9 files changed, 41 insertions(+), 31 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 5a46983d55..ea430627cd 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -1195,7 +1195,7 @@ static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ ** table is missing a row that is present in the full-text index. ** The data structures are corrupt. */ - rc = SQLITE_CORRUPT; + rc = SQLITE_CORRUPT_VTAB; } pCsr->isEof = 1; if( pContext ){ @@ -1255,7 +1255,7 @@ static int fts3ScanInteriorNode( zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); if( zCsr>zEnd ){ - return SQLITE_CORRUPT; + return SQLITE_CORRUPT_VTAB; } while( zCsrzEnd ){ - rc = SQLITE_CORRUPT; + rc = SQLITE_CORRUPT_VTAB; goto finish_scan; } if( nPrefix+nSuffix>nAlloc ){ diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 99f9dd7174..8bf9ed2d5a 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -960,7 +960,7 @@ static int fts3MatchinfoSelectDoctotal( a = sqlite3_column_blob(pStmt, 0); a += sqlite3Fts3GetVarint(a, &nDoc); - if( nDoc==0 ) return SQLITE_CORRUPT; + if( nDoc==0 ) return SQLITE_CORRUPT_VTAB; *pnDoc = (u32)nDoc; if( paLen ) *paLen = a; @@ -1555,7 +1555,7 @@ void sqlite3Fts3Offsets( ); rc = fts3StringAppend(&res, aBuffer, -1); }else if( rc==SQLITE_DONE ){ - rc = SQLITE_CORRUPT; + rc = SQLITE_CORRUPT_VTAB; } } } diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 025fb64a64..d00632a75d 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -291,7 +291,7 @@ static int fts3SelectDocsize( rc = sqlite3_step(pStmt); if( rc!=SQLITE_ROW || sqlite3_column_type(pStmt, 0)!=SQLITE_BLOB ){ rc = sqlite3_reset(pStmt); - if( rc==SQLITE_OK ) rc = SQLITE_CORRUPT; + if( rc==SQLITE_OK ) rc = SQLITE_CORRUPT_VTAB; pStmt = 0; }else{ rc = SQLITE_OK; @@ -972,7 +972,7 @@ static int fts3SegReaderNext(Fts3Table *p, Fts3SegReader *pReader){ if( nPrefix<0 || nSuffix<=0 || &pNext[nSuffix]>&pReader->aNode[pReader->nNode] ){ - return SQLITE_CORRUPT; + return SQLITE_CORRUPT_VTAB; } if( nPrefix+nSuffix>pReader->nTermAlloc ){ @@ -998,7 +998,7 @@ static int fts3SegReaderNext(Fts3Table *p, Fts3SegReader *pReader){ if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode] || pReader->aDoclist[pReader->nDoclist-1] ){ - return SQLITE_CORRUPT; + return SQLITE_CORRUPT_VTAB; } return SQLITE_OK; } @@ -1123,7 +1123,7 @@ int sqlite3Fts3SegReaderCost( } if( nDoc==0 || nByte==0 ){ sqlite3_reset(pStmt); - return SQLITE_CORRUPT; + return SQLITE_CORRUPT_VTAB; } pCsr->nRowAvg = (int)(((nByte / nDoc) + pgsz) / pgsz); @@ -2762,7 +2762,7 @@ int sqlite3Fts3UpdateMethod( if( nArg>1 && rc==SQLITE_OK ){ if( bInsertDone==0 ){ rc = fts3InsertData(p, apVal, pRowid); - if( rc==SQLITE_CONSTRAINT ) rc = SQLITE_CORRUPT; + if( rc==SQLITE_CONSTRAINT ) rc = SQLITE_CORRUPT_VTAB; } if( rc==SQLITE_OK && (!isRemove || *pRowid!=iRemove) ){ rc = fts3PendingTermsDocid(p, *pRowid); diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 4529f3aabb..6e00827b46 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -517,17 +517,17 @@ nodeAcquire( if( pNode && iNode==1 ){ pRtree->iDepth = readInt16(pNode->zData); if( pRtree->iDepth>RTREE_MAX_DEPTH ){ - rc = SQLITE_CORRUPT; + rc = SQLITE_CORRUPT_VTAB; } } /* If no error has occurred so far, check if the "number of entries" ** field on the node is too large. If so, set the return code to - ** SQLITE_CORRUPT. + ** SQLITE_CORRUPT_VTAB. */ if( pNode && rc==SQLITE_OK ){ if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ - rc = SQLITE_CORRUPT; + rc = SQLITE_CORRUPT_VTAB; } } @@ -535,7 +535,7 @@ nodeAcquire( if( pNode!=0 ){ nodeHashInsert(pRtree, pNode); }else{ - rc = SQLITE_CORRUPT; + rc = SQLITE_CORRUPT_VTAB; } *ppNode = pNode; }else{ @@ -1062,7 +1062,7 @@ static int nodeRowidIndex( return SQLITE_OK; } } - return SQLITE_CORRUPT; + return SQLITE_CORRUPT_VTAB; } /* @@ -1657,7 +1657,7 @@ static int AdjustTree( int iCell; if( nodeParentIndex(pRtree, p, &iCell) ){ - return SQLITE_CORRUPT; + return SQLITE_CORRUPT_VTAB; } nodeGetCell(pRtree, pParent, iCell, &cell); @@ -2329,7 +2329,7 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ } rc = sqlite3_reset(pRtree->pReadParent); if( rc==SQLITE_OK ) rc = rc2; - if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT; + if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB; pChild = pChild->pParent; } return rc; diff --git a/manifest b/manifest index 0cb8889843..ab1aadca4c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sexceeding\sarray\sbounds\swhen\sreading\sa\scorrupt\sdatabase\sfile\sin\nautovacuum\smode.\s\sFixes\sa\sproblem\sdiscovered\sby\sJohn\sRegehr\sand\sPeng\sLi\nusing\sa\scustomized\sclang\scompiler. -D 2011-05-17T15:21:56.657 +C Add\sextended\sreturn\scode\sSQLITE_CORRUPT_VTAB.\sReturned\swhen\sthe\stcontents\sof\sthe\ssqlite\stables\sused\sinternally\sby\sa\svirtual\stable\smodule\sare\sinvalid\sor\sinconsistent. +D 2011-05-17T15:56:16.473 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -61,7 +61,7 @@ F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 0077bd07395d2aabafa1ed1b104552619ecad34a +F ext/fts3/fts3.c 18c2a079ba2b9154b7485fd39d1a6d12b5872a76 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 05d145152620e7849c452bd919f2cc3e2d75309f F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf @@ -70,19 +70,19 @@ F ext/fts3/fts3_hash.c 3c8f6387a4a7f5305588b203fa7c887d753e1f1c F ext/fts3/fts3_hash.h 8331fb2206c609f9fc4c4735b9ab5ad6137c88ec F ext/fts3/fts3_icu.c ac494aed69835008185299315403044664bda295 F ext/fts3/fts3_porter.c d61cfd81fb0fd8fbcb25adcaee0ba671aefaa5c2 -F ext/fts3/fts3_snippet.c a4a3c7d2ab15ca9188e2d9b51a5e3927bf76580d +F ext/fts3/fts3_snippet.c 92b40397b28422c35c4127492d7ac6da34d1966a F ext/fts3/fts3_term.c f115f5a5f4298303d3b22fc6c524b8d565c7b950 F ext/fts3/fts3_tokenizer.c 055f3dc7369585350b28db1ee0f3b214dca6724d F ext/fts3/fts3_tokenizer.h 13ffd9fcb397fec32a05ef5cd9e0fa659bf3dbd3 F ext/fts3/fts3_tokenizer1.c 6e5cbaa588924ac578263a598e4fb9f5c9bb179d -F ext/fts3/fts3_write.c 7d6d904b89333448eb968fc82470a74985d0b61e +F ext/fts3/fts3_write.c b50181e5ecf484c2f56e98d651424e4b69f96c89 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/icu/README.txt bf8461d8cdc6b8f514c080e4e10dc3b2bbdfefa9 F ext/icu/icu.c eb9ae1d79046bd7871aa97ee6da51eb770134b5a F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/rtree.c 829c6901a2b065ff93a68d431f9eaba8de7128e0 +F ext/rtree/rtree.c 2445bec932f58f8f4fe9de49a63bd6bf24db82d6 F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e F ext/rtree/rtree1.test 28e1b8da4da98093ce3210187434dd760a8d89d8 F ext/rtree/rtree2.test acbb3a4ce0f4fbc2c304d2b4b784cfa161856bba @@ -179,14 +179,14 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79 -F src/sqlite.h.in d7cc9050446a5ed9eb896362dd264e6e10e0cc03 +F src/sqlite.h.in ee13c23409219c0a5fd3f0c0cd761a5073564a0b F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/tclsqlite.c 501c9a200fd998a268be475be5858febc90b725b -F src/test1.c f506164085bc4cbbb4b5c14b9c6de153f1aeafc5 +F src/test1.c 4a1171af201be90c21d64a872e686b1333d9a2cf F src/test2.c 80d323d11e909cf0eb1b6fbb4ac22276483bcf31 F src/test3.c 124ff9735fb6bb7d41de180d6bac90e7b1509432 F src/test4.c d1e5a5e904d4b444cf572391fdcb017638e36ff7 @@ -458,7 +458,7 @@ F test/fts3b.test e93bbb653e52afde110ad53bbd793f14fe7a8984 F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c F test/fts3conf.test 8e65ea56f88ced6cdd2252bdddb1a8327ae5af7e -F test/fts3corrupt.test 7890cc202406858386ddf390a879dcf80bc10abf +F test/fts3corrupt.test 7b0f91780ca36118d73324ec803187208ad33b32 F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7 F test/fts3d.test 95fb3c862cbc4297c93fceb9a635543744e9ef52 @@ -936,7 +936,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P f392b7ae0266b4c694836583cb91b10f2b6c0752 -R cf53219bce3a7dbccc0e0612301125fc -U drh -Z 6f0c0bbdb12e972d7467056dbeea9264 +P f7c525f5fc31e909721df2b1e66fc62dfb105718 +R 8174cc733f5a883825d78ae2804a3f2d +U dan +Z 5f2d01dc50656b115009ed665e1773e1 diff --git a/manifest.uuid b/manifest.uuid index 7f322c90bc..a4856a4e02 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f7c525f5fc31e909721df2b1e66fc62dfb105718 \ No newline at end of file +8844e8bfb87314fb40ecb92705e8fff88f72bb38 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index dbc4a45a6c..4bcba18a95 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -453,6 +453,7 @@ int sqlite3_exec( #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) +#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) /* ** CAPI3REF: Flags For File Open Operations diff --git a/src/test1.c b/src/test1.c index 8e30123433..50575afbbc 100644 --- a/src/test1.c +++ b/src/test1.c @@ -163,6 +163,8 @@ const char *sqlite3TestErrorName(int rc){ case SQLITE_IOERR_CHECKRESERVEDLOCK: zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; case SQLITE_IOERR_LOCK: zName = "SQLITE_IOERR_LOCK"; break; + case SQLITE_CORRUPT_VTAB: zName = "SQLITE_CORRUPT_VTAB"; break; + zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; default: zName = "SQLITE_Unknown"; break; } return zName; diff --git a/test/fts3corrupt.test b/test/fts3corrupt.test index b8b45c3951..ea4c9a9d3b 100644 --- a/test/fts3corrupt.test +++ b/test/fts3corrupt.test @@ -40,6 +40,7 @@ do_test fts3corrupt-1.2 { do_catchsql_test 1.3 { INSERT INTO t1 VALUES('world'); } {1 {database disk image is malformed}} +do_test 1.3.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB do_execsql_test 1.4 { DROP TABLE t1; } @@ -69,6 +70,7 @@ do_test fts3corrupt-2.1 { do_catchsql_test 2.2 { SELECT rowid FROM t1 WHERE t1 MATCH 'hello' } {1 {database disk image is malformed}} +do_test 2.2.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB do_execsql_test 3.0 { DROP TABLE t1; @@ -86,6 +88,7 @@ do_test fts3corrupt-3.1 { do_catchsql_test 3.2 { SELECT rowid FROM t1 WHERE t1 MATCH 'world' } {1 {database disk image is malformed}} +do_test 3.2.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB do_execsql_test 4.0 { @@ -111,6 +114,7 @@ do_catchsql_test 4.2 { UPDATE t1_segdir SET root = X'FFFFFFFFFFFFFFFF'; SELECT rowid FROM t1 WHERE t1 MATCH 'world'; } {1 {database disk image is malformed}} +do_test 4.2.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB set blob [binary format cca*cca*cca*cca*cca*cca*cca*cca*cca*cca*a* \ 22 120 [string repeat a 120] \ @@ -130,6 +134,7 @@ do_catchsql_test 4.3 { UPDATE t1_segdir SET root = $blob; SELECT rowid FROM t1 WHERE t1 MATCH 'world'; } {1 {database disk image is malformed}} +do_test 4.3.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB # Test a special kind of corruption, where the %_stat table contains # an invalid entry. At one point this could lead to a division-by-zero @@ -152,10 +157,12 @@ do_catchsql_test 5.2 { UPDATE t1_stat SET value = X'0000'; SELECT matchinfo(t1, 'nxa') FROM t1 WHERE t1 MATCH 't*'; } {1 {database disk image is malformed}} +do_test 5.2.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB do_catchsql_test 5.3 { UPDATE t1_stat SET value = NULL; SELECT matchinfo(t1, 'nxa') FROM t1 WHERE t1 MATCH 't*'; } {1 {database disk image is malformed}} +do_test 5.3.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB finish_test From cc487d13fce19666c4977578864dad9264ea1821 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 May 2011 18:53:08 +0000 Subject: [PATCH 10/38] Add the sqlite3_uri_parameter() interface function for use in building new VFSes. FossilOrigin-Name: 6b5de95fb575c7ceb3034068c4f5e0fccb1b15ac --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/main.c | 22 ++++++++++++++++++++++ src/sqlite.h.in | 20 ++++++++++++++++++++ 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index ab1aadca4c..2c19667b1c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sextended\sreturn\scode\sSQLITE_CORRUPT_VTAB.\sReturned\swhen\sthe\stcontents\sof\sthe\ssqlite\stables\sused\sinternally\sby\sa\svirtual\stable\smodule\sare\sinvalid\sor\sinconsistent. -D 2011-05-17T15:56:16.473 +C Add\sthe\ssqlite3_uri_parameter()\sinterface\sfunction\sfor\suse\sin\sbuilding\nnew\sVFSes. +D 2011-05-17T18:53:08.942 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -144,7 +144,7 @@ F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e F src/loadext.c 3ae0d52da013a6326310655be6473fd472347b85 -F src/main.c e32d7a44c3307a4a33cfd1a2b06fb46f418ba7fc +F src/main.c d189df8eb4833ca36e93ccf7ba1b5bad6273bfea F src/malloc.c 591aedb20ae40813f1045f2ef253438a334775d9 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206 @@ -179,7 +179,7 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79 -F src/sqlite.h.in ee13c23409219c0a5fd3f0c0cd761a5073564a0b +F src/sqlite.h.in 8bbf8d9bc5f1a9474a633a2de7014506f1f06b90 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d @@ -936,7 +936,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P f7c525f5fc31e909721df2b1e66fc62dfb105718 -R 8174cc733f5a883825d78ae2804a3f2d -U dan -Z 5f2d01dc50656b115009ed665e1773e1 +P 8844e8bfb87314fb40ecb92705e8fff88f72bb38 +R 95d48a407a23b64e1866e265afe49282 +U drh +Z 6f0e27514e0a4b3281aede2f373acd02 diff --git a/manifest.uuid b/manifest.uuid index a4856a4e02..7b2519a73f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8844e8bfb87314fb40ecb92705e8fff88f72bb38 \ No newline at end of file +6b5de95fb575c7ceb3034068c4f5e0fccb1b15ac \ No newline at end of file diff --git a/src/main.c b/src/main.c index d19f5f9012..6dd591ce05 100644 --- a/src/main.c +++ b/src/main.c @@ -2908,3 +2908,25 @@ int sqlite3_test_control(int op, ...){ #endif /* SQLITE_OMIT_BUILTIN_TEST */ return rc; } + +/* +** This is a utility routine, useful to VFS implementations, that checks +** to see if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of the query parameter. +** +** The zFilename argument is the filename pointer passed into the xOpen() +** method of a VFS implementation. The zParam argument is the name of the +** query parameter we seek. This routine returns the value of the zParam +** parameter if it exists. If the parameter does not exist, this routine +** returns a NULL pointer. +*/ +const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){ + zFilename += sqlite3Strlen30(zFilename); + while( zFilename[0] ){ + int x = strcmp(zFilename, zParam); + zFilename += sqlite3Strlen30(zFilename); + if( x==0 ) return zFilename; + zFilename += sqlite3Strlen30(zFilename); + } + return 0; +} diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 4bcba18a95..f955d63741 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2553,6 +2553,26 @@ int sqlite3_open_v2( const char *zVfs /* Name of VFS module to use */ ); +/* +** CAPI3REF: Obtain Values For URI Parameters +** +** This is a utility routine, useful to VFS implementations, that checks +** to see if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of the query parameter. +** +** The zFilename argument is the filename pointer passed into the xOpen() +** method of a VFS implementation. The zParam argument is the name of the +** query parameter we seek. This routine returns the value of the zParam +** parameter if it exists. If the parameter does not exist, this routine +** returns a NULL pointer. +** +** If the zFilename argument to this function is not a pointer that SQLite +** passed into the xOpen VFS method, then the behavior of this routine +** is undefined and probably undesirable. +*/ +const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); + + /* ** CAPI3REF: Error Codes And Messages ** From bd69559bfdfc72d4c1e5741a3bdcd51268cfedd5 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 May 2011 19:43:38 +0000 Subject: [PATCH 11/38] Fix an off-by-one error in the new sqlite3_uri_parameter() function. FossilOrigin-Name: 9593a640795458ce6e57e02dd5d702b642858f76 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/main.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2c19667b1c..1a8a57d2af 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3_uri_parameter()\sinterface\sfunction\sfor\suse\sin\sbuilding\nnew\sVFSes. -D 2011-05-17T18:53:08.942 +C Fix\san\soff-by-one\serror\sin\sthe\snew\ssqlite3_uri_parameter()\sfunction. +D 2011-05-17T19:43:38.641 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -144,7 +144,7 @@ F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e F src/loadext.c 3ae0d52da013a6326310655be6473fd472347b85 -F src/main.c d189df8eb4833ca36e93ccf7ba1b5bad6273bfea +F src/main.c 059daeed5876b3604f0192f838faf5f4db138901 F src/malloc.c 591aedb20ae40813f1045f2ef253438a334775d9 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206 @@ -936,7 +936,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 8844e8bfb87314fb40ecb92705e8fff88f72bb38 -R 95d48a407a23b64e1866e265afe49282 +P 6b5de95fb575c7ceb3034068c4f5e0fccb1b15ac +R d104cfa9424db95a1c8ed2af31b70a54 U drh -Z 6f0e27514e0a4b3281aede2f373acd02 +Z e3568578d123c11b9aea2de4d2897b24 diff --git a/manifest.uuid b/manifest.uuid index 7b2519a73f..0fe7c3a736 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6b5de95fb575c7ceb3034068c4f5e0fccb1b15ac \ No newline at end of file +9593a640795458ce6e57e02dd5d702b642858f76 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 6dd591ce05..c99d396546 100644 --- a/src/main.c +++ b/src/main.c @@ -2921,12 +2921,12 @@ int sqlite3_test_control(int op, ...){ ** returns a NULL pointer. */ const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){ - zFilename += sqlite3Strlen30(zFilename); + zFilename += sqlite3Strlen30(zFilename) + 1; while( zFilename[0] ){ int x = strcmp(zFilename, zParam); - zFilename += sqlite3Strlen30(zFilename); + zFilename += sqlite3Strlen30(zFilename) + 1; if( x==0 ) return zFilename; - zFilename += sqlite3Strlen30(zFilename); + zFilename += sqlite3Strlen30(zFilename) + 1; } return 0; } From 81cc516352d809335f78de86b785b3f532ae5254 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 May 2011 20:36:21 +0000 Subject: [PATCH 12/38] Add the ability to limit filenames to 8+3 using the SQLITE_ENABLE_8_3_NAMES compile-time option together with a URI parameter of "8_3_names=1". FossilOrigin-Name: 96d609856025919571f781207dfa6a24b1732e8d --- manifest | 27 +++--- manifest.uuid | 2 +- src/os_unix.c | 19 +++-- src/os_win.c | 1 + src/pager.c | 2 + src/pragma.c | 10 +-- src/sqliteInt.h | 6 ++ src/test_config.c | 6 ++ src/util.c | 26 ++++++ src/vdbeaux.c | 1 + test/8_3_names.test | 197 ++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 271 insertions(+), 26 deletions(-) create mode 100644 test/8_3_names.test diff --git a/manifest b/manifest index 1a8a57d2af..3d4df4239f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\soff-by-one\serror\sin\sthe\snew\ssqlite3_uri_parameter()\sfunction. -D 2011-05-17T19:43:38.641 +C Add\sthe\sability\sto\slimit\sfilenames\sto\s8+3\susing\sthe\nSQLITE_ENABLE_8_3_NAMES\scompile-time\soption\stogether\swith\sa\sURI\nparameter\sof\s"8_3_names=1". +D 2011-05-17T20:36:21.474 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -163,15 +163,15 @@ F src/os.c 22ac61d06e72a0dac900400147333b07b13d8e1d F src/os.h 9dbed8c2b9c1f2f2ebabc09e49829d4777c26bf9 F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440 -F src/os_unix.c 2c67d126874b78eb427371db4793f0e8fbc7448b -F src/os_win.c ff0e14615a5086fa5ba6926e4ec0dc9cfb5a1a84 -F src/pager.c ebf0411b037fbc6dec272520be55fc11423e789a +F src/os_unix.c 6d4a58d81ad4b782406519f3790202f330e89bb7 +F src/os_win.c 218b899469e570d46eb8147c2383075f7c026230 +F src/pager.c b7fe4b8e51d51a062618c4630c40d20a1a44cb80 F src/pager.h 3f8c783de1d4706b40b1ac15b64f5f896bcc78d1 F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050 F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e -F src/pragma.c 49c90ab27a4339d4b5bc0b03c08cbcf20ed8d454 +F src/pragma.c 9e778decc3ee9bcaf88904b4a3b0a4360aaf0eab F src/prepare.c e64261559a3187698a3e7e6c8b001a4f4f98dab4 F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 @@ -181,7 +181,7 @@ F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79 F src/sqlite.h.in 8bbf8d9bc5f1a9474a633a2de7014506f1f06b90 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6 +F src/sqliteInt.h 771087591052966d36ac1fcd3c8bb7a8c6cf9a38 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -199,7 +199,7 @@ F src/test_async.c 0612a752896fad42d55c3999a5122af10dcf22ad F src/test_autoext.c 30e7bd98ab6d70a62bb9ba572e4c7df347fe645e F src/test_backup.c c129c91127e9b46e335715ae2e75756e25ba27de F src/test_btree.c 47cd771250f09cdc6e12dda5bc71bc0b3abc96e2 -F src/test_config.c d536042f27226b4639f0f87d4795fd37428a9ddf +F src/test_config.c 9a6aa8301a56906612b5e70f5b38e80cfb8af8e7 F src/test_demovfs.c 938d0f595f8bd310076e1c06cf7885a01ce7ce01 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_func.c cbdec5cededa0761daedde5baf06004a9bf416b5 @@ -234,13 +234,13 @@ F src/tokenize.c 604607d6813e9551cf5189d899e0a25c12681080 F src/trigger.c 144cc18bb701f3286484aae4292a9531f09278c8 F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 -F src/util.c 914e860d21496b19a912cd14f6f7a889a22f44e1 +F src/util.c 5f4ba293a4bce63aab6885edde6261b007b34a20 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e F src/vdbe.c 343a068e8daeb8475e66776feb9f2974046e95c5 F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1 -F src/vdbeaux.c 25aa5ba7d46b4fe7c8f33dc132d474242d5f9726 +F src/vdbeaux.c 535851211df61d83213c83d5ffd3c6ce9ecbdc18 F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 @@ -249,6 +249,7 @@ F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66 F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f F src/where.c 55403ce19c506be6a321c7f129aff693d6103db5 +F test/8_3_names.test b93687beebd17f6ebf812405a6833bae5d1f4199 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 51756962d522e474338e9b2ebb26e7364d4aa125 @@ -936,7 +937,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 6b5de95fb575c7ceb3034068c4f5e0fccb1b15ac -R d104cfa9424db95a1c8ed2af31b70a54 +P 9593a640795458ce6e57e02dd5d702b642858f76 +R 87dd50ad185017288f71d71ad9ceabb5 U drh -Z e3568578d123c11b9aea2de4d2897b24 +Z 1ba151bdfae18403ba429fed62365eed diff --git a/manifest.uuid b/manifest.uuid index 0fe7c3a736..c295187117 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9593a640795458ce6e57e02dd5d702b642858f76 \ No newline at end of file +96d609856025919571f781207dfa6a24b1732e8d \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index a760e2c147..c768dcfa76 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -3769,6 +3769,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ (u32)sStat.st_ino, (u32)sStat.st_dev); #else sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", pDbFd->zPath); + sqlite3FileSuffix3(pDbFd->zPath, zShmFilename); #endif pShmNode->h = -1; pDbFd->pInode->pShmNode = pShmNode; @@ -4802,6 +4803,11 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ ** corresponding database file and sets *pMode to this value. Whenever ** possible, WAL and journal files are created using the same permissions ** as the associated database file. +** +** If the SQLITE_ENABLE_8_3_NAMES option is enabled, then the +** original filename is unavailable. But 8_3_NAMES is only used for +** FAT filesystems and permissions do not matter there, so just use +** the default permissions. */ static int findCreateFileMode( const char *zPath, /* Path of file (possibly) being created */ @@ -4809,6 +4815,7 @@ static int findCreateFileMode( mode_t *pMode /* OUT: Permissions to open file with */ ){ int rc = SQLITE_OK; /* Return Code */ + *pMode = SQLITE_DEFAULT_FILE_PERMISSIONS; if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ char zDb[MAX_PATHNAME+1]; /* Database file path */ int nDb; /* Number of valid bytes in zDb */ @@ -4820,15 +4827,15 @@ static int findCreateFileMode( ** ** "-journal" ** "-wal" - ** "-journal-NNNN" - ** "-wal-NNNN" + ** "-journalNN" + ** "-walNN" ** - ** where NNNN is a 4 digit decimal number. The NNNN naming schemes are + ** where NN is a 4 digit decimal number. The NN naming schemes are ** used by the test_multiplex.c module. */ nDb = sqlite3Strlen30(zPath) - 1; - while( nDb>0 && zPath[nDb]!='l' ) nDb--; - nDb -= ((flags & SQLITE_OPEN_WAL) ? 3 : 7); + while( nDb>0 && zPath[nDb]!='-' ) nDb--; + if( nDb==0 ) return SQLITE_OK; memcpy(zDb, zPath, nDb); zDb[nDb] = '\0'; @@ -4839,8 +4846,6 @@ static int findCreateFileMode( } }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ *pMode = 0600; - }else{ - *pMode = SQLITE_DEFAULT_FILE_PERMISSIONS; } return rc; } diff --git a/src/os_win.c b/src/os_win.c index 1300b90143..b3e47f8363 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -1570,6 +1570,7 @@ static int winOpenSharedMemory(winFile *pDbFd){ memset(pNew, 0, sizeof(*pNew)); pNew->zFilename = (char*)&pNew[1]; sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath); + sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename); /* Look to see if there is an existing winShmNode that can be used. ** If no matching winShmNode currently exists, create a new one. diff --git a/src/pager.c b/src/pager.c index 24db850273..b622c7acfe 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4405,10 +4405,12 @@ int sqlite3PagerOpen( memcpy(&pPager->zFilename[nPathname+1], zUri, nUri); memcpy(pPager->zJournal, zPathname, nPathname); memcpy(&pPager->zJournal[nPathname], "-journal", 8); + sqlite3FileSuffix3(pPager->zFilename, pPager->zJournal); #ifndef SQLITE_OMIT_WAL pPager->zWal = &pPager->zJournal[nPathname+8+1]; memcpy(pPager->zWal, zPathname, nPathname); memcpy(&pPager->zWal[nPathname], "-wal", 4); + sqlite3FileSuffix3(pPager->zFilename, pPager->zWal); #endif sqlite3_free(zPathname); } diff --git a/src/pragma.c b/src/pragma.c index 75ab26d441..799805c40b 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -49,7 +49,7 @@ static u8 getSafetyLevel(const char *z){ /* ** Interpret the given string as a boolean value. */ -static u8 getBoolean(const char *z){ +u8 sqlite3GetBoolean(const char *z){ return getSafetyLevel(z)&1; } @@ -219,7 +219,7 @@ static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){ mask &= ~(SQLITE_ForeignKeys); } - if( getBoolean(zRight) ){ + if( sqlite3GetBoolean(zRight) ){ db->flags |= mask; }else{ db->flags &= ~mask; @@ -433,7 +433,7 @@ void sqlite3Pragma( int b = -1; assert( pBt!=0 ); if( zRight ){ - b = getBoolean(zRight); + b = sqlite3GetBoolean(zRight); } if( pId2->n==0 && b>=0 ){ int ii; @@ -1033,7 +1033,7 @@ void sqlite3Pragma( #ifndef NDEBUG if( sqlite3StrICmp(zLeft, "parser_trace")==0 ){ if( zRight ){ - if( getBoolean(zRight) ){ + if( sqlite3GetBoolean(zRight) ){ sqlite3ParserTrace(stderr, "parser: "); }else{ sqlite3ParserTrace(0, 0); @@ -1047,7 +1047,7 @@ void sqlite3Pragma( */ if( sqlite3StrICmp(zLeft, "case_sensitive_like")==0 ){ if( zRight ){ - sqlite3RegisterLikeFunctions(db, getBoolean(zRight)); + sqlite3RegisterLikeFunctions(db, sqlite3GetBoolean(zRight)); } }else diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4a3e45d7c0..6932e0b455 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2941,6 +2941,12 @@ int sqlite3AddInt64(i64*,i64); int sqlite3SubInt64(i64*,i64); int sqlite3MulInt64(i64*,i64); int sqlite3AbsInt32(int); +#ifdef SQLITE_ENABLE_8_3_NAMES +void sqlite3FileSuffix3(const char*, char*); +#else +# define sqlite3FileSuffix3(X,Y) +#endif +u8 sqlite3GetBoolean(const char *z); const void *sqlite3ValueText(sqlite3_value*, u8); int sqlite3ValueBytes(sqlite3_value*, u8); diff --git a/src/test_config.c b/src/test_config.c index 03d2f4e976..92f343f458 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -73,6 +73,12 @@ static void set_options(Tcl_Interp *interp){ Tcl_SetVar2(interp, "sqlite_options", "memdebug", "0", TCL_GLOBAL_ONLY); #endif +#ifdef SQLITE_ENABLE_8_3_NAMES + Tcl_SetVar2(interp, "sqlite_options", "8_3_names", "1", TCL_GLOBAL_ONLY); +#else + Tcl_SetVar2(interp, "sqlite_options", "8_3_names", "0", TCL_GLOBAL_ONLY); +#endif + #ifdef SQLITE_ENABLE_MEMSYS3 Tcl_SetVar2(interp, "sqlite_options", "mem3", "1", TCL_GLOBAL_ONLY); #else diff --git a/src/util.c b/src/util.c index 50dc591207..7e271aac05 100644 --- a/src/util.c +++ b/src/util.c @@ -1146,3 +1146,29 @@ int sqlite3AbsInt32(int x){ if( x==(int)0x80000000 ) return 0x7fffffff; return -x; } + +#ifdef SQLITE_ENABLE_8_3_NAMES +/* +** If SQLITE_ENABLE_8_3_NAME is set at compile-time and if the database +** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and +** if filename in z[] has a suffix (a.k.a. "extension") that is longer than +** three characters, then shorten the suffix on z[] to be the last three +** characters of the original suffix. +** +** Examples: +** +** test.db-journal => test.nal +** test.db-wal => test.wal +** test.db-shm => test.shm +*/ +void sqlite3FileSuffix3(const char *zBaseFilename, char *z){ + const char *zOk; + zOk = sqlite3_uri_parameter(zBaseFilename, "8_3_names"); + if( zOk && sqlite3GetBoolean(zOk) ){ + int i, sz; + sz = sqlite3Strlen30(z); + for(i=sz-1; i>0 && z[i]!='/' && z[i]!='\\' && z[i]!='.'; i--){} + if( z[i]=='.' && sz>i+4 ) memcpy(&z[i+1], &z[sz-3], 4); + } +} +#endif diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 0c7b11f1e1..e89a87b522 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1799,6 +1799,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ if( !zMaster ){ return SQLITE_NOMEM; } + sqlite3FileSuffix3(zMainFile, zMaster); rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res); }while( rc==SQLITE_OK && res ); if( rc==SQLITE_OK ){ diff --git a/test/8_3_names.test b/test/8_3_names.test new file mode 100644 index 0000000000..418685e64b --- /dev/null +++ b/test/8_3_names.test @@ -0,0 +1,197 @@ +# 2011 May 17 +# +# 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. +# +#*********************************************************************** +# +# Test cases for the SQLITE_ENABLE_8_3_NAMES feature that forces all +# filename extensions to be limited to 3 characters. Some embedded +# systems need this to work around microsoft FAT patents, but this +# feature should be disabled on most deployments. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +ifcapable !8_3_names { + finish_test + return +} + +db close +sqlite3_shutdown +sqlite3_config_uri 1 + +do_test 8_3_names-1.0 { + forcedelete test.db test.nal test.db-journal + sqlite3 db test.db + db eval { + PRAGMA cache_size=10; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(randomblob(20000)); + BEGIN; + DELETE FROM t1; + INSERT INTO t1 VALUES(randomblob(15000)); + } + file exists test.db-journal +} 1 +do_test 8_3_names-1.1 { + file exists test.nal +} 0 +do_test 8_3_names-1.2 { + db eval { + ROLLBACK; + SELECT length(x) FROM t1 + } +} 20000 + +db close +do_test 8_3_names-2.0 { + forcedelete test.db test.nal test.db-journal + sqlite3 db file:./test.db?8_3_names=1 + db eval { + PRAGMA cache_size=10; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(randomblob(20000)); + BEGIN; + DELETE FROM t1; + INSERT INTO t1 VALUES(randomblob(15000)); + } + file exists test.db-journal +} 0 +do_test 8_3_names-2.1 { + file exists test.nal +} 1 +forcedelete test2.db test2.nal test2.db-journal +file copy test.db test2.db +file copy test.nal test2.nal +do_test 8_3_names-2.2 { + db eval { + COMMIT; + SELECT length(x) FROM t1 + } +} 15000 +do_test 8_3_names-2.3 { + sqlite3 db2 file:./test2.db?8_3_names=1 + db2 eval { + PRAGMA integrity_check; + SELECT length(x) FROM t1; + } +} {ok 20000} + +db close +do_test 8_3_names-3.0 { + forcedelete test.db test.nal test.db-journal + sqlite3 db file:./test.db?8_3_names=0 + db eval { + PRAGMA cache_size=10; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(randomblob(20000)); + BEGIN; + DELETE FROM t1; + INSERT INTO t1 VALUES(randomblob(15000)); + } + file exists test.db-journal +} 1 +do_test 8_3_names-3.1 { + file exists test.nal +} 0 +forcedelete test2.db test2.nal test2.db-journal +file copy test.db test2.db +file copy test.db-journal test2.db-journal +do_test 8_3_names-3.2 { + db eval { + COMMIT; + SELECT length(x) FROM t1 + } +} 15000 +do_test 8_3_names-3.3 { + sqlite3 db2 file:./test2.db?8_3_names=0 + db2 eval { + PRAGMA integrity_check; + SELECT length(x) FROM t1; + } +} {ok 20000} + +########################################################################## +# Master journals. +# +db close +forcedelete test.db test2.db +do_test 8_3_names-4.0 { + sqlite3 db file:./test.db?8_3_names=1 + db eval { + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(1); + ATTACH 'file:./test2.db?8_3_names=1' AS db2; + CREATE TABLE db2.t2(y); + INSERT INTO t2 VALUES(2); + BEGIN; + INSERT INTO t1 VALUES(3); + INSERT INTO t2 VALUES(4); + COMMIT; + SELECT * FROM t1, t2 ORDER BY x, y + } +} {1 2 1 4 3 2 3 4} + + +########################################################################## +# WAL mode. +# +ifcapable !wal { + finish_test + return +} +db close +forcedelete test.db +do_test 8_3_names-5.0 { + sqlite3 db file:./test.db?8_3_names=1 + register_wholenumber_module db + db eval { + PRAGMA journal_mode=WAL; + CREATE TABLE t1(x); + CREATE VIRTUAL TABLE nums USING wholenumber; + INSERT INTO t1 SELECT value FROM nums WHERE value BETWEEN 1 AND 1000; + BEGIN; + UPDATE t1 SET x=x*2; + } + sqlite3 db2 file:./test.db?8_3_names=1 + register_wholenumber_module db2 + db2 eval { + BEGIN; + SELECT sum(x) FROM t1; + } +} {500500} + +do_test 8_3_names-5.1 { + file exists test.db-wal +} 0 +do_test 8_3_names-5.2 { + file exists test.wal +} 1 +do_test 8_3_names-5.3 { + file exists test.db-shm +} 0 +do_test 8_3_names-5.4 { + file exists test.shm +} 1 + + +do_test 8_3_names-5.5 { + db eval { + COMMIT; + SELECT sum(x) FROM t1; + } +} {1001000} +do_test 8_3_names-5.6 { + db2 eval { + SELECT sum(x) FROM t1; + } +} {500500} + + +finish_test From cc4e19be9a2d5076c6d05891859c3bd3f90a4ac8 Mon Sep 17 00:00:00 2001 From: shaneh Date: Wed, 18 May 2011 02:22:41 +0000 Subject: [PATCH 13/38] Update multiplex VFS to handle empty filenames which can occur for during vacuuming (temp file names.) FossilOrigin-Name: a074986045f1a81fb831ffee4a29af13c978b053 --- manifest | 16 +++---- manifest.uuid | 2 +- src/test_multiplex.c | 111 ++++++++++++++++++++++++++++++++++++------- test/multiplex.test | 40 ++++++++++++++++ 4 files changed, 142 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index 3d4df4239f..9a8c046453 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sability\sto\slimit\sfilenames\sto\s8+3\susing\sthe\nSQLITE_ENABLE_8_3_NAMES\scompile-time\soption\stogether\swith\sa\sURI\nparameter\sof\s"8_3_names=1". -D 2011-05-17T20:36:21.474 +C Update\smultiplex\sVFS\sto\shandle\sempty\sfilenames\swhich\scan\soccur\sfor\sduring\svacuuming\s(temp\sfile\snames.) +D 2011-05-18T02:22:41.100 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -211,7 +211,7 @@ F src/test_intarray.h 489edb9068bb926583445cb02589344961054207 F src/test_journal.c 785edd54f963aefb3c1628124170a56697c68c70 F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e F src/test_malloc.c 7ca7be34e0e09ef0ed6619544552ed95732e41f6 -F src/test_multiplex.c fdabd793ee7a9642c5a8a470def2347144c46d05 +F src/test_multiplex.c c71f0a0cdf2b89a441e0bcefb2fcdf1dd358a820 F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec @@ -590,7 +590,7 @@ F test/misc5.test 45b2e3ed5f79af2b4f38ae362eaf4c49674575bd F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 F test/misc7.test 29032efcd3d826fbd409e2a7af873e7939f4a4e3 F test/misuse.test 30b3a458e5a70c31e74c291937b6c82204c59f33 -F test/multiplex.test a88f3e2c16e567e72be7296195c59fbdd6a8d3d4 +F test/multiplex.test 7a8a50c8ed72dfcf4db9ebae977f7a63184639d8 F test/mutex1.test 78b2b9bb320e51d156c4efdb71b99b051e7a4b41 F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test dc212a22b36109fd1ae37154292444ef249c5ec2 @@ -937,7 +937,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 9593a640795458ce6e57e02dd5d702b642858f76 -R 87dd50ad185017288f71d71ad9ceabb5 -U drh -Z 1ba151bdfae18403ba429fed62365eed +P 96d609856025919571f781207dfa6a24b1732e8d +R 2d9bd612a3d2dc8f2665702baad38baa +U shaneh +Z d27048d3dae68da084505a60e1541c3b diff --git a/manifest.uuid b/manifest.uuid index c295187117..1dc5ed78fb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -96d609856025919571f781207dfa6a24b1732e8d \ No newline at end of file +a074986045f1a81fb831ffee4a29af13c978b053 \ No newline at end of file diff --git a/src/test_multiplex.c b/src/test_multiplex.c index d8a7db86e1..861e68e877 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -185,13 +185,72 @@ static void multiplexLeave(void){ sqlite3_mutex_leave(gMultiplex.pMutex); } ** than the actual length of the string. For very long strings (greater ** than 1GiB) the value returned might be less than the true string length. */ -int multiplexStrlen30(const char *z){ +static int multiplexStrlen30(const char *z){ const char *z2 = z; if( z==0 ) return 0; while( *z2 ){ z2++; } return 0x3fffffff & (int)(z2 - z); } +/* +** Create a temporary file name in zBuf. zBuf must be big enough to +** hold at pOrigVfs->mxPathname characters. This function departs +** from the traditional temporary name generation in the os_win +** and os_unix VFS in several ways, but is necessary so that +** the file name is known for temporary files (like those used +** during vacuum.) +** +** N.B. This routine assumes your underlying VFS is ok with using +** "/" as a directory seperator. This is the default for UNIXs +** and is allowed (even mixed) for most versions of Windows. +*/ +static int multiplexGetTempname(sqlite3_vfs *pOrigVfs, int nBuf, char *zBuf){ + static char zChars[] = + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789"; + int i,j; + int attempts = 0; + int exists = 0; + int rc = SQLITE_ERROR; + + /* Check that the output buffer is large enough for + ** pVfs->mxPathname characters. + */ + if( pOrigVfs->mxPathname <= nBuf ){ + + /* sqlite3_temp_directory should always be less than + ** pVfs->mxPathname characters. + */ + sqlite3_snprintf(pOrigVfs->mxPathname, + zBuf, + "%s/", + sqlite3_temp_directory ? sqlite3_temp_directory : "."); + + /* Check that the output buffer is large enough for the temporary file + ** name. + */ + j = multiplexStrlen30(zBuf); + if( (j + 8 + 1 + 3 + 1) <= nBuf ){ + /* Make 3 attempts to generate a unique name. */ + do { + attempts++; + sqlite3_randomness(8, &zBuf[j]); + for(i=0; i<8; i++){ + zBuf[j+i] = (char)zChars[ ((unsigned char)zBuf[j+i])%(sizeof(zChars)-1) ]; + } + memcpy(&zBuf[j+i], ".tmp", 5); + rc = pOrigVfs->xAccess(pOrigVfs, zBuf, SQLITE_ACCESS_EXISTS, &exists); + } while ( (rc==SQLITE_OK) && exists && (attempts<3) ); + if( rc==SQLITE_OK && exists ){ + rc = SQLITE_ERROR; + } + } + } + + return rc; +} + /* Translate an sqlite3_file* that is really a multiplexGroup* into ** the sqlite3_file* for the underlying original VFS. */ @@ -295,12 +354,12 @@ static int multiplexOpen( int flags, /* Flags to control the opening */ int *pOutFlags /* Flags showing results of opening */ ){ - int rc; /* Result code */ + int rc = SQLITE_OK; /* Result code */ multiplexConn *pMultiplexOpen; /* The new multiplex file descriptor */ multiplexGroup *pGroup; /* Corresponding multiplexGroup object */ sqlite3_file *pSubOpen; /* Real file descriptor */ sqlite3_vfs *pOrigVfs = gMultiplex.pOrigVfs; /* Real VFS */ - int nName = multiplexStrlen30(zName); + int nName; int i; int sz; @@ -311,23 +370,39 @@ static int multiplexOpen( */ multiplexEnter(); pMultiplexOpen = (multiplexConn*)pConn; - /* allocate space for group */ - sz = sizeof(multiplexGroup) /* multiplexGroup */ - + (sizeof(sqlite3_file *)*SQLITE_MULTIPLEX_MAX_CHUNKS) /* pReal[] */ - + (pOrigVfs->szOsFile*SQLITE_MULTIPLEX_MAX_CHUNKS) /* *pReal */ - + SQLITE_MULTIPLEX_MAX_CHUNKS /* bOpen[] */ - + nName + 1; /* zName */ + + /* If the second argument to this function is NULL, generate a + ** temporary file name to use. This will be handled by the + ** original xOpen method. We just need to allocate space for + ** it. + */ + if( !zName ){ + rc = multiplexGetTempname(pOrigVfs, pOrigVfs->mxPathname, gMultiplex.zName); + zName = gMultiplex.zName; + } + + if( rc==SQLITE_OK ){ + /* allocate space for group */ + nName = multiplexStrlen30(zName); + sz = sizeof(multiplexGroup) /* multiplexGroup */ + + (sizeof(sqlite3_file *)*SQLITE_MULTIPLEX_MAX_CHUNKS) /* pReal[] */ + + (pOrigVfs->szOsFile*SQLITE_MULTIPLEX_MAX_CHUNKS) /* *pReal */ + + SQLITE_MULTIPLEX_MAX_CHUNKS /* bOpen[] */ + + nName + 1; /* zName */ #ifndef SQLITE_MULTIPLEX_EXT_OVWR - sz += SQLITE_MULTIPLEX_EXT_SZ; - assert(nName+SQLITE_MULTIPLEX_EXT_SZ < pOrigVfs->mxPathname); + sz += SQLITE_MULTIPLEX_EXT_SZ; + assert(nName+SQLITE_MULTIPLEX_EXT_SZ < pOrigVfs->mxPathname); #else - assert(nName >= SQLITE_MULTIPLEX_EXT_SZ); - assert(nName < pOrigVfs->mxPathname); + assert(nName >= SQLITE_MULTIPLEX_EXT_SZ); + assert(nName < pOrigVfs->mxPathname); #endif - pGroup = sqlite3_malloc( sz ); - if( pGroup==0 ){ - rc=SQLITE_NOMEM; - }else{ + pGroup = sqlite3_malloc( sz ); + if( pGroup==0 ){ + rc=SQLITE_NOMEM; + } + } + + if( rc==SQLITE_OK ){ /* assign pointers to extra space allocated */ char *p = (char *)&pGroup[1]; pMultiplexOpen->pGroup = pGroup; @@ -411,7 +486,7 @@ static int multiplexDelete( } rc2 = pOrigVfs->xAccess(pOrigVfs, gMultiplex.zName, SQLITE_ACCESS_EXISTS, &exists); - if( rc2==SQLITE_OK && exists){ + if( rc2==SQLITE_OK && exists ){ /* if it exists, delete it */ rc2 = pOrigVfs->xDelete(pOrigVfs, gMultiplex.zName, syncDir); if( rc2!=SQLITE_OK ) rc = rc2; diff --git a/test/multiplex.test b/test/multiplex.test index 518cbe37a0..ae60d639e5 100644 --- a/test/multiplex.test +++ b/test/multiplex.test @@ -567,5 +567,45 @@ if {0==[info exists ::G(perm:presql)] || $::G(perm:presql) == ""} { } } +#------------------------------------------------------------------------- +# Test that you can vacuum a multiplex'ed DB. + +ifcapable vacuum { + +do_test multiplex-6.0.0 { + multiplex_delete test.db + sqlite3_multiplex_initialize "" 1 + sqlite3 db test.db + multiplex_set db main 4096 16 +} {SQLITE_OK} + +do_test multiplex-6.1.0 { + execsql { + PRAGMA page_size=1024; + PRAGMA journal_mode=DELETE; + PRAGMA auto_vacuum=OFF; + } + execsql { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, randomblob($g_chunk_size)); + INSERT INTO t1 VALUES(2, randomblob($g_chunk_size)); + } +} {} +do_test multiplex-6.2.1 { file size [multiplex_name test.db 0] } [list $g_chunk_size] +do_test multiplex-6.2.2 { file size [multiplex_name test.db 1] } [list $g_chunk_size] + +do_test multiplex-6.3.0 { + execsql { VACUUM } +} {} + +do_test multiplex-6.99 { + db close + multiplex_delete test.db + sqlite3_multiplex_shutdown +} {SQLITE_OK} + +} + + catch { sqlite3_multiplex_shutdown } finish_test From c83f2d477c16d820a9a13a3824923a7085304eef Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 May 2011 02:41:10 +0000 Subject: [PATCH 14/38] Remove unreachable branches from the 8.3 filename logic. FossilOrigin-Name: 4f7e7b44f2d17681318a1fd22466d3cc03103fc4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/util.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 9a8c046453..c9ce396096 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\smultiplex\sVFS\sto\shandle\sempty\sfilenames\swhich\scan\soccur\sfor\sduring\svacuuming\s(temp\sfile\snames.) -D 2011-05-18T02:22:41.100 +C Remove\sunreachable\sbranches\sfrom\sthe\s8.3\sfilename\slogic. +D 2011-05-18T02:41:10.584 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -234,7 +234,7 @@ F src/tokenize.c 604607d6813e9551cf5189d899e0a25c12681080 F src/trigger.c 144cc18bb701f3286484aae4292a9531f09278c8 F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 -F src/util.c 5f4ba293a4bce63aab6885edde6261b007b34a20 +F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e F src/vdbe.c 343a068e8daeb8475e66776feb9f2974046e95c5 F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 @@ -937,7 +937,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 96d609856025919571f781207dfa6a24b1732e8d -R 2d9bd612a3d2dc8f2665702baad38baa -U shaneh -Z d27048d3dae68da084505a60e1541c3b +P a074986045f1a81fb831ffee4a29af13c978b053 +R b1e893cccba0a3222ced9d709bda7393 +U drh +Z 511f68817ff94b8f1f3a0e7f5adbf2b3 diff --git a/manifest.uuid b/manifest.uuid index 1dc5ed78fb..125c6a81c5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a074986045f1a81fb831ffee4a29af13c978b053 \ No newline at end of file +4f7e7b44f2d17681318a1fd22466d3cc03103fc4 \ No newline at end of file diff --git a/src/util.c b/src/util.c index 7e271aac05..de73577203 100644 --- a/src/util.c +++ b/src/util.c @@ -1167,8 +1167,8 @@ void sqlite3FileSuffix3(const char *zBaseFilename, char *z){ if( zOk && sqlite3GetBoolean(zOk) ){ int i, sz; sz = sqlite3Strlen30(z); - for(i=sz-1; i>0 && z[i]!='/' && z[i]!='\\' && z[i]!='.'; i--){} - if( z[i]=='.' && sz>i+4 ) memcpy(&z[i+1], &z[sz-3], 4); + for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} + if( z[i]=='.' && ALWAYS(sz>i+4) ) memcpy(&z[i+1], &z[sz-3], 4); } } #endif From 4aef70174bdefd062f5fc8ddab227318818858ff Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 May 2011 03:02:10 +0000 Subject: [PATCH 15/38] Make sure the multiplexor shim uses a full pathname for temp file that it creates. FossilOrigin-Name: 186d7ff1d9804d508e472e4939608bf2be67bdc2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/test_multiplex.c | 7 ++++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c9ce396096..f7a02d4dc5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sunreachable\sbranches\sfrom\sthe\s8.3\sfilename\slogic. -D 2011-05-18T02:41:10.584 +C Make\ssure\sthe\smultiplexor\sshim\suses\sa\sfull\spathname\sfor\stemp\sfile\sthat\sit\ncreates. +D 2011-05-18T03:02:10.059 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -211,7 +211,7 @@ F src/test_intarray.h 489edb9068bb926583445cb02589344961054207 F src/test_journal.c 785edd54f963aefb3c1628124170a56697c68c70 F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e F src/test_malloc.c 7ca7be34e0e09ef0ed6619544552ed95732e41f6 -F src/test_multiplex.c c71f0a0cdf2b89a441e0bcefb2fcdf1dd358a820 +F src/test_multiplex.c 8e67617b80b532315293761970589581745a52a0 F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec @@ -937,7 +937,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P a074986045f1a81fb831ffee4a29af13c978b053 -R b1e893cccba0a3222ced9d709bda7393 +P 4f7e7b44f2d17681318a1fd22466d3cc03103fc4 +R d6d83dacd40319cfb494e08bc967aebf U drh -Z 511f68817ff94b8f1f3a0e7f5adbf2b3 +Z e159c1e62c6ced1398d519693948ac08 diff --git a/manifest.uuid b/manifest.uuid index 125c6a81c5..89d525c9c0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4f7e7b44f2d17681318a1fd22466d3cc03103fc4 \ No newline at end of file +186d7ff1d9804d508e472e4939608bf2be67bdc2 \ No newline at end of file diff --git a/src/test_multiplex.c b/src/test_multiplex.c index 861e68e877..32e63ae889 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -218,14 +218,19 @@ static int multiplexGetTempname(sqlite3_vfs *pOrigVfs, int nBuf, char *zBuf){ ** pVfs->mxPathname characters. */ if( pOrigVfs->mxPathname <= nBuf ){ + char *zTmp = sqlite3_malloc(pOrigVfs->mxPathname); + if( zTmp==0 ) return SQLITE_NOMEM; /* sqlite3_temp_directory should always be less than ** pVfs->mxPathname characters. */ sqlite3_snprintf(pOrigVfs->mxPathname, - zBuf, + zTmp, "%s/", sqlite3_temp_directory ? sqlite3_temp_directory : "."); + rc = pOrigVfs->xFullPathname(pOrigVfs, zTmp, nBuf, zBuf); + sqlite3_free(zTmp); + if( rc ) return rc; /* Check that the output buffer is large enough for the temporary file ** name. From 52784bd01ae1b2935c1c0374dd2403bc3f0de69a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 May 2011 17:15:06 +0000 Subject: [PATCH 16/38] Enable URI filenames in the command-line shell. Add a check to the beginning of the shell to make sure it is compiled with the same SQLite source and header. FossilOrigin-Name: de58cb28387f44c35b1a81bdab853cafd938c1a6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c | 6 ++++++ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index f7a02d4dc5..16faa5700b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\smultiplexor\sshim\suses\sa\sfull\spathname\sfor\stemp\sfile\sthat\sit\ncreates. -D 2011-05-18T03:02:10.059 +C Enable\sURI\sfilenames\sin\sthe\scommand-line\sshell.\s\sAdd\sa\scheck\sto\sthe\nbeginning\sof\sthe\sshell\sto\smake\ssure\sit\sis\scompiled\swith\sthe\ssame\nSQLite\ssource\sand\sheader. +D 2011-05-18T17:15:06.501 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -178,7 +178,7 @@ F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff -F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79 +F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48 F src/sqlite.h.in 8bbf8d9bc5f1a9474a633a2de7014506f1f06b90 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqliteInt.h 771087591052966d36ac1fcd3c8bb7a8c6cf9a38 @@ -937,7 +937,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 4f7e7b44f2d17681318a1fd22466d3cc03103fc4 -R d6d83dacd40319cfb494e08bc967aebf +P 186d7ff1d9804d508e472e4939608bf2be67bdc2 +R 45381afe8cd9a292cfb03ba775eccef4 U drh -Z e159c1e62c6ced1398d519693948ac08 +Z 8316bf531771ea80911215ce32a98e54 diff --git a/manifest.uuid b/manifest.uuid index 89d525c9c0..5de0e20c97 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -186d7ff1d9804d508e472e4939608bf2be67bdc2 \ No newline at end of file +de58cb28387f44c35b1a81bdab853cafd938c1a6 \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index aab70b29db..8e9870a5a8 100644 --- a/src/shell.c +++ b/src/shell.c @@ -2649,6 +2649,7 @@ static void main_init(struct callback_data *data) { data->mode = MODE_List; memcpy(data->separator,"|", 2); data->showHeader = 0; + sqlite3_config(SQLITE_CONFIG_URI, 1); sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); @@ -2663,6 +2664,11 @@ int main(int argc, char **argv){ int i; int rc = 0; + if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){ + fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", + sqlite3_sourceid(), SQLITE_SOURCE_ID); + exit(1); + } Argv0 = argv[0]; main_init(&data); stdin_is_interactive = isatty(0); From e5a1320d73f94a600ba2c9fc70060ddbf95e8a09 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 May 2011 01:21:42 +0000 Subject: [PATCH 17/38] When committing a WAL transaction, make sure at least one page is written to the WAL file so that the WAL subsystem will have a page on which to set the commit flag. Ticket [2d1a5c67dfc236]. FossilOrigin-Name: 67bf1c9a888b0d84d252d6c4c754c2c51994d208 --- manifest | 13 ++++---- manifest.uuid | 2 +- src/pager.c | 10 ++++++ test/tkt-2d1a5c67d.test | 73 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 test/tkt-2d1a5c67d.test diff --git a/manifest b/manifest index 16faa5700b..a2fbca16d7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\sURI\sfilenames\sin\sthe\scommand-line\sshell.\s\sAdd\sa\scheck\sto\sthe\nbeginning\sof\sthe\sshell\sto\smake\ssure\sit\sis\scompiled\swith\sthe\ssame\nSQLite\ssource\sand\sheader. -D 2011-05-18T17:15:06.501 +C When\scommitting\sa\sWAL\stransaction,\smake\ssure\sat\sleast\sone\spage\sis\nwritten\sto\sthe\sWAL\sfile\sso\sthat\sthe\sWAL\ssubsystem\swill\shave\sa\spage\non\swhich\sto\sset\sthe\scommit\sflag.\nTicket\s[2d1a5c67dfc236]. +D 2011-05-19T01:21:42.431 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -165,7 +165,7 @@ F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440 F src/os_unix.c 6d4a58d81ad4b782406519f3790202f330e89bb7 F src/os_win.c 218b899469e570d46eb8147c2383075f7c026230 -F src/pager.c b7fe4b8e51d51a062618c4630c40d20a1a44cb80 +F src/pager.c 4b2358556c88660a94a4560de95dd728911e00fd F src/pager.h 3f8c783de1d4706b40b1ac15b64f5f896bcc78d1 F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa @@ -705,6 +705,7 @@ F test/threadtest2.c ace893054fa134af3fc8d6e7cfecddb8e3acefb9 F test/threadtest3.c 0ed13e09690f6204d7455fac3b0e8ece490f6eef F test/tkt-02a8e81d44.test 58494de77be2cf249228ada3f313fa399821c6ab F test/tkt-26ff0c2d1e.test 888324e751512972c6e0d1a09df740d8f5aaf660 +F test/tkt-2d1a5c67d.test 39d2368072315923021700a216379fcf23ac3a5c F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28 F test/tkt-31338dca7e.test 5741cd48de500347a437ba1be58c8335e83c5a5e F test/tkt-313723c356.test c47f8a9330523e6f35698bf4489bcb29609b53ac @@ -937,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 186d7ff1d9804d508e472e4939608bf2be67bdc2 -R 45381afe8cd9a292cfb03ba775eccef4 +P de58cb28387f44c35b1a81bdab853cafd938c1a6 +R e623b89a5e0b9474dd0884ecf24382fc U drh -Z 8316bf531771ea80911215ce32a98e54 +Z 83669a82fd950b01af57955dbca1c918 diff --git a/manifest.uuid b/manifest.uuid index 5de0e20c97..ad5e538784 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de58cb28387f44c35b1a81bdab853cafd938c1a6 \ No newline at end of file +67bf1c9a888b0d84d252d6c4c754c2c51994d208 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index b622c7acfe..6bddd7fd1f 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5747,11 +5747,21 @@ int sqlite3PagerCommitPhaseOne( }else{ if( pagerUseWal(pPager) ){ PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); + PgHdr *pPageOne = 0; + if( pList==0 ){ + /* Must have at least one page for the WAL commit flag. + ** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */ + rc = sqlite3PagerGet(pPager, 1, &pPageOne); + pList = pPageOne; + pList->pDirty = 0; + } + assert( pList!=0 || rc!=SQLITE_OK ); if( pList ){ rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1, (pPager->fullSync ? pPager->syncFlags : 0) ); } + sqlite3PagerUnref(pPageOne); if( rc==SQLITE_OK ){ sqlite3PcacheCleanAll(pPager->pPCache); } diff --git a/test/tkt-2d1a5c67d.test b/test/tkt-2d1a5c67d.test new file mode 100644 index 0000000000..676e60b057 --- /dev/null +++ b/test/tkt-2d1a5c67d.test @@ -0,0 +1,73 @@ +# 2011 May 19 +# +# 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. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. Specifically, +# it tests that ticket [2d1a5c67dfc2363e44f29d9bbd57f7331851390a] has +# been resolved. +# +# +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !wal {finish_test; return} + +for {set ii 1} {$ii<=10} {incr ii} { + do_test tkt-2d1a5c67d.1.$ii { + db close + forcedelete test.db test.db-wal + sqlite3 db test.db + db eval "PRAGMA cache_size=$::ii" + db eval { + PRAGMA journal_mode=WAL; + CREATE TABLE t1(a,b); + CREATE INDEX t1b ON t1(b); + CREATE TABLE t2(x,y UNIQUE); + INSERT INTO t2 VALUES(3,4); + BEGIN; + INSERT INTO t1(a,b) VALUES(1,2); + SELECT 'A', * FROM t2 WHERE y=4; + SELECT 'B', * FROM t1; + COMMIT; + SELECT 'C', * FROM t1; + } + } {wal A 3 4 B 1 2 C 1 2} +} + +db close +forcedelete test.db test.db-wal +sqlite3 db test.db +register_wholenumber_module db +db eval { + PRAGMA journal_mode=WAL; + CREATE TABLE t1(a,b); + CREATE INDEX t1b ON t1(b); + CREATE TABLE t2(x,y); + CREATE VIRTUAL TABLE nums USING wholenumber; + INSERT INTO t2 SELECT value, randomblob(1000) FROM nums + WHERE value BETWEEN 1 AND 1000; +} + +for {set ii 1} {$ii<=10} {incr ii} { + do_test tkt-2d1a5c67d.2.$ii { + db eval "PRAGMA cache_size=$::ii" + db eval { + DELETE FROM t1; + BEGIN; + INSERT INTO t1(a,b) VALUES(1,2); + SELECT sum(length(y)) FROM t2; + COMMIT; + SELECT * FROM t1; + } + } {1000000 1 2} +} + +finish_test From fdf304d39956e866d8107456f1e8788bf03f5548 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 19 May 2011 07:53:23 +0000 Subject: [PATCH 18/38] Add another test for [2d1a5c67df]. FossilOrigin-Name: 97fcd9e88891abd44037004e47862bcecfa1b0c9 --- manifest | 14 +++++------ manifest.uuid | 2 +- test/tkt-2d1a5c67d.test | 54 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a2fbca16d7..661fb78b3c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\scommitting\sa\sWAL\stransaction,\smake\ssure\sat\sleast\sone\spage\sis\nwritten\sto\sthe\sWAL\sfile\sso\sthat\sthe\sWAL\ssubsystem\swill\shave\sa\spage\non\swhich\sto\sset\sthe\scommit\sflag.\nTicket\s[2d1a5c67dfc236]. -D 2011-05-19T01:21:42.431 +C Add\sanother\stest\sfor\s[2d1a5c67df]. +D 2011-05-19T07:53:23.122 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -705,7 +705,7 @@ F test/threadtest2.c ace893054fa134af3fc8d6e7cfecddb8e3acefb9 F test/threadtest3.c 0ed13e09690f6204d7455fac3b0e8ece490f6eef F test/tkt-02a8e81d44.test 58494de77be2cf249228ada3f313fa399821c6ab F test/tkt-26ff0c2d1e.test 888324e751512972c6e0d1a09df740d8f5aaf660 -F test/tkt-2d1a5c67d.test 39d2368072315923021700a216379fcf23ac3a5c +F test/tkt-2d1a5c67d.test 450b3cf86ca9a3b1fd0a9e136978142be3bff7e0 F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28 F test/tkt-31338dca7e.test 5741cd48de500347a437ba1be58c8335e83c5a5e F test/tkt-313723c356.test c47f8a9330523e6f35698bf4489bcb29609b53ac @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P de58cb28387f44c35b1a81bdab853cafd938c1a6 -R e623b89a5e0b9474dd0884ecf24382fc -U drh -Z 83669a82fd950b01af57955dbca1c918 +P 67bf1c9a888b0d84d252d6c4c754c2c51994d208 +R 84c84662daf4fcfa430ab94eb0e5302f +U dan +Z b2a115bcb644bb929ad33751c5f52805 diff --git a/manifest.uuid b/manifest.uuid index ad5e538784..f2ab280f7f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -67bf1c9a888b0d84d252d6c4c754c2c51994d208 \ No newline at end of file +97fcd9e88891abd44037004e47862bcecfa1b0c9 \ No newline at end of file diff --git a/test/tkt-2d1a5c67d.test b/test/tkt-2d1a5c67d.test index 676e60b057..5db364bd79 100644 --- a/test/tkt-2d1a5c67d.test +++ b/test/tkt-2d1a5c67d.test @@ -17,6 +17,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix tkt-2d1a5c67d ifcapable !wal {finish_test; return} @@ -70,4 +71,57 @@ for {set ii 1} {$ii<=10} {incr ii} { } {1000000 1 2} } +db close +sqlite3 db test.db + + +do_execsql_test 3.1 { + PRAGMA cache_size = 10; + CREATE TABLE t3(a INTEGER PRIMARY KEY, b); + CREATE TABLE t4(a); +} + +do_execsql_test 3.2 { + INSERT INTO t3 VALUES(NULL, randomblob(500)); + INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 2 + INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 4 + INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 8 + INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 16 + INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 32 + INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 64 + INSERT INTO t3 SELECT NULL, b||b FROM t3; -- 128 +} + +do_execsql_test 3.3 { + BEGIN; + INSERT INTO t4 VALUES('xyz'); +} + +do_test 3.4 { + set blobs [list] + for {set i 1} {$i<100} {incr i} { + set b [db incrblob -readonly t3 b $i] + read $b + lappend blobs $b + } + + execsql COMMIT + execsql { SELECT * FROM t4 WHERE a = 'xyz' } +} {xyz} + +do_test 3.5 { + foreach b $blobs { close $b } + execsql { SELECT * FROM t4 WHERE a = 'xyz' } +} {xyz} + +# Check that recovery works on the WAL file. +# +forcedelete test.db2-wal test.db2 +do_test 3.6 { + file copy test.db-wal test.db2-wal + file copy test.db test.db2 + sqlite3 db2 test.db2 + execsql { SELECT * FROM t4 WHERE a = 'xyz' } db2 +} {xyz} + finish_test From 14438d12b14b6ddf73876436264fb2e0c6b53730 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 May 2011 01:49:30 +0000 Subject: [PATCH 19/38] Mark an unreachable branch in the recent WAL problem as unreachable. FossilOrigin-Name: 3e8a29ff8953054cb3b88db5997b5bae38ba09dd --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 661fb78b3c..4ded5d5da8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sanother\stest\sfor\s[2d1a5c67df]. -D 2011-05-19T07:53:23.122 +C Mark\san\sunreachable\sbranch\sin\sthe\srecent\sWAL\sproblem\sas\sunreachable. +D 2011-05-20T01:49:30.995 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -165,7 +165,7 @@ F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440 F src/os_unix.c 6d4a58d81ad4b782406519f3790202f330e89bb7 F src/os_win.c 218b899469e570d46eb8147c2383075f7c026230 -F src/pager.c 4b2358556c88660a94a4560de95dd728911e00fd +F src/pager.c 120550e7ef01dafaa2cbb4a0528c0d87c8f12b41 F src/pager.h 3f8c783de1d4706b40b1ac15b64f5f896bcc78d1 F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 67bf1c9a888b0d84d252d6c4c754c2c51994d208 -R 84c84662daf4fcfa430ab94eb0e5302f -U dan -Z b2a115bcb644bb929ad33751c5f52805 +P 97fcd9e88891abd44037004e47862bcecfa1b0c9 +R dfc39482dc1485cfb422ba7a47f95a18 +U drh +Z 170a5ac08de306ec947114fc9ba724a8 diff --git a/manifest.uuid b/manifest.uuid index f2ab280f7f..e36365ca26 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -97fcd9e88891abd44037004e47862bcecfa1b0c9 \ No newline at end of file +3e8a29ff8953054cb3b88db5997b5bae38ba09dd \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 6bddd7fd1f..7ff9a9a000 100644 --- a/src/pager.c +++ b/src/pager.c @@ -5755,8 +5755,8 @@ int sqlite3PagerCommitPhaseOne( pList = pPageOne; pList->pDirty = 0; } - assert( pList!=0 || rc!=SQLITE_OK ); - if( pList ){ + assert( rc==SQLITE_OK ); + if( ALWAYS(pList) ){ rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1, (pPager->fullSync ? pPager->syncFlags : 0) ); From 812d6088be28ab5bf2d44b4411df417dfb29b8d8 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 May 2011 01:50:01 +0000 Subject: [PATCH 20/38] Fix the URI test script so that it works even if there is a subdirectory named "test". FossilOrigin-Name: 2018d4e108872f2436df046636401b89cfde589d --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/uri.test | 9 +++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 4ded5d5da8..f751acadc1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mark\san\sunreachable\sbranch\sin\sthe\srecent\sWAL\sproblem\sas\sunreachable. -D 2011-05-20T01:49:30.995 +C Fix\sthe\sURI\stest\sscript\sso\sthat\sit\sworks\seven\sif\sthere\sis\sa\ssubdirectory\nnamed\s"test". +D 2011-05-20T01:50:01.794 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -843,7 +843,7 @@ F test/unique.test 083c7fff74695bcc27a71d75699deba3595bc9c2 F test/unixexcl.test 9d80a54d86d2261f660758928959368ffc36151e F test/unordered.test e81169ce2a8f31b2c6b66af691887e1376ab3ced F test/update.test 8bc86fd7ef1a00014f76dc6a6a7c974df4aef172 -F test/uri.test 2d08a6f77bf93ca925743a65802c4aa23aaaf373 +F test/uri.test 53de9a2549cbda9c343223236918ef502f6a9051 F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae F test/vacuum.test 29b60e8cc9e573b39676df6c4a75fe9e02d04a09 F test/vacuum2.test 91a84c9b08adfc4472097d2e8deb0150214e0e76 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 97fcd9e88891abd44037004e47862bcecfa1b0c9 -R dfc39482dc1485cfb422ba7a47f95a18 +P 3e8a29ff8953054cb3b88db5997b5bae38ba09dd +R 5fea414460a5e5fa1ee92fc36723f05a U drh -Z 170a5ac08de306ec947114fc9ba724a8 +Z c112edb8a27a2fc78ca0bd2c77513025 diff --git a/manifest.uuid b/manifest.uuid index e36365ca26..aac5e1d8c2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e8a29ff8953054cb3b88db5997b5bae38ba09dd \ No newline at end of file +2018d4e108872f2436df046636401b89cfde589d \ No newline at end of file diff --git a/test/uri.test b/test/uri.test index 42cbc66d77..f361e92917 100644 --- a/test/uri.test +++ b/test/uri.test @@ -46,7 +46,7 @@ foreach {tn uri file} { 11 file file 12 http:test.db http:test.db 13 file:test.db%00extra test.db - 14 file:test%00.db%00extra test + 14 file:testdb%00.db%00extra testdb 15 test.db?mork=1#boris test.db?mork=1#boris 16 file://localhostPWD/test.db%3Fhello test.db?hello @@ -59,6 +59,7 @@ foreach {tn uri file} { set uri [string map [list PWD [pwd]] $uri] } + if {[file isdir $file]} {error "$file is a directory"} forcedelete $file do_test 1.$tn.1 { file exists $file } 0 set DB [sqlite3_open $uri] @@ -90,9 +91,9 @@ foreach {tn uri kvlist} { 3 file:test.db?hello=1&world=2&vfs=tvfs {hello 1 world 2 vfs tvfs} 4 file:test.db?hello=1&world=2&vfs=tvfs2 {} 5 file:test.db?%68%65%6C%6C%6F=%77%6F%72%6C%64 {hello world} - 6 file:test%00.db?hello%00extra=world%00ex {hello world} - 7 file:test%00.db?hello%00=world%00 {hello world} - 8 file:test%00.db?=world&xyz=abc {xyz abc} + 6 file:testdb%00.db?hello%00extra=world%00ex {hello world} + 7 file:testdb%00.db?hello%00=world%00 {hello world} + 8 file:testdb%00.db?=world&xyz=abc {xyz abc} 9 file:test.db?%00hello=world&xyz=abc {xyz abc} 10 file:test.db?hello=%00world&xyz= {hello {} xyz {}} 11 file:test.db?=#ravada {} From cf8112bef9901e14de9ad313661f33f2d883771b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 May 2011 13:26:58 +0000 Subject: [PATCH 21/38] Add a big comment to the top of test_vfstrace.c to explain how to compile and use that module. FossilOrigin-Name: a6a0fefbe503a2c81aa1847ced3bac21850d8faa --- manifest | 12 +++--- manifest.uuid | 2 +- src/test_vfstrace.c | 94 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index f751acadc1..1e4ee00bc5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sURI\stest\sscript\sso\sthat\sit\sworks\seven\sif\sthere\sis\sa\ssubdirectory\nnamed\s"test". -D 2011-05-20T01:50:01.794 +C Add\sa\sbig\scomment\sto\sthe\stop\sof\stest_vfstrace.c\sto\sexplain\show\sto\scompile\nand\suse\sthat\smodule. +D 2011-05-20T13:26:58.320 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -227,7 +227,7 @@ F src/test_syscall.c 162c4ec0137a549c009bb9ecab550527743cfc5d F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa F src/test_thread.c 361ae0a0f1cbf5a28ad0388a258b104017a370c0 F src/test_vfs.c 0ac5b2e3da61bc385c1017890687c359746be2fd -F src/test_vfstrace.c 2265c9895f350c8d3c39b079998fbe7481505cc1 +F src/test_vfstrace.c 0b884e06094a746da729119a2cabdc7aa790063d F src/test_wholenumber.c 6129adfbe7c7444f2e60cc785927f3aa74e12290 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/tokenize.c 604607d6813e9551cf5189d899e0a25c12681080 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 3e8a29ff8953054cb3b88db5997b5bae38ba09dd -R 5fea414460a5e5fa1ee92fc36723f05a +P 2018d4e108872f2436df046636401b89cfde589d +R 255b37749f43768ed482b58df21cb526 U drh -Z c112edb8a27a2fc78ca0bd2c77513025 +Z b3fd4754e05513cf46b48a7229f1cea7 diff --git a/manifest.uuid b/manifest.uuid index aac5e1d8c2..2e71a6e1d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2018d4e108872f2436df046636401b89cfde589d \ No newline at end of file +a6a0fefbe503a2c81aa1847ced3bac21850d8faa \ No newline at end of file diff --git a/src/test_vfstrace.c b/src/test_vfstrace.c index 073eab631b..5e94f5cf06 100644 --- a/src/test_vfstrace.c +++ b/src/test_vfstrace.c @@ -12,6 +12,100 @@ ** ** This file contains code implements a VFS shim that writes diagnostic ** output for each VFS call, similar to "strace". +** +** USAGE: +** +** This source file exports a single symbol which is the name of a +** function: +** +** int vfstrace_register( +** const char *zTraceName, // Name of the newly constructed VFS +** const char *zOldVfsName, // Name of the underlying VFS +** int (*xOut)(const char*,void*), // Output routine. ex: fputs +** void *pOutArg, // 2nd argument to xOut. ex: stderr +** int makeDefault // Make the new VFS the default +** ); +** +** Applications that want to trace their VFS usage must provide a callback +** function with this prototype: +** +** int traceOutput(const char *zMessage, void *pAppData); +** +** This function will "output" the trace messages, where "output" can +** mean different things to different applications. The traceOutput function +** for the command-line shell (see shell.c) is "fputs" from the standard +** library, which means that all trace output is written on the stream +** specified by the second argument. In the case of the command-line shell +** the second argument is stderr. Other applications might choose to output +** trace information to a file, over a socket, or write it into a buffer. +** +** The vfstrace_register() function creates a new "shim" VFS named by +** the zTraceName parameter. A "shim" VFS is an SQLite backend that does +** not really perform the duties of a true backend, but simply filters or +** interprets VFS calls before passing them off to another VFS which does +** the actual work. In this case the other VFS - the one that does the +** real work - is identified by the second parameter, zOldVfsName. If +** the the 2nd parameter is NULL then the default VFS is used. The common +** case is for the 2nd parameter to be NULL. +** +** The third and fourth parameters are the pointer to the output function +** and the second argument to the output function. For the SQLite +** command-line shell, when the -vfstrace option is used, these parameters +** are fputs and stderr, respectively. +** +** The fifth argument is true (non-zero) to cause the newly created VFS +** to become the default VFS. The common case is for the fifth parameter +** to be true. +** +** The call to vfstrace_register() simply creates the shim VFS that does +** tracing. The application must also arrange to use the new VFS for +** all database connections that are created and for which tracing is +** desired. This can be done by specifying the trace VFS using URI filename +** notation, or by specifying the trace VFS as the 4th parameter to +** sqlite3_open_v2() or by making the trace VFS be the default (by setting +** the 5th parameter of vfstrace_register() to 1). +** +** +** ENABLING VFSTRACE IN A COMMAND-LINE SHELL +** +** The SQLite command line shell implemented by the shell.c source file +** can be used with this module. To compile in -vfstrace support, first +** gather this file (test_vfstrace.c), the shell source file (shell.c), +** and the SQLite amalgamation source files (sqlite3.c, sqlite3.h) into +** the working directory. Then compile using a command like the following: +** +** gcc -o sqlite3 -Os -I. -DSQLITE_ENABLE_VFSTRACE \ +** -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE \ +** -DHAVE_READLINE -DHAVE_USLEEP=1 \ +** shell.c test_vfstrace.c sqlite3.c -ldl -lreadline -lncurses +** +** The gcc command above works on Linux and provides (in addition to the +** -vfstrace option) support for FTS3 and FTS4, RTREE, and command-line +** editing using the readline library. The command-line shell does not +** use threads so we added -DSQLITE_THREADSAFE=0 just to make the code +** run a little faster. For compiling on a Mac, you'll probably need +** to omit the -DHAVE_READLINE, the -lreadline, and the -lncurses options. +** The compilation could be simplified to just this: +** +** gcc -DSQLITE_ENABLE_VFSTRACE \ +** shell.c test_vfstrace.c sqlite3.c -ldl -lpthread +** +** In this second example, all unnecessary options have been removed +** Note that since the code is now threadsafe, we had to add the -lpthread +** option to pull in the pthreads library. +** +** To cross-compile for windows using MinGW, a command like this might +** work: +** +** /opt/mingw/bin/i386-mingw32msvc-gcc -o sqlite3.exe -Os -I \ +** -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_VFSTRACE \ +** shell.c test_vfstrace.c sqlite3.c +** +** Similar compiler commands will work on different systems. The key +** invariants are (1) you must have -DSQLITE_ENABLE_VFSTRACE so that +** the shell.c source file will know to include the -vfstrace command-line +** option and (2) you must compile and link the three source files +** shell,c, test_vfstrace.c, and sqlite3.c. */ #include #include From 1c48530a13d2943141ca20641e300a3c6de23682 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 May 2011 20:42:11 +0000 Subject: [PATCH 22/38] Adjustments to documentation hyperlinks to accommodate the new VFS documentation. FossilOrigin-Name: 139a8f53ae1979591734a8244fb33655a6499193 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1e4ee00bc5..b8b2ce242c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sbig\scomment\sto\sthe\stop\sof\stest_vfstrace.c\sto\sexplain\show\sto\scompile\nand\suse\sthat\smodule. -D 2011-05-20T13:26:58.320 +C Adjustments\sto\sdocumentation\shyperlinks\sto\saccommodate\sthe\snew\sVFS\ndocumentation. +D 2011-05-20T20:42:11.435 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -179,7 +179,7 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48 -F src/sqlite.h.in 8bbf8d9bc5f1a9474a633a2de7014506f1f06b90 +F src/sqlite.h.in 91c63a69eeddbd62182ec00dbfee390016972bdb F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqliteInt.h 771087591052966d36ac1fcd3c8bb7a8c6cf9a38 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 2018d4e108872f2436df046636401b89cfde589d -R 255b37749f43768ed482b58df21cb526 +P a6a0fefbe503a2c81aa1847ced3bac21850d8faa +R 1c4aa7e39f492e96b1f4f46ead44733c U drh -Z b3fd4754e05513cf46b48a7229f1cea7 +Z 31318bdaf7f46736283d7518e5463d58 diff --git a/manifest.uuid b/manifest.uuid index 2e71a6e1d6..372beb9a2c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a6a0fefbe503a2c81aa1847ced3bac21850d8faa \ No newline at end of file +139a8f53ae1979591734a8244fb33655a6499193 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f955d63741..445a247a19 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -759,11 +759,11 @@ typedef struct sqlite3_mutex sqlite3_mutex; /* ** CAPI3REF: OS Interface Object -** KEYWORDS: VFS VFSes ** ** An instance of the sqlite3_vfs object defines the interface between ** the SQLite core and the underlying operating system. The "vfs" -** in the name of the object stands for "virtual file system". +** in the name of the object stands for "virtual file system". See +** the [VFS | VFS documentation] for further information. ** ** The value of the iVersion field is initially 1 but may be larger in ** future versions of SQLite. Additional fields may be appended to this From a12b6fa392a7d81d5c4720f199d542671b9c9afd Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 May 2011 18:37:42 +0000 Subject: [PATCH 23/38] Minor cleanups to the header comments on various test_*.c file, to make the suitable for programmer-level documentation. FossilOrigin-Name: a65d043a2ad895b931871c67e0ef397a1dc614a6 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/test_demovfs.c | 12 +++++------- src/test_journal.c | 12 +++++------- src/test_multiplex.c | 33 ++++++++++++++++++++++++++++----- src/test_vfs.c | 5 +---- 6 files changed, 49 insertions(+), 33 deletions(-) diff --git a/manifest b/manifest index b8b2ce242c..eb200a5f8a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjustments\sto\sdocumentation\shyperlinks\sto\saccommodate\sthe\snew\sVFS\ndocumentation. -D 2011-05-20T20:42:11.435 +C Minor\scleanups\sto\sthe\sheader\scomments\son\svarious\stest_*.c\sfile,\sto\smake\nthe\ssuitable\sfor\sprogrammer-level\sdocumentation. +D 2011-05-23T18:37:42.742 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -200,7 +200,7 @@ F src/test_autoext.c 30e7bd98ab6d70a62bb9ba572e4c7df347fe645e F src/test_backup.c c129c91127e9b46e335715ae2e75756e25ba27de F src/test_btree.c 47cd771250f09cdc6e12dda5bc71bc0b3abc96e2 F src/test_config.c 9a6aa8301a56906612b5e70f5b38e80cfb8af8e7 -F src/test_demovfs.c 938d0f595f8bd310076e1c06cf7885a01ce7ce01 +F src/test_demovfs.c 20a4975127993f4959890016ae9ce5535a880094 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_func.c cbdec5cededa0761daedde5baf06004a9bf416b5 F src/test_fuzzer.c f884f6f32e8513d34248d6e1ac8a32047fead254 @@ -208,10 +208,10 @@ F src/test_hexio.c c4773049603151704a6ab25ac5e936b5109caf5a F src/test_init.c 5d624ffd0409d424cf9adbfe1f056b200270077c F src/test_intarray.c d879bbf8e4ce085ab966d1f3c896a7c8b4f5fc99 F src/test_intarray.h 489edb9068bb926583445cb02589344961054207 -F src/test_journal.c 785edd54f963aefb3c1628124170a56697c68c70 +F src/test_journal.c 03313c693cca72959dcaaf79f8d76f21c01e19ff F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e F src/test_malloc.c 7ca7be34e0e09ef0ed6619544552ed95732e41f6 -F src/test_multiplex.c 8e67617b80b532315293761970589581745a52a0 +F src/test_multiplex.c a7457a1ac46964b7f897d75ecfd447410ec067e6 F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec @@ -226,7 +226,7 @@ F src/test_superlock.c 2b97936ca127d13962c3605dbc9a4ef269c424cd F src/test_syscall.c 162c4ec0137a549c009bb9ecab550527743cfc5d F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa F src/test_thread.c 361ae0a0f1cbf5a28ad0388a258b104017a370c0 -F src/test_vfs.c 0ac5b2e3da61bc385c1017890687c359746be2fd +F src/test_vfs.c e7855568dfa1e0ba73668d273b65605d9f8b77e8 F src/test_vfstrace.c 0b884e06094a746da729119a2cabdc7aa790063d F src/test_wholenumber.c 6129adfbe7c7444f2e60cc785927f3aa74e12290 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P a6a0fefbe503a2c81aa1847ced3bac21850d8faa -R 1c4aa7e39f492e96b1f4f46ead44733c +P 139a8f53ae1979591734a8244fb33655a6499193 +R 135e5df582474459d4ad1ce32ee0336a U drh -Z 31318bdaf7f46736283d7518e5463d58 +Z 551eea5e1688e783dfd89f144647d748 diff --git a/manifest.uuid b/manifest.uuid index 372beb9a2c..196319ab0a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -139a8f53ae1979591734a8244fb33655a6499193 \ No newline at end of file +a65d043a2ad895b931871c67e0ef397a1dc614a6 \ No newline at end of file diff --git a/src/test_demovfs.c b/src/test_demovfs.c index d7bcd1f908..637627071d 100644 --- a/src/test_demovfs.c +++ b/src/test_demovfs.c @@ -10,14 +10,12 @@ ** ************************************************************************* ** -** An example of a simple VFS implementation that omits complex features -** often not required or not possible on embedded platforms. Also includes -** code to buffer writes to the journal file, which can be a significant -** performance improvement on some embedded platforms. +** This file implements an example of a simple VFS implementation that +** omits complex features often not required or not possible on embedded +** platforms. Code is included to buffer writes to the journal file, +** which can be a significant performance improvement on some embedded +** platforms. ** -*/ - -/* ** OVERVIEW ** ** The code in this file implements a minimal SQLite VFS that can be diff --git a/src/test_journal.c b/src/test_journal.c index ca4c5c3884..68869723b3 100644 --- a/src/test_journal.c +++ b/src/test_journal.c @@ -14,13 +14,7 @@ ** an existing VFS. The code in this file attempts to verify that SQLite ** correctly populates and syncs a journal file before writing to a ** corresponding database file. -*/ -#if SQLITE_TEST /* This file is used for testing only */ - -#include "sqlite3.h" -#include "sqliteInt.h" - -/* +** ** INTERFACE ** ** The public interface to this wrapper VFS is two functions: @@ -99,6 +93,10 @@ ** ** c) The journal file is deleted using xDelete. */ +#if SQLITE_TEST /* This file is used for testing only */ + +#include "sqlite3.h" +#include "sqliteInt.h" /* ** Maximum pathname length supported by the jt backend. diff --git a/src/test_multiplex.c b/src/test_multiplex.c index 32e63ae889..f709c9a99f 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -11,13 +11,36 @@ ************************************************************************* ** ** This file contains a VFS "shim" - a layer that sits in between the -** pager and the real VFS. +** pager and the real VFS - that breaks up a very large database file +** into two or more smaller files on disk. This is useful, for example, +** in order to support large, multi-gigabyte databases on older filesystems +** that limit the maximum file size to 2 GiB. ** -** This particular shim enforces a multiplex system on DB files. -** This shim shards/partitions a single DB file into smaller -** "chunks" such that the total DB file size may exceed the maximum -** file size of the underlying file system. +** USAGE: ** +** Compile this source file and link it with your application. Then +** at start-time, invoke the following procedure: +** +** int sqlite3_multiplex_initialize( +** const char *zOrigVfsName, // The underlying real VFS +** int makeDefault // True to make multiplex the default VFS +** ); +** +** The procedure call above will create and register a new VFS shim named +** "multiplex". The multiplex VFS will use the VFS named by zOrigVfsName to +** do the actual disk I/O. (The zOrigVfsName parameter may be NULL, in +** which case the default VFS at the moment sqlite3_multiplex_initialize() +** is called will be used as the underlying real VFS.) +** +** If the makeDefault parameter is TRUE then multiplex becomes the new +** default VFS. Otherwise, you can use the multiplex VFS by specifying +** "multiplex" as the 4th parameter to sqlite3_open_v2() or by employing +** URI filenames and adding "vfs=multiplex" as a parameter to the filename +** URI. +** +** The multiplex VFS allows databases up to 32 GiB in size. But it splits +** the files up into 1 GiB pieces, so that they will work even on filesystems +** that do not support large files. */ #include "sqlite3.h" #include diff --git a/src/test_vfs.c b/src/test_vfs.c index ba078a0f9b..696321d26e 100644 --- a/src/test_vfs.c +++ b/src/test_vfs.c @@ -10,10 +10,6 @@ ** ****************************************************************************** ** -*/ -#if SQLITE_TEST /* This file is used for testing only */ - -/* ** This file contains the implementation of the Tcl [testvfs] command, ** used to create SQLite VFS implementations with various properties and ** instrumentation to support testing SQLite. @@ -28,6 +24,7 @@ ** -mxpathname INTEGER (Value for sqlite3_vfs.mxPathname) ** -iversion INTEGER (Value for sqlite3_vfs.iVersion) */ +#if SQLITE_TEST /* This file is used for testing only */ #include "sqlite3.h" #include "sqliteInt.h" From a24bc9ced33a7b20c27d3e538c9f244161908168 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 May 2011 00:35:56 +0000 Subject: [PATCH 24/38] Make sure the savepoint index is correct one calls to sqlite3VtabSavepoint with SAVEPOINT_BEGIN. FossilOrigin-Name: a9d095660ca0e99b226e0fe669c11a0be6c49710 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index eb200a5f8a..1ca83606c1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\scleanups\sto\sthe\sheader\scomments\son\svarious\stest_*.c\sfile,\sto\smake\nthe\ssuitable\sfor\sprogrammer-level\sdocumentation. -D 2011-05-23T18:37:42.742 +C Make\ssure\sthe\ssavepoint\sindex\sis\scorrect\sone\scalls\sto\ssqlite3VtabSavepoint\nwith\sSAVEPOINT_BEGIN. +D 2011-05-24T00:35:56.199 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -236,7 +236,7 @@ F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e -F src/vdbe.c 343a068e8daeb8475e66776feb9f2974046e95c5 +F src/vdbe.c 408cc051fab3f16af2ccfe5a5eb0c86499ebb10c F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 139a8f53ae1979591734a8244fb33655a6499193 -R 135e5df582474459d4ad1ce32ee0336a +P a65d043a2ad895b931871c67e0ef397a1dc614a6 +R 94ee8b905e59bc1d32642c15b01f0858 U drh -Z 551eea5e1688e783dfd89f144647d748 +Z 1f18a51d1c1bfd3a78b89267e4416239 diff --git a/manifest.uuid b/manifest.uuid index 196319ab0a..86e9ebce7f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a65d043a2ad895b931871c67e0ef397a1dc614a6 \ No newline at end of file +a9d095660ca0e99b226e0fe669c11a0be6c49710 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index cac0906998..5b421a65e5 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2589,7 +2589,8 @@ case OP_Savepoint: { ** If this is a transaction savepoint being opened, it is guaranteed ** that the db->aVTrans[] array is empty. */ assert( db->autoCommit==0 || db->nVTrans==0 ); - rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement); + rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, + db->nStatement+db->nSavepoint); if( rc!=SQLITE_OK ) goto abort_due_to_error; /* Create a new savepoint structure. */ From e4855224621a5d1a0323cb6e777618266897628f Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 May 2011 15:36:01 +0000 Subject: [PATCH 25/38] Do not invoke the xRollbackTo or xRelease methods of a virtual table without having first invoked an appropriate xSavepoint method. Add assert() statements to FTS3/4 to verify that this is happening in all cases. FossilOrigin-Name: 651ef24249d8c22c4f13e4c0bb98a60099cfd23a --- ext/fts3/fts3.c | 36 +++++++++++++++++++++++++++++++----- ext/fts3/fts3Int.h | 30 ++++++++++++++++++++++++++++++ manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/sqliteInt.h | 1 + src/vtab.c | 6 ++++-- 6 files changed, 76 insertions(+), 17 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index ea430627cd..fecf092148 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -977,6 +977,8 @@ static int fts3InitVtab( p->nMaxPendingData = FTS3_MAX_PENDING_DATA; p->bHasDocsize = (isFts4 && bNoDocsize==0); p->bHasStat = isFts4; + TESTONLY( p->inTransaction = -1 ); + TESTONLY( p->mxSavepoint = -1 ); fts3HashInit(&p->pendingTerms, FTS3_HASH_STRING, 1); /* Fill in the zName and zDb fields of the vtab structure. */ @@ -3274,7 +3276,11 @@ static int fts3SyncMethod(sqlite3_vtab *pVtab){ */ static int fts3BeginMethod(sqlite3_vtab *pVtab){ UNUSED_PARAMETER(pVtab); - assert( ((Fts3Table *)pVtab)->nPendingData==0 ); + TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + assert( p->nPendingData==0 ); + assert( p->inTransaction!=1 ); + TESTONLY( p->inTransaction = 1 ); + TESTONLY( p->mxSavepoint = -1; ); return SQLITE_OK; } @@ -3285,7 +3291,11 @@ static int fts3BeginMethod(sqlite3_vtab *pVtab){ */ static int fts3CommitMethod(sqlite3_vtab *pVtab){ UNUSED_PARAMETER(pVtab); - assert( ((Fts3Table *)pVtab)->nPendingData==0 ); + TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + assert( p->nPendingData==0 ); + assert( p->inTransaction!=0 ); + TESTONLY( p->inTransaction = 0 ); + TESTONLY( p->mxSavepoint = -1; ); return SQLITE_OK; } @@ -3294,7 +3304,11 @@ static int fts3CommitMethod(sqlite3_vtab *pVtab){ ** hash-table. Any changes made to the database are reverted by SQLite. */ static int fts3RollbackMethod(sqlite3_vtab *pVtab){ - sqlite3Fts3PendingTermsClear((Fts3Table *)pVtab); + Fts3Table *p = (Fts3Table*)pVtab; + sqlite3Fts3PendingTermsClear(p); + assert( p->inTransaction!=0 ); + TESTONLY( p->inTransaction = 0 ); + TESTONLY( p->mxSavepoint = -1; ); return SQLITE_OK; } @@ -3650,13 +3664,25 @@ static int fts3RenameMethod( } static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ - return sqlite3Fts3PendingTermsFlush((Fts3Table *)pVtab); + Fts3Table *p = (Fts3Table*)pVtab; + assert( p->inTransaction ); + assert( p->mxSavepoint < iSavepoint ); + TESTONLY( p->mxSavepoint = iSavepoint ); + return sqlite3Fts3PendingTermsFlush(p); } static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ + TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + assert( p->inTransaction ); + assert( p->mxSavepoint >= iSavepoint ); + TESTONLY( p->mxSavepoint = iSavepoint>0 ? iSavepoint-1 : 0 ); return SQLITE_OK; } static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ - sqlite3Fts3PendingTermsClear((Fts3Table *)pVtab); + Fts3Table *p = (Fts3Table*)pVtab; + assert( p->inTransaction ); + assert( p->mxSavepoint >= iSavepoint ); + TESTONLY( p->mxSavepoint = iSavepoint ); + sqlite3Fts3PendingTermsClear(p); return SQLITE_OK; } diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 8d1e15737d..bb21165ffc 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -92,12 +92,32 @@ typedef unsigned char u8; /* 1-byte (or larger) unsigned integer */ typedef short int i16; /* 2-byte (or larger) signed integer */ typedef unsigned int u32; /* 4-byte unsigned integer */ typedef sqlite3_uint64 u64; /* 8-byte unsigned integer */ + /* ** Macro used to suppress compiler warnings for unused parameters. */ #define UNUSED_PARAMETER(x) (void)(x) + +/* +** Activate assert() only if SQLITE_TEST is enabled. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 #endif +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) +# define TESTONLY(X) X +#else +# define TESTONLY(X) +#endif + +#endif /* SQLITE_AMALGAMATION */ + typedef struct Fts3Table Fts3Table; typedef struct Fts3Cursor Fts3Cursor; typedef struct Fts3Expr Fts3Expr; @@ -151,6 +171,16 @@ struct Fts3Table { int nPendingData; sqlite_int64 iPrevDocid; Fts3Hash pendingTerms; + +#if defined(SQLITE_DEBUG) + /* State variables used for validating that the transaction control + ** methods of the virtual table are called at appropriate times. These + ** values do not contribution to the FTS computation; they are used for + ** verifying the SQLite core. + */ + int inTransaction; /* True after xBegin but before xCommit/xRollback */ + int mxSavepoint; /* Largest valid xSavepoint integer */ +#endif }; /* diff --git a/manifest b/manifest index 1ca83606c1..51c28b73df 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\ssavepoint\sindex\sis\scorrect\sone\scalls\sto\ssqlite3VtabSavepoint\nwith\sSAVEPOINT_BEGIN. -D 2011-05-24T00:35:56.199 +C Do\snot\sinvoke\sthe\sxRollbackTo\sor\sxRelease\smethods\sof\sa\svirtual\stable\swithout\nhaving\sfirst\sinvoked\san\sappropriate\sxSavepoint\smethod.\s\sAdd\sassert()\sstatements\nto\sFTS3/4\sto\sverify\sthat\sthis\sis\shappening\sin\sall\scases. +D 2011-05-24T15:36:01.532 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -61,9 +61,9 @@ F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 18c2a079ba2b9154b7485fd39d1a6d12b5872a76 +F ext/fts3/fts3.c e7600e285b58027657ebb46c6132b7d5a100accb F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 05d145152620e7849c452bd919f2cc3e2d75309f +F ext/fts3/fts3Int.h c8c0011c5e5b3a7703376ea6cd7deb91cfb96a06 F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf F ext/fts3/fts3_expr.c 5f49e0deaf723724b08100bb3ff40aab02ad0c93 F ext/fts3/fts3_hash.c 3c8f6387a4a7f5305588b203fa7c887d753e1f1c @@ -181,7 +181,7 @@ F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48 F src/sqlite.h.in 91c63a69eeddbd62182ec00dbfee390016972bdb F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h 771087591052966d36ac1fcd3c8bb7a8c6cf9a38 +F src/sqliteInt.h 558170329f2b9cc3ac1a697fda69d6136b1052a1 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -244,7 +244,7 @@ F src/vdbeaux.c 535851211df61d83213c83d5ffd3c6ce9ecbdc18 F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 -F src/vtab.c 48dcef8bc757c2e7b488f68b5ddebb1650da2450 +F src/vtab.c abc63828276619d7eb8f45ab265ebc2204c85ddd F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66 F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P a65d043a2ad895b931871c67e0ef397a1dc614a6 -R 94ee8b905e59bc1d32642c15b01f0858 +P a9d095660ca0e99b226e0fe669c11a0be6c49710 +R 19875cc50e6351fd8eaf432c5942eda7 U drh -Z 1f18a51d1c1bfd3a78b89267e4416239 +Z f15ff60c160c7edadf458f2c05939bd4 diff --git a/manifest.uuid b/manifest.uuid index 86e9ebce7f..47cc55cc06 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a9d095660ca0e99b226e0fe669c11a0be6c49710 \ No newline at end of file +651ef24249d8c22c4f13e4c0bb98a60099cfd23a \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 6932e0b455..a6fac4f854 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1235,6 +1235,7 @@ struct VTable { sqlite3_vtab *pVtab; /* Pointer to vtab instance */ int nRef; /* Number of pointers to this structure */ u8 bConstraint; /* True if constraints are supported */ + u8 bInSavepoint; /* True if within a SAVEPOINT */ VTable *pNext; /* Next in linked list (see above) */ }; diff --git a/src/vtab.c b/src/vtab.c index c64c897d07..1de0baec91 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -873,12 +873,14 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ if( db->aVTrans ){ int i; for(i=0; rc==SQLITE_OK && inVTrans; i++){ - const sqlite3_module *pMod = db->aVTrans[i]->pMod->pModule; - if( pMod->iVersion>=2 ){ + VTable *pVTab = db->aVTrans[i]; + const sqlite3_module *pMod = pVTab->pMod->pModule; + if( pMod->iVersion>=2 && (pVTab->bInSavepoint || op==SAVEPOINT_BEGIN) ){ int (*xMethod)(sqlite3_vtab *, int); switch( op ){ case SAVEPOINT_BEGIN: xMethod = pMod->xSavepoint; + pVTab->bInSavepoint = 1; break; case SAVEPOINT_ROLLBACK: xMethod = pMod->xRollbackTo; From 346506f97b5cae2252569fd00739b5c34f44735a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 25 May 2011 01:16:42 +0000 Subject: [PATCH 26/38] Changes to savepoint in virtual tables for simpler and more consistent operation. FossilOrigin-Name: 92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 --- ext/fts3/fts3.c | 2 +- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/sqliteInt.h | 2 +- src/vdbe.c | 2 +- src/vdbeaux.c | 8 +------- src/vtab.c | 10 +++++++--- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index fecf092148..5e2472753e 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -3674,7 +3674,7 @@ static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); assert( p->inTransaction ); assert( p->mxSavepoint >= iSavepoint ); - TESTONLY( p->mxSavepoint = iSavepoint>0 ? iSavepoint-1 : 0 ); + TESTONLY( p->mxSavepoint = iSavepoint-1 ); return SQLITE_OK; } static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ diff --git a/manifest b/manifest index 51c28b73df..70bd6447db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sinvoke\sthe\sxRollbackTo\sor\sxRelease\smethods\sof\sa\svirtual\stable\swithout\nhaving\sfirst\sinvoked\san\sappropriate\sxSavepoint\smethod.\s\sAdd\sassert()\sstatements\nto\sFTS3/4\sto\sverify\sthat\sthis\sis\shappening\sin\sall\scases. -D 2011-05-24T15:36:01.532 +C Changes\sto\ssavepoint\sin\svirtual\stables\sfor\ssimpler\sand\smore\sconsistent\noperation. +D 2011-05-25T01:16:42.774 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -61,7 +61,7 @@ F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c e7600e285b58027657ebb46c6132b7d5a100accb +F ext/fts3/fts3.c 0a2ae110f2d1806687ee0de837ac1eff106843b4 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h c8c0011c5e5b3a7703376ea6cd7deb91cfb96a06 F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf @@ -181,7 +181,7 @@ F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48 F src/sqlite.h.in 91c63a69eeddbd62182ec00dbfee390016972bdb F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h 558170329f2b9cc3ac1a697fda69d6136b1052a1 +F src/sqliteInt.h aba3cb057fabf6ff9fa634d677e750dfa946a856 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -236,15 +236,15 @@ F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e -F src/vdbe.c 408cc051fab3f16af2ccfe5a5eb0c86499ebb10c +F src/vdbe.c 4812f0e5813b3969307ec466d26d9b32b7b814e9 F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1 -F src/vdbeaux.c 535851211df61d83213c83d5ffd3c6ce9ecbdc18 +F src/vdbeaux.c 07a5226ae6e9c6e54b5fcd3c395b86e7ffdba3a4 F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 -F src/vtab.c abc63828276619d7eb8f45ab265ebc2204c85ddd +F src/vtab.c 6bff354033de8eff72f42565411a72a84fd2b26b F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66 F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P a9d095660ca0e99b226e0fe669c11a0be6c49710 -R 19875cc50e6351fd8eaf432c5942eda7 +P 651ef24249d8c22c4f13e4c0bb98a60099cfd23a +R d659c94b5cac09c043b35685a3ce715d U drh -Z f15ff60c160c7edadf458f2c05939bd4 +Z 45421066265cfeebb2a0b357f6a7553d diff --git a/manifest.uuid b/manifest.uuid index 47cc55cc06..ddcd4dc4ff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -651ef24249d8c22c4f13e4c0bb98a60099cfd23a \ No newline at end of file +92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a6fac4f854..753c0fcefb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1235,7 +1235,7 @@ struct VTable { sqlite3_vtab *pVtab; /* Pointer to vtab instance */ int nRef; /* Number of pointers to this structure */ u8 bConstraint; /* True if constraints are supported */ - u8 bInSavepoint; /* True if within a SAVEPOINT */ + u32 iSavepoint; /* Depth of the SAVEPOINT stack */ VTable *pNext; /* Next in linked list (see above) */ }; diff --git a/src/vdbe.c b/src/vdbe.c index 5b421a65e5..add643f176 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2840,7 +2840,7 @@ case OP_Transaction: { p->iStatement = db->nSavepoint + db->nStatement; } - rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement); + rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1); if( rc==SQLITE_OK ){ rc = sqlite3BtreeBeginStmt(pBt, p->iStatement); } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index e89a87b522..e9764a5096 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2202,17 +2202,11 @@ int sqlite3VdbeHalt(Vdbe *p){ ** do so. If this operation returns an error, and the current statement ** error code is SQLITE_OK or SQLITE_CONSTRAINT, then promote the ** current statement error code. - ** - ** Note that sqlite3VdbeCloseStatement() can only fail if eStatementOp - ** is SAVEPOINT_ROLLBACK. But if p->rc==SQLITE_OK then eStatementOp - ** must be SAVEPOINT_RELEASE. Hence the NEVER(p->rc==SQLITE_OK) in - ** the following code. */ if( eStatementOp ){ rc = sqlite3VdbeCloseStatement(p, eStatementOp); if( rc ){ - assert( eStatementOp==SAVEPOINT_ROLLBACK ); - if( NEVER(p->rc==SQLITE_OK) || p->rc==SQLITE_CONSTRAINT ){ + if( p->rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT ){ p->rc = rc; sqlite3DbFree(db, p->zErrMsg); p->zErrMsg = 0; diff --git a/src/vtab.c b/src/vtab.c index 1de0baec91..0a4c9ea0a4 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -753,6 +753,7 @@ static void callFinaliser(sqlite3 *db, int offset){ x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset); if( x ) x(p); } + pVTab->iSavepoint = 0; sqlite3VtabUnlock(pVTab); } sqlite3DbFree(db, db->aVTrans); @@ -870,17 +871,18 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ int rc = SQLITE_OK; assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN ); + assert( iSavepoint>=0 ); if( db->aVTrans ){ int i; for(i=0; rc==SQLITE_OK && inVTrans; i++){ VTable *pVTab = db->aVTrans[i]; const sqlite3_module *pMod = pVTab->pMod->pModule; - if( pMod->iVersion>=2 && (pVTab->bInSavepoint || op==SAVEPOINT_BEGIN) ){ + if( pMod->iVersion>=2 ){ int (*xMethod)(sqlite3_vtab *, int); switch( op ){ case SAVEPOINT_BEGIN: xMethod = pMod->xSavepoint; - pVTab->bInSavepoint = 1; + pVTab->iSavepoint = iSavepoint+1; break; case SAVEPOINT_ROLLBACK: xMethod = pMod->xRollbackTo; @@ -889,7 +891,9 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ xMethod = pMod->xRelease; break; } - if( xMethod ) rc = xMethod(db->aVTrans[i]->pVtab, iSavepoint); + if( xMethod && pVTab->iSavepoint>iSavepoint ){ + rc = xMethod(db->aVTrans[i]->pVtab, iSavepoint); + } } } } From addd8f872949d25653d925d728011bcceb27be0a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 25 May 2011 15:54:09 +0000 Subject: [PATCH 27/38] Fix a compiler warning. FossilOrigin-Name: 6df99e52dabf2a243ad635529649b86c21735e91 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 70bd6447db..a7124cf8a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\ssavepoint\sin\svirtual\stables\sfor\ssimpler\sand\smore\sconsistent\noperation. -D 2011-05-25T01:16:42.774 +C Fix\sa\scompiler\swarning. +D 2011-05-25T15:54:09.204 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -181,7 +181,7 @@ F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48 F src/sqlite.h.in 91c63a69eeddbd62182ec00dbfee390016972bdb F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h aba3cb057fabf6ff9fa634d677e750dfa946a856 +F src/sqliteInt.h d9ff5f198b5bac7ee0c6e1ea55f76897ba4dda87 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 651ef24249d8c22c4f13e4c0bb98a60099cfd23a -R d659c94b5cac09c043b35685a3ce715d +P 92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 +R 1179d31eff61655636edf672584723cf U drh -Z 45421066265cfeebb2a0b357f6a7553d +Z c44adff51be44d9f0cc2862535697c61 diff --git a/manifest.uuid b/manifest.uuid index ddcd4dc4ff..e2dc48d525 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 \ No newline at end of file +6df99e52dabf2a243ad635529649b86c21735e91 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 753c0fcefb..bba0b3c441 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1235,7 +1235,7 @@ struct VTable { sqlite3_vtab *pVtab; /* Pointer to vtab instance */ int nRef; /* Number of pointers to this structure */ u8 bConstraint; /* True if constraints are supported */ - u32 iSavepoint; /* Depth of the SAVEPOINT stack */ + int iSavepoint; /* Depth of the SAVEPOINT stack */ VTable *pNext; /* Next in linked list (see above) */ }; From 2cac2078f6afd8fb6d262293029e12f9c235a130 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 25 May 2011 18:46:22 +0000 Subject: [PATCH 28/38] Fix a case where a malloc() error could lead to mismatched virtual-table xBegin/xCommit/xRollback callbacks. FossilOrigin-Name: d807304a695fc85402b86e1cd32a6e3bbb2823c8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vtab.c | 30 ++++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index a7124cf8a8..1074285b3f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scompiler\swarning. -D 2011-05-25T15:54:09.204 +C Fix\sa\scase\swhere\sa\smalloc()\serror\scould\slead\sto\smismatched\svirtual-table\sxBegin/xCommit/xRollback\scallbacks. +D 2011-05-25T18:46:22.024 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -244,7 +244,7 @@ F src/vdbeaux.c 07a5226ae6e9c6e54b5fcd3c395b86e7ffdba3a4 F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 -F src/vtab.c 6bff354033de8eff72f42565411a72a84fd2b26b +F src/vtab.c 9ba8c7fdb7d39260c033a402f6032d3e7bc5d336 F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66 F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 92f26a8b8f18832cb1f8ba7dd8e5b020e71a5883 -R 1179d31eff61655636edf672584723cf -U drh -Z c44adff51be44d9f0cc2862535697c61 +P 6df99e52dabf2a243ad635529649b86c21735e91 +R 02c26b8fd230a540c57276590c974e79 +U dan +Z e2a23225f8e5abceac6a8fe1d14982ec diff --git a/manifest.uuid b/manifest.uuid index e2dc48d525..5b49fb4d2d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6df99e52dabf2a243ad635529649b86c21735e91 \ No newline at end of file +d807304a695fc85402b86e1cd32a6e3bbb2823c8 \ No newline at end of file diff --git a/src/vtab.c b/src/vtab.c index 0a4c9ea0a4..dffd6a2664 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -577,11 +577,11 @@ int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ return rc; } - /* -** Add the virtual table pVTab to the array sqlite3.aVTrans[]. +** Grow the db->aVTrans[] array so that there is room for at least one +** more v-table. Return SQLITE_NOMEM if a malloc fails, or SQLITE_OK otherwise. */ -static int addToVTrans(sqlite3 *db, VTable *pVTab){ +static int growVTrans(sqlite3 *db){ const int ARRAY_INCR = 5; /* Grow the sqlite3.aVTrans array if required */ @@ -596,10 +596,17 @@ static int addToVTrans(sqlite3 *db, VTable *pVTab){ db->aVTrans = aVTrans; } + return SQLITE_OK; +} + +/* +** Add the virtual table pVTab to the array sqlite3.aVTrans[]. Space should +** have already been reserved using growVTrans(). +*/ +static void addToVTrans(sqlite3 *db, VTable *pVTab){ /* Add pVtab to the end of sqlite3.aVTrans */ db->aVTrans[db->nVTrans++] = pVTab; sqlite3VtabLock(pVTab); - return SQLITE_OK; } /* @@ -637,7 +644,10 @@ int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){ /* Justification of ALWAYS(): The xConstructor method is required to ** create a valid sqlite3_vtab if it returns SQLITE_OK. */ if( rc==SQLITE_OK && ALWAYS(sqlite3GetVTable(db, pTab)) ){ - rc = addToVTrans(db, sqlite3GetVTable(db, pTab)); + rc = growVTrans(db); + if( rc==SQLITE_OK ){ + addToVTrans(db, sqlite3GetVTable(db, pTab)); + } } return rc; @@ -843,10 +853,14 @@ int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ } } - /* Invoke the xBegin method */ - rc = pModule->xBegin(pVTab->pVtab); + /* Invoke the xBegin method. If successful, add the vtab to the + ** sqlite3.aVTrans[] array. */ + rc = growVTrans(db); if( rc==SQLITE_OK ){ - rc = addToVTrans(db, pVTab); + rc = pModule->xBegin(pVTab->pVtab); + if( rc==SQLITE_OK ){ + addToVTrans(db, pVTab); + } } } return rc; From ef05c39d12cf13bdad52c9f63f3154a588aaeb74 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 25 May 2011 20:25:10 +0000 Subject: [PATCH 29/38] Ignore malloc failures within the WAL file truncation attempt for journal_size_limit. FossilOrigin-Name: dd19105aa9521ffc0edcf16b84c064d5ebad55d7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1074285b3f..bd65c3d5e3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scase\swhere\sa\smalloc()\serror\scould\slead\sto\smismatched\svirtual-table\sxBegin/xCommit/xRollback\scallbacks. -D 2011-05-25T18:46:22.024 +C Ignore\smalloc\sfailures\swithin\sthe\sWAL\sfile\struncation\sattempt\sfor\njournal_size_limit. +D 2011-05-25T20:25:10.559 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -245,7 +245,7 @@ F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 F src/vtab.c 9ba8c7fdb7d39260c033a402f6032d3e7bc5d336 -F src/wal.c de27c34c8016c00be348fc6bed588816557ceb66 +F src/wal.c ab1d8c5abf904fd6396f90499cbd8c54b8d6961b F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f F src/where.c 55403ce19c506be6a321c7f129aff693d6103db5 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 6df99e52dabf2a243ad635529649b86c21735e91 -R 02c26b8fd230a540c57276590c974e79 -U dan -Z e2a23225f8e5abceac6a8fe1d14982ec +P d807304a695fc85402b86e1cd32a6e3bbb2823c8 +R 40f4c0754c95b7a51c08aa03886ff26c +U drh +Z c74bad4333e073e26c4db5e166f8f584 diff --git a/manifest.uuid b/manifest.uuid index 5b49fb4d2d..f139bfb8f7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d807304a695fc85402b86e1cd32a6e3bbb2823c8 \ No newline at end of file +dd19105aa9521ffc0edcf16b84c064d5ebad55d7 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 1222660985..d90fb05d8b 100644 --- a/src/wal.c +++ b/src/wal.c @@ -2539,10 +2539,12 @@ static int walRestartLog(Wal *pWal){ if( pWal->mxWalSize>=0 ){ i64 sz; int rx; + sqlite3BeginBenignMalloc(); rx = sqlite3OsFileSize(pWal->pWalFd, &sz); if( rx==SQLITE_OK && (sz > pWal->mxWalSize) ){ rx = sqlite3OsTruncate(pWal->pWalFd, pWal->mxWalSize); } + sqlite3EndBenignMalloc(); if( rx ){ sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName); } From 7ee4fdd7ba0366a929adb5c94297f9debcf4a4b3 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 25 May 2011 23:18:02 +0000 Subject: [PATCH 30/38] Fix some minor and harmless compiler warnings. FossilOrigin-Name: a4755e7088c3cc7c5ea191ce37f3950472f523ec --- ext/fts3/fts3.c | 4 ++++ ext/fts3/fts3_aux.c | 6 +++++- ext/rtree/rtree.c | 7 +++++-- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 5e2472753e..0aba0546c3 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -3665,6 +3665,7 @@ static int fts3RenameMethod( static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ Fts3Table *p = (Fts3Table*)pVtab; + UNUSED_PARAMETER(iSavepoint); assert( p->inTransaction ); assert( p->mxSavepoint < iSavepoint ); TESTONLY( p->mxSavepoint = iSavepoint ); @@ -3672,6 +3673,8 @@ static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ } static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); + UNUSED_PARAMETER(iSavepoint); + UNUSED_PARAMETER(pVtab); assert( p->inTransaction ); assert( p->mxSavepoint >= iSavepoint ); TESTONLY( p->mxSavepoint = iSavepoint-1 ); @@ -3679,6 +3682,7 @@ static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ } static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ Fts3Table *p = (Fts3Table*)pVtab; + UNUSED_PARAMETER(iSavepoint); assert( p->inTransaction ); assert( p->mxSavepoint >= iSavepoint ); TESTONLY( p->mxSavepoint = iSavepoint ); diff --git a/ext/fts3/fts3_aux.c b/ext/fts3/fts3_aux.c index 6108689ae1..cd035d2a30 100644 --- a/ext/fts3/fts3_aux.c +++ b/ext/fts3/fts3_aux.c @@ -342,6 +342,7 @@ static int fts3auxFilterMethod( int isScan; UNUSED_PARAMETER(nVal); + UNUSED_PARAMETER(idxStr); assert( idxStr==0 ); assert( idxNum==FTS4AUX_EQ_CONSTRAINT || idxNum==0 @@ -459,7 +460,10 @@ int sqlite3Fts3InitAux(sqlite3 *db){ 0, /* xCommit */ 0, /* xRollback */ 0, /* xFindFunction */ - 0 /* xRename */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0 /* xRollbackTo */ }; int rc; /* Return code */ diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 6e00827b46..66a10df1c3 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -2849,7 +2849,7 @@ static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){ } static sqlite3_module rtreeModule = { - 0, /* iVersion */ + 0, /* iVersion */ rtreeCreate, /* xCreate - create a table */ rtreeConnect, /* xConnect - connect to an existing table */ rtreeBestIndex, /* xBestIndex - Determine search strategy */ @@ -2868,7 +2868,10 @@ static sqlite3_module rtreeModule = { 0, /* xCommit - commit transaction */ 0, /* xRollback - rollback transaction */ 0, /* xFindFunction - function overloading */ - rtreeRename /* xRename - rename the table */ + rtreeRename, /* xRename - rename the table */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0 /* xRollbackTo */ }; static int rtreeSqlInit( diff --git a/manifest b/manifest index bd65c3d5e3..bd8d6e5ef2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ignore\smalloc\sfailures\swithin\sthe\sWAL\sfile\struncation\sattempt\sfor\njournal_size_limit. -D 2011-05-25T20:25:10.559 +C Fix\ssome\sminor\sand\sharmless\scompiler\swarnings. +D 2011-05-25T23:18:02.794 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -61,10 +61,10 @@ F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 0a2ae110f2d1806687ee0de837ac1eff106843b4 +F ext/fts3/fts3.c b3a10a1a320aaeb56a1dd6710bf09eb5c2370839 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h c8c0011c5e5b3a7703376ea6cd7deb91cfb96a06 -F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf +F ext/fts3/fts3_aux.c 97c960b1b0d371c08eae6b8565dfac619eb9d979 F ext/fts3/fts3_expr.c 5f49e0deaf723724b08100bb3ff40aab02ad0c93 F ext/fts3/fts3_hash.c 3c8f6387a4a7f5305588b203fa7c887d753e1f1c F ext/fts3/fts3_hash.h 8331fb2206c609f9fc4c4735b9ab5ad6137c88ec @@ -82,7 +82,7 @@ F ext/icu/README.txt bf8461d8cdc6b8f514c080e4e10dc3b2bbdfefa9 F ext/icu/icu.c eb9ae1d79046bd7871aa97ee6da51eb770134b5a F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/rtree.c 2445bec932f58f8f4fe9de49a63bd6bf24db82d6 +F ext/rtree/rtree.c 4b8438444927191b55de18e00df43b2e02aacbda F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e F ext/rtree/rtree1.test 28e1b8da4da98093ce3210187434dd760a8d89d8 F ext/rtree/rtree2.test acbb3a4ce0f4fbc2c304d2b4b784cfa161856bba @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P d807304a695fc85402b86e1cd32a6e3bbb2823c8 -R 40f4c0754c95b7a51c08aa03886ff26c +P dd19105aa9521ffc0edcf16b84c064d5ebad55d7 +R 008aea5da6bfc4eb7e4a2c09eb3620eb U drh -Z c74bad4333e073e26c4db5e166f8f584 +Z e8c2f21e52caf9d88919dc2348e8bfe9 diff --git a/manifest.uuid b/manifest.uuid index f139bfb8f7..310e58b317 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dd19105aa9521ffc0edcf16b84c064d5ebad55d7 \ No newline at end of file +a4755e7088c3cc7c5ea191ce37f3950472f523ec \ No newline at end of file From 305ebab7cc7b12e17a502865a01c9d20658495fe Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 26 May 2011 14:19:14 +0000 Subject: [PATCH 31/38] Changes to work with SQLITE_OMIT_VIRTUAL_TABLE. FossilOrigin-Name: 03f7d36a8a24825b7542b5fed651af1622ae4eb5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 2 ++ test/tkt-2d1a5c67d.test | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index bd8d6e5ef2..3f4e379ddd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssome\sminor\sand\sharmless\scompiler\swarnings. -D 2011-05-25T23:18:02.794 +C Changes\sto\swork\swith\sSQLITE_OMIT_VIRTUAL_TABLE. +D 2011-05-26T14:19:14.865 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -236,7 +236,7 @@ F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e -F src/vdbe.c 4812f0e5813b3969307ec466d26d9b32b7b814e9 +F src/vdbe.c a8ff6724d4f1ca8c45ef778d67633d1fb4d9bdbf F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1 @@ -705,7 +705,7 @@ F test/threadtest2.c ace893054fa134af3fc8d6e7cfecddb8e3acefb9 F test/threadtest3.c 0ed13e09690f6204d7455fac3b0e8ece490f6eef F test/tkt-02a8e81d44.test 58494de77be2cf249228ada3f313fa399821c6ab F test/tkt-26ff0c2d1e.test 888324e751512972c6e0d1a09df740d8f5aaf660 -F test/tkt-2d1a5c67d.test 450b3cf86ca9a3b1fd0a9e136978142be3bff7e0 +F test/tkt-2d1a5c67d.test 73574c758502bf23260c17f97fcd9316dfb5a060 F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28 F test/tkt-31338dca7e.test 5741cd48de500347a437ba1be58c8335e83c5a5e F test/tkt-313723c356.test c47f8a9330523e6f35698bf4489bcb29609b53ac @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P dd19105aa9521ffc0edcf16b84c064d5ebad55d7 -R 008aea5da6bfc4eb7e4a2c09eb3620eb +P a4755e7088c3cc7c5ea191ce37f3950472f523ec +R 730ee7bc721983cbb8520125b21bb17e U drh -Z e8c2f21e52caf9d88919dc2348e8bfe9 +Z d447764bdbeb7397b78d42ae4b389d7c diff --git a/manifest.uuid b/manifest.uuid index 310e58b317..ff053854df 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a4755e7088c3cc7c5ea191ce37f3950472f523ec \ No newline at end of file +03f7d36a8a24825b7542b5fed651af1622ae4eb5 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index add643f176..c55927e663 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2584,6 +2584,7 @@ case OP_Savepoint: { }else{ nName = sqlite3Strlen30(zName); +#ifdef SQLITE_OMIT_VIRTUAL_TABLE /* This call is Ok even if this savepoint is actually a transaction ** savepoint (and therefore should not prompt xSavepoint()) callbacks. ** If this is a transaction savepoint being opened, it is guaranteed @@ -2592,6 +2593,7 @@ case OP_Savepoint: { rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, db->nStatement+db->nSavepoint); if( rc!=SQLITE_OK ) goto abort_due_to_error; +#endif /* Create a new savepoint structure. */ pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+nName+1); diff --git a/test/tkt-2d1a5c67d.test b/test/tkt-2d1a5c67d.test index 5db364bd79..278e1d38bc 100644 --- a/test/tkt-2d1a5c67d.test +++ b/test/tkt-2d1a5c67d.test @@ -19,7 +19,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix tkt-2d1a5c67d -ifcapable !wal {finish_test; return} +ifcapable {!wal || !vtab} {finish_test; return} for {set ii 1} {$ii<=10} {incr ii} { do_test tkt-2d1a5c67d.1.$ii { From c97125eb72437be15c8499782bb00c786671cd4a Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 May 2011 15:53:07 +0000 Subject: [PATCH 32/38] Print a log message on each cache spill if compiled with SQLITE_LOG_CACHE_SPILL. FossilOrigin-Name: 5f15579f8ca747f0fa0a7867ceffc8c7b8f904e6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pcache.c | 7 +++++++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 3f4e379ddd..ef773de94f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\swork\swith\sSQLITE_OMIT_VIRTUAL_TABLE. -D 2011-05-26T14:19:14.865 +C Print\sa\slog\smessage\son\seach\scache\sspill\sif\scompiled\swith\nSQLITE_LOG_CACHE_SPILL. +D 2011-05-28T15:53:07.056 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -168,7 +168,7 @@ F src/os_win.c 218b899469e570d46eb8147c2383075f7c026230 F src/pager.c 120550e7ef01dafaa2cbb4a0528c0d87c8f12b41 F src/pager.h 3f8c783de1d4706b40b1ac15b64f5f896bcc78d1 F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58 -F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa +F src/pcache.c 49e718c095810c6b3334e3a6d89970aceaddefce F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050 F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e F src/pragma.c 9e778decc3ee9bcaf88904b4a3b0a4360aaf0eab @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P a4755e7088c3cc7c5ea191ce37f3950472f523ec -R 730ee7bc721983cbb8520125b21bb17e +P 03f7d36a8a24825b7542b5fed651af1622ae4eb5 +R ecca10c4aa82cb4b740a494236bdb180 U drh -Z d447764bdbeb7397b78d42ae4b389d7c +Z 7233c15025f0530a32ecee3359d1f724 diff --git a/manifest.uuid b/manifest.uuid index ff053854df..42def11d4f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -03f7d36a8a24825b7542b5fed651af1622ae4eb5 \ No newline at end of file +5f15579f8ca747f0fa0a7867ceffc8c7b8f904e6 \ No newline at end of file diff --git a/src/pcache.c b/src/pcache.c index 242f3071d9..f37511e9e4 100644 --- a/src/pcache.c +++ b/src/pcache.c @@ -253,6 +253,13 @@ int sqlite3PcacheFetch( } if( pPg ){ int rc; +#ifdef SQLITE_LOG_CACHE_SPILL + sqlite3_log(SQLITE_FULL, + "spill page %d making room for %d - cache used: %d/%d", + pPg->pgno, pgno, + sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache), + pCache->nMax); +#endif rc = pCache->xStress(pCache->pStress, pPg); if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){ return rc; From 21f80f0478ae4570dfd9f803fecd15a05abc5b54 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 28 May 2011 19:24:15 +0000 Subject: [PATCH 33/38] Fix a "#ifdef" from check-in [03f7d36a8a] that should have been "#ifndef". FossilOrigin-Name: edb865c35415f9553f8279028120f7b8de2bf7e2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ef773de94f..701dc47e95 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Print\sa\slog\smessage\son\seach\scache\sspill\sif\scompiled\swith\nSQLITE_LOG_CACHE_SPILL. -D 2011-05-28T15:53:07.056 +C Fix\sa\s"#ifdef"\sfrom\scheck-in\s[03f7d36a8a]\sthat\sshould\shave\sbeen\s"#ifndef". +D 2011-05-28T19:24:15.852 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -236,7 +236,7 @@ F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e -F src/vdbe.c a8ff6724d4f1ca8c45ef778d67633d1fb4d9bdbf +F src/vdbe.c 380dddc404c1e4a9260a4194daa728b94ed102d7 F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 03f7d36a8a24825b7542b5fed651af1622ae4eb5 -R ecca10c4aa82cb4b740a494236bdb180 +P 5f15579f8ca747f0fa0a7867ceffc8c7b8f904e6 +R a63903941bea8f77658823b8763468e2 U drh -Z 7233c15025f0530a32ecee3359d1f724 +Z 62e9bfe1cc7669e25feec8cecb39066d diff --git a/manifest.uuid b/manifest.uuid index 42def11d4f..60ef9e438e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5f15579f8ca747f0fa0a7867ceffc8c7b8f904e6 \ No newline at end of file +edb865c35415f9553f8279028120f7b8de2bf7e2 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index c55927e663..d28f73d1b1 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2584,7 +2584,7 @@ case OP_Savepoint: { }else{ nName = sqlite3Strlen30(zName); -#ifdef SQLITE_OMIT_VIRTUAL_TABLE +#ifndef SQLITE_OMIT_VIRTUAL_TABLE /* This call is Ok even if this savepoint is actually a transaction ** savepoint (and therefore should not prompt xSavepoint()) callbacks. ** If this is a transaction savepoint being opened, it is guaranteed From 1fbb230f90e150c3c42c294afc06eb32901193e5 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 30 May 2011 14:35:48 +0000 Subject: [PATCH 34/38] Make sure the P5 argument to the OP_VUpdate opcode is always set to a valid conflict resolution code. FossilOrigin-Name: e3350dbd9f472c27ea6bc872d85098ac89d874c7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/delete.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 701dc47e95..f9e0a1ae94 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\s"#ifdef"\sfrom\scheck-in\s[03f7d36a8a]\sthat\sshould\shave\sbeen\s"#ifndef". -D 2011-05-28T19:24:15.852 +C Make\ssure\sthe\sP5\sargument\sto\sthe\sOP_VUpdate\sopcode\sis\salways\sset\sto\sa\nvalid\sconflict\sresolution\scode. +D 2011-05-30T14:35:48.783 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -130,7 +130,7 @@ F src/callback.c 0425c6320730e6d3981acfb9202c1bed9016ad1a F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 7deec4534f3b5a0c3b4a4cbadf809d321f64f9c4 F src/date.c 1548fdac51377e4e7833251de878b4058c148e1b -F src/delete.c 7a24fcc9a31664d145acb97ce56b6d9f249a25e4 +F src/delete.c cecc926c70783452f3e8eb452c728291ce1a0b21 F src/expr.c e3cf0957c6b8faaaf7386a3bc69e53c0dc9705be F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c a43ba8a005fb5efd1deeee06853e3a6120d46a91 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 5f15579f8ca747f0fa0a7867ceffc8c7b8f904e6 -R a63903941bea8f77658823b8763468e2 +P edb865c35415f9553f8279028120f7b8de2bf7e2 +R 3b765e3c18f9b2a8d8763c389176a0b5 U drh -Z 62e9bfe1cc7669e25feec8cecb39066d +Z 3e70f15cebd9551500dd66c2327a7d64 diff --git a/manifest.uuid b/manifest.uuid index 60ef9e438e..f3911243ba 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -edb865c35415f9553f8279028120f7b8de2bf7e2 \ No newline at end of file +e3350dbd9f472c27ea6bc872d85098ac89d874c7 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index e5389e2b6a..a2df773af8 100644 --- a/src/delete.c +++ b/src/delete.c @@ -401,6 +401,7 @@ void sqlite3DeleteFrom( const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); sqlite3VtabMakeWritable(pParse, pTab); sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iRowid, pVTab, P4_VTAB); + sqlite3VdbeChangeP5(v, OE_Abort); sqlite3MayAbort(pParse); }else #endif From f4b595b929449c03383f8c20d1929f284c960cc9 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 30 May 2011 15:06:48 +0000 Subject: [PATCH 35/38] Update evidence marks on the URI filename tests to conform to the latest documentation. FossilOrigin-Name: 1bab03c4811b5e5b3d15632bc2a3844891f9fad7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/e_uri.test | 18 ++++++++++-------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index f9e0a1ae94..207bb8d5bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\sP5\sargument\sto\sthe\sOP_VUpdate\sopcode\sis\salways\sset\sto\sa\nvalid\sconflict\sresolution\scode. -D 2011-05-30T14:35:48.783 +C Update\sevidence\smarks\son\sthe\sURI\sfilename\stests\sto\sconform\sto\sthe\slatest\ndocumentation. +D 2011-05-30T15:06:48.453 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -380,7 +380,7 @@ F test/e_resolve.test dcce9308fb13b934ce29591105d031d3e14fbba6 F test/e_select.test bf385ae3aa0f014c4933ae66fd3e1302138493eb F test/e_select2.test 5c3d3da19c7b3e90ae444579db2b70098599ab92 F test/e_update.test 963d6876064e65f318d1c93aaed36a02b9b389bf -F test/e_uri.test 9ce11319fb9b271bf7392027f913f7830e93e7a7 +F test/e_uri.test b6da43a10f44d9aa0aff5ffa3c2f3de668361255 F test/e_vacuum.test 6c09c2af7f2f140518f371c5342100118f779dcf F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea F test/enc2.test 6d91a5286f59add0cfcbb2d0da913b76f2242398 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P edb865c35415f9553f8279028120f7b8de2bf7e2 -R 3b765e3c18f9b2a8d8763c389176a0b5 +P e3350dbd9f472c27ea6bc872d85098ac89d874c7 +R 31eb4302622f868d251135572f646bae U drh -Z 3e70f15cebd9551500dd66c2327a7d64 +Z 47e43c01cd8d7b7136f7bc52a005ac53 diff --git a/manifest.uuid b/manifest.uuid index f3911243ba..45419984ac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3350dbd9f472c27ea6bc872d85098ac89d874c7 \ No newline at end of file +1bab03c4811b5e5b3d15632bc2a3844891f9fad7 \ No newline at end of file diff --git a/test/e_uri.test b/test/e_uri.test index b0e2f876de..3e47427941 100644 --- a/test/e_uri.test +++ b/test/e_uri.test @@ -48,10 +48,11 @@ proc open_uri_error {uri} { # and the filename argument begins with "file:", then the filename is # interpreted as a URI. # -# EVIDENCE-OF: R-00067-59538 URI filename interpretation is enabled if +# EVIDENCE-OF: R-32637-34037 URI filename interpretation is enabled if # the SQLITE_OPEN_URI flag is is set in the fourth argument to # sqlite3_open_v2(), or if it has been enabled globally using the -# SQLITE_CONFIG_URI option with the sqlite3_config() method. +# SQLITE_CONFIG_URI option with the sqlite3_config() method or by the +# SQLITE_USE_URI compile-time option. # if {$tcl_platform(platform) == "unix"} { set flags [list SQLITE_OPEN_READWRITE SQLITE_OPEN_CREATE] @@ -140,8 +141,8 @@ if {$tcl_platform(platform) == "unix"} { } } -# EVIDENCE-OF: R-43804-65312 The 'fragment' component of a URI, if -# present, is always ignored. +# EVIDENCE-OF: R-45981-25528 The fragment component of a URI, if +# present, is ignored. # # It is difficult to test that something is ignore correctly. So these tests # just show that adding a fragment does not interfere with the pathname or @@ -157,14 +158,15 @@ if {$tcl_platform(platform) == "unix"} { } } -# EVIDENCE-OF: R-00273-20588 SQLite uses the 'path' component of the URI -# as the path to the database file to open. +# EVIDENCE-OF: R-62557-09390 SQLite uses the path component of the URI +# as the name of the disk file which contains the database. # # EVIDENCE-OF: R-28659-11035 If the path begins with a '/' character, # then it is interpreted as an absolute path. # -# EVIDENCE-OF: R-39349-47203 If it does not begin with a '/', it is -# interpreted as a relative path. +# EVIDENCE-OF: R-46234-61323 If the path does not begin with a '/' +# (meaning that the authority section is omitted from the URI) then the +# path is interpreted as a relative path. # if {$tcl_platform(platform) == "unix"} { foreach {tn uri parse} " From c3f1d5f0958df10afadc10cd24ea1fb1d7003dfb Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 30 May 2011 23:42:16 +0000 Subject: [PATCH 36/38] Minor performance improvements. FossilOrigin-Name: f9950c6af1813f724dacd7455f472acec921b06a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 6 ++++-- src/vdbe.c | 28 ++++++++++++++-------------- src/vdbeaux.c | 4 +++- 5 files changed, 30 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index 207bb8d5bf..b9205ae2bb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sevidence\smarks\son\sthe\sURI\sfilename\stests\sto\sconform\sto\sthe\slatest\ndocumentation. -D 2011-05-30T15:06:48.453 +C Minor\sperformance\simprovements. +D 2011-05-30T23:42:16.233 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -122,7 +122,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 986c15232757f2873dff35ee3b35cbf935fc573c F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 975ad691a57eb1fb60f1ec76ad0b6571eace62f9 +F src/btree.c 0d3b39dcb79565c053e35fc12713f12d8a74d6a9 F src/btree.h f5d775cd6cfc7ac32a2535b70e8d2af48ef5f2ce F src/btreeInt.h 67978c014fa4f7cc874032dd3aacadd8db656bc3 F src/build.c 0132bc6631fa617a1d28ef805921f6dbac18a514 @@ -236,11 +236,11 @@ F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e -F src/vdbe.c 380dddc404c1e4a9260a4194daa728b94ed102d7 +F src/vdbe.c 103827f560cdc48b1d455ce4d4b3573dd88f9ab4 F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797 F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1 -F src/vdbeaux.c 07a5226ae6e9c6e54b5fcd3c395b86e7ffdba3a4 +F src/vdbeaux.c 99900868d18618a07ffaf780ecc41fd807834bde F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P e3350dbd9f472c27ea6bc872d85098ac89d874c7 -R 31eb4302622f868d251135572f646bae +P 1bab03c4811b5e5b3d15632bc2a3844891f9fad7 +R 7acb04adb38e3c88e3b1f83ed6f40a4e U drh -Z 47e43c01cd8d7b7136f7bc52a005ac53 +Z 9e474b54141fcb6c3097a32384090f3c diff --git a/manifest.uuid b/manifest.uuid index 45419984ac..58a05fb539 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1bab03c4811b5e5b3d15632bc2a3844891f9fad7 \ No newline at end of file +f9950c6af1813f724dacd7455f472acec921b06a \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index df75053743..972a2f608c 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5390,10 +5390,10 @@ static int fillInCell( ** "sz" must be the number of bytes in the cell. */ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ - int i; /* Loop counter */ 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 */ @@ -5418,9 +5418,11 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ *pRC = rc; return; } - for(i=idx+1; inCell; i++, ptr+=2){ + endPtr = &data[pPage->cellOffset + 2*pPage->nCell - 2]; + while( ptrnCell--; put2byte(&data[hdr+3], pPage->nCell); diff --git a/src/vdbe.c b/src/vdbe.c index d28f73d1b1..eea6aba70e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1766,7 +1766,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ pIn3 = &aMem[pOp->p3]; flags1 = pIn1->flags; flags3 = pIn3->flags; - if( (pIn1->flags | pIn3->flags)&MEM_Null ){ + if( (flags1 | flags3)&MEM_Null ){ /* One or both operands are NULL */ if( pOp->p5 & SQLITE_NULLEQ ){ /* If SQLITE_NULLEQ is set (which will only happen if the operator is @@ -1774,7 +1774,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** or not both operands are null. */ assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); - res = (pIn1->flags & pIn3->flags & MEM_Null)==0; + res = (flags1 & flags3 & MEM_Null)==0; }else{ /* SQLITE_NULLEQ is clear and at least one operand is NULL, ** then the result is always NULL. @@ -5882,20 +5882,20 @@ case OP_MaxPgcnt: { /* out2-prerelease */ */ case OP_Trace: { char *zTrace; + char *z; - zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); - if( zTrace ){ - if( db->xTrace ){ - char *z = sqlite3VdbeExpandSql(p, zTrace); - db->xTrace(db->pTraceArg, z); - sqlite3DbFree(db, z); - } -#ifdef SQLITE_DEBUG - if( (db->flags & SQLITE_SqlTrace)!=0 ){ - sqlite3DebugPrintf("SQL-trace: %s\n", zTrace); - } -#endif /* SQLITE_DEBUG */ + if( db->xTrace && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 ){ + z = sqlite3VdbeExpandSql(p, zTrace); + db->xTrace(db->pTraceArg, z); + sqlite3DbFree(db, z); } +#ifdef SQLITE_DEBUG + if( (db->flags & SQLITE_SqlTrace)!=0 + && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 + ){ + sqlite3DebugPrintf("SQL-trace: %s\n", zTrace); + } +#endif /* SQLITE_DEBUG */ break; } #endif diff --git a/src/vdbeaux.c b/src/vdbeaux.c index e9764a5096..0322b04c21 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2852,7 +2852,7 @@ UnpackedRecord *sqlite3VdbeRecordUnpack( idx += getVarint32(&aKey[idx], serial_type); pMem->enc = pKeyInfo->enc; pMem->db = pKeyInfo->db; - pMem->flags = 0; + /* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */ pMem->zMalloc = 0; d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); pMem++; @@ -2867,6 +2867,7 @@ UnpackedRecord *sqlite3VdbeRecordUnpack( ** This routine destroys a UnpackedRecord object. */ void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord *p){ +#ifdef SQLITE_DEBUG int i; Mem *pMem; @@ -2880,6 +2881,7 @@ void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord *p){ */ if( NEVER(pMem->zMalloc) ) sqlite3VdbeMemRelease(pMem); } +#endif if( p->flags & UNPACKED_NEED_FREE ){ sqlite3DbFree(p->pKeyInfo->db, p); } From a80a141247a233e71d0adc29244096eebf3204f0 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 31 May 2011 11:56:15 +0000 Subject: [PATCH 37/38] Update the documentation to state that any parameter that is optimized out of a prepared statement becomes an anonymous parameter for which sqlite3_bind_parameter_name() returns NULL. FossilOrigin-Name: 701b8a23e3ea2c94454af5d9bd1e72acb66d0fe2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b9205ae2bb..f7cee8fa4c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sperformance\simprovements. -D 2011-05-30T23:42:16.233 +C Update\sthe\sdocumentation\sto\sstate\sthat\sany\sparameter\sthat\sis\soptimized\sout\nof\sa\sprepared\sstatement\sbecomes\san\sanonymous\sparameter\sfor\swhich\nsqlite3_bind_parameter_name()\sreturns\sNULL. +D 2011-05-31T11:56:15.040 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -179,7 +179,7 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/shell.c decd04236a7ef26be5ef46d4ea963044bfad9a48 -F src/sqlite.h.in 91c63a69eeddbd62182ec00dbfee390016972bdb +F src/sqlite.h.in c095996e68e0082f674f32e68ca909fc24196a2a F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqliteInt.h d9ff5f198b5bac7ee0c6e1ea55f76897ba4dda87 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 1bab03c4811b5e5b3d15632bc2a3844891f9fad7 -R 7acb04adb38e3c88e3b1f83ed6f40a4e +P f9950c6af1813f724dacd7455f472acec921b06a +R f6b845f51167252cf7d20999b01d5085 U drh -Z 9e474b54141fcb6c3097a32384090f3c +Z 659dc0a03ae6f4d76444e7107181eaaf diff --git a/manifest.uuid b/manifest.uuid index 58a05fb539..6374f63920 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f9950c6af1813f724dacd7455f472acec921b06a \ No newline at end of file +701b8a23e3ea2c94454af5d9bd1e72acb66d0fe2 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 445a247a19..a9d60e8a2d 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3068,6 +3068,8 @@ int sqlite3_bind_parameter_count(sqlite3_stmt*); ** is included as part of the name.)^ ** ^Parameters of the form "?" without a following integer have no name ** and are referred to as "nameless" or "anonymous parameters". +** ^Any parameter that is optimized out of the prepared statement by the +** query planner becomes a nameless or anonymous parameter. ** ** ^The first host parameter has an index of 1, not 0. ** From ed9624187d89a96e591353a7bdee53b292e6f849 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 31 May 2011 16:50:23 +0000 Subject: [PATCH 38/38] Fix a problem in the sqlite3TestErrorName() function (used only for testing) that appears to have originated from a bad merge. FossilOrigin-Name: a0ae314c7f41d0146a9ee1adc576cd977219a378 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/test1.c | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f7cee8fa4c..9323cd6b55 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\sdocumentation\sto\sstate\sthat\sany\sparameter\sthat\sis\soptimized\sout\nof\sa\sprepared\sstatement\sbecomes\san\sanonymous\sparameter\sfor\swhich\nsqlite3_bind_parameter_name()\sreturns\sNULL. -D 2011-05-31T11:56:15.040 +C Fix\sa\sproblem\sin\sthe\ssqlite3TestErrorName()\sfunction\s(used\sonly\sfor\stesting)\nthat\sappears\sto\shave\soriginated\sfrom\sa\sbad\smerge. +D 2011-05-31T16:50:23.129 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -186,7 +186,7 @@ F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/tclsqlite.c 501c9a200fd998a268be475be5858febc90b725b -F src/test1.c 4a1171af201be90c21d64a872e686b1333d9a2cf +F src/test1.c 9f61b9d23938bc5dd165ec7b95a91c30ce6e66db F src/test2.c 80d323d11e909cf0eb1b6fbb4ac22276483bcf31 F src/test3.c 124ff9735fb6bb7d41de180d6bac90e7b1509432 F src/test4.c d1e5a5e904d4b444cf572391fdcb017638e36ff7 @@ -938,7 +938,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P f9950c6af1813f724dacd7455f472acec921b06a -R f6b845f51167252cf7d20999b01d5085 +P 701b8a23e3ea2c94454af5d9bd1e72acb66d0fe2 +R 0252c62ef68072dedfcd687577c244b5 U drh -Z 659dc0a03ae6f4d76444e7107181eaaf +Z 32d78009c9e58634b2f842adf352a1be diff --git a/manifest.uuid b/manifest.uuid index 6374f63920..55d88bed1a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -701b8a23e3ea2c94454af5d9bd1e72acb66d0fe2 \ No newline at end of file +a0ae314c7f41d0146a9ee1adc576cd977219a378 \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index 50575afbbc..7d31c6d02a 100644 --- a/src/test1.c +++ b/src/test1.c @@ -164,7 +164,6 @@ const char *sqlite3TestErrorName(int rc){ zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; case SQLITE_IOERR_LOCK: zName = "SQLITE_IOERR_LOCK"; break; case SQLITE_CORRUPT_VTAB: zName = "SQLITE_CORRUPT_VTAB"; break; - zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; default: zName = "SQLITE_Unknown"; break; } return zName;