小. 快速. 可靠.
选择任意三个.
编译时选项

1. Overview

对于大多数用途,可以使用默认编译选项很好地构建SQLite. 但是,如果需要,下面介绍的编译时选项可用于省略SQLite功能 (导致较小的编译库大小 )或更改某些参数的默认值 .

已尽一切努力确保编译选项的各种组合能够和谐地工作并产生一个工作库. 但是,强烈建议在使用使用非标准编译选项构建的SQLite库之前,执行SQLite测试套件以检查错误.

2. Recommended Compile-time Options

对于能够使用它们的应用程序,建议使用以下编译时选项,以最大程度地减少CPU周期数和SQLite使用的内存字节. 并非每个应用程序都可以使用所有这些编译时选项. 例如,SQLITE_THREADSAFE = 0选项仅可用于永远不会一次从多个线程访问SQLite的应用程序. 而且SQLITE_OMIT_PROGRESS_CALLBACK选项仅由不使用sqlite3_progress_handler()接口的应用程序使用. 依此类推.

无法测试SQLite编译时选项的所有可能组合. 但是以下一组编译时选项是一种始终经过全面测试的配置.

  1. SQLITE_DQS = 0 . 此设置禁用双引号字符串文字错误功能.

  2. SQLITE_THREADSAFE = 0 . 设置-DSQLITE_THREADSAFE = 0会使SQLite中的所有互斥锁和线程安全逻辑被忽略. 这是一个单独的编译时选项,可使SQLite的运行速度提高约2%,并使库的大小减少约2%. 但是不利的是,使用compile-time选项意味着即使每个线程都有自己的数据库连接,SQLite一次也不能被多个线程使用.

  3. SQLITE_DEFAULT_MEMSTATUS = 0 . 此设置导致跟踪内存使用情况的sqlite3_status()接口被禁用. 这有助于sqlite3_malloc()例程运行得更快,并且由于SQLite在内部使用了sqlite3_malloc() ,因此有助于使整个库更快.

  4. SQLITE_DEFAULT_WAL_SYNCHRONOUS = 1 . 为了在断电后获得最大的数据库安全性,建议设置PRAGMAynchronous = FULL . 但是,在WAL模式下 ,可以通过PRAGMA syncy = NORMAL保证完整的数据库完整性. 在WAL模式下 ,如果PRAGMA sync = NORMAL ,则断电可能会回滚对数据库的最新更改,但不会损坏数据库. 而且,在WAL模式下,使用sync = NORMAL的事务提交要比默认的sync = FULL快得多. 由于这些原因,建议在切换到WAL模式时将同步设置从FULL更改为NORMAL. 此编译时选项将完成此任务.

  5. SQLITE_LIKE_DOESNT_MATCH_BLOBS . 从历史上看,SQLite允许将BLOB操作数用于LIKEGLOB运算符. 但是,将BLOB用作LIKEGLOB的操作数会使LIKE优化变得复杂和缓慢. 设置此选项时,意味着如果两个操作数中的任何一个为BLOB,则LIKE和GLOB运算符始终返回FALSE. 这简化了LIKE优化的实现,并允许使用LIKE优化的查询运行得更快.

  6. SQLITE_MAX_EXPR_DEPTH = 0 . 将最大的表达式分析树深度设置为零会禁用对表达式分析树深度的所有检查,这会简化代码,从而加快执行速度,并有助于解析树使用更少的内存.

  7. SQLITE_OMIT_DECLTYPE . 通过省略(很少需要)从查询结果集中返回声明的列类型的功能,可以使准备好的语句消耗更少的内存.

  8. SQLITE_OMIT_DEPRECATED . 省略不推荐使用的接口和功能将无法帮助SQLite更快地运行. 但是,它将减少磁带库的占用空间. 这是正确的做法.

  9. SQLITE_OMIT_PROGRESS_CALLBACK . 必须在字节码引擎的内部循环中检查进度处理程序回调计数器. 通过省略此接口,从字节码引擎的内部循环中删除了一个条件,从而帮助SQL语句运行得更快.

  10. SQLITE_OMIT_SHARED_CACHE . 省略使用共享缓存的可能性,可以消除代码的性能关键部分中的许多条件. 这可以显着提高性能.

  11. SQLITE_USE_ALLOCA . 在支持alloca()的系统上,利用alloca()动态分配临时堆栈空间以在单个函数中使用. 如果没有此选项,将从堆中分配临时空间.

  12. SQLITE_OMIT_AUTOINIT . 在使用某些接口之前,需要使用对sqlite3_initialize()的调用来初始化SQLite库. 这种初始化通常在第一次需要时自动进行. 但是,使用SQLITE_OMIT_AUTOINIT选项,将省略自动初始化. 这可以帮助许多API调用更快地运行(因为它们不必检查初始化是否已经发生,然后如果以前没有调用过初始化则可以运行初始化),但这也意味着应用程序必须手动调用sqlite3_initialize() . 如果SQLite是与-DSQLITE_OMIT_AUTOINIT并像常规编译sqlite3_malloc()sqlite3_vfs_find()sqlite3_open()没有先调用调用sqlite3_initialize() ,可能的结果将是一个段错误.

使用上述所有建议的编译时选项时,SQLite库将缩小大约3%,并减少大约5%的CPU周期. 因此,这些选项没有太大的区别. 但是在某些设计情况下,一点点帮助.

3. Platform Configuration

_HAVE_SQLITE_CONFIG_H

如果定义了_HAVE_SQLITE_CONFIG_H宏,则SQLite源代码将尝试#include一个名为" config.h"的文件. " type options generated by autoconf scripts. " config.h"文件通常包含其他配置选项,尤其是由autoconf脚本生成的" HAVE_ "类型选项.

HAVE_FDATASYNC

如果HAVE_FDATASYNC编译时选项为true,则Unix系统的默认VFS将在适当的地方尝试使用fdatasync()代替fsync(). 如果此标志丢失或为false,则始终使用fsync().

HAVE_GMTIME_R

如果HAVE_GMTIME_R选项为true,并且SQLITE_OMIT_DATETIME_FUNCS为true,则CURRENT_TIME,CURRENT_DATE和CURRENT_TIMESTAMP关键字将使用线程安全的" gmtime_r()"接口而不是" gmtime()". 在未定义SQLITE_OMIT_DATETIME_FUNCS或为false的通常情况下,则使用内置的日期和时间函数来实现CURRENT_TIME,CURRENT_DATE和CURRENT_TIMESTAMP关键字,并且永远不会调用gmtime_r()和gmtime().

HAVE_ISNAN

如果HAVE_ISNAN选项为true,则SQLite调用系统库isnan()函数来确定双精度浮点值是否为NaN. 如果HAVE_ISNAN未定义或为false,则SQLite将替换其自己的isnan()本地实现.

HAVE_LOCALTIME_R

如果HAVE_LOCALTIME_R选项为true,则SQLite使用线程安全的localtime_r()库例程而不是localtime()来帮助实现内置日期和时间函数localtime修饰符 .

HAVE_LOCALTIME_S

如果HAVE_LOCALTIME_S选项为true,则SQLite使用线程安全的localtime_s()库例程而不是localtime()来帮助实现内置日期和时间函数localtime修饰符 .

HAVE_MALLOC_USABLE_SIZE

如果HAVE_MALLOC_USABLE_SIZE选项为true,则SQLite尝试使用malloc_usable_size()接口来查找从标准库malloc()或realloc()例程获得的内存分配的大小. 仅当使用标准库malloc()时,此选项才适用. 在Apple系统上,使用" zone malloc"代替,因此该选项不适用. 而且,当然,如果应用程序使用SQLITE_CONFIG_MALLOC提供了自己的malloc实现,则此选项无效.

如果HAVE_MALLOC_USABLE_SIZE选项被省略或为false,则SQLite使用系统malloc()和realloc()的包装,将每个分配扩大8个字节,并在初始8个字节中写入分配的大小,然后SQLite也实现其自己的本地版本的malloc_usable_size(),该版本参考该8字节前缀来查找分配大小. 这种方法有效,但不是最优的. 鼓励应用程序尽可能使用HAVE_MALLOC_USABLE_SIZE.

HAVE_STRCHRNUL

如果HAVE_STRCHRNUL选项为true,则SQLite使用strchrnul()库函数. 如果此选项丢失或为false,则SQLite将替换其自身的strchrnul()实现.

HAVE_USLEEP

如果HAVE_USLEEP选项为true,则默认的unix VFS使用usleep()系统调用来实现xSleep方法. 如果此选项未定义或为false,则使用sleep()实现unix上的xSleep,这意味着sqlite3_sleep()的最小等待间隔为1000毫秒,无论其参数如何.

HAVE_UTIME

如果HAVE_UTIME选项为true,则内置但非标准的" unix-dotfile" VFS将使用utime()系统调用而不是utimes()来设置锁定文件的最后访问时间.

SQLITE_BYTEORDER=(0|1234|4321)

