Small. Fast. Reliable.
Choose any three.
编译时选项

1.概述

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

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

2.推荐的编译时选项

对于能够使用它们的应用程序,建议使用以下编译时选项,以最大程度地减少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 sync = NORMAL来确保完整的数据库完整性。随着 PRAGMA同步= NORMALWAL模式,最近对数据库的变化可能是由电源损耗回滚,但数据库不会被破坏。此外,在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()的情况下调用,可能的结果将是segfault。

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

3.平台配置

_HAVE_SQLITE_CONFIG_H

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

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系统上,使用“区域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需要知道目标CPU的本机字节顺序是大端还是小端。对于大字节序计算机,SQLITE_BYTEORDER预处理器设置为4321,对于小字节序计算机,则设置为1234,或者可以将其设置为0表示必须在运行时确定字节顺序。代码中包含#ifdef,它们可为所有常见平台和编译器自动设置SQLITE_BYTEORDER。但是,在为晦涩的目标编译SQLite时,适当地设置SQLITE_BYTEORDER可能是有利的。如果无法在编译时确定目标字节顺序,则SQLite会退回执行运行时检查,该检查始终有效,尽管性能损失很小。

4.设置默认参数值的选项

SQLITE_DEFAULT_AUTOMATIC_INDEX = <0或1>

该宏 为新打开的数据库连接确定PRAGMA automatic_index的初始设置。对于SQLite 3.7.17之前的所有版本,如果省略了编译时选项,通常都会为新的数据库连接启用自动索引。但是,这可能会在将来的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的较新版本创建的数据库文件,对于SQLite版本(截至3.7.9),默认架构格式设置为1(2011年11月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的内存量的默认限制。如果N 为零,则默认情况下禁用内存映射的I / O。可以在开始时使用sqlite3_configSQLITE_CONFIG_MMAP_SIZE)调用,或者在运行时使用mmap_size pragma修改 此编译时限制和SQLITE_MAX_MMAP_SIZE

SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT = <字节>

此选项在持久日志模式排他锁定模式下设置回滚日志文件 的大小限制,在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 = <字节>

此宏用于设置创建数据库时使用的默认页面大小。分配的值必须为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 = <页面>

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

SQLITE_DEFAULT_WORKER_THREADS = N

此宏设置SQLITE_LIMIT_WORKER_THREADS参数的默认值。该SQLITE_LIMIT_WORKER_THREADS 参数设置一个辅助线程的最大数量 准备的语句将推出与查询,以帮助它。如果未指定,则默认最大值为0。此处设置的值不能超过SQLITE_MAX_WORKER_THREADS

SQLITE_DQS = N

该宏确定SQLITE_DBCONFIG_DQS_DDLSQLITE_DBCONFIG_DQS_DML的默认值 ,这反过来又是SQLite处理每个双引号字符串文字的方式。在“DQS”的名字代表“ d ouble- Q uoted小号特林”。所述Ñ参数应该是整数0,1,2,或3。

SQLITE_DQS允许双引号字符串 评论
在DDL中在DML中
3是的是的默认
2个是的 
1个是的 
0受到推崇的

推荐的设置为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

此选项将SQLite从malloc()请求的总内存量限制为N个字节。SQLite尝试分配新内存的任何尝试都会导致SQLite持有的所有分配的总和超过 N个字节,这将导致内存不足错误。这是一个硬上限。另请参见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 mmap_size)作为只要其他设置小于此处定义的最大值。

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永远不会使用小于N的文件描述符。N的默认值为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') ”的格式来防止恶意或运行不正常的脚本使用过多的内存。N的值通常约为1000。

printf()的SQL函数是受SQLITE_LIMIT_LENGTH 的极限sqlite3_limit() 。因此,任何宽度或精度大于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

作为查询计划过程的一部分,SQLite枚举索引和WHERE子句约束的所有可用组合。对于某些病理查询,这些索引和约束组合的数量可能非常大,从而导致查询计划程序的性能降低。SQLITE_QUERY_PLANNER_LIMIT值(与相关的SQLITE_QUERY_PLANNER_LIMIT_INCR设置结合使用)限制了查询计划程序将考虑的索引和约束组合的数量,以防止查询计划程序使用过多的CPU时间。SQLITE_QUERY_PLANNER_LIMIT的默认值设置得足够高,以至于现实世界中的查询永远无法达到。查询计划者搜索限制仅适用于故意使用多余计划时间的查询。

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 = <最大深度>

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

5.设置大小限制的选项

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

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

6.控制运行特性的选项

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或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默认为打开。

secure_delete设置导致删除的内容被零覆盖。由于必须进行额外的I / O,因此性能损失很小。另一方面,secure_delete可以防止敏感信息的片段在删除后保留在数据库文件的未使用部分中。有关其他信息,请参阅secure_delete杂注上的文档 。

