一、概述
对于大多数用途,可以使用默认编译选项很好地构建 SQLite。但是,如果需要,下面记录的编译时选项可用于 省略 SQLite 功能(导致较小的编译库大小)或更改某些参数的 默认值。
已尽一切努力确保编译选项的各种组合和谐地工作并产生一个工作库。尽管如此,强烈建议在使用使用非标准编译选项构建的 SQLite 库之前执行 SQLite 测试套件以检查错误。
2.推荐的编译时选项
对于能够使用它们的应用程序,建议使用以下编译时选项,以最大限度地减少 CPU 周期数和 SQLite 使用的内存字节数。并非所有这些编译时选项都可供每个应用程序使用。例如,SQLITE_THREADSAFE=0 选项只能由从不同时从多个线程访问 SQLite 的应用程序使用。SQLITE_OMIT_PROGRESS_CALLBACK 选项只能由不使用sqlite3_progress_handler()接口的应用程序使用。等等。
不可能测试 SQLite 编译时选项的所有可能组合。但是以下一组编译时选项是一个始终经过全面测试的配置。
SQLITE_DQS=0。此设置禁用双引号字符串文字错误功能。
SQLITE_THREADSAFE=0。设置 -DSQLITE_THREADSAFE=0 会导致省略 SQLite 中的所有互斥锁和线程安全逻辑。这是单个编译时选项,可使 SQLite 的运行速度提高约 2%,并将库的大小减少约 2%。但缺点是使用编译时选项意味着 SQLite 永远不能同时被多个线程使用,即使每个线程都有自己的数据库连接。
SQLITE_DEFAULT_MEMSTATUS=0。此设置会导致跟踪内存使用情况的sqlite3_status()接口被禁用。这有助于sqlite3_malloc()例程运行得更快,并且由于 SQLite 在内部使用sqlite3_malloc(),这有助于使整个库更快。
SQLITE_DEFAULT_WAL_SYNCHRONOUS=1。为了在断电后获得最大的数据库安全性,建议设置 PRAGMA synchronous=FULL。然而,在WAL 模式下,完全的数据库完整性由PRAGMA synchronous=NORMAL保证。在WAL 模式下使用 PRAGMA synchronous=NORMAL,最近对数据库的更改可能会因断电而回滚,但数据库不会损坏。此外,在 WAL 模式下使用 synchronous=NORMAL 的事务提交比使用默认的 synchronous=FULL 快得多。由于这些原因,建议在切换到 WAL 模式时将同步设置从 FULL 更改为 NORMAL。这个编译时选项将实现这一点。
SQLITE_LIKE_DOESNT_MATCH_BLOBS。从历史上看,SQLite 允许 BLOB 操作数用于LIKE和GLOB 运算符。但是将 BLOB 作为LIKE或GLOB的操作数会使LIKE 优化复杂化并减慢速度。设置此选项后,意味着如果任一操作数是 BLOB,则 LIKE 和 GLOB 运算符始终返回 FALSE。这简化了LIKE 优化的实现,并允许使用LIKE 优化的查询运行得更快。
SQLITE_MAX_EXPR_DEPTH=0。将最大表达式解析树深度设置为零会禁用对表达式解析树深度的所有检查,从而简化代码从而加快执行速度,并帮助解析树使用更少的内存。
SQLITE_OMIT_DECLTYPE。通过省略(很少需要的)从查询结果集中返回声明类型的列的能力,可以使 准备好的语句消耗更少的内存。
SQLITE_OMIT_DEPRECATED。省略不推荐使用的接口和功能不会帮助 SQLite 运行得更快。但是,它将减少图书馆的足迹。这是正确的做法。
SQLITE_OMIT_PROGRESS_CALLBACK。必须在字节码引擎的内部循环中检查进度处理程序回调计数器。通过省略这个接口,从字节码引擎的内部循环中删除了一个单一的条件,帮助 SQL 语句运行得稍微快一些。
SQLITE_OMIT_SHARED_CACHE。省略使用共享缓存的可能性允许消除代码的性能关键部分中的许多条件。这可以显着提高性能。
SQLITE_USE_ALLOCA。在支持 alloca() 的系统上,使用 alloca() 动态分配临时堆栈空间以供在单个函数内使用。如果没有这个选项,临时空间将从堆中分配。
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 周期。所以这些选项并没有太大的区别。但在某些设计情况下,一点一滴都有帮助。
三、平台配置
_HAVE_SQLITE_CONFIG_H
如果定义了 _HAVE_SQLITE_CONFIG_H 宏,则 SQLite 源代码将尝试 #include 名为“config.h”的文件。“config.h”文件通常包含其他配置选项,尤其是 autoconf 脚本生成的“HAVE_INTERFACE ”类型选项。
HAVE_FDATASYNC
如果 HAVE_FDATASYNC 编译时选项为真,则 unix 系统的默认VFS 将在适当的地方尝试使用 fdatasync() 而不是 fsync()。如果此标志丢失或为 false,则始终使用 fsync()。
HAVE_GMTIME_R
如果 HAVE_GMTIME_R 选项为真且SQLITE_OMIT_DATETIME_FUNCS为真,则 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 选项为真,则 SQLite 调用系统库 isnan() 函数来确定双精度浮点值是否为 NaN。如果 HAVE_ISNAN 未定义或为 false,则 SQLite 将替换它自己开发的 isnan() 实现。
HAVE_LOCALTIME_R
如果 HAVE_LOCALTIME_R 选项为真,则 SQLite 使用线程安全的 localtime_r() 库例程而不是 localtime() 来帮助实现 内置日期和时间函数的本地时间修饰符。
HAVE_LOCALTIME_S
如果 HAVE_LOCALTIME_S 选项为真,则 SQLite 使用线程安全的 localtime_s() 库例程而不是 localtime() 来帮助实现 内置日期和时间函数的本地时间修饰符。
HAVE_MALLOC_USABLE_SIZE
如果 HAVE_MALLOC_USABLE_SIZE 选项为真,则 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 选项为真,则 SQLite 使用 strchrnul() 库函数。如果此选项缺失或为 false,则 SQLite 将替换它自己开发的 strchrnul() 实现。
HAVE_USLEEP
如果 HAVE_USLEEP 选项为真,则默认的 unix VFS 使用 usleep() 系统调用来实现 xSleep 方法。如果此选项未定义或为 false,则 unix 上的 xSleep 将使用 sleep() 实现,这意味着sqlite3_sleep()的最小等待间隔为 1000 毫秒,无论其参数如何。
HAVE_UTIME
如果 HAVE_UTIME 选项为真,那么内置但非标准的“unix-dotfile”VFS 将使用 utime() 系统调用而不是 utimes() 来设置锁定文件的最后访问时间。
SQLITE_BYTEORDER= (0|1234|4321)
SQLite 需要知道目标 CPU 的本机字节顺序是大端还是小端。SQLITE_BYTEORDER 预处理器对于大端机器设置为 4321,对于小端机器设置为 1234,或者它可以是 0,表示字节顺序必须在运行时确定。代码中有#ifdefs 为所有常见平台和编译器自动设置SQLITE_BYTEORDER。但是,在为模糊目标编译 SQLite 时适当地设置 SQLITE_BYTEORDER 可能是有利的。如果在编译时无法确定目标字节顺序,则 SQLite 会回退到执行运行时检查,这总是有效的,但性能损失很小。
4.设置默认参数值的选项
SQLITE_DEFAULT_AUTOMATIC_INDEX= <0 或 1>
该宏确定新打开的数据库连接的PRAGMA automatic_index 的初始设置。对于 SQLite 到 3.7.17 的所有版本,如果省略此编译时选项,通常会为新数据库连接启用自动索引。但是,这可能会在 SQLite 的未来版本中改变。
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 将能够读取和写入由较新版本的 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 使用的内存量的默认限制。如果N 为零,则默认情况下禁用内存映射 I/O。这个编译时限制和SQLITE_MAX_MMAP_SIZE可以在启动时使用 sqlite3_config ( SQLITE_CONFIG_MMAP_SIZE ) 调用修改,或者在运行时使用mmap_size pragma 修改。
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_config ( SQLITE_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_status64 ( SQLITE_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= <页面>
SQLITE_DEFAULT_WORKER_THREADS= N
此宏设置SQLITE_LIMIT_WORKER_THREADS参数的默认值。SQLITE_LIMIT_WORKER_THREADS 参数设置单个 准备好的语句将启动以协助查询的最大辅助线程数。如果不指定,默认最大值为0。这里设置的值不能大于SQLITE_MAX_WORKER_THREADS。
SQLITE_DQS= N
该宏确定 SQLITE_DBCONFIG_DQS_DDL和SQLITE_DBCONFIG_DQS_DML的默认值,这反过来又是 SQLite 如何处理每个双引号字符串文字。“DQS”名称代表“双引号字符串” 。N参数应该是整数 0、1、2 或 3。
SQLITE_DQS Double-Quoted Strings Allowed Remarks In DDL In DML 3 yes yes default 2 yes no 1 no yes 0 no no recommended 推荐设置为 0,这意味着双引号字符串在所有上下文中都是不允许的。但是,默认设置为 3 以最大程度地兼容遗留应用程序。
SQLITE_EXTRA_DURABLE
SQLITE_EXTRA_DURABLE 编译时选项,用于使默认的 PRAGMA 同步设置为 EXTRA,而不是 FULL。不再支持此选项。请改用 SQLITE_DEFAULT_SYNCHRONOUS=3。
SQLITE_FTS3_MAX_EXPR_DEPTH= N
此宏设置与FTS3或FTS4全文索引 中 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_status64 ( SQLITE_STATUS_MEMORY_USED ) 接口 可以获得内存使用统计信息时,此限制才起作用。没有内存使用信息,SQLite 无法知道何时会超过限制,因此无法防止内存分配过多。内存使用跟踪默认打开,但可以在编译时使用SQLITE_DEFAULT_MEMSTATUS选项或在启动时使用sqlite3_config ( SQLITE_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_config ( SQLITE_CONFIG_MEMDB_MAXSIZE ,N) 或在运行时使用 SQLITE_FCNTL_SIZE_LIMIT file-control更改单个数据库的限制。如果未指定默认值,则使用 1073741824。
SQLITE_MINIMUM_FILE_DESCRIPTOR= N
unix VFS永远不会使用小于N的文件描述符。N的默认值为3。
避免使用低编号的文件描述符可以防止意外的数据库损坏。例如,如果使用文件描述符 2 打开数据库文件,然后 assert() 失败并调用 write(2,...),这可能会通过使用断言错误消息覆盖部分数据库文件来导致数据库损坏. 仅使用更高值的文件描述符可以避免这个潜在的问题。可以通过将此编译时选项设置为 0 来禁用对使用低编号文件描述符的保护。
SQLITE_POWERSAFE_OVERWRITE= <0 或 1>
此选项更改了关于 unix 和 windows VFSes 的底层文件系统的powersafe 覆盖 的默认假设。将 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') ”之类的格式来防止恶意或故障脚本使用过多的内存。大约 100000 的N值通常就足够了。
printf() SQL 函数受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()功能来格式化存储在sqlite_schema 表中的 CREATE 语句的文本。因此 SQLITE_PRINTF_PRECISION_LIMIT 应该至少与您可能遇到的最大表、索引、视图或触发器定义一样大。
如果宽度或精度超过 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 threads设置 启用多线程处理 ,则当要排序的内容量超过由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 堆 API 函数进行内存分配,而不是标准库 malloc() 和 free() 例程。
YYSTACKDEPTH= <最大深度>
该宏设置 SQLite 中 SQL 解析器使用的 LALR(1) 堆栈的最大深度。默认值为 100。典型的应用程序将使用少于大约 20 层的堆栈。应用程序包含需要超过 100 个 LALR(1) 堆栈条目的 SQL 语句的开发人员应该认真考虑重构他们的 SQL,因为它可能远远超出任何人的理解能力。
5.设置大小限制的选项
有一些编译时选项可以设置 SQLite 中各种结构大小的上限。编译时选项通常设置一个硬上限,可以在运行时使用 sqlite3_limit()接口在单个数据库连接上更改。
用于设置上限的编译时选项 单独记录。以下是可用设置的列表:
- SQLITE_MAX_ATTACHED
- SQLITE_MAX_COLUMN
- SQLITE_MAX_COMPOUND_SELECT
- SQLITE_MAX_EXPR_DEPTH
- SQLITE_MAX_FUNCTION_ARG
- SQLITE_MAX_LENGTH
- SQLITE_MAX_LIKE_PATTERN_LENGTH
- SQLITE_MAX_PAGE_COUNT
- SQLITE_MAX_SQL_LENGTH
- SQLITE_MAX_VARIABLE_NUMBER
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 pragma的文档。
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 将 线程模式设置为单线程。
SQLITE_THREADSAFE 的值可以在运行时使用sqlite3_threadsafe()接口确定。
当使用 SQLITE_THREADSAFE=1 或 SQLITE_THREADSAFE=2 编译 SQLite 时,线程模式 可以在运行时使用sqlite3_config()接口和以下动词之一进行更改:
sqlite3_open_v2() 的SQLITE_OPEN_NOMUTEX和 SQLITE_OPEN_FULLMUTEX标志也可用于在运行时调整单个数据库连接的线程模式 。
请注意,当使用 SQLITE_THREADSAFE=0 编译 SQLite 时,构建中省略了使 SQLite 线程安全的代码。发生这种情况时,不可能在启动时或运行时更改线程模式。
有关在多线程环境中使用 SQLite 的其他信息, 请参阅线程模式文档。
SQLITE_TEMP_STORE= <0 到 3>
此选项控制临时文件是存储在磁盘上还是内存中。该编译时选项的各项设置含义如下:
SQLITE_TEMP_STORE Meaning 0 Always use temporary files 1 Use files by default but allow the PRAGMA temp_store command to override 2 Use memory by default but allow the PRAGMA temp_store command to override 3 Always use memory 默认设置为 1。可以在tempfiles.html中找到其他信息。
SQLITE_TRACE_SIZE_LIMIT= N
如果此宏定义为正整数N ,则在sqlite3_trace()的输出中扩展为参数的字符串和 BLOB 的长度限制为 N个字节。
SQLITE_TRUSTED_SCHEMA= <0 或 1>
此宏确定 SQLITE_DBCONFIG_TRUSTED_SCHEMA和PRAGMA 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_WRITE和SQLITE_FCNTL_COMMIT_ATOMIC_WRITE的sqlite3_file_control() , 因此将来可以将此功能添加到其他文件系统。启用此选项后,SQLite 会自动检测底层文件系统是否支持批量原子写入,并且在这样做时会避免写入回滚日志用于事务控制。这可以使交易速度提高一倍以上,同时减少 SSD 存储设备的磨损。
SQLite 的未来版本可能会默认启用批量原子写入功能,此时此编译时选项将变得多余。
SQLITE_ENABLE_BYTECODE_VTAB
此选项启用字节码和 tables_used 虚拟表。
SQLITE_ENABLE_COLUMN_METADATA
定义此 C 预处理器宏时,SQLite 包含一些额外的 API,可方便地访问有关表和查询的元数据。此选项启用的 API 是:
SQLITE_ENABLE_DBPAGE_VTAB
该选项启用SQLITE_DBPAGE 虚拟表。
SQLITE_ENABLE_DBSTAT_VTAB
该选项启用dbstat 虚拟表。
SQLITE_ENABLE_DESERIALIZE
此选项以前用于启用sqlite3_serialize()和sqlite3_deserialize() 接口。但是,从 SQLite 3.36.0 (2021-06-18) 开始,这些接口默认启用,并添加了一个新的编译时选项SQLITE_OMIT_DESERIALIZE以忽略它们。
SQLITE_ENABLE_EXPLAIN_COMMENTS
此选项向 SQLite 添加额外的逻辑,将注释文本插入EXPLAIN的输出。这些额外的注释使用额外的内存,从而使准备好的语句变得更大并且速度稍慢,因此它们在大多数应用程序中默认情况下是关闭的。但是一些应用程序,例如 SQLite 的命令行 shell,重视 EXPLAIN 输出的清晰度而不是原始性能,因此这个编译时选项对它们可用。如果启用SQLITE_DEBUG,SQLITE_ENABLE_EXPLAIN_COMMENTS 编译时选项也会自动启用。
SQLITE_ENABLE_FTS3
当在amalgamation 中定义此选项时,全文搜索引擎的版本 3 会自动添加到构建中。
SQLITE_ENABLE_FTS3_PARENTHESIS
此选项修改 FTS3 中的查询模式解析器,使其支持运算符 AND 和 NOT(除了通常的 OR 和 NEAR 之外),还允许查询表达式包含嵌套括号。
SQLITE_ENABLE_FTS3_TOKENIZER
此选项启用fts3_tokenizer() 接口 的双参数版本。fts3_tokenizer() 的第二个参数假定是指向实现应用程序定义的分词器的函数(编码为 BLOB)的指针。如果敌对行为者能够使用任意第二个参数运行 fts3_tokenizer() 的双参数版本,他们可以使用崩溃或控制进程。
出于安全考虑,双参数 fts3_tokenizer() 功能从版本 3.11.0 (2016-02-15) 开始被禁用,除非使用此编译时选项。 版本 3.12.0 (2016-03-29) 添加了 sqlite3_db_config (db, SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER ,1,0) 接口,该接口在运行时 为特定数据库连接激活fts3_tokenizer()的双参数版本。
SQLITE_ENABLE_FTS4
当在amalgamation 中定义此选项时,全文搜索引擎的版本 3 和 4 会自动添加到构建中。
SQLITE_ENABLE_FTS5
当在amalgamation 中定义此选项时,全文搜索引擎 ( fts5 ) 的版本 5 会自动添加到构建中。
SQLITE_ENABLE_GEOPOLY
当此选项在amalgamation中定义时,Geopoly 扩展 包含在构建中。
SQLITE_ENABLE_ICU
此选项导致将 Unicode 的国际组件 或 SQLite 的“ICU”扩展添加到构建中。
SQLITE_ENABLE_IOTRACE
当 SQLite 核心和命令行界面(CLI) 都使用此选项编译时,CLI 会提供一个名为“.iotrace”的额外命令,该命令提供 I/O 活动的低级日志。此选项是实验性的,可能会在未来的版本中停止使用。
SQLITE_ENABLE_MATH_FUNCTIONS
此宏启用内置的 SQL 数学函数。除非使用 --disable-math 选项,否则此选项会通过 unix 平台上的配置脚本自动添加到 Makefile。此选项也包含在使用 nmake 的“Makefile.msc”生成文件的 Windows 构建中。
SQLITE_ENABLE_JSON1
这个编译时选项是一个空操作。在 SQLite 版本 3.38.0 (2022-02-22) 之前,必须使用此选项进行编译才能在构建中包含JSON SQL 函数。但是,从 SQLite 版本 3.38.0 开始,默认包含这些函数。使用-DSQLITE_OMIT_JSON选项忽略它们。
SQLITE_ENABLE_LOCKING_STYLE
此选项在 Mac OS X 的操作系统接口层中启用附加逻辑。附加逻辑尝试确定底层文件系统的类型,并选择适用于该文件系统类型的替代锁定策略。有五种锁定策略可用:
- POSIX 锁定样式。这是默认的锁定样式和其他(非 Mac OS X)Unix 使用的样式。使用 fcntl() 系统调用获取和释放锁。
- AFP 锁定样式。这种锁定方式用于使用 AFP(Apple 文件协议)协议的网络文件系统。锁是通过调用库函数 _AFPFSSetLock() 获得的。
- 植绒锁定样式。这用于不支持 POSIX 锁定样式的文件系统。使用 flock() 系统调用获取和释放锁。
- 点文件锁定样式。当文件系统不支持 flock 和 POSIX 锁定样式时,使用此锁定样式。数据库锁是通过在文件系统中相对于数据库文件(“点文件”)的已知位置创建和输入并通过删除同一文件而放弃的。
- 没有锁定样式。如果以上都不支持,则使用这种锁定方式。没有使用数据库锁定机制。使用此系统时,多个客户端访问单个数据库是不安全的。
此外,还提供了五个额外的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_NORMALIZE
此选项包括sqlite3_normalized_sql() API。
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 hook 的操作类似于 update hook,只是回调是在更改之前调用,而不是之后调用,并且除非使用此编译时选项,否则将省略 preupdate hook 接口。
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 值,则每条记录的大小可能会很大,这意味着排序器必须使用更多内存,和/或将更多内容写入临时存储.
当启用 SQLITE_ENABLE_SORTER_REFERENCES 时,传递给排序器的记录通常只包含一个ROWID值。这样的记录要小得多。这意味着分拣机要处理的“有效载荷”要少得多,并且可以运行得更快。排序发生后,ROWID 用于查找原始表中的输出列值。这需要对表进行另一次搜索,并可能导致速度减慢。或者,这可能是性能上的胜利,具体取决于值的大小。
即使打开 SQLITE_ENABLE_SORTER_REFERENCES 编译时选项,排序器引用在默认情况下仍处于禁用状态。要使用排序器引用,应用程序必须在启动时使用 sqlite3_config ( SQLITE_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取代。SQLITE_ENABLE_STAT3 编译时选项在版本 3.29.0 (2019-07-10) 中继续受支持,但现在已成为空操作。
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
此选项在UPDATE和DELETE语句 上启用可选的 ORDER BY 和 LIMIT 子句 。
如果定义了这个选项,那么在使用Lemon 解析器生成器工具生成 parse.c 文件时也必须定义它。因此,此选项只能在库是从源代码构建时使用,而不是从网站上为非 Unix 类平台提供的合并或预打包 C 文件集合中构建。
SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
当 SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION 编译时选项被激活时,SQLite 将在运行EXPLAIN或EXPLAIN QUERY PLAN时抑制“未知函数”错误。SQLite 不会抛出错误,而是插入一个名为“unknown()”的替代无操作函数。用“unknown()”代替无法识别的函数只发生在EXPLAIN和EXPLAIN QUERY PLAN上,而不发生在普通语句上。
在命令行 shell中使用时,SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION 功能允许将包含应用程序定义函数的 SQL 文本粘贴到 shell 中进行分析和调试,而无需创建和加载实现应用程序定义函数的扩展。
SQLITE_ENABLE_UNLOCK_NOTIFY
此选项启用sqlite3_unlock_notify()接口及其相关功能。有关其他信息,请参阅标题为 使用 SQLite 解锁通知功能的文档。
SQLITE_INTROSPECTION_PRAGMAS
此选项已过时。它曾经启用一些额外的一些额外的 PRAGMA 语句,例如 PRAGMA function_list、PRAGMA module_list和 PRAGMA 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 核心没有影响。它仅由扩展程序使用。该选项对于压缩和解压缩功能是必需的,这些功能是命令行 shell中SQL Archive支持的 一部分。
使用此选项编译时,通常需要添加链接器选项以在构建中包含 zlib 库。通常此选项是“-lz”,但在不同的系统上可能会有所不同。
在 Windows 系统上使用 MSVC 构建时,可以将 zlib 源代码放在源代码树的 compat/zlib 子目录中,然后在 nmake 命令中添加 USE_ZLIB=1 选项,使 Makefile.msc 自动构建并使用一个适当的 zlib 库实现。
YYTRACK最大堆叠深度
此选项导致使用sqlite3_status ( SQLITE_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 文件以及编译生成 keywordhash.h 文件的“mkkeywordhash”工具时,也必须定义相同的 SQLITE_OMIT_* 选项集。因此,这些选项只能在库是从规范源构建时使用,而不是从合并. 某些 SQLITE_OMIT_* 选项在与amalgamation一起使用时可能会起作用,或者看起来会起作用。但这并不能保证。通常,始终从规范源编译以利用 SQLITE_OMIT_* 选项。
重要说明: SQLITE_OMIT_* 选项可能不适用于 合并。SQLITE_OMIT_* 编译时选项通常仅在 SQLite 从规范源文件构建时才能正常工作。
可以生成与一组预定的 SQLITE_OMIT_* 选项一起工作的 SQLite 合并的特殊版本。为此,请复制规范源代码分发中的 Makefile.linux-gcc 生成文件模板。将副本的名称更改为简单的“Makefile”。然后编辑“Makefile”以设置适当的编译时选项。然后输入:
make clean; make sqlite3.c
然后可以将生成的“sqlite3.c”合并代码文件(及其关联的头文件“sqlite3.h”)移动到非 unix 平台,以便使用本机编译器进行最终编译。
不支持 SQLITE_OMIT_* 选项。我们的意思是,在当前版本中从构建中省略代码的 SQLITE_OMIT_* 选项可能会在下一版本中成为空操作。或者反过来:在当前版本中是空操作的 SQLITE_OMIT_* 可能会导致代码在下一个版本中被排除。此外,并非所有 SQLITE_OMIT_* 选项都经过测试。某些 SQLITE_OMIT_* 选项可能会导致 SQLite 出现故障和/或提供不正确的答案。
重要说明: SQLITE_OMIT_* 编译时选项大多不受支持。
SQLITE_OMIT_ALTERTABLE
定义此选项时 ,库中不包含ALTER TABLE命令。执行ALTER TABLE语句会导致分析错误。
SQLITE_OMIT_ANALYZE
定义此选项后,构建中将省略 ANALYZE命令。
SQLITE_OMIT_ATTACH
SQLITE_OMIT_AUTHORIZATION
定义此选项会忽略库中的授权回调功能。库中不存在 sqlite3_set_authorizer() API 函数。
SQLITE_OMIT_AUTOINCREMENT
此选项省略了AUTOINCREMENT功能。定义此宏时,声明为“ INTEGER PRIMARY KEY AUTOINCREMENT”的列的行为方式与插入 NULL 时声明为“ INTEGER PRIMARY KEY ”的列的行为方式相同。sqlite_sequence 系统表既不会创建,也不会被尊重(如果它已经存在)。
SQLITE_OMIT_AUTOINIT
为了向后兼容缺少sqlite3_initialize()接口的旧版本 SQLite, sqlite3_initialize()接口会在进入某些关键接口(例如 sqlite3_open()、sqlite3_vfs_register()和sqlite3_mprintf() )时自动调用。通过使用 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_ROW、SQLITE_BUSY或SQLITE_LOCKED以外的任何内容后再次调用,将返回SQLITE_MISUSE ,除非中间调用了sqlite3_reset()。
在 SQLite版本 3.6.23.1 (2010-03-26) 及更早版本中,如果在返回除SQLITE_ROW以外的任何内容后再次调用它而没有对 sqlite3_reset() 的干预调用,则sqlite3_step ( )过去总是返回SQLITE_MISUSE。这导致一些编写不当的智能手机应用程序出现问题,这些应用程序无法正确处理SQLITE_LOCKED和SQLITE_BUSY错误返回。SQLite 的行为在 3.6.23.2 中被更改为自动重置准备好的语句,而不是修复许多有缺陷的智能手机应用程序。但这种改变导致其他未正确实施的应用程序出现问题,这些应用程序实际上正在寻找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 标志。如果一个支持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功能。 使用 UNION、UNION ALL、INTERSECT 或 EXCEPT 复合 SELECT 运算符的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_changes、 PRAGMA data_store_directory、 PRAGMA default_cache_size、 PRAGMA empty_result_callbacks、 PRAGMA full_column、 PRAGMA full_column 、 PRAGMA full_column杂注 temp_store_directory。
SQLITE_OMIT_DESERIALIZE
此选项会导致 从构建中省略 sqlite3_serialize()和sqlite3_deserialize()接口。
SQLITE_OMIT_DISKIO
此选项忽略对写入磁盘的所有支持并强制数据库仅存在于内存中。此选项尚未维护,可能不适用于较新版本的 SQLite。
SQLITE_OMIT_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_list、PRAGMA module_list和 PRAGMA pragma_list的支持。
SQLITE_OMIT_JSON
此选项从构建中 省略JSON SQL 函数。
SQLITE_OMIT_LIKE_OPTIMIZATION
此选项禁用 SQLite 使用索引来帮助解析WHERE 子句中的 LIKE和GLOB运算符的能力。
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-Tree 平衡例程。使用此选项会使 SQLite 稍微变小,但会使其运行速度稍慢。
SQLITE_OMIT_REINDEX
定义此选项时 ,库中不包含REINDEX命令。执行REINDEX语句会导致分析错误。
SQLITE_OMIT_SCHEMA_PRAGMAS
定义此选项会省略用于从构建中查询数据库架构的编译指示。
SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
定义此选项会省略用于查询和修改构建中的数据库架构版本和用户版本的编译指示。具体来说,省略了 schema_version和user_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
此选项省略了对 TEMP 或 TEMPORARY 表的支持。
SQLITE_OMIT_TRACE
此选项省略了对sqlite3_profile()和 sqlite3_trace()接口及其关联逻辑的支持。
SQLITE_OMIT_TRIGGER
定义此选项会忽略对 TRIGGER 对象的支持。在这种情况下, CREATE TRIGGER或DROP TRIGGER命令都不 可用,尝试执行其中任何一个都会导致解析错误。此选项还禁用外键约束的强制执行,因为实现触发器且被此选项省略的代码也用于实现外键操作。
SQLITE_OMIT_TRUNCATE_OPTIMIZATION
SQLite 的默认构建,如果DELETE语句没有 WHERE 子句并且在没有触发器的表上运行,则会发生优化,通过删除和重新创建表来导致 DELETE 发生。删除和重新创建表通常比逐行删除表内容要快得多。这就是“截断优化”。
SQLITE_OMIT_UTF16
该宏用于省略对 UTF16 文本编码的支持。定义此后,所有返回或接受 UTF16 编码文本的 API 函数均不可用。这些函数可以通过它们以“16”结尾的事实来识别,例如sqlite3_prepare16()、sqlite3_column_text16()和 sqlite3_bind_text16()。
SQLITE_OMIT_VACUUM
SQLITE_OMIT_VIEW
定义此选项会忽略对 VIEW 对象的支持。在这种情况下, CREATE VIEW和DROP VIEW命令都不 可用,尝试执行其中任何一个都会导致解析错误。
警告:如果定义了这个宏,将无法打开架构包含 VIEW 对象的数据库。
SQLITE_OMIT_VIRTUALTABLE
此选项省略了对 SQLite 中虚拟表机制的支持。
SQLITE_OMIT_WAL
SQLITE_OMIT_WINDOWFUNC
此选项从构建中 省略窗口函数。
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_config(SQLITE_CONFIG_MALLOC,...)或 sqlite3_config(SQLITE_CONFIG_HEAP,...)替换。因此,此编译时选项的最终效果是它允许针对不支持 malloc()、free() 和/或 realloc() 的系统库编译和链接 SQLite。
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 标识了一个外部可见的接口。这个宏有时被设置为“extern”。但定义是特定于编译器的。
SQLITE_APICALL
此宏标识 SQLite 中接受固定数量参数的公共接口例程使用的调用约定。该宏通常定义为空,但在 Windows 构建中它有时可以设置为“__cdecl”或“__stdcall”。“__cdecl”设置是默认设置,但“__stdcall”用于将 SQLite 编译为 Windows 系统库时使用。
单个函数声明不应超过以下一项: SQLITE_APICALL、SQLITE_CDECL或SQLITE_SYSAPI。
SQLITE_CALLBACK
此宏指定在 SQLite 中与回调指针一起使用的调用约定。该宏通常定义为空,但在 Windows 构建中它有时可以设置为“__cdecl”或“__stdcall”。“__cdecl”设置是默认设置,但“__stdcall”用于将 SQLite 编译为 Windows 系统库时使用。
SQLITE_CDECL
此宏指定 SQLite 中可变参数接口例程使用的调用约定。该宏通常定义为空,但在 Windows 构建中有时可以将其设置为“__cdecl”。此宏用于可变参数例程,因此不能设置为“__stdcall”,因为 __stdcall 调用约定不支持可变参数函数。
单个函数声明不应超过以下一项: SQLITE_APICALL、SQLITE_CDECL或SQLITE_SYSAPI。
SQLITE_EXTERN
此宏指定 SQLite 中公共接口变量的链接。通常应该允许它默认为“extern”。
SQLITE_STDCALL
此宏不再使用,现已弃用。
SQLITE_SYSAPI
此宏标识操作系统接口为 SQLite 构建的目标平台使用的调用约定。该宏通常定义为空,但在 Windows 构建中有时可以将其设置为“__stdcall”。
单个函数声明不应超过以下一项: SQLITE_APICALL、SQLITE_CDECL或SQLITE_SYSAPI。
SQLITE_TCLAPI
此宏指定 TCL库接口例程使用的调用约定。SQLite 核心不使用该宏,仅供TCL Interface 和TCL test suite使用。该宏通常定义为空,但在 Windows 构建中有时可以将其设置为“__cdecl”。此宏用于 TCL 库接口例程,这些例程始终编译为 __cdecl,即使在更喜欢使用 __stdcall 的平台上也是如此,因此不应将此宏设置为 __stdcall,除非平台具有支持 __stdcall 的自定义 TCL 库构建。
该宏不能与SQLITE_APICALL、 SQLITE_CALLBACK、SQLITE_CDECL或SQLITE_SYSAPI中的任何一个结合使用。