SQLite needs to know if the native byte order of the target CPU is big-endian or little-ending. The SQLITE_BYTEORDER preprocessor is set to 4321 for big-endian machines and 1234 for little-endian machines, or it can be 0 to mean that the byte order must be determined at run-time. There are #ifdefs in the code that set SQLITE_BYTEORDER automatically for all common platforms and compilers. However, it may be advantageous to set SQLITE_BYTEORDER appropriately when compiling SQLite for obscure targets. If the target byte order cannot be determined at compile-time, then SQLite falls back to doing run-time checks, which always work, though with a small performance penalty.

4. Options To Set Default Parameter Values

SQLITE_DEFAULT_AUTOMATIC_INDEX=<0或1>

该宏为新打开的数据库连接确定PRAGMA automatic_index的初始设置. 对于3.7.17之前的所有SQLite版本,如果省略了编译时选项,通常都会为新的数据库连接启用自动索引. 但是,这可能会在将来的SQLite版本中发生变化.

另请参阅: SQLITE_OMIT_AUTOMATIC_INDEX

SQLITE_DEFAULT_AUTOVACUUM=<0或1或2>

此宏确定SQLite是否创建默认情况下将auto_vacuum标志设置为OFF(0),FULL(1)或INCREMENTAL(2)的数据库. 默认值为0,表示在关闭自动真空的情况下创建数据库. 在任何情况下, PRAGMA auto_vacuum命令都可以覆盖编译时默认值.

SQLITE_DEFAULT_CACHE_SIZE=<N>

该宏为每个连接的数据库设置页面高速缓存的默认最大大小. 正值表示限制为N页. 如果N为负,则意味着将缓存大小限制为-N * 1024字节. 建议的最大高速缓存大小可以被PRAGMA cache_size命令覆盖. 缺省值为-2000,这意味着每个高速缓存最大可转换2048000字节.

SQLITE_DEFAULT_FILE_FORMAT=<1或4>

此宏设置SQLite创建新数据库文件时使用的默认架构格式编号 . 模式格式都非常相似. 格式1和格式4之间的区别在于格式4可以理解降序索引,并且对布尔值的编码更严格.

从3.3.0(2006-01-10)开始的所有SQLite版本都可以读取和写入1到4之间的任何模式格式.但是旧版本的SQLite可能无法读取大于1的格式.因此,旧版本的SQLite将可以读取和写入大于1的格式.为了能够读取和写入由较新版本的SQLite创建的数据库文件,对于通过3.7.9(2011-11-01)发布的SQLite版本,默认架构格式设置为1. 从版本3.7.10 (2012-01-16)开始,默认架构格式为4.

可以在运行时使用PRAGMA legacy_file_format命令设置新数据库的模式格式编号.

SQLITE_DEFAULT_FILE_PERMISSIONS=N

UNIX下新创建的数据库文件的默认数字文件权限. 如果未指定,则默认值为0644,这意味着文件是全局可读的,但只能由创建者写入.

SQLITE_DEFAULT_FOREIGN_KEYS=<0或1>

此宏确定默认情况下对新数据库连接是启用还是禁用外键约束的实施. 每个数据库连接始终可以使用foreign_keys pragma打开和关闭外键约束的强制执行,并在运行时打开. 通常,默认情况下,外键约束的实施是关闭的,但如果将此编译时参数设置为1,则默认情况下,外键约束的实施将是启用的.

SQLITE_DEFAULT_MMAP_SIZE=N

此宏为每个打开的数据库文件的内存映射I / O使用的内存量设置默认限制. is zero, then memory mapped I/O is disabled by default. 如果为零,则默认情况下禁用内存映射的I / O. 可以在开始时使用sqlite3_configSQLITE_CONFIG_MMAP_SIZE )调用,或者在运行时使用mmap_size pragma修改此编译时限制和SQLITE_MAX_MMAP_SIZE .

SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=<bytes>

此选项设置持久日志模式独占锁定模式下 回滚日志文件的大小限制,以及WAL模式下设置预写日志文件的大小限制. 省略此编译时选项时,回滚日志或预写日志的大小没有上限. 日志文件大小限制可以在运行时使用journal_size_limit pragma进行更改.

SQLITE_DEFAULT_LOCKING_MODE=<1或0>

如果设置为1,则默认的locking_mode设置为EXCLUSIVE. 如果省略或设置为0,则默认的locking_mode为NORMAL.

SQLITE_DEFAULT_LOOKASIDE=SZ,N

后备内存分配器内存池的默认大小设置为每个SZ字节N个条目. 可以在启动时使用sqlite3_configSQLITE_CONFIG_LOOKASIDE )和/或在使用sqlite3_db_config (db, SQLITE_DBCONFIG_LOOKASIDE )打开每个数据库连接时修改此设置.

SQLITE_DEFAULT_MEMSTATUS=<1或0>

此宏用于确定默认情况下使用sqlite3_config()的SQLITE_CONFIG_MEMSTATUS参数启用和禁用的功能是否可用. 默认值为1(启用了SQLITE_CONFIG_MEMSTATUS相关功能).

当禁用内存使用情况跟踪时, sqlite3_memory_used()sqlite3_memory_highwater()接口, sqlite3_status64SQLITE_STATUS_MEMORY_USED )接口和SQLITE_MAX_MEMORY编译时选项均不起作用.

SQLITE_DEFAULT_PCACHE_INITSZ=N

当不使用SQLITE_CONFIG_PAGECACHE配置选项并从sqlite3_malloc()获取页面缓存的内存时,此宏确定页面缓存模块最初分配的页面数. 该宏设置的页面数在单个分配中分配,这减少了内存分配器上的负载.

SQLITE_DEFAULT_PAGE_SIZE=<bytes>

此宏用于设置创建数据库时使用的默认页面大小. 分配的值必须是2的幂.默认值为4096.在运行时, PRAGMA page_size命令可以覆盖编译时的默认值.

SQLITE_DEFAULT_SYNCHRONOUS=<0-3>

此宏确定PRAGMA同步设置的默认值. 如果在编译时未覆盖,则默认设置为2(FULL).

SQLITE_DEFAULT_WAL_SYNCHRONOUS=<0-3>

该宏为在WAL模式下打开的数据库文件确定PRAGMA同步设置的默认值. 如果在编译时未覆盖,则此值与SQLITE_DEFAULT_SYNCHRONOUS相同.

如果SQLITE_DEFAULT_WAL_SYNCHRONOUS与SQLITE_DEFAULT_SYNCHRONOUS不同,并且如果应用程序未使用PRAGMA同步语句修改数据库文件的同步设置,则当数据库连接首次切换到WAL模式时,同步设置将更改为SQLITE_DEFAULT_WAL_SYNCHRONOUS定义的值. 如果在编译时未覆盖SQLITE_DEFAULT_WAL_SYNCHRONOUS值,则该值将始终与SQLITE_DEFAULT_SYNCHRONOUS相同,因此不会发生自动同步设置更改.

SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=<pages>

此宏设置WAL 自动检查点功能的默认页数. 如果未指定,则默认页数为1000.

SQLITE_DEFAULT_WORKER_THREADS=N

此宏设置SQLITE_LIMIT_WORKER_THREADS参数的默认值. SQLITE_LIMIT_WORKER_THREADS参数设置单个准备好的语句将启动以辅助查询的辅助线程的最大数量. 如果未指定,则默认最大值为0.此处设置的值不能超过SQLITE_MAX_WORKER_THREADS .

SQLITE_DQS=N

This macro determines the default values for SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML, which in turn how SQLite handles each double-quoted string literal. The "DQS" name stands for "Double-Quoted String". The N argument should be an integer 0, 1, 2, or 3.

SQLITE_DQS允许使用双引号字符串 Remarks
在DDL中在DML中
3yesyesdefault
2yesno 
1noyes 
0nonorecommended

推荐的设置为0,这意味着在所有上下文中都不允许使用双引号字符串. 但是,默认设置为3,以最大程度地与旧版应用程序兼容.

SQLITE_EXTRA_DURABLE

SQLITE_EXTRA_DURABLE编译时选项用于使默认PRAGMA同步设置为EXTRA,而不是FULL. 不再支持此选项. 请改用SQLITE_DEFAULT_SYNCHRONOUS = 3 .

SQLITE_FTS3_MAX_EXPR_DEPTH=N

此宏设置FTS3FTS4全文索引中与MATCH运算符右侧相对应的搜索树的最大深度. 全文搜索使用递归算法,因此限制了树的深度,以防止使用过多的堆栈空间. 默认限制为12.此限制足以匹配MATCH运算符右侧的4095个搜索词,并且将堆栈空间使用量控制在2000个字节以内.

对于普通的FTS3 / FTS4查询,搜索树深度大约是MATCH运算符右侧的项数的以2为底的对数. 但是,对于短语查询NEAR查询 ,搜索树的深度在右侧术语的数量上是线性的. 因此,默认深度限制12足以匹配MATCH上的4095个普通术语,仅足以满足11或12个短语或NEAR术语. 即使这样,对于大多数应用程序而言,默认值也绰绰有余.

SQLITE_LIKE_DOESNT_MATCH_BLOBS

如果任一操作数是BLOB,则此编译时选项会使LIKE运算符始终返回False. LIKE的默认行为是在完成比较之前将BLOB操作数强制转换为TEXT.

此编译时选项使SQLite在处理使用LIKE运算符的查询时可以更有效地运行,但以破坏向后兼容性为代价. 但是,向后兼容性中断可能只是技术问题. LIKE处理逻辑中存在一个长期存在的错误(请参阅https://www.sqlite.org/src/info/05f43be8fdda9f ),导致它对BLOB操作数的行为不佳,并且在将近10年的活跃使用中没有人发现该错误. . 因此,对于更多用户而言,启用此编译时选项可能很安全,从而可以在LIKE查询上节省一点CPU时间.

此编译时选项仅影响SQL LIKE运算符,对sqlite3_strlike() C语言接口没有影响.

SQLITE_MAX_MEMORY=N

bytes. 此选项将SQLite从malloc()请求的总内存量限制为个字节. bytes will result in an out-of-memory error. SQLite尝试分配新内存的任何尝试都会导致SQLite持有的所有分配的总和超过个字节,这将导致内存不足错误. 这是一个硬上限. 另请参见sqlite3_soft_heap_limit()接口.

仅当通过sqlite3_memory_used()sqlite3_status64SQLITE_STATUS_MEMORY_USED )接口提供内存使用情况统计信息时,此限制才起作用. 没有该内存使用信息,SQLite无法知道何时将要超过限制,因此无法防止过多的内存分配. 内存使用情况跟踪默认情况下处于打开状态,但可以在编译时使用SQLITE_DEFAULT_MEMSTATUS选项禁用,也可以在启动时使用sqlite3_configSQLITE_CONFIG_MEMSTATUS )禁用.

SQLITE_MAX_MMAP_SIZE=N

此宏为任何单个数据库可用于内存映射I / O的地址空间量设置了硬上限. 将此值设置为0将完全禁用内存映射的I / O,并使与内存映射的I / O相关的逻辑从构建中省略. 此选项确实会更改默认的内存映射I / O地址空间大小(由SQLITE_DEFAULT_MMAP_SIZE或sqlite3_config( SQLITE_CONFIG_MMAP_SIZE设置 )或运行时内存映射的I / O地址空间大小(由sqlite3_file_control( SQLITE_FCNTL_MMAP_SIZE设置)或PRAGMA mm只要其他设置小于此处定义的最大值.

SQLITE_MAX_SCHEMA_RETRY=N

每当数据库架构更改时,都会自动重新准备准备好的语句以适应新的架构. 这里有一个竞争条件,如果一个线程不断更改架构,则另一个线程可能会旋转准备好的语句的重新解析和重新编写,而永远不会完成任何实际工作. 此参数通过强制旋转线程在经过固定次数的尝试重新编译已准备好的语句后放弃来防止无限循环. 默认设置是50,对于大多数应用程序来说已经足够了.

SQLITE_MAX_WORKER_THREADS=N

sqlite3_limit (db, SQLITE_LIMIT_WORKER_THREADS ,N)设置上设置一个上限,该上限确定单个准备好的语句将用于协助CPU密集型计算(主要是排序)的最大辅助线程数. 另请参见SQLITE_DEFAULT_WORKER_THREADS选项.

SQLITE_MEMDB_DEFAULT_MAXSIZE=N

设置使用sqlite3_deserialize()创建的内存数据库的默认大小限制(以字节为单位 . 这只是默认设置. 可以在开始时使用sqlite3_configSQLITE_CONFIG_MEMDB_MAXSIZE ,N)更改限制,也可以在运行时使用SQLITE_FCNTL_SIZE_LIMIT 文件控件为单个数据库更改限制 . 如果未指定默认值,则使用1073741824.

SQLITE_MINIMUM_FILE_DESCRIPTOR=N

. Unix VFS永远不会使用小于文件描述符. is 3. 的默认值为3.

避免使用低编号的文件描述符可以防止数据库意外损坏. 例如,如果使用文件描述符2打开数据库文件,然后assert()失败并调用write(2,...),则可能会通过使用断言错误消息覆盖部分数据库文件而导致数据库损坏. 仅使用值更高的文件描述符可避免此潜在问题. 通过将此编译时选项设置为0,可以禁用对使用低编号文件描述符的保护.

SQLITE_POWERSAFE_OVERWRITE=<0或1>

此选项更改有关unix和Windows VFS的基础文件系统电源安全覆盖的默认假设. 将SQLITE_POWERSAFE_OVERWRITE设置为1会导致SQLite假定应用程序级写操作无法更改超出所写字节范围的字节,即使该写操作恰好在断电之前发生. 在将SQLITE_POWERSAFE_OVERWRITE设置为0的情况下,SQLite假定同一扇区中具有写入字节的其他字节可能因断电而发生更改或损坏.

SQLITE_PRINTF_PRECISION_LIMIT=N

此选项限制了printf()SQL函数和其他C语言字符串格式函数(例如sqlite3_mprintf()sqlite3_str_appendf())的最大宽度和替换精度. 这样可以通过调用诸如" printf('%* s',2147483647,'hi') "的格式来防止恶意或运行不正常的脚本使用过多的内存. of around 1000 is normally sufficient. 的值通常约为1000.

SQL函数printf()sqlite3_limit()SQLITE_LIMIT_LENGTH限制. 因此,任何宽度或精度大于SQLITE_LIMIT_LENGTH的printf()结果都将导致SQLITE_TOOBIG错误. 但是,printf()函数的低级格式化是由无法访问SQLITE_LIMIT_LENGTH的子例程完成的. 因此,将低级格式化设置为可能远远大于SQLITE_LIMIT_LENGTH的内存分配,并且仅在所有格式化完成后才执行SQLITE_LIMIT_LENGTH检查. 因此,可能存在一个超出SQLITE_LIMIT_LENGTH的瞬态缓冲区. SQLITE_PRINTF_PRECISION_LIMIT选项是一项附加检查,可防止在SQLITE_LIMIT_LENGTH检查之前在低级格式化子例程中使用的临时缓冲区的大小过大.

如果宽度或精度超过SQLITE_PRINTF_PRECISION_LIMIT,则不会引发任何错误. 而是,较大的宽度或精度被静默截断.

SQLITE_PRINTF_PRECISION_LIMIT的默认值为2147483647(0x7fffffff).

SQLITE_QUERY_PLANNER_LIMIT=N

As part of the query planning process, SQLite enumerates all usable combinations of indexes and WHERE-clause constraints. For certain pathological queries, the number of these index-and-constraint combinations can be very large, resulting in slow performance by the query planner. The SQLITE_QUERY_PLANNER_LIMIT value (in conjunction with the related SQLITE_QUERY_PLANNER_LIMIT_INCR setting) limits the number of index-and-constraint combinations that the query planner will consider, in order to prevent the query planner from using excess CPU time. The default value for SQLITE_QUERY_PLANNER_LIMIT is set high enough so that is never reached for real-world queries. The query planner search limit only applies to queries that are deliberately crafted to use excess planning time.

SQLITE_QUERY_PLANNER_LIMIT_INCR=N

SQLITE_QUERY_PLANNER_LIMIT选项为查询计划者考虑的最大索引和约束组合数设置初始基线值. 在处理连接的每个表之前,通过增加SQLITE_QUERY_PLANNER_LIMIT_INCR来提高基线查询计划程序的限制,从而即使在连接的先前表已用尽所有资源的情况下,也保证每个表都能够向优化器建议至少一些索引和约束组合.基线极限. 此编译时选项和SQLITE_QUERY_PLANNER_LIMIT选项的默认值都设置得足够高,因此对于现实世界中的查询永远不要达到它们的默认值.

SQLITE_REVERSE_UNORDERED_SELECTS

此选项使PRAGMA reverse_unordered_selects设置在默认情况下启用. 启用后,缺少ORDER BY子句的SELECT语句将以相反的顺序运行.

此选项对于检测应用程序(错误地)假设不带ORDER BY子句的SELECT中的行顺序始终相同是有用的.

SQLITE_SORTER_PMASZ=N

如果通过PRAGMA线程设置启用了多线程处理,则当要排序的内容量超过SQLITE_CONFIG_PMASZ启动时间选项确定的cache_size和PMA Size的最小值时,排序操作将尝试启动帮助程序线程. 此编译时选项设置SQLITE_CONFIG_PMASZ启动时选项的默认值. 默认值为250.

SQLITE_STMTJRNL_SPILL=N

SQLITE_STMTJRNL_SPILL编译时选项确定SQLITE_CONFIG_STMTJRNL_SPILL开始时间设置的默认设置. 该设置确定了大小阈值,超过该阈值后, 语句日志将从内存移动到磁盘.

SQLITE_WIN32_MALLOC

使用此选项可以使用Windows Heap API函数进行内存分配,而不是使用标准库malloc()和free()例程.

YYSTACKDEPTH=<max_depth>

此宏设置SQLite中SQL解析器使用的LALR(1)堆栈的最大深度. 默认值为100.典型的应用程序将使用少于大约20个级别的堆栈. 其应用程序包含需要超过100个LALR(1)堆栈条目的SQL语句的开发人员应认真考虑对其SQL进行重构,因为它很可能超出任何人的理解能力.

5. Options To Set Size Limits

有一些编译时选项可以设置SQLite中各种结构的大小的上限. 编译时选项通常设置一个硬上限,可以在运行时使用sqlite3_limit()接口在单个数据库连接上更改该硬上限.

设置上限的编译时选项单独记录 . 以下是可用设置的列表:

6. Options To Control Operating Characteristics

SQLITE_4_BYTE_ALIGNED_MALLOC

在大多数系统上,malloc()系统调用返回与8字节边界对齐的缓冲区. 但是在某些系统上(例如Windows),malloc()返回4字节对齐的指针. 此编译时选项必须在从malloc()返回4字节对齐指针的系统上使用.

SQLITE_CASE_SENSITIVE_LIKE

如果存在此选项,则内置的LIKE运算符将区分大小写. 使用case_sensitive_like pragma可以在运行时实现相同的效果.

SQLITE_DIRECT_OVERFLOW_READ

如果存在此选项,则在读取事务期间,将绕过页面缓存直接从磁盘直接读取数据库文件溢出页面中包含的内容. 在对大型BLOB进行大量读取的应用程序中,此选项可能会提高读取性能.

SQLITE_HAVE_ISNAN

如果存在此选项,则SQLite将使用系统数学库中的isnan()函数. 这是HAVE_ISNAN配置选项的别名.

SQLITE_OS_OTHER=<0 or 1>

该选项使SQLite省略其针对Unix,Windows和OS / 2的内置操作系统接口. 生成的库将没有默认的操作系统接口 . 在使用SQLite之前,应用程序必须使用sqlite3_vfs_register()注册适当的接口. 应用程序还必须提供sqlite3_os_init()sqlite3_os_end()接口的实现. 通常的做法是让提供的sqlite3_os_init()调用sqlite3_vfs_register() . SQLite初始化时将自动调用sqlite3_os_init() .

当为具有自定义操作系统的嵌入式平台构建SQLite时,通常使用此选项.

SQLITE_SECURE_DELETE

此编译时选项更改secure_delete pragma的默认设置. 不使用此选项时,secure_delete默认为关闭. 存在此选项时,secure_delete默认为打开.

The secure_delete setting causes deleted content to be overwritten with zeros. There is a small performance penalty since additional I/O must occur. On the other hand, secure_delete can prevent fragments of sensitive information from lingering in unused parts of the database file after it has been deleted. See the documentation on the secure_delete pragma for additional information.

SQLITE_THREADSAFE=<0或1或2>

此选项控制代码是否包含在SQLite中以使其能够在多线程环境中安全运行. 默认值为SQLITE_THREADSAFE = 1,可以在多线程环境中安全使用. 当使用SQLITE_THREADSAFE = 0进行编译时,将忽略所有的静音代码,并且在多线程程序中使用SQLite是不安全的. 当使用SQLITE_THREADSAFE = 2进行编译时,只要没有两个线程尝试同时使用同一数据库连接 (或从该数据库连接派生的任何准备好的语句 ),就可以在多线程程序中使用SQLite.

To put it another way, SQLITE_THREADSAFE=1 sets the default threading mode to Serialized. SQLITE_THREADSAFE=2 sets the default threading mode to Multi-threaded. And SQLITE_THREADSAFE=0 sets the threading mode to Single-threaded.

可以在运行时使用sqlite3_threadsafe()接口确定SQLITE_THREADSAFE的值.

当使用SQLITE_THREADSAFE = 1或SQLITE_THREADSAFE = 2编译SQLite时,可以在运行时使用sqlite3_config()接口以及以下动词之一来更改线程模式

sqlite3_open_v2()SQLITE_OPEN_NOMUTEXSQLITE_OPEN_FULLMUTEX标志还可用于在运行时调整各个数据库连接线程模式 .

请注意,当使用SQLITE_THREADSAFE = 0编译SQLite时,构建过程中将省略使SQLite线程安全的代码. 发生这种情况时,不可能在启动时或运行时更改线程模式 .

See the threading mode documentation for additional information on aspects of using SQLite in a multithreaded environment.

SQLITE_TEMP_STORE=<0至3>

此选项控制临时文件是存储在磁盘还是内存中. 此编译时选项的各种设置的含义如下:

SQLITE_TEMP_STOREMeaning
0Always use temporary files
1默认情况下使用文件,但允许PRAGMA temp_store命令覆盖
2Use memory by default but allow the PRAGMA temp_store command to override
3始终使用内存

默认设置为1.其他信息可以在tempfiles.html中找到.

SQLITE_TRACE_SIZE_LIMIT=N

如果将此宏定义为正整数 ,则在sqlite3_trace()输出中扩展为参数的字符串和BLOB的长度限制为个字节.

SQLITE_TRUSTED_SCHEMA=<0或1>

此宏确定SQLITE_DBCONFIG_TRUSTED_SCHEMAPRAGMA Trusted_schema设置的默认值. 如果未指定其他选择,则为实现旧版兼容性,trusted-schema设置默认为ON(值1). 但是,为了获得最佳安全性,实现应用程序定义的SQL函数和/或虚拟表的系统应考虑将默认值更改为OFF.

SQLITE_USE_URI

此选项使URI文件名处理逻辑默认情况下处于启用状态.

7. Options To Enable Features Normally Turned Off

SQLITE_ALLOW_URI_AUTHORITY

如果权限部分不为空或" localhost",则URI文件名通常会引发错误. 但是,如果使用SQLITE_ALLOW_URI_AUTHORITY编译时选项编译SQLite,则URI将转换为统一命名约定(UNC)文件名,并以这种方式传递给底层操作系统.

默认情况下,某些将来版本的SQLite可能会更改为启用此功能.

SQLITE_ALLOW_COVERING_INDEX_SCAN=<0或1>

此C预处理宏确定SQLITE_CONFIG_COVERING_INDEX_SCAN配置设置的默认设置. 默认值为1(开),这意味着覆盖索引将在可能的情况下用于全表扫描,以减少I / O并提高性能. 但是,将覆盖索引用于完整扫描将导致结果显示的顺序与旧版的顺序不同,这可能会导致某些(错误编码)的旧版应用程序崩溃. 因此,覆盖索引扫描选项可以在系统上的编译时禁用,以最大程度地降低其在遗留应用程序中暴露错误的风险.

SQLITE_ENABLE_8_3_NAMES=<1或2>

如果定义了此C预处理器宏,则将包括额外的代码,这些代码使SQLite可以在仅支持8 + 3文件名的文件系统上运行. 如果此宏的值为1,则默认行为是继续使用长文件名,并且如果使用带有" 8_3_names = 1 "查询参数的URI文件名打开数据库连接,则默认行为是仅使用8 + 3文件名. 如果此宏的值为2,则默认使用8 + 3文件名,但在使用8_3_names = 0查询参数时可能会被禁用.

SQLITE_ENABLE_API_ARMOR

定义后,此C预处理程序宏会激活额外的代码,这些代码尝试检测对SQLite API的滥用,例如,将NULL指针传递给必需的参数或在销毁它们之后使用对象.

SQLITE_ENABLE_ATOMIC_WRITE

如果定义了此C预处理器宏,并且数据库文件的sqlite3_io_methods对象的xDeviceCharacteristics方法报告(通过SQLITE_IOCAP_ATOMIC位之一)报告该文件系统支持原子写入,并且如果事务仅涉及更改数据库的单个页面,文件,则仅提交数据库单个页面的单个写入请求,就不会提交或写入回滚日志. 在支持原子写入的文件系统上,此优化可以显着提高小型更新的速度. 但是,很少有文件系统支持此功能,并且检查该功能的代码路径会降低缺少原子写功能的系统上的写性能,因此默认情况下禁用此功能.

SQLITE_ENABLE_BATCH_ATOMIC_WRITE

该编译时选项使SQLite可以利用基础文件系统中的批处理原子写功能. 从SQLite版本3.21.0(2017-10-24)开始,仅在F2FS上支持此功能 . 但是,该接口是通过使用带SQLITE_FCNTL_BEGIN_ATOMIC_WRITESQLITE_FCNTL_COMMIT_ATOMIC_WRITE的 sqlite3_file_control()来通用实现的,因此将来可以将该功能添加到其他文件系统中. 启用此选项后,SQLite会自动检测基础文件系统是否支持批处理原子写,并且这样做时,它避免为事务控制编写回滚日志 . 这样可以使事务处理速度提高两倍,同时减少SSD存储设备的磨损.

未来版本的SQLite可能默认情况下启用批处理原子写入功能,此时,此编译时选项将变得多余.

SQLITE_ENABLE_BYTECODE_VTAB

此选项启用字节码和table_used虚拟表 .

SQLITE_ENABLE_COLUMN_METADATA

定义此C预处理器宏后,SQLite包括一些其他API,这些API提供了对表和查询的元数据的便捷访问. 此选项启用的API是:

SQLITE_ENABLE_DBPAGE_VTAB

此选项启用SQLITE_DBPAGE虚拟表 .

SQLITE_ENABLE_DBSTAT_VTAB

此选项启用dbstat虚拟表 .

SQLITE_ENABLE_DESERIALIZE

此选项启用sqlite3_serialize()sqlite3_deserialize()接口.

SQLite的未来版本可能默认情况下启用这些接口,而是提供一个SQLITE_OMIT_DESERIALIZE选项以将其排除在外.

SQLITE_ENABLE_EXPLAIN_COMMENTS

This option adds extra logic to SQLite that inserts comment text into the output of EXPLAIN. These extra comments use extra memory, thus making prepared statements larger and very slightly slower, and so they are turned off by default and in most application. But some applications, such as the command-line shell for SQLite, value clarity of EXPLAIN output over raw performance and so this compile-time option is available to them. The SQLITE_ENABLE_EXPLAIN_COMMENTS compile-time option is also enabled automatically if SQLITE_DEBUG is enabled.

SQLITE_ENABLE_FTS3

合并中定义了此选项后,全文搜索引擎的版本3将自动添加到构建中.

SQLITE_ENABLE_FTS3_PARENTHESIS

此选项修改FTS3中的查询模式解析器,以使其支持运算符AND和NOT(除了通常的OR和NEAR之外),并且还允许查询表达式包含嵌套的括号.

SQLITE_ENABLE_FTS3_TOKENIZER

此选项启用fts3_tokenizer()接口的两个参数版本. 假设fts3_tokenizer()的第二个参数是指向实现应用程序定义的令牌生成器的函数(编码为BLOB)的指针. 如果敌对行动者能够使用任意第二个参数运行fts3_tokenizer()的两个参数版本,则他们可以使用崩溃或控制进程.

出于安全考虑,除非使用此编译时选项,否则从版本3.11.0 (2016-02-15)开始禁用具有两个参数的fts3_tokenizer()功能. 版本3.12.0 (2016-03-29)添加了sqlite3_db_config (db, SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER ,1,0)接口,该接口在运行时为特定数据库连接激活fts3_tokenizer()的两个参数版本.

SQLITE_ENABLE_FTS4

合并中定义此选项后,全文搜索引擎的版本3和4将自动添加到版本中.

SQLITE_ENABLE_FTS5

合并中定义此选项后,全文搜索引擎( fts5 )的版本5将自动添加到构建中.

SQLITE_ENABLE_GEOPOLY

当在amalgamation中定义此选项时,构建中将包括Geopoly扩展 .

SQLITE_ENABLE_ICU

此选项导致将Unicode国际组件或SQLite的" ICU"扩展添加到构建中.

SQLITE_ENABLE_IOTRACE

当同时使用此选项编译SQLite核心和命令行界面 (CLI)时,CLI将提供一个名为" .iotrace"的附加命令,该命令可提供I / O活动的低级日志. 此选项是试验性的,在将来的版本中可能会停止使用.

SQLITE_ENABLE_JSON1

当在amalgamation中定义此选项时, JSON SQL函数将自动添加到构建中.

SQLITE_ENABLE_LOCKING_STYLE

此选项在Mac OS X的OS接口层中启用附加逻辑.附加逻辑尝试确定基础文件系统的类型,并选择适合该文件系统类型的替代锁定策略. 提供了五种锁定策略:

此外,还提供了五个额外的VFS实施以及默认实施. 通过在调用sqlite3_open_v2()时指定其他VFS实现之一,应用程序可以绕过文件系统检测逻辑,并显式选择以上锁定样式之一. 这五个额外的VFS实现称为" unix-posix"," unix-afp"," unix-flock"," unix-dotfile"和" unix-none".

SQLITE_ENABLE_MEMORY_MANAGEMENT

此选项向SQLite添加了额外的逻辑,使其可以根据请求释放未使用的内存. 为了启用sqlite3_release_memory()接口,必须启用此选项. 如果不使用此编译时选项,则sqlite3_release_memory()接口为无操作.

SQLITE_ENABLE_MEMSYS3

此选项包括SQLite中实现替代内存分配器的代码. 仅当使用sqlite3_config()SQLITE_CONFIG_HEAP选项提供大量内存以从中获取所有内存分配时,才使用此备用内存分配器. MEMSYS3内存分配器使用在dlmalloc()之后模式化的混合分配算法. 一次只能启用SQLITE_ENABLE_MEMSYS3和SQLITE_ENABLE_MEMSYS5之一.

SQLITE_ENABLE_MEMSYS5

此选项包括SQLite中实现替代内存分配器的代码. 仅当使用sqlite3_config()SQLITE_CONFIG_HEAP选项提供大量内存以从中获取所有内存分配时,才使用此备用内存分配器. MEMSYS5模块将所有分配向上舍入为2的下一个幂,并使用"最适合"的伙伴分配器算法,该算法为某些操作约束下的碎片和崩溃提供了有力的保证.

SQLITE_ENABLE_NULL_TRIM

使用此选项可以实现优化,该优化在行尾省略了NULL列,从而节省了磁盘空间.

启用了此选项的数据库不能被SQLite 3.1.6(2005-03-17)及更早版本读取. 另外,启用此选项的情况下生成的数据库很容易在sqlite3_blob_reopen()接口中触发e6e962d6b0f06f46错误. 由于这些原因,默认情况下禁用此优化. 但是,在将来的SQLite版本中可能默认启用此优化.

SQLITE_ENABLE_OFFSET_SQL_FUNC

此选项启用对sqlite_offset(X) SQL函数的支持.

sqlite_offset(X) SQL函数需要B树存储引擎上的新接口,运行SQL语句的虚拟机中的新操作码以及代码生成器关键路径中的新条件. 为了避免不需要sqlite_offset(X)实用程序的应用程序产生开销,默认情况下禁用此功能.

SQLITE_ENABLE_PREUPDATE_HOOK

此选项启用几个新的API ,这些API在对rowid表进行任何更改之前提供回调. 回调可用于记录更改发生之前的行状态.

The action of the preupdate hook is similar to the update hook except that the callback is invoked before the change, not afterwards, and the preupdate hook interfaces are omitted unless this compile-time option is used.

最初添加了preupdate挂钩接口以支持会话扩展.

SQLITE_ENABLE_QPSG

此选项使查询计划程序稳定性保证 (QPSG)在默认情况下处于启用状态. 通常,QPSG是关闭的,必须在运行时使用sqlite3_db_config()接口的SQLITE_DBCONFIG_ENABLE_QPSG选项激活.

SQLITE_ENABLE_RBU

启用实现RBU扩展的代码.

SQLITE_ENABLE_RTREE

此选项使SQLite包括对R * Tree索引扩展的支持 .

SQLITE_ENABLE_SESSION

此选项启用会话扩展 .

SQLITE_ENABLE_SNAPSHOT

此选项使代码支持sqlite3_snapshot对象及其相关接口:

SQLITE_ENABLE_SORTER_REFERENCES

此选项激活了一种优化,该优化减少了排序器所需的内存,但会在排序发生后进行额外的B树查找.

默认的排序过程是收集最终将输出到"记录"中的所有信息,并将完整的记录传递给分类器. 但是在某些情况下,例如,如果某些输出列由较大的BLOB值组成,则每个记录的大小可能会很大,这意味着排序器必须使用更多的内存,和/或将更多的内容写入临时存储.

启用S​​QLITE_ENABLE_SORTER_REFERENCES时,传递给排序器的记录通常仅包含ROWID值. 这样的记录要小得多. 这意味着分拣机需要处理的"有效负载"少得多,并且运行速度更快. 发生排序后,将使用ROWID在原始表中查找输出列的值. 这需要对表进行另一次搜索,并有可能导致速度降低. 或者,这可能是性能上的胜利,具体取决于值的大小.

即使启用了SQLITE_ENABLE_SORTER_REFERENCES编译时选项,默认情况下仍禁用分类器引用. 要使用分类器引用,应用程序必须在启动时使用sqlite3_configSQLITE_CONFIG_SORTERREF_SIZE )接口设置分类器引用大小阈值.

Because the SQLite developers do not know whether the SQLITE_ENABLE_SORTER_REFERENCES option will help or hurt performance, it is disabled by default at this time (2018-05-04). It might be enabled by default in some future release, depending on what is learned about its impact on performance.

SQLITE_ENABLE_STMT_SCANSTATUS

此选项启用sqlite3_stmt_scanstatus()接口. 通常,从构建中省略sqlite3_stmt_scanstatus()接口,因为即使对不使用该功能的语句,其性能也会受到轻微影响.

SQLITE_ENABLE_STMTVTAB

此编译时选项启用SQLITE_STMT虚拟表逻辑.

SQLITE_RTREE_INT_ONLY

此编译时选项已弃用且未经测试.

SQLITE_ENABLE_SQLLOG

此选项启用额外的代码(尤其是sqlite3_config()SQLITE_CONFIG_SQLLOG选项),可用于创建应用程序执行的所有SQLite处理的日志. 这些日志可用于对应用程序的行为进行离线分析,尤其是对于性能分析. 为了使SQLITE_ENABLE_SQLLOG选项有用,需要一些额外的代码. SQLite源代码树中的" test_sqllog.c"源代码文件是所需额外代码的有效示例. 在UNIX和Windows系统上,开发人员可以将" test_sqllog.c"源代码文件的文本附加到" sqlite3.c"合并的末尾,使用-DSQLITE_ENABLE_SQLLOG选项重新编译应用程序,然后使用环境变量控制日志记录. 有关其他详细信息,请参见" test_sqllog.c"源文件上的标题注释.

SQLITE_ENABLE_STAT2

此选项用于使ANALYZE命令收集sqlite_stat2表中的索引直方图数据. 但是从SQLite 版本3.7.9 (2011-11-01)开始,该功能已由SQLITE_ENABLE_STAT3取代. 现在,SQLITE_ENABLE_STAT2编译时选项为空操作.

SQLITE_ENABLE_STAT3

此选项用于使ANALYZE命令收集sqlite_stat3表中的索引直方图数据. 但是从SQLite 版本3.8.1 (2013-10-17)开始,该功能已由SQLITE_ENABLE_STAT4取代. 版本3.29.0 (2019-07-10)继续支持SQLITE_ENABLE_STAT3编译时选项,但现在已成为空操作.

SQLITE_ENABLE_STAT4

此选项将附加逻辑添加到ANALYZE命令和查询计划程序中 ,可以帮助SQLite在某些情况下选择更好的查询计划. ANALYZE命令得到增强,可以从每个索引的所有列收集直方图数据,并将该数据存储在sqlite_stat4表中. 然后,查询计划者将使用直方图数据来帮助它做出更好的索引选择. 此编译时选项的缺点是,它违反了查询计划程序的稳定性保证 ,因此很难确保在批量生产的应用程序中保持一致的性能.

SQLITE_ENABLE_STAT4是增强SQLITE_ENABLE_STAT3 . STAT3仅记录每个索引最左列的直方图数据,而STAT4增强功能记录每个索引所有列的直方图数据. SQLITE_ENABLE_STAT3的编译时选项已成为无操作.

SQLITE_ENABLE_TREE_EXPLAIN

不再使用此编译时选项.

SQLITE_ENABLE_UPDATE_DELETE_LIMIT

此选项在UPDATEDELETE语句上启用可选的ORDER BY和LIMIT子句.

如果定义了此选项,则在使用Lemon解析器生成器工具生成parse.c文件时,也必须定义它. 因此,仅当从源而不是通过合并或从网站上为非Unix平台提供的预打包C文件集合构建库时,才可以使用此选项.

SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION

激活SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION编译时选项后,SQLite将在运行EXPLAINEXPLAIN QUERY PLAN时抑制"未知函数"错误. SQLite不会引发错误,而是会插入一个名为" unknown()"的替代无操作函数. 仅在EXPLAINEXPLAIN QUERY PLAN上发生" unknown()"代替无法识别的函数的情况,而不是在普通语句上发生.

当在命令行外壳中使用时 ,SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION功能允许将包含应用程序定义的函数的SQL文本粘贴到外壳中进行分析和调试,而无需创建和加载实现应用程序定义的函数的扩展.

SQLITE_ENABLE_UNLOCK_NOTIFY

此选项启用sqlite3_unlock_notify()接口及其关联的功能. 有关其他信息,请参见标题为" 使用SQLite解锁通知功能 "的文档.

SQLITE_INTROSPECTION_PRAGMAS

此选项已过时. 它曾经使一些额外的一些额外的注记语句,如PRAGMA function_listPRAGMA MODULE_LISTPRAGMA pragma_list ,但这些pragma现在都默认启用. 请参阅SQLITE_OMIT_INTROSPECTION_PRAGMAS .

SQLITE_SOUNDEX

This option enables the soundex() SQL function.

SQLITE_USE_ALLOCA

如果启用此选项,则在一些合适的情况下将使用alloca()内存分配器. 这样会导致二进制文件的大小略小且速度更快. 当然,SQLITE_USE_ALLOCA编译时仅在支持alloca()的系统上有效.

SQLITE_USE_FCNTL_TRACE

此选项使SQLite发出额外的SQLITE_FCNTL_TRACE文件控件,以向VFS提供补充信息. " vfslog.c"扩展使用此功能来提供VFS活动的增强日志.

SQLITE_HAVE_ZLIB

此选项导致某些扩展链接到zlib压缩库 .

此选项对SQLite核心没有影响. 仅扩展使用. 对于命令行外壳程序SQL Archive支持的压缩和解压缩功能,此选项是必需的.

使用此选项进行编译时,通常需要添加链接器选项以在构建中包括zlib库. 正常情况下,此选项为" -lz",但在不同系统上可能有所不同.

在Windows系统上使用MSVC进行构建时,可以将zlib源代码放入源树的compat / zlib子目录中,然后将USE_ZLIB = 1选项添加到nmake命令中,以使Makefile.msc自动生成并使用适当的zlib库实现.

YYTRACKMAXSTACKDEPTH

此选项导致使用sqlite3_statusSQLITE_STATUS_PARSER_STACK ,...)接口跟踪和报告LALR(1)解析器堆栈深度. SQLite的LALR(1)解析器具有固定的堆栈深度(在编译时使用YYSTACKDEPTH选项确定). 此选项可用于帮助确定应用程序是否接近最大LALR(1)堆栈深度.

