Index: pages/34to35.in ================================================================== --- pages/34to35.in +++ pages/34to35.in @@ -50,11 +50,11 @@ HEADING 1 {Overview Of Changes} PARAGRAPH { A quick enumeration of the changes in SQLite version 3.5.0 - is provide here. Subsequent sections will describe these + is provided here. Subsequent sections will describe these changes in more detail. } PARAGRAPH {
  1. The OS interface layer has been completely reworked: @@ -137,11 +137,11 @@ The new OS interface for SQLite is built around an object named [sqlite3_vfs]. The "vfs" stands for "Virtual File System". The sqlite3_vfs object is basically a structure containing pointers to functions that implement the primitive disk I/O operations that SQLite needs to perform in order to read and write databases. - In this article, we will often refer a sqlite3_vfs objects as a "VFS". + In this article, we will often refer to an sqlite3_vfs objects as a "VFS". } PARAGRAPH { SQLite is able to use multiple VFSes at the same time. Each individual database connection is associated with just one VFS. @@ -173,20 +173,20 @@ CODE { int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); } PARAGRAPH { - Applications can call sqlite3_vfs_register at any time, though of course + Applications can call sqlite3_vfs_register() at any time, though of course a VFS needs to be registered before it can be used. The first argument is a pointer to a customized VFS object that the application has prepared. The second argument is true to make the new VFS the default VFS so that it will be used by the legacy [sqlite3_open()] and [sqlite3_open16()] APIs. If the new VFS is not the default, then you will probably have to use the new [sqlite3_open_v2()] API to use it. Note, however, that if a new VFS is the only VFS known to SQLite (if SQLite was compiled without its usual default VFS or if the precompiled default VFS was removed - using [sqlite3_vfs_unregister()]) then the new VFS automatic becomes the + using [sqlite3_vfs_unregister()]) then the new VFS automatically becomes the default VFS regardless of the makeDflt argument to [sqlite3_vfs_register()]. } PARAGRAPH { Standard builds include the default "unix" or "win32" VFSes. @@ -236,11 +236,11 @@ Once a VFS has been registered, it should never be modified. If a change in behavior is required, a new VFS should be registered. The application could, perhaps, use [sqlite3_vfs_find()] to locate the old VFS, make a copy of the old VFS into a new [sqlite3_vfs] object, make the desired modifications to the new VFS, unregister - the old VFS, the register the new VFS in its place. Existing + the old VFS, then register the new VFS in its place. Existing database connections would continue to use the old VFS even after it is unregistered, but new database connections would use the new VFS. } @@ -326,13 +326,13 @@ available to store auxiliary information that a VFS information might want to carry around. } PARAGRAPH { - The remaining fields of the [sqlite3_vfs] object all store pointer + The remaining fields of the [sqlite3_vfs] object all store pointers to functions that implement primitive operations. We call these - "methods". The first methods, xOpen, is used to open files on + "methods". The first method, xOpen, is used to open files on the underlying storage media. The result is an [sqlite3_file] object. There are additional methods, defined by the [sqlite3_file] object itself that are used to read and write and close the file. The additional methods are detailed below. The filename is in UTF-8. SQLite will guarantee that the zFilename string passed to @@ -396,11 +396,11 @@ for the duration of the database connection. TRANSIENT_DB databases last only for the duration of a single SQL statement. } PARAGRAPH { - The xDelete method is used delete a file. The name of the file is + The xDelete method is used to delete a file. The name of the file is given in the second parameter. The filename will be in UTF-8. The VFS must convert the filename into whatever character representation the underlying operating system expects. If the syncDir parameter is true, then the xDelete method should not return until the change to the directory contents for the directory containing the @@ -461,11 +461,11 @@ The xRandomness routine requests that nByte bytes of randomness be written into zOut. The routine returns the actual number of bytes of randomness obtained. The quality of the randomness so obtained will determine the quality of the randomness generated by built-in SQLite functions such as random() and randomblob(). SQLite also - uses its PRNG to generate temporary file names.. On some platforms + uses its PRNG to generate temporary file names. On some platforms (ex: Windows) SQLite assumes that temporary file names are unique without actually testing for collisions, so it is important to have good-quality randomness even if the random() and randomblob() functions are never used. } @@ -480,11 +480,11 @@ be rounded up. xSleep returns this rounded-up value. } PARAGRAPH { The xCurrentTime method finds the current time and date and writes - the result as double-precision floating point value into pointer + the result as a double-precision floating point value into pointer provided by the second parameter. The time and date is in coordinated universal time (UTC) and is a fractional Julian day number. } HEADING 3 {The Open File Object} @@ -611,36 +611,36 @@ specified locking level or higher. The xUnlock method decreases the locking level to no lower than the level specified. [SQLITE_LOCK_NONE] means that the file is unlocked. [SQLITE_LOCK_SHARED] gives permission to read the file. Multiple database connections can hold [SQLITE_LOCK_SHARED] at the same time. - [SQLITE_LOCK_RESERVED] is like [SQLITE_LOCK_SHARED] in that its is permission + [SQLITE_LOCK_RESERVED] is like [SQLITE_LOCK_SHARED] in that it is permission to read the file. But only a single connection can hold a reserved lock at any point in time. The [SQLITE_LOCK_PENDING] is also permission to read the file. Other connections can continue to read the file as well, but no other connection is allowed to escalate a lock from none to shared. [SQLITE_LOCK_EXCLUSIVE] is permission to write on the file. Only a single connection can hold an exclusive lock and no other connection can hold - any lock (other than "none") while one connection is hold an exclusive + any lock (other than "none") while one connection holds an exclusive lock. The xLock returns [SQLITE_OK] on success, [SQLITE_BUSY] if it is unable to obtain the lock, or [SQLITE_IOERR_RDLOCK] if something else goes wrong. The xUnlock method returns [SQLITE_OK] on success and [SQLITE_IOERR_UNLOCK] for problems. } PARAGRAPH { - The xCheckReservedLock method checks to see if another connection or + The xCheckReservedLock() method checks to see if another connection or another process is currently holding a reserved, pending, or exclusive lock on the file. It returns true or false. } PARAGRAPH { The xFileControl() method is a generic interface that allows custom VFS implementations to directly control an open file using the (new and experimental) [sqlite3_file_control()] interface. The second "op" argument - is an integer opcode. The third + is an integer opcode. The third argument is a generic pointer which is intended to be a pointer to a structure that may contain arguments or space in which to write return values. Potential uses for xFileControl() might be functions to enable blocking locks with timeouts, to change the locking strategy (for example to use dot-file locks), to inquire @@ -657,11 +657,11 @@ storage that can be written without disturbing adjacent storage. On a disk drive the "sector size" has until recently been 512 bytes, though there is a push to increase this value to 4KiB. SQLite needs to know the sector size so that it can write a full sector at a time, and thus avoid corrupting adjacent storage space if a power - lose occurs in the middle of a write. + loss occurs in the middle of a write. } PARAGRAPH { The xDeviceCharacteristics method returns an integer bit vector that defines any special properties that the underlying storage medium might @@ -779,11 +779,11 @@ } PARAGRAPH { The [sqlite3_memory_alarm] routine is used to register a callback on memory allocation events. - This routine registers or clears a callbacks that fires when + This routine registers or clears a callback that fires when the amount of memory allocated exceeds iThreshold. Only a single callback can be registered at a time. Each call to [sqlite3_memory_alarm()] overwrites the previous callback. The callback is disabled by setting xCallback to a NULL pointer. Index: pages/35to36.in ================================================================== --- pages/35to36.in +++ pages/35to36.in @@ -92,11 +92,11 @@ has been modified so that it returns an [error code] and stores its boolean result into an integer pointed to by a parameter. In association with this change, a new extended error code [SQLITE_IOERR_CHECKRESERVEDLOCK] has been added.

  2. -
  3. When SQLite is ported to new operation systems (operating systems +

  4. When SQLite is ported to new operating systems (operating systems other than Unix, Windows, and OS/2 for which ports are provided together with the core) two new functions, [sqlite3_os_init()] and [sqlite3_os_end()], must be provided as part of the port.

  5. @@ -295,13 +295,13 @@
  6. The [sqlite3_initialize()] interface can be called to explicitly initialize the SQLite subsystem. The [sqlite3_initialize()] interface is called automatically when invoking certain interfaces so the use of [sqlite3_initialize()] is not required, but it is recommended.

  7. -
  8. The [sqlite3_shutdown()] interface causes SQLite release any +

  9. The [sqlite3_shutdown()] interface causes SQLite to release any system resources (memory allocations, mutexes, open file handles) - that it might have been allocated by [sqlite3_initialize()].

  10. + that might have been allocated by [sqlite3_initialize()].

  11. The [sqlite3_next_stmt()] interface allows an application to discover all [prepared statements] associated with a [database connection].

  12. Added the [page_count] PRAGMA for returning the size of the underlying Index: pages/appfileformat.in ================================================================== --- pages/appfileformat.in +++ pages/appfileformat.in @@ -56,11 +56,11 @@

    We make a distinction between a "file format" and an "application format". A file format is used to store a single object. So, for example, a GIF or JPEG file stores a single image, and an XHTML file stores text, so those are "file formats" and not "application formats". An EPUB file, in contrast, stores both text and images (as contained XHTML and GIF/JPEG -files) and so it is considered a "application format". This article is +files) and so it is considered an "application format". This article is about "application formats".

    The boundary between a file format and an application format is fuzzy. This article calls JPEG a file format, but for an image editor, JPEG might be considered the application format. Much depends on context. @@ -153,11 +153,11 @@ the entire document.

    But an SQLite database is not limited to a simple key/value structure like a pile-of-files database. An SQLite database can have dozens -or hundreds or thousands of different of tables, with dozens or +or hundreds or thousands of different tables, with dozens or hundreds or thousands of fields per table, each with different datatypes and constraints and particular meanings, all cross-referencing each other, appropriately and automatically indexed for rapid retrieval, and all stored efficiently and compactly in a single disk file. And all of this structure is succinctly documented for humans @@ -228,11 +228,11 @@

    A pile-of-files format can be viewed as a key/value database. A key/value database is better than no database at all. But without transactions or indices or a high-level query language or a proper schema, -it much harder and more error prone to use a key/value database than +it is much harder and more error prone to use a key/value database than a relational database.

  13. Accessible Content. Information held in an SQLite database file is accessible using commonly available open-source command-line tools - tools that @@ -296,11 +296,11 @@

    SQLite also supports continuous update. Instead of collecting changes in memory and then writing them to disk only on a File/Save action, changes can be written back to the disk as they occur. This avoids loss of work on a system crash or power failure. An [automated undo/redo stack], managed using triggers, -can be kept in the on-disk database, meaning that undo/redo can occur +can be kept in the on-disk database, meaning that undo/redo can occur across session boundaries.

  14. Easily Extensible. As an application grows, new features can be added to an SQLite application file format simply by adding new tables to the schema Index: pages/atomiccommit.in ================================================================== --- pages/atomiccommit.in +++ pages/atomiccommit.in @@ -789,11 +789,11 @@ hd_fragment completesectors

    6.1 Always Journal Complete Sectors

    When the original content of a database page is written into the rollback journal (as shown in section 3.5), -SQLite always writes a complete sectors worth of data, even if the +SQLite always writes a complete sector of data, even if the page size of the database is smaller than the sector size. Historically, the sector size in SQLite has been hard coded to 512 bytes and since the minimum page size is also 512 bytes, this has never been an issue. But beginning with SQLite version 3.3.14, it is possible for SQLite to use mass storage devices with a sector size larger than 512 @@ -1109,11 +1109,11 @@

     PRAGMA journal_mode=PERSIST;
     
    -

    The use of persistent journal mode provide a noticeable performance +

    The use of persistent journal mode provides a noticeable performance improvement on many systems. Of course, the drawback is that the journal files remain on the disk, using disk space and cluttering directories, long after the transaction commits. The only safe way to delete a persistent journal file is to commit a transaction with journaling mode set to DELETE:

    @@ -1238,11 +1238,11 @@ hd_fragment fsync

    9.2 Incomplete Disk Flushes

    SQLite uses the fsync() system call on Unix and the FlushFileBuffers() system call on w32 in order to sync the file system buffers onto disk -oxide as shown in step 3.7 and +oxide as shown in step 3.7 and step 3.10. Unfortunately, we have received reports that neither of these interfaces works as advertised on many systems. We hear that FlushFileBuffers() can be completely disabled using registry settings on some Windows versions. Some historical versions of Linux contain versions of fsync() which are no-ops on Index: pages/autoinc.in ================================================================== --- pages/autoinc.in +++ pages/autoinc.in @@ -97,11 +97,11 @@ ^The ROWID chosen for the new row is at least one larger than the largest ROWID that has ever before existed in that same table. ^If the table has never before contained any data, then a ROWID of 1 is used. ^If the table has previously held a row with the largest possible ROWID, then new INSERTs are not allowed and any attempt to insert a new row will fail with an -SQLITE_FULL error. ^(Only ROWID values from previously transactions that +SQLITE_FULL error. ^(Only ROWID values from previous transactions that were committed are considered. ROWID values that were rolled back are ignored and can be reused.)^

    Index: pages/backup.in ================================================================== --- pages/backup.in +++ pages/backup.in @@ -124,16 +124,16 @@ pTo = (isSave ? pFile : pInMemory); /* Set up the backup procedure to copy from the "main" database of ** connection pFile to the main database of connection pInMemory. ** If something goes wrong, pBackup will be set to NULL and an error - ** code and message left in connection pTo. + ** code and message left in connection pTo. ** ** If the backup object is successfully created, call backup_step() ** to copy data from pFile to pInMemory. Then call backup_finish() ** to release resources associated with the pBackup object. If an - ** error occurred, then an error code and message will be left in + ** error occurred, then an error code and message will be left in ** connection pTo. If no error occurred, then the error code belonging ** to pTo is set to SQLITE_OK. */ pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main"); if( pBackup ){ @@ -150,11 +150,11 @@ } }

    - The C function to the right demonstrates of one of the simplest, + The C function to the right demonstrates one of the simplest, and most common, uses of the backup API: loading and saving the contents of an in-memory database to a file on disk. The backup API is used as follows in this example:

      @@ -337,11 +337,11 @@ exception to this rule: If the source database is not an in-memory database, and the write is performed from within the same process as the backup operation and uses the same database handle (pDb), then the destination database (the one opened using connection pFile) is automatically updated along with the source. The backup process may then be continued after the - xSleep() call returns as if nothing had happened. + sqlite3_sleep() call returns as if nothing had happened.

      Whether or not the backup process is restarted as a result of writes to the source database mid-backup, the user can be sure that when the backup operation is completed the backup database contains a consistent and Index: pages/btreemodule.in ================================================================== --- pages/btreemodule.in +++ pages/btreemodule.in @@ -79,11 +79,11 @@ [h2 "Glossary"] [Glossary "Balance-Siblings Algorithm" { - The balance-siblings algorithm is one of four algorithms that may be used + The balance-siblings algorithm is one of four algorithms that may be used to redistribute data within a b-tree structure after an insert or delete operation that causes a b-tree node to become overfull or underfull. See section balance_siblings for details. }] [Glossary "B-Tree Cursor" { Index: pages/changes.in ================================================================== --- pages/changes.in +++ pages/changes.in @@ -13,14 +13,53 @@

      set nChng 0 proc chng {date desc {options {}}} { - global nChng aChng + global nChng aChng xrefChng set aChng($nChng) [list $date $desc $options] + set xrefChng($date) $nChng incr nChng } + +chng {2016-04-18 (3.12.2)} { +
    1. Fix a backwards compatibility problem in version 3.12.0 and 3.12.1: + Columns declared as "INTEGER" PRIMARY KEY (with quotes around + the datatype keyword) where not being recognized as an + [INTEGER PRIMARY KEY], which resulted in an incompatible database file. + Ticket [https://www.sqlite.org/src/info/7d7525cb01b68|7d7525cb01b68] +
    2. Fix a bug (present since [version 3.9.0]) that can cause the [DELETE] + operation to miss rows if [PRAGMA reverse_unordered_selects] is turned on. + Ticket [https://www.sqlite.org/src/info/a306e56ff68b8fa5|a306e56ff68b8fa5] +
    3. Fix a bug in the code generator that can causes incorrect results if + two or more [virtual tables] are joined and the virtual table used in + outer loop of the join has an [IN operator] constraint. +
    4. Correctly interpret negative "PRAGMA cache_size" values when determining + the cache size used for sorting large amounts of data. +

      Hashes: +

    5. SQLITE_SOURCE_ID: "2016-04-18 17:30:31 92dc59fd5ad66f646666042eb04195e3a61a9e8e" +
    6. SHA1 for sqlite3.c: de5a5898ebd3a3477d4652db143746d008b24c83 +} {patchagainst 1 patchagainst 3} + +chng {2016-04-08 (3.12.1)} { +
    7. Fix a boundary condition error introduced by version 3.12.0 + that can result in a crash during heavy [SAVEPOINT] usage. + Ticket [https://www.sqlite.org/src/info/7f7f8026eda38|7f7f8026eda38]. +
    8. Fix [views] so that they inherit column datatypes from the + table that they are defined against, when possible. +
    9. Fix the query planner so that IS and IS NULL operators are able + to drive an index on a LEFT OUTER JOIN. +

      Hashes: +

    10. SQLITE_SOURCE_ID: "2016-04-08 15:09:49 fe7d3b75fe1bde41511b323925af8ae1b910bc4d" +
    11. SHA1 for sqlite3.c: ebb18593350779850e3e1a930eb84a70fca8c1d1 +} {patchagainst 2} + +chng {2016-04-01 (3.9.3)} { +
    12. Backport a simple query planner optimization that allows the IS operator + to drive an index on a LEFT OUTER JOIN. No other changes from the + [version 3.9.2] baseline. +} chng {2016-03-29 (3.12.0)} {

      Potentially Disruptive Change:

    13. The [SQLITE_DEFAULT_PAGE_SIZE] is increased from 1024 to 4096. The [SQLITE_DEFAULT_CACHE_SIZE] is changed from 2000 to -2000 so Index: pages/cli.in ================================================================== --- pages/cli.in +++ pages/cli.in @@ -56,11 +56,11 @@ goodbye|20 sqlite> } -

      You can terminate the sqlite3 program by typing your systems +

      You can terminate the sqlite3 program by typing your system End-Of-File character (usually a Control-D). Use the interrupt character (usually a Control-C) to stop a long-running SQL statement.

      Make sure you type a semicolon at the end of each SQL command! The sqlite3 program looks for a semicolon to know when your SQL command is Index: pages/crew.in ================================================================== --- pages/crew.in +++ pages/crew.in @@ -3,11 +3,11 @@

      The SQLite Development Team

      D. Richard Hipp - began the SQLite project in on 2000-May-29 + began the SQLite project on 2000-05-29 and continues to serve as the project architect. Richard was born, lives, and works in [http://en.wikipedia.org/wiki/Charlotte,_North_Carolina | Charlotte, North Carolina.] He holds degrees from [http://www.gatech.edu/ | Georgia Tech] (MSEE, 1984) and [http://www.duke.edu/ | Duke University] (PhD, 1992) and is Index: pages/dev.in ================================================================== --- pages/dev.in +++ pages/dev.in @@ -1,9 +1,9 @@ SQLite Developer Links

      Developer Resources

      Index: pages/howtocorrupt.in ================================================================== --- pages/howtocorrupt.in +++ pages/howtocorrupt.in @@ -190,15 +190,17 @@ systems that permit a file to be unlinked while it is still open for reading and writing. Windows does not allow this to occur.) Since rollback journals and WAL files are based on the name of the database file, the two different database files will share the same rollback journal or WAL file. A rollback or recovery for one of the databases -might use content from the other database, resulting in corruption.

      - -

      A similar problem occurs if a database file is renamed while it is +might use content from the other database, resulting in corruption. +A similar problem occurs if a database file is renamed while it is opened and a new file is created with the old name.

      +

      In other words, unlinking or renaming an open database file +results in behavior that is undefined and probably undesirable.

      +

      Beginning with SQLite [version 3.7.17], the unix OS interface will send SQLITE_WARNING messages to the [error log] if a database file is unlinked while it is still in use.

      hd_fragment alias {database filename aliasing} @@ -210,15 +212,22 @@ they will use different rollback journals and WAL files. That means that if one process crashes, the other process will be unable to recover the transaction in progress because it will be looking in the wrong place for the appropriate journal.

      +

      In other words, opening and using a database file that has two or +more names results in behavior that is undefined and probably undesirable.

      +

      Beginning with SQLite [version 3.7.17], the unix OS interface will send SQLITE_WARNING messages to the [error log] if a database file has -multiple hard links. As of this writing, SQLite still does not yet detect -or warn about the use of database files through soft links.

      +multiple hard links.

      +

      Beginning with SQLite [version 3.10.0], the unix OS interface will +attempt to resolve symbolic links and open the database file by its +canonical name. Prior to version 3.10.0, opening a database file +through a symbolic link was similar to opening a database file +that had multiple hard links and resulted in undefined behavior.

      3.0 Failure to sync

      In order to guarantee that database files are always consistent, SQLite will occasionally ask the operating system to flush all pending writes to Index: pages/index.in ================================================================== --- pages/index.in +++ pages/index.in @@ -108,11 +108,11 @@

    14. Current Status

      Common Links

      Index: pages/news.in ================================================================== --- pages/news.in +++ pages/news.in @@ -16,10 +16,38 @@ regsub -all {[Tt]icket #(\d+)} $txt \ {\0} txt hd_resolve "
      $txt
      " hd_puts "
      " } + +newsitem {2016-04-18} {Release 3.12.2} { +

      Yikes! The 3.12.0 and 3.12.1 releases contain a backwards compatibility bug! + Tables that declare a column with type "INTEGER" PRIMARY KEY + (where the datatype name INTEGER is quoted) generate an incompatible + database file. The mistake came about because the developers have never + thought to put a typename in quotes before, and so there was no documentation + of that capability nor any tests. (There are tests now, though, of course.) + Instances of quoting the datatype name are probably infrequent in the wild, + so we do not expect the impact of this bug to be too severe. + Upgrading is still strongly recommended. +

      Fixes for three other minor issues were included in this patch release. + The other issues would have normally been deferred until the next scheduled + release, but since a patch release is being issued anyhow, they might as + well be included. +} + +newsitem {2016-04-08} {Release 3.12.1} { +

      SQLite [version 3.12.1] is an emergency patch release to address a + [https://www.sqlite.org/src/info/7f7f8026eda38|crash bug] that snuck + into [version 3.12.0]. Upgrading from version 3.12.0 is highly + recommended. +

      Another minor problem involving datatypes on [view] columns, and + a query planner deficiency are fixed at the same time. These two + issues did not justify a new release on their own, but since a release + is being issued to deal with the crash bug, we included these other + fixes for good measure. +} newsitem {2016-03-29} {Release 3.12.0} {

      SQLite [version 3.12.0] is a regularly scheduled maintenance release. A notable change in this release is an [increase in the default page size] for newly created database files. Index: pages/not-found.in ================================================================== --- pages/not-found.in +++ pages/not-found.in @@ -1,7 +1,7 @@ Page Not Found -

      Page Not found

      +

      Page Not Found

      The document you seek is not available. Please consider one of the links below or use the Search feature on the right-hand side of the menu bar above. Index: pages/onefile.in ================================================================== --- pages/onefile.in +++ pages/onefile.in @@ -15,11 +15,11 @@ architectures.

      The SQLite database file format is also stable. -All releases of of SQLite version 3 can read and write database +All releases of SQLite version 3 can read and write database files created by the very first SQLite 3 release (version 3.0.0) going back to 2004-06-18. This is "backwards compatibility". The developers promise to maintain backwards compatibility of the database file format for all future releases of SQLite 3. "Forwards compatibility" means that older releases Index: pages/partialindex.in ================================================================== --- pages/partialindex.in +++ pages/partialindex.in @@ -36,11 +36,11 @@

      ^The expression following the WHERE clause may contain operators, literal values, and names of columns in the table being indexed. -^The WHERE clause may not contains subqueries, references to other +^The WHERE clause may not contain subqueries, references to other tables, functions, or [bound parameters]. The LIKE, GLOB, MATCH, and REGEXP operators in SQLite are implemented as functions by the same name. ^Since functions are prohibited in the WHERE clause of a CREATE INDEX statement, so too are the LIKE, GLOB, MATCH, and REGEXP operators.

      Index: pages/pgszchng2016.in ================================================================== --- pages/pgszchng2016.in +++ pages/pgszchng2016.in @@ -22,11 +22,11 @@ page size for new database files has been increased to 4096 bytes.

      The upper bound on the database [cache_size|cache size] has -traditionally defaulted to 2000 page. SQLite [version 3.12.0] also +traditionally defaulted to 2000 pages. SQLite [version 3.12.0] also changes this default setting to be "-2000" which means 2000*1024 bytes, regardless of page size. So, the upper bound on the amount of memory used for the page cache is unchanged.

      Index: pages/pragma.in ================================================================== --- pages/pragma.in +++ pages/pragma.in @@ -800,12 +800,13 @@ the default page size was almost always 1024 bytes, but beginning with SQLite [version 3.12.0] in 2016, the default page size increased to 4096.

      ^The page_size pragma will only cause an immediate change in the - page size if it is issued while the database is still empty, prior - to the first CREATE TABLE statement. ^(If the page_size pragma is + page size if it is issued while the database is still empty (prior + to the first CREATE statement) and if the database is not in + [WAL mode]. ^(If the page_size pragma is used to specify a new page size just prior to running the [VACUUM] command and if the database is not in [WAL | WAL journal mode] then [VACUUM] will change the page size to the new value.)^

      Index: pages/quickstart.in ================================================================== --- pages/quickstart.in +++ pages/quickstart.in @@ -18,11 +18,11 @@
    15. At a shell or DOS prompt, enter: "sqlite3 test.db". This will create a new database named "test.db". (You can use a different name if you like.)

    16. Enter SQL commands at the prompt to create and populate the new database.

    17. -
    18. Additional documentation is available [CLI | here]

    19. +
    20. Additional documentation is available [CLI | here].

    21. Write Programs That Use SQLite

        Index: pages/serverless.in ================================================================== --- pages/serverless.in +++ pages/serverless.in @@ -29,11 +29,11 @@ provide better protection from bugs in the client application - stray pointers in a client cannot corrupt memory on the server. And because a server is a single persistent process, it is able to control database access with more precision, -allowing for finer grain locking and better concurrency. +allowing for finer-grained locking and better concurrency.

        Most SQL database engines are client/server based. Of those that are serverless, SQLite is the only one Index: pages/threadsafe.in ================================================================== --- pages/threadsafe.in +++ pages/threadsafe.in @@ -1,11 +1,11 @@ Using SQLite In Multi-Threaded Applications hd_keywords {threading mode}

        SQLite And Multiple Threads

        -

        SQLite support three different threading modes:

        +

        SQLite supports three different threading modes:

        1. Single-thread. In this mode, all mutexes are disabled and SQLite is unsafe to use in more than a single thread at once.