SQLITE_THREADSAFE = <0或1或2>

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

换句话说,SQLITE_THREADSAFE = 1将默认 线程模式设置为序列化。SQLITE_THREADSAFE = 2将默认 线程模式设置为多线程。并且SQLITE_THREADSAFE = 0将 线程模式设置为单线程。

可以在运行时使用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线程安全的代码。发生这种情况时,不可能在启动时或运行时更改线程模式

有关在多线程环境中使用SQLite的其他信息,请参见线程模式文档。

SQLITE_TEMP_STORE = <0到3>

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

SQLITE_TEMP_STORE意义
0一律使用临时文件
1个默认情况下使用文件,但允许 PRAGMA temp_store命令覆盖
2个默认情况下使用内存,但允许 PRAGMA temp_store命令覆盖
3始终使用内存

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

SQLITE_TRACE_SIZE_LIMIT = N

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

SQLITE_TRUSTED_SCHEMA = <0或1>

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

SQLITE_USE_URI

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

7.启用功能的选项通常处于关闭状态

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 3.36.0(待定)开始,默认情况下启用了这些接口,并添加了新的编译时选项SQLITE_OMIT_DESERIALIZE以忽略它们。

SQLITE_ENABLE_EXPLAIN_COMMENTS

此选项向SQLite添加了额外的逻辑,该逻辑将注释文本插入EXPLAIN的输出中。这些额外的注释会占用额外的内存,从而使准备好的语句变大且变慢,因此默认情况下会在大多数应用程序中将其关闭。但是某些应用程序(例如SQLite的命令行外壳程序)对EXPLAIN输出的重视程度超过了原始性能,因此他们可以使用此编译时选项。如果启用了SQLITE_DEBUG,则还自动启用了SQLITE_ENABLE_EXPLAIN_COMMENTS编译时选项。

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

当这个选项在定义合并时,Geopoly扩展 包含在构建中。

SQLITE_ENABLE_ICU

此选项导致将Unicode国际组件 或SQLite的“ ICU”扩展名添加到构建中。

SQLITE_ENABLE_IOTRACE

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

SQLITE_ENABLE_MATH_FUNCTIONS

该宏启用内置的SQL数学函数。除非使用--disable-math选项,否则此选项将由unix平台上的configure脚本自动添加到Makefile中。使用“ Makefile.msc” makefile进行nmake的Windows版本中也包含此选项。

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表进行任何更改之前提供回调。回调可用于记录更改发生之前的行状态。

preupdate钩子的操作与更新钩子类似, 不同之处在于,在更改之前(而不是在更改之后)调用回调,并且除非使用了compile-time选项,否则将忽略preupdate钩子接口。

最初添加了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)接口设置分类器参考大小阈值 。

由于SQLite开发人员不知道SQLITE_ENABLE_SORTER_REFERENCES选项是否会帮助或损害性能,因此默认情况下此时间处于禁用状态(2018-05-04)。在将来的某些发行版中,可能默认情况下启用此功能,具体取决于所了解的性能影响。

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选项有用,需要一些额外的代码。该 “test_sqllog.c” SQLite源代码树中的源代码文件是所需额外代码的有效示例。在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

此选项启用soundex()SQL函数

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.禁用通常打开的功能的选项

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.省略功能的选项

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

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

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

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

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

清洁 制作sqlite3.c

然后可以将生成的“ sqlite3.c”合并代码文件(及其关联的头文件“ sqlite3.h”)移至非Unix平台,以使用本机编译器进行最终编译。

不支持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_names,和 PRAGMA temp_store_directory

SQLITE_OMIT_DESERIALIZE

此选项使sqlite3_serialize()sqlite3_deserialize() 接口从构建中省略。

SQLITE_OMIT_DISKIO

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

SQLITE_OMIT_EXPLAIN

定义此选项将导致从库中省略EXPLAIN命令。尝试执行EXPLAIN语句将导致解析错误。

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

此选项禁用SQLite使用索引以及由OR运算符连接的WHERE子句的条款的功能。

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树子系统内相当数量省略沿。

SQLITE_OMIT_SUBQUERY

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

SQLITE_OMIT_TCL_VARIABLE

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

SQLITE_OMIT_TEMPDB

此选项省略了对TEMP或TEMPORARY表的支持。

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 VIEW也没有DROP 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.分析和调试选项

SQLITE_DEBUG

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

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

SQLITE_MEMDEBUG

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

11. Windows特定的选项

SQLITE_WIN32_HEAP_CREATE

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

SQLITE_WIN32_MALLOC_VALIDATE

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

12.编译器链接控制

以下宏为某些类型的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结合使用