8. Options To Disable Features Normally Turned On

SQLITE_DISABLE_LFS

如果定义了此C预处理器宏,则禁用大文件支持.

SQLITE_DISABLE_DIRSYNC

如果定义了此C预处理器宏,则目录同步将被禁用. 删除文件时,SQLite通常尝试同步父目录,以确保目录条目立即在磁盘上更新.

SQLITE_DISABLE_FTS3_UNICODE

如果定义了此C预处理程序宏,则FTS3中unicode61标记生成器将从构建中省略,并且对应用程序不可用.

SQLITE_DISABLE_FTS4_DEFERRED

如果此C预处理器宏禁用FTS4中的"延迟令牌"优化. "递延令牌"优化避免了为集合的大多数文档中的术语加载大量的过帐列表,而只是在文档源中扫描这些令牌. 无论是否进行此优化, FTS4都应获得完全相同的答案.

SQLITE_DISABLE_INTRINSIC

此选项禁止使用特定于编译器的内置函数,例如GCC和Clang中的__builtin_bswap32()和__builtin_add_overflow()或MSVC中的_byteswap_ulong()和_ReadWriteBarrier().

9. Options To Omit Features

以下选项可用于通过省略未使用的功能来减小编译库的大小 . 这可能仅在空间特别狭窄的嵌入式系统中有用,因为即使包括了所有功能,SQLite库也相对较小. 不要忘记告诉编译器针对二进制大小进行优化! (如果使用GCC,则为-Os选项). 与采用任何这些编译时选项相比,告诉编译器进行大小优化通常对库占用空间的影响要大得多. 您还应该验证调试选项是否已禁用.

本节中的宏不需要值. 以下编译开关均具有相同的效果:
-DSQLITE_OMIT_ALTERTABLE
-DSQLITE_OMIT_ALTERTABLE = 1
-DSQLITE_OMIT_ALTERTABLE = 0

如果定义了这些选项中的任何一个,则在使用Lemon解析器生成器工具生成parse.c文件时,以及在编译用于生成keywordhash.h文件的" mkkeywordhash"工具时,也必须定义相同的SQLITE_OMIT_ *选项集. 因此,仅当从规范来源(而不是从合并 )构建库时,才可以使用这些选项. 有些SQLITE_OMIT_ *选项可能会奏效,或者出现工作,与使用时合并 . 但这不能保证. 通常,为了利用SQLITE_OMIT_ *选项,请始终从规范源进行编译.

重要说明: SQLITE_OMIT_ *选项可能不适用于合并 . 通常,仅当从规范源文件构建SQLite时,SQLITE_OMIT_ *编译时选项才能正常工作.

可以生成与预定的SQLITE_OMIT_ *选项一起使用的特殊版本的SQLite合并. 为此,请在规范的源代码发行版中复制Makefile.linux-gcc makefile模板. 将副本的名称更改为简单的" Makefile". 然后编辑" Makefile"以设置适当的编译时选项. 然后输入:

make clean; make sqlite3.c

The resulting "sqlite3.c" amalgamation code file (and its associated header file "sqlite3.h") can then be moved to a non-unix platform for final compilation using a native compiler.

不支持SQLITE_OMIT_ *选项. 通过这种方式,我们的意思是在当前发行版中省略构建代码的SQLITE_OMIT_ *选项在下一发行版中可能会变成无操作. 或反之亦然:当前版本中无操作的SQLITE_OMIT_ *可能会导致在下一版本中排除代码. 另外,并非所有SQLITE_OMIT_ *选项都经过测试. 一些SQLITE_OMIT_ *选项可能会导致SQLite发生故障和/或提供错误的答案.

重要说明:几乎不支持SQLITE_OMIT_ *编译时选项.

以下是可用的OMIT选项:

SQLITE_OMIT_ALTERTABLE

定义此选项后,库中将不包含ALTER TABLE命令. 执行ALTER TABLE语句会导致解析错误.

SQLITE_OMIT_ANALYZE

定义此选项后,将在构建中省略ANALYZE命令.

SQLITE_OMIT_ATTACH

定义此选项后,将在构建中省略ATTACHDETACH命令.

SQLITE_OMIT_AUTHORIZATION

定义此选项将忽略库中的授权回调功能. 该库中不存在sqlite3_set_authorizer() API函数.

SQLITE_OMIT_AUTOINCREMENT

此选项省略了AUTOINCREMENT功能. 定义此宏时,插入NULL时,声明为" INTEGER PRIMARY KEY AUTOINCREMENT"的列的行为与声明为" INTEGER PRIMARY KEY "的列相同. sqlite_sequence系统表既不会创建,也不会受到尊重(如果已存在).

SQLITE_OMIT_AUTOINIT

为了与缺少sqlite3_initialize()接口的SQLite的旧版本向后兼容,在进入某些关键接口(例如sqlite3_open()sqlite3_vfs_register()sqlite3_mprintf() )时 ,将自动调用sqlite3_initialize()接口. 通过使用SQLITE_OMIT_AUTOINIT C预处理器宏构建SQLite,可以省去以这种方式自动调用sqlite3_initialize()的开销. 使用SQLITE_OMIT_AUTOINIT构建时,SQLite不会自动初始化自身,并且要求应用程序直接在开始使用SQLite库之前调用sqlite3_initialize() .

SQLITE_OMIT_AUTOMATIC_INDEX

此选项用于省略自动索引功能. 另请参阅: SQLITE_DEFAULT_AUTOMATIC_INDEX .

SQLITE_OMIT_AUTORESET

默认情况下,必要时sqlite3_step()接口将自动调用sqlite3_reset()以重置准备好的语句 . 此编译时选项会更改该行为,以便sqlite3_step()如果在返回除SQLITE_ROWSQLITE_BUSYSQLITE_LOCKED之外的任何值之后再次调用,则它将返回SQLITE_MISUSE ,除非对sqlite3_reset()进行了中间调用.

在SQLite 3.6.23.1 (2010-03-26)和更早版本中,如果在返回SQLITE_ROW以外的任何内容之后再次调用SQLITE_MISUSE而又没有中间调用sqlite3_reset()的情况下再次调用SQLITE_MISUSE ,则sqlite3_step()总是会返回SQLITE_MISUSE . 这在一些编写不正确的智能手机应用程序上引起了问题,这些应用程序不能正确处理SQLITE_LOCKEDSQLITE_BUSY错误返回. 不是修复许多有缺陷的智能手机应用程序,而是在3.6.23.2中更改了SQLite的行为,以自动重置准备好的语句. 但是这种变化导致了其他未正确实施的应用程序中的问题,这些应用程序实际上正在寻找SQLITE_MISUSE返回以终止其查询循环. (每当应用程序从SQLite获取SQLITE_MISUSE错误代码,这意味着该应用程序滥用了SQLite接口,因此实现了错误的实现.)SQLITE_OMIT_AUTORESET接口已添加到SQLite 3.7.5 (2011-02-01) 版本中,旨在让所有(损坏的)应用程序再次运行,而无需实际修复应用程序.

SQLITE_OMIT_AUTOVACUUM

如果定义了此选项,则库将无法创建或写入支持auto_vacuum的数据库. 执行PRAGMA auto_vacuum语句不是错误(因为未知的PRAGMA会被静默忽略),但是不会返回值或修改数据库文件中的auto-vacuum标志. 如果使用此选项编译的库打开了支持自动真空的数据库,则它将以只读模式自动打开.

SQLITE_OMIT_BETWEEN_OPTIMIZATION

此选项禁止将索引与使用BETWEEN运算符的WHERE子句一起使用.

SQLITE_OMIT_BLOB_LITERAL

定义此选项后,将无法使用X'ABCD'语法在SQL语句中指定blob.

SQLITE_OMIT_BTREECOUNT

此选项不再用于任何东西. 这是没有操作的.

SQLITE_OMIT_BUILTIN_TEST

此编译时选项已重命名为SQLITE_UNTESTABLE .

SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA

此编译时选项禁用PRAGMA case_sensitive_like命令.

SQLITE_OMIT_CAST

此选项导致SQLite省略对CAST运算符的支持.

SQLITE_OMIT_CHECK

此选项导致SQLite省略对CHECK约束的支持. 解析器仍将接受SQL语句中的CHECK约束,只是不会被强制执行.

SQLITE_OMIT_COMPILEOPTION_DIAGS

此选项用于省略SQLite中可用的编译时选项诊断,包括sqlite3_compileoption_used()sqlite3_compileoption_get() C / C ++函数, sqlite_compileoption_used()sqlite_compileoption_get() SQL函数以及compile_options pragma .

SQLITE_OMIT_COMPLETE

此选项导致忽略sqlite3_complete()sqlite3_complete16()接口.

SQLITE_OMIT_COMPOUND_SELECT

此选项用于省略复合SELECT功能. SELECT是使用UNION,UNION ALL,INTERSECT或EXCEPT复合SELECT语句运营商将导致解析错误.

在VALUES子句中具有多个值的INSERT语句在内部实现为复合SELECT. 因此,此选项还禁用了使用INSERT INTO ... VALUES ...语句插入多个行的功能.

SQLITE_OMIT_CTE

此选项导致省略对公用表表达式的支持.

SQLITE_OMIT_DATETIME_FUNCS

如果定义了此选项,则将忽略SQLite的内置日期和时间操作功能. 具体来说,SQL函数julianday(),date(),time(),datetime()和strftime()不可用. 默认列值CURRENT_TIME,CURRENT_DATE和CURRENT_TIMESTAMP仍然可用.

SQLITE_OMIT_DECLTYPE

此选项导致SQLite省略对sqlite3_column_decltype()sqlite3_column_decltype16()接口的支持.

SQLITE_OMIT_DEPRECATED

此选项导致SQLite省略对标记为已弃用的接口的支持. 这包括sqlite3_aggregate_count() , sqlite3_expired() , sqlite3_transfer_bindings() , sqlite3_global_recover() , sqlite3_thread_cleanup()sqlite3_memory_alarm()接口和PRAGMA语句PRAGMA count_changesPRAGMA data_store_directoryPRAGMA default_cache_sizePRAGMA empty_result_callbacksPRAGMA full_column_namesPRAGMA short_column_namesPRAGMA temp_store_directory .

SQLITE_OMIT_DISKIO

此选项忽略了对写入磁盘的所有支持,并强制数据库仅存在于内存中. 此选项尚未维护,可能不适用于较新版本的SQLite.

SQLITE_OMIT_EXPLAIN

Defining this option causes the EXPLAIN command to be omitted from the library. Attempting to execute an EXPLAIN statement will cause a parse error.

SQLITE_OMIT_FLAG_PRAGMAS

此选项省略了对查询和设置布尔属性的PRAGMA命令子集的支持.

SQLITE_OMIT_FLOATING_POINT

此选项用于从SQLite库中省略浮点数支持. 指定后,将浮点数指定为文字(即" 1.01")会导致解析错误.

将来,此选项可能还会禁用其他浮点功能,例如sqlite3_result_double()sqlite3_bind_double()sqlite3_value_double()sqlite3_column_double() API函数.

SQLITE_OMIT_FOREIGN_KEY

如果定义了此选项,则无法识别外键约束语法.

SQLITE_OMIT_GENERATED_COLUMNS

如果定义了此选项,则无法识别生成的列语法.

SQLITE_OMIT_GET_TABLE

此选项导致省略对sqlite3_get_table()sqlite3_free_table()的支持.

SQLITE_OMIT_HEX_INTEGER

此选项省略了对十六进制整数文字的支持.

SQLITE_OMIT_INCRBLOB

此选项导致省略对增量BLOB I / O的支持.

SQLITE_OMIT_INTEGRITY_CHECK

该选项省略了对integrity_check pragma的支持.

SQLITE_OMIT_INTROSPECTION_PRAGMAS

此选项省略了支持PRAGMA function_listPRAGMA MODULE_LISTPRAGMA pragma_list .

SQLITE_OMIT_LIKE_OPTIMIZATION

此选项禁用SQLite使用索引来帮助解析WHERE子句中的LIKEGLOB运算符的功能.

SQLITE_OMIT_LOAD_EXTENSION

该选项忽略了SQLite的整个扩展加载机制,包括sqlite3_enable_load_extension()sqlite3_load_extension()接口.

SQLITE_OMIT_LOCALTIME

此选项从日期和时间函数中省略了" localtime"修饰符. 尝试在不支持本地时间概念的平台上编译日期和时间函数时,此选项有时很有用.

SQLITE_OMIT_LOOKASIDE

此选项省略了后备内存分配器 .

SQLITE_OMIT_MEMORYDB

定义此名称后,库将不遵守特殊的数据库名称":memory:"(通常用于创建内存数据库 ). 如果将":memory:"传递给sqlite3_open()sqlite3_open16()sqlite3_open_v2() ,则将打开或创建具有该名称的文件.

SQLITE_OMIT_OR_OPTIMIZATION

This option disables the ability of SQLite to use an index together with terms of a WHERE clause connected by the OR operator.

SQLITE_OMIT_PAGER_PRAGMAS

定义此选项将忽略与构建中的寻呼机子系统有关的编译指示.

SQLITE_OMIT_PRAGMA

此选项用于从库中省略PRAGMA命令. 注意,定义除此以外的宏还很有用,因为它们也可能会删除其他子系统中的支持代码. 该宏仅删除PRAGMA命令.

SQLITE_OMIT_PROGRESS_CALLBACK

可以定义此选项以省略在长时间运行的SQL语句期间发出"进度"回调的功能. 该库中不存在sqlite3_progress_handler() API函数.

SQLITE_OMIT_QUICKBALANCE

此选项省略了另一种更快的B树平衡例程. 使用此选项会使SQLite稍小一些,但要使其运行稍慢一些.

SQLITE_OMIT_REINDEX

定义此选项后, REINDEX命令不包含在库中. 执行REINDEX语句会导致解析错误.

SQLITE_OMIT_SCHEMA_PRAGMAS

定义此选项会忽略用于从构建中查询数据库架构的实用性.

SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS

定义此选项将省略用于从构建中查询和修改数据库架构版本和用户版本的编译指示. 具体来说,将省略schema_versionuser_version PRAGMA.

SQLITE_OMIT_SHARED_CACHE

此选项将构建不支持共享缓存模式的SQLite. 忽略sqlite3_enable_shared_cache()以及与共享缓存管理相关的B-Tree子系统中的大量逻辑.

SQLITE_OMIT_SUBQUERY

如果定义,则省略对子选择和IN()运算符的支持.

SQLITE_OMIT_TCL_VARIABLE

如果定义了此宏,则特殊的" $ 省略了用于将SQL变量自动绑定到TCL变量的语法.

SQLITE_OMIT_TEMPDB

This option omits support for TEMP or TEMPORARY tables.

SQLITE_OMIT_TRACE

此选项省略了对sqlite3_profile()sqlite3_trace()接口及其关联逻辑的支持.

SQLITE_OMIT_TRIGGER

定义此选项将省略对TRIGGER对象的支持. 在这种情况下, CREATE TRIGGERDROP TRIGGER命令均不可用,并且尝试执行任何一个都将导致解析错误. 此选项还禁用外键约束的实施 ,因为实现触发器的代码(此选项省略了该代码)也用于实现外键动作 .

SQLITE_OMIT_TRUNCATE_OPTIMIZATION

如果没有DELETE语句没有WHERE子句并且在没有触发器的表上运行,则SQLite的默认构建会发生优化,该优化会通过删除并重新创建表来导致DELETE发生. 通常,删除和重新创建表比逐行删除表内容要快得多. 这是"截断优化".

SQLITE_OMIT_UTF16

此宏用于省略对UTF16文本编码的支持. 定义此属性后,返回或接受UTF16编码文本的所有API函数均不可用. 这些函数可以通过以'16'结尾的事实来标识,例如sqlite3_prepare16()sqlite3_column_text16()sqlite3_bind_text16() .

SQLITE_OMIT_VACUUM

定义此选项后, VACUUM命令不包括在库中. 执行VACUUM语句会导致解析错误.

SQLITE_OMIT_VIEW

定义此选项将省略对VIEW对象的支持. 在这种情况下, CREATE VIEWDROP VIEW命令均不可用,尝试执行其中任何一个都会导致解析错误.

警告:如果定义了此宏,将无法打开其架构包含VIEW对象的数据库.

SQLITE_OMIT_VIRTUALTABLE

该选项省略了对SQLite中的虚拟表机制的支持.

SQLITE_OMIT_WAL

该选项省略了" 预写日志 "(又名" WAL ")功能.

SQLITE_OMIT_WSD

此选项可构建不包含可写静态数据(WSD)的SQLite库版本. WSD是全局变量和/或静态变量. 某些平台不支持WSD,并且此选项对于SQLite能够在那些平台上工作是必需的.

与其他使SQLite库更小的OMIT选项不同,此选项实际上增加了SQLite的大小,并使它运行的速度稍慢. 仅当为不支持WSD的嵌入式目标构建SQLite时,才使用此选项.

SQLITE_OMIT_XFER_OPT

此选项省略了对优化的支持,这些优化可帮助" INSERT INTO ... SELECT ..."形式的语句运行得更快.

SQLITE_UNTESTABLE

标准的SQLite构建包括少量与sqlite3_test_control()相关联的逻辑,以执行SQLite核心中难以验证的部分. 此编译时选项忽略了额外的测试逻辑. 在SQLite版本3.16.0(2017-01-02)之前,此编译时选项称为" SQLITE_OMIT_BUILTIN_TEST". 名称被更改以更好地描述使用它的含义.

设置此编译时选项会阻止SQLite进行完全测试. 分支测试覆盖率从100%下降到大约95%.

SQLite开发人员遵循NASA的"飞行测试和测试飞行"原则. 如果启用此选项可交付但禁用此选项以进行测试,则会违反此原则. 但是,如果在测试期间启用了此选项,则并非所有分支都可以访问. 因此,不建议使用此编译时选项.

SQLITE_ZERO_MALLOC

此选项从构建中忽略默认的内存分配器调试内存分配器 ,并替换总是失败的存根内存分配器. SQLite将无法使用此存根内存分配器运行,因为它将无法分配内存. 但是可以在开始时使用sqlite3_configSQLITE_CONFIG_MALLOC ,...)或sqlite3_configSQLITE_CONFIG_HEAP ,...)替换此存根. 因此,此编译时选项的最终效果是,它允许对不支持malloc(),free()和/或realloc()的系统库进行编译和链接.

10. Analysis and Debugging Options

SQLITE_DEBUG

SQLite源代码实际上包含数千个assert()语句,这些语句用于验证内部假设以及子例程的先决条件和后置条件. 这些assert()语句通常被关闭(它们不生成代码),因为将它们打开会使SQLite的运行速度慢大约三倍. 但是对于测试和分析,打开assert()语句很有用. SQLITE_DEBUG编译时选项可以执行此操作.

SQLITE_DEBUG还启用其他一些调试功能,例如特殊的PRAGMA语句,这些语句打开用于对VDBE和代码生成器进行故障排除和分析的跟踪和列出功能.

SQLITE_MEMDEBUG

SQLITE_MEMDEBUG选项使检测到的调试内存分配器用作SQLite中的默认内存分配器. 检测的内存分配器检查动态分配的内存是否被滥用. 滥用的示例包括释放内存后使用内存,注销内存分配的末尾,释放先前未从内存分配器获得的内存或无法初始化新分配的内存.

11. Windows-Specific Options

SQLITE_WIN32_HEAP_CREATE

启用后,此选项将强制Win32本机内存分配器创建一个专用堆来保存所有内存分配.

SQLITE_WIN32_MALLOC_VALIDATE

如果启用了该选项,则如果还启用了assert(),则强制Win32本机内存分配器对HeapValidate()函数进行战略调用.

12. Compiler Linkage Control

以下宏为某些类型的SQLite构建指定接口链接. Makefile通常会自动处理这些宏的设置. 应用程序开发人员不必担心这些宏. 以下是关于这些宏的完整说明.

SQLITE_API

此宏标识SQLite的外部可见接口. 有时将此宏设置为"外部". 但是定义是特定于编译器的.

SQLITE_APICALL

此宏标识SQLite中公共接口例程使用的调用约定. 该宏通常定义为空,尽管在Windows构建中有时可以将其设置为" __cdecl"或" __stdcall". " __cdecl"设置是默认设置,但是当打算将SQLite编译为Windows系统库时使用" __stdcall".

单个函数声明最多只能包含以下一项: SQLITE_APICALLSQLITE_CALLBACKSQLITE_CDECLSQLITE_SYSCALL .

SQLITE_CALLBACK

此宏指定SQLite中的回调指针使用的调用约定. 该宏通常定义为空,尽管在Windows构建中有时可以将其设置为" __cdecl"或" __stdcall". " __cdecl"设置是默认设置,但是当打算将SQLite编译为Windows系统库时,将使用" __stdcall".

单个函数声明最多只能包含以下一项: SQLITE_APICALLSQLITE_CALLBACKSQLITE_CDECLSQLITE_SYSCALL .

SQLITE_CDECL

此宏指定SQLite中varargs接口例程使用的调用约定. 尽管在Windows构建中,有时可以将其设置为" __cdecl",但通常将其定义为空. 该宏用于varargs例程,因此不能设置为" __stdcall",因为__stdcall调用约定不支持varargs函数.

单个函数声明最多只能包含以下一项: SQLITE_APICALLSQLITE_CALLBACKSQLITE_CDECLSQLITE_SYSCALL .

SQLITE_SYSCALL

此宏标识操作系统接口使用的调用约定,该调用约定以SQLite构建平台为目标. 该宏通常定义为空,尽管在Windows构建中有时可以将其设置为" __stdcall".

单个函数声明最多只能包含以下一项: SQLITE_APICALLSQLITE_CALLBACKSQLITE_CDECLSQLITE_SYSCALL .

SQLITE_TCLAPI

该宏指定TCL库接口例程使用的调用约定. SQLite核心不使用此宏,而TCL接口TCL测试套件仅使用此宏. 尽管在Windows构建中,有时可以将其设置为" __cdecl",但通常将其定义为空. 即使在更喜欢使用__stdcall的平台上,该宏也始终用于__cdecl的TCL库接口例程中使用,因此,除非将平台作为支持__stdcall的自定义TCL库构建平台,否则不应将此宏设置为__stdcall.

此宏不得与SQLITE_APICALLSQLITE_CALLBACKSQLITE_CDECLSQLITE_SYSCALL结合使用 .

by  ICOPY.SITE