SQLite超详细的编译时选项(十六)

65 篇文章 1 订阅
62 篇文章 3 订阅

返回:SQLite—系列文章目录   

上一篇:SQLite数据库文件格式(十五)

下一篇:SQLite 在Android安装与定制方案(十七)

1. 概述

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

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

对于以下应用程序,建议使用以下编译时选项 能够使用它们,以最大限度地减少 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%。 但缺点是,使用编译时选项意味着 SQLite 永远无法 一次由多个线程使用,即使每个线程都有自己的线程 数据库连接。

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

  4. SQLITE_DEFAULT_WAL_SYNCHRONOUS=1。 为了在断电后最大限度地提高数据库安全性,建议设置 PRAGMA synchronous=FULL。但是,在 WAL 模式下,完成 使用 PRAGMA synchronous=NORMAL 保证数据库完整性。在 WAL 模式下使用 PRAGMA synchronous=NORMAL 时,最近对数据库所做的更改可能会 因断电而回滚,但数据库不会损坏。 此外,在 WAL 模式下,事务提交速度要快得多,使用 synchronous=NORMAL 比默认的 synchronous=FULL 更胜一筹。对于这些 原因,建议将同步设置从 切换到 WAL 模式时,FULL 设置为 NORMAL。此编译时选项将 完成它。

  5. SQLITE_LIKE_DOESNT_MATCH_BLOBS。 从历史上看,SQLite 允许 BLOB 操作数用于 LIKE 和 GLOB 运算符。但是将 BLOB 作为 LIKE 或 GLOB 的操作数会变得复杂 并减慢 LIKE 优化。设置此选项后,表示 如果任一操作数为 BLOB,则 LIKE 和 GLOB 运算符始终返回 FALSE。 这简化了 LIKE 优化的实现,并允许 使用 LIKE 优化来加快运行速度的查询。

  6. SQLITE_MAX_EXPR_DEPTH=0。 将最大表达式解析树深度设置为零将禁用所有检查 表达式 parse-tree depth,它简化了代码,导致 更快的执行速度,并帮助解析树使用更少的内存。

  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()。 如果使用 -DSQLITE_OMIT_AUTOINIT 编译 SQLite 并调用 sqlite3_malloc() 或 sqlite3_vfs_find() 或 sqlite3_open() 等例程 如果不先调用 sqlite3_initialize(),可能的结果将是 段错误。

  13. SQLITE_STRICT_SUBTYPE=1。 如果应用程序定义了 没有 SQLITE_RESULT_SUBTYPE 属性的函数 调用 sqlite3_result_subtype() 接口。sqlite3_result_subtype() 除非注册了函数,否则接口无法可靠工作 与SQLITE_RESULT_SUBTYPE属性。此编译时选项 旨在引起开发人员的注意 早。

当使用上述所有推荐的编译时选项时, 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未定义或为假,则SQLite将替换其自己的本地 isnan() 的实现。

HAVE_LOCALTIME_R

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

HAVE_LOCALTIME_S

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

HAVE_MALLOC_USABLE_SIZE

如果 HAVE_MALLOC_USABLE_SIZE 选项为 true,则 SQLite 尝试使用 malloc_usable_size() 接口来查找所获得的内存分配的大小 来自标准库 malloc() 或 realloc() 例程。此选项仅 如果使用 standard-library 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_UTIME

如果 HAVE_UTIME 选项为 true,则内置但非标准 “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的初始设置。 对于 3.7.17 之前的所有 SQLite 版本, 如果出现以下情况,通常会为新数据库连接启用自动索引 省略此编译时选项。 但是,这可能会在 SQLite 的未来版本中发生变化。

另请参阅:SQLITE_OMIT_AUTOMATIC_INDEX

SQLITE_DEFAULT_AUTOVACUUM=<0 或 1 或 2>

此宏确定 SQLite 是否创建数据库,其 auto_vacuum 标志默认设置为 OFF (0)、FULL (1) 或 增量 (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 起的所有版本 SQLite (2006-01-10) 可以读取和写入任何模式格式 介于 1 和 4 之间。但是旧版本的SQLite可能无法 读取格式大于 1。因此,旧版本的 SQLite 将 能够读取和写入由较新版本创建的数据库文件 对于 SQLite,默认架构格式设置为 1 通过 3.7.9 (2011-11-01)。从版本 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_configSQLITE_CONFIG_MMAP_SIZE) 调用,或在运行时 使用mmap_size Pragma

SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=<字节>

此选项设置在持久日志模式独占锁定模式下的回滚日志文件的大小限制,以及 WAL 模式下的预写日志文件。当这个 compile-time 选项被省略,因为 回滚日志或预写日志的大小。 日志文件大小限制 可以在运行时使用 journal_size_limit 编译指示进行更改。

SQLITE_DEFAULT_LOCKING_MODE=<1 或 0>

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

SQLITE_DEFAULT_LOOKASIDE=SZ,N

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

SQLITE_DEFAULT_MEMSTATUS=<1 或 0>

此宏用于确定是否启用了功能,并且 默认情况下,使用 SQLITE_CONFIG_MEMSTATUS 参数禁用 sqlite3_config() 可用。默认值为 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 synchronous 语句的数据库文件,然后 同步设置将更改为 由 SQLITE_DEFAULT_WAL_SYNCHRONOUS数据库连接切换时 首次进入 WAL 模式。 如果 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_DDL 和 SQLITE_DBCONFIG_DQS_DML 的默认值,其中 反过来确定 SQLite 如何处理每个双引号字符串文本。 “DQS”名称代表 “Double-Q uoted String”. N 参数应为整数 0、1、2 或 3。

SQLITE_DQS允许使用双引号字符串言论
在 DDL 中在 DML 中
3是的是的违约
2是的
1是的
0推荐

建议设置为 0,表示双引号 在所有上下文中都不允许使用字符串。但是,默认 设置为 3 以实现与旧应用程序的最大兼容性。

SQLITE_EXTRA_DURABLE

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

SQLITE_FTS3_MAX_EXPR_DEPTH=N

此宏设置搜索树的最大深度,该深度对应于 FTS3 或 FTS4 全文中 MATCH 运算符的右侧 指数。全文搜索采用递归算法,因此深度 树受到限制,以防止使用过多的堆栈空间。默认值 限制为 12。此限制足以满足 4095 个搜索词的需求 MATCH 运算符的右侧,它将堆栈空间使用情况保持在 小于 2000 字节。

对于普通的 FTS3/FTS4 查询,搜索树深度约为 项数的以 2 为底的对数在 MATCH 运算符。但是,对于短语查询和 NEAR 查询, 搜索树深度在右侧术语的数量上是线性的。 因此,默认深度限制 12 足以满足多达 4095 个普通 MATCH 上的术语,它仅适用于 11 或 12 个短语或 NEAR 条款。即便如此,默认值对于大多数应用程序来说还是绰绰有余的。

SQLITE_JSON_MAX_DEPTH=N

此宏设置 JSON 对象和数组的最大嵌套深度。 默认值为 1000。

JSON SQL 函数使用递归体面的解析器。 这意味着深度嵌套的 JSON 可能需要大量堆栈空间来 解析。在堆栈空间有限的系统上,可以使用 大大降低了最大 JSON 嵌套深度,以避免 堆栈溢出,甚至来自敌对输入。通常值为 10 或 20 即使对于最复杂的现实世界 JSON 也足够了。

SQLITE_LIKE_DOESNT_MATCH_BLOBS

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

这个编译时选项使SQLite在处理时更有效地运行 使用 LIKE 运算符的查询,以向后中断为代价 兼容性。但是,向后兼容性中断可能只是 技术性。LIKE 处理逻辑中存在一个长期存在的错误 (见 SQLite: View Ticket)导致它 BLOB 操作数的不当行为,几乎没有人观察到该错误 10 年积极使用。因此,对于更多用户来说,可能是安全的 启用此编译时选项,从而节省一点 CPU 时间 在 LIKE 查询上。

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

SQLITE_MAX_MEMORY=N

此选项限制了 SQLite 将请求的内存总量 从 malloc() 到 N 个字节。SQLite的任何分配尝试 导致 SQLite 持有的所有分配的总和超过 N 个字节的新内存将导致内存不足错误。 这是一个硬性上限。另请参阅 sqlite3_soft_heap_limit() 接口。

此选项是对分配的内存量的限制。 请参阅SQLITE_MAX_ALLOCATION_SIZE选项,了解金额限制 任何单个内存分配中允许的内存。

仅当内存使用情况统计信息通过以下方式提供时,此限制才有效 sqlite3_memory_used() 和 sqlite3_status64(SQLITE_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_limitdb,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 的底层文件系统的 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')”。 N 的值通常约为 100000 就足够了。

printf() SQL 函数受 sqlite3_limit() 的SQLITE_LIMIT_LENGTH限制。因此,任何 printf() 结果都带有 宽度或精度超过SQLITE_LIMIT_LENGTH将导致的 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 子句的行顺序 将永远是一样的。

SQLITE_SORTER_PMASZ=N

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

SQLITE_STMTJRNL_SPILL=N

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

SQLITE_WIN32_MALLOC

此选项允许将 Windows 堆 API 函数用于内存 分配而不是标准库 malloc() 和 free() 例程。

YYSTACKDEPTH=<max_depth>

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

5. 设置大小限制的选项

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

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

还有一些大小限制不能使用 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 或字符串进行大量读取,此选项进行了改进 读取性能。

从版本 3.45.0 (2024-01-15) 开始,此选项由 违约。要禁用它,请使用 -DSQLITE_DIRECT_OVERFLOW_READ=0。

SQLITE_HAVE_ISNAN

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

SQLITE_MAX_ALLOCATION_SIZE=N

此编译时选项设置内存大小的上限 可以使用 sqlite3_malloc64()、sqlite3_realloc64() 等请求的分配。默认值为 2,147,483,391 (0x7ffffeff),这应该被视为 上界。大多数应用程序都可以通过最大分配 几百万字节的大小。

这是对任何单个内存分配的最大大小的限制。 它不是对分配的内存总量的限制。 有关内存总量的限制,请参阅SQLITE_MAX_MEMORY 分配。

减小单个内存分配的最大大小可提供 针对试图耗尽的拒绝服务攻击提供额外防御 系统内存通过执行许多大型分配。它也是一个额外的层 对内存分配大小的应用程序 bug 的防御 使用可能溢出的有符号 32 位整数进行计算→ 由于最大分配大小较小,因此内存分配大小有缺陷 由于内存不足错误,计算可能会更快地被发现 在整数实际溢出之前。

SQLITE_OS_OTHER=<0 或 1>

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

此选项通常用于为嵌入式构建 SQLite 具有自定义操作系统的平台。

SQLITE_SECURE_DELETE

此编译时选项更改secure_delete编译指示的默认设置。如果不使用此选项,则secure_delete默认值 关闭。如果存在此选项,则secure_delete默认为 on。

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 将默认线程模式设置为 Serialized。SQLITE_THREADSAFE=2 将默认线程模式设置为多线程。SQLITE_THREADSAFE=0 将线程模式设置为单线程。

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

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

也可以使用 sqlite3_open_v2() 的 SQLITE_OPEN_NOMUTEX 和 SQLITE_OPEN_FULLMUTEX 标志 在运行时调整单个数据库连接线程模式

请注意,当 SQLite 编译时 SQLITE_THREADSAFE=0,代码 使 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_SCHEMA 和 PRAGMA trusted_schema 设置的默认值。 如果未指定替代项,则 trusted-schema 设置默认值 设置为 ON(值为 1)以实现旧版兼容性。但是,为了最好 安全性,实现应用程序定义的 SQL 函数和/或虚拟表的系统应 请考虑将默认值更改为 OFF。

SQLITE_USE_URI

此选项会导致 URI 文件名进程逻辑通过以下方式启用 违约。

7. 启用通常关闭的功能的选项

SQLITE_ALLOW_URI_AUTHORITY

如果 authority 部分为 既不是空的,也不是“localhost”。但是,如果 SQLite 是用 SQLITE_ALLOW_URI_AUTHORITY编译时选项,则 URI 为 转换为统一命名约定 (UNC) 文件名并传递 以这种方式深入到底层操作系统。

SQLite的某些未来版本可能会更改以启用此功能 默认情况下。

SQLITE_ALLOW_COVERING_INDEX_SCAN=<0 或 1>

此 C 预处理宏确定 SQLITE_CONFIG_COVERING_INDEX_SCAN 配置设置的默认设置。它默认 到 1 (on),这意味着覆盖索引用于全表 尽可能进行扫描,以减少 I/O 并提高性能。 但是,使用覆盖率进行全面扫描将导致结果 以与 legacy 不同的顺序显示,这可能会导致一些 (编码错误)遗留应用程序中断。因此,覆盖物 索引扫描选项可以在编译时在系统上禁用 以最大程度地降低他们在遗留应用程序中暴露错误的风险。

SQLITE_ENABLE_8_3_NAMES=<1 或 2>

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

SQLITE_ENABLE_API_ARMOR

定义后,此 C 预处理器宏会激活额外的代码,这些代码 尝试检测 SQLite API 的滥用,例如传入 NULL 指向所需参数的指针或在对象被使用后使用对象 摧毁。启用此选项且 API 使用非法时 检测到时,接口通常会返回SQLITE_MISUSE。

SQLITE_ENABLE_API_ARMOR选项并不能保证所有 将检测到非法的 API 使用。即使当 SQLITE_ENABLE_API_ARMOR已启用,传递不正确的值 进入 C 语言 API 可能会导致由于分段而导致进程崩溃 错误或空指针服从或其他原因。这 SQLITE_ENABLE_API_ARMOR编译时选项旨在作为辅助 用于应用程序测试和调试选项。应用 不应依赖SQLITE_ENABLE_API_ARMOR来保证安全。 SQLITE_ENABLE_API_ARMORE 适合作为 防御应用程序错误,但它不应该是唯一的 防御。如果任何 SQLite 接口返回SQLITE_MISUSE,则 指示应用程序正在使用 SQLite,这与 规范,并且应用程序包含一个错误。The SQLITE_MISUSE 返回为应用程序提供了响应的机会 优雅地处理该错误,而不是简单地使进程崩溃, 但仅此而已。应用程序不应使用或依赖 SQLITE_MISUSE进行常规处理。

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 上受支持。但是,界面 通常实现,将 sqlite3_file_control() 与 SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 和 SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 一起使用,因此可以将该功能添加到 前途。启用此选项后,SQLite 会自动检测 底层文件系统支持批量原子写入,以及 当它这样做时,它避免为事务写入回滚日志 控制。这可以使交易速度提高一倍以上,而 同时减少 SSD 存储设备的磨损。

SQLite的未来版本可能会启用batch-atomic-write 默认情况下,此时此编译时选项 将变得多余。

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_ENABLE_EXPLAIN_COMMENTS编译时选项 如果启用了SQLITE_DEBUG,则自动执行。

SQLITE_ENABLE_FTS3

合并中定义此选项时,版本 3 和 4 的全文搜索引擎会自动添加到构建中。

SQLITE_ENABLE_FTS3_PARENTHESIS

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

SQLITE_ENABLE_FTS3_TOKENIZER

此选项启用 fts3_tokenizer() 接口的双参数版本。fts3_tokenizer() 的第二个参数假定为 指向实现 应用程序定义的分词器。如果敌对行为者能够逃跑 具有任意秒数的 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

合并中定义此选项时,版本 3 和 4 的全文搜索引擎会自动添加到构建中。

SQLITE_ENABLE_FTS5

合并中定义此选项时,版本 5 的全文搜索引擎 (FTS5) 会自动添加到构建中。

SQLITE_ENABLE_GEOPOLY

合并中定义此选项后,Geopoly 扩展模块将包含在构建中。

SQLITE_ENABLE_HIDDEN_COLUMNS

合并中定义此选项时, 为虚拟表启用了隐藏列功能。

SQLITE_ENABLE_ICU

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

SQLITE_ENABLE_IOTRACE

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

SQLITE_ENABLE_MATH_FUNCTIONS

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

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 Filing Protocol)协议的系统。锁 通过调用库函数 _AFPFSSetLock() 获得。

  • 羊群锁定方式。这用于不 支持POSIX锁定样式。锁是使用 flock() 系统调用。

  • 点文件锁定样式。当两者都不使用时,使用此锁定样式 文件系统不支持 flock 和 POSIX 锁定样式。 数据库锁是通过在文件系统中创建和输入来获取的 在相对于数据库文件(“点文件”)的已知位置 并通过删除同一文件来放弃。

  • 无锁定方式。如果以上都不支持,则 使用锁定样式。不使用数据库锁定机制。什么时候 使用此系统时,单个数据库是不安全的 由多个客户端访问。

此外,还提供了五个额外的 VFS 实现以及 违约。通过指定一个额外的 VFS 实现 调用 sqlite3_open_v2() 时,应用程序可能会绕过文件系统 检测逻辑,并显式选择上述锁定样式之一。这 五个额外的 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模块将所有分配四舍五入到下一个幂 两个,并使用首次拟合的伙伴分配器算法 这为防止碎片化和崩溃提供了强有力的保证 受某些操作限制。

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-tree 存储引擎,虚拟机中的新操作码 运行 SQL 语句,并在 代码生成器。为了避免在不这样做的应用程序中产生这种开销 需要 sqlite_offset(X) 的效用,该函数被禁用 违约。

SQLITE_ENABLE_PREUPDATE_HOOK

此选项启用多个提供回调的新 API 在对 Rowid 表进行任何更改之前。可以使用回调 记录更改发生前的行状态。

preupdate 钩子的操作与 update hook 类似,只是回调是 在更改之前调用,而不是在更改之后调用,并且在预更新之前调用 除非此编译时选项是 使用。

更新前的挂钩接口最初被添加到 支持会话扩展。

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_configSQLITE_CONFIG_SORTERREF_SIZE) 接口设置分拣器引用大小阈值。

因为 SQLite 开发人员不知道 SQLITE_ENABLE_SORTER_REFERENCES选项将有助于或损害性能, 目前默认禁用 (2018-05-04)。它可能已启用 默认情况下,在未来的某些版本中,取决于对其 对性能的影响。

SQLITE_ENABLE_STMT_SCANSTATUS

此选项启用 sqlite3_stmt_scanstatus() 和 sqlite3_stmt_scanstatus_v2() 接口。那些 接口通常从构建中省略 因为它们施加了绩效惩罚,即使是对 请勿使用该功能。

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_ENABLE_STAT3 取代 SQLite 版本 3.7.9 (2011-11-01). SQLITE_ENABLE_STAT2编译时选项 现在是无操作。

SQLITE_ENABLE_STAT3

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

SQLITE_ENABLE_STAT4

此选项将附加逻辑添加到 ANALYZE 命令和 可以帮助SQLite选择更好的查询方案的查询规划器 在某些情况下。ANALYZE 命令已得到增强,可以收集 来自每个索引的所有列的直方图数据并存储该数据 在sqlite_stat4表中。然后,查询规划器将使用 直方图数据,以帮助它做出更好的指数选择。的缺点 此编译时选项违反了查询规划器稳定性保证,使其更难确保 在大规模生产的应用中具有一致的性能。

SQLITE_ENABLE_STAT4是对SQLITE_ENABLE_STAT3的增强。统计3 仅记录每个索引最左边列的直方图数据 而 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 查询计划。而不是抛出错误, SQLite 将插入一个名为“unknown()”的替代 no-op 函数。 用“unknown()”代替无法识别的函数 仅发生在 EXPLAIN 和 EXPLAIN QUERY PLAN 上,不发生在普通的 语句。

命令行 shell 中使用时, SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION功能允许包含 要粘贴到 shell 中的应用程序定义函数 分析和调试,无需创建和加载 实现应用程序定义函数的扩展。

SQLITE_ENABLE_UNLOCK_NOTIFY

此选项启用 sqlite3_unlock_notify() 接口和 其相关功能。有关其他内容,请参阅标题为“使用SQLite解锁通知功能”的文档 信息。

SQLITE_INTROSPECTION_PRAGMAS

此选项已过时。它曾经启用一些额外的 一些额外的 PRAGMA 语句,例如 PRAGMA function_listPRAGMA module_list 和 PRAGMA pragma_list,但这些 PRAGMA 现在都是 默认启用。请参见SQLITE_OMIT_INTROSPECTION_PRAGMAS

SQLITE_SOUNDEX

此选项启用 soundex() SQL 函数

SQLITE_STRICT_SUBTYPE=1

此选项会导致应用程序定义的 SQL 函数引发 SQL 如果他们调用 sqlite3_result_subtype() 接口,则出错,但 未在SQLITE_RESULT_SUBTYPE财产中注册。 此推荐选项有助于识别 在早期实现应用程序定义的 SQL 函数 开发周期。

SQLITE_USE_ALLOCA

如果启用此选项,则 alloca() 内存分配器将是 在一些适当的情况下使用。这导致略有 更小、更快的二进制文件。仅SQLITE_USE_ALLOCA编译时 当然,在支持 alloca() 的系统上工作。

SQLITE_USE_FCNTL_TRACE

此选项会导致 SQLite 发出额外的SQLITE_FCNTL_TRACE文件控件 向VFS提供补充信息。“vfslog.c”扩展 利用此功能提供 VFS 活动的增强日志。

SQLITE_USE_SEH

此选项在 Windows 版本上启用了结构化异常处理 (SEH)。 SEH 是一种特定于 Windows 的技术,用于捕获在 访问内存映射文件。SEH 用于拦截可能 在访问属于 WAL 模式处理一部分的内存映射 SHM 文件时发生。如果操作系统在 SQLite 时引发错误 正在尝试访问 shm 文件,此选项会导致这些错误 被SQLite捕获和处理,而不是中止整个过程。

此选项仅在使用 MSVC 在 Windows 上编译时有效。

SQLITE_HAVE_ZLIB

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

此选项对 SQLite 核心没有影响。它仅由扩展使用。 这是压缩和解压缩所必需的选项 属于命令行 shell 中的 SQL 存档的函数支持。

使用此选项编译时,它通常会 需要添加链接器选项以将 zlib 库包含在 建。正常情况下,此选项是“-lz”,但在不同的 系统。

在 Windows 系统上使用 MSVC 构建时,可以放置 zlib 源代码 代码,然后添加 nmake 命令的 USE_ZLIB=1 选项导致 Makefile.msc 自动构建和使用适当的 zlib 库实现。

YYTRACKMAXSTACKDEPTH

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

8. 禁用正常打开的功能的选项

SQLITE_DISABLE_LFS

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

SQLITE_DISABLE_DIRSYNC

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

SQLITE_DISABLE_FTS3_UNICODE

如果定义了此 C 预处理器宏,则 unicode61 分词器 FTS3 中的构建被省略,并且不可用于 应用。

SQLITE_DISABLE_FTS4_DEFERRED

如果此 C 预处理器宏禁用“延迟令牌”优化 在 FTS4 中。“延迟令牌”优化避免了大量加载 发布馆藏中大多数文档中的术语列表 而只是扫描文档源中的这些标记。FTS4 在有和没有这种优化的情况下应该得到完全相同的答案。

SQLITE_DISABLE_INTRINSIC

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

SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS

此选项禁用 sqlite3_status() SQLITE_STATUS_PAGECACHE_OVERFLOW 和 SQLITE_STATUS_PAGECACHE_SIZE 统计信息的收集。设置此选项已被证明可以提高以下性能: 高并发多线程应用程序。

9. 省略功能的选项

以下选项可用于通过省略未使用的功能来减小已编译库的大小。这可能只有用 在空间特别紧张的嵌入式系统中,即使所有 SQLite库包含的功能相对较小。别忘了 告诉编译器优化二进制大小!(如果 -Os 选项 使用 GCC)。告诉编译器优化大小通常有 对图书馆占用空间的影响比采用其中任何一种都要大得多 编译时选项。您还应该验证调试选项是否已禁用。

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

如果定义了这些选项中的任何一个,则同一组 SQLITE_OMIT_* 使用 Lemon 解析器生成器工具生成 parse.c 文件,并在编译生成 关键字hash.h 文件。 因此,这些选项只能在生成库时使用 来自规范来源,而不是来自合并。 某些 SQLITE_OMIT_* 选项在与 合并。但这并不能保证。通常,始终编译 从规范来源,以便利用 SQLITE_OMIT_* 选项。

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

SQLite合并的特殊版本,可以与 可以生成一组预定的 SQLITE_OMIT_* 选项。为此, 在规范中复制 Makefile.linux-gcc makefile 模板 源代码分发。将副本的名称更改为“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_* 编译时选项大多不受支持。

以下是可用的 OMIT 选项:

SQLITE_OMIT_ALTERTABLE

定义此选项后,ALTER TABLE 命令不包含在 图书馆。执行 ALTER TABLE 语句会导致分析错误。

SQLITE_OMIT_ANALYZE

定义此选项时,将省略 ANALYZE 命令 构建。

SQLITE_OMIT_ATTACH

定义此选项后,ATTACH 和 DETACH 命令为 从构建中省略。

SQLITE_OMIT_AUTHORIZATION

定义此选项会省略 图书馆。sqlite3_set_authorizer() API 函数不存在 在图书馆中。

SQLITE_OMIT_AUTOINCREMENT

此选项省略了 AUTOINCREMENT 功能。 当定义此宏时,列声明为 “整数主键自动增量” 行为方式与声明为“INTEGER PRIMARY KEY”的列相同,当 插入 NULL。既不会创建sqlite_sequence系统表,也不会创建 如果它已经存在,则受到尊重。

SQLITE_OMIT_AUTOINIT

为了向后兼容缺少的旧版本的 SQLite sqlite3_initialize() 接口、sqlite3_initialize() 接口 在进入某些关键接口(如 sqlite3_open()sqlite3_vfs_register() 和 sqlite3_mprintf())时自动调用。 在此情况下自动调用 sqlite3_initialize() 的开销 通过使用 SQLITE_OMIT_AUTOINIT 构建 SQLite 可以省略 C 预处理器宏。使用 SQLITE_OMIT_AUTOINIT 构建时,SQLite 不会自动初始化自身,并且需要应用程序 sqlite3_initialize在开始使用 SQLite 库。

SQLITE_OMIT_AUTOMATIC_INDEX

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

SQLITE_OMIT_AUTORESET

默认情况下,sqlite3_step() 接口将在必要时自动调用 sqlite3_reset() 来重置准备好的语句。这 编译时选项更改该行为,以便 sqlite3_step() 将 如果返回其他任何内容后再次调用,则返回SQLITE_MISUSE 比 SQLITE_ROWSQLITE_BUSY 或 SQLITE_LOCKED 除非有 对 sqlite3_reset() 的干预调用。

在 SQLite 版本 3.6.23.1 中 (2010-03-26) 而更早,sqlite3_step() 过去总是 如果在返回任何内容后再次调用,则返回SQLITE_MISUSE 除了没有对 sqlite3_reset() 的干预调用的SQLITE_ROW。 这导致了一些写得不好的智能手机应用程序出现问题,这些应用程序 未正确处理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 被静默忽略),但不返回值 或修改数据库文件中的自动抽真空标志。如果数据库 支持自动真空是由使用此选项编译的库打开的,它 以只读模式自动打开。

SQLITE_OMIT_BETWEEN_OPTIMIZATION

此选项禁止使用带有 WHERE 子句术语的索引 使用 BETWEEN 运算符。

SQLITE_OMIT_BLOB_LITERAL

定义此选项后,无法在 使用 X'ABCD' 语法的 SQL 语句。

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的编译。

SQLITE_OMIT_COMPLETE

此选项会导致省略 sqlite3_complete() 和 sqlite3_complete16() 接口。

SQLITE_OMIT_COMPOUND_SELECT

此选项用于省略复合 SELECT 功能。使用 UNION、UNION ALL、INTERSECT 或 EXCEPT 复合 SELECT 运算符将 导致分析错误。

在 VALUES 子句中具有多个值的 INSERT 语句是 在内部作为复合 SELECT 实现。因此,此选项也 禁用使用 插入...值。。。陈述。

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_names、 PRAGMA 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编译指示的支持。

SQLITE_OMIT_INTROSPECTION_PRAGMAS

此选项省略了对 PRAGMA function_listPRAGMA 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

定义此值时,库不遵循特殊数据库 name “: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_version 和 user_version PRAGMA。

SQLITE_OMIT_SHARED_CACHE

此选项在不支持共享缓存模式的情况下生成 SQLite。 省略了 sqlite3_enable_shared_cache() 和 fair 与共享关联的 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 命令都不可用,并且正在尝试执行 两者都会导致解析错误。 此选项还禁用外键约束的强制执行, 因为实现触发器的代码被省略了 option 还用于实现外键操作

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

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

SQLITE_OMIT_VIEW

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

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

SQLITE_OMIT_VIRTUALTABLE

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

SQLITE_OMIT_WAL

此选项省略了“预写日志”(也称为“WAL”)功能。

SQLITE_OMIT_WINDOWFUNC

此选项从生成中省略窗口函数

SQLITE_OMIT_WSD

此选项生成一个 SQLite 库版本,该版本不包含 可写静态数据 (WSD)。WSD 是全局变量和/或静态变量 变量。某些平台不支持 WSD,此选项是必需的 为了让SQLite能够运行这些平台。

与其他使 SQLite 库更小的 OMIT 选项不同, 这个选项实际上增加了SQLite的大小并使其运行 慢一点。仅当 SQLite 是为 不支持 WSD 的嵌入式目标。

SQLITE_OMIT_XFER_OPT

此选项省略了对帮助语句的优化的支持 形式为“插入......选择......”跑得更快。

SQLITE_UNTESTABLE

标准的 SQLite 构建包含少量关联的逻辑 用 sqlite3_test_control() 进行锻炼 否则难以验证的 SQLite 核心部分。 此编译时选项省略了额外的测试逻辑。这 编译时选项之前称为“SQLITE_OMIT_BUILTIN_TEST” 更新到 SQLite 版本 3.16.0 (2017-01-02)。名称已更改 更好地描述使用它的含义。

设置此编译时选项会阻止 SQLite 完全 可测试。分支测试覆盖率从 100% 下降到 95% 左右。

SQLite 开发人员遵循 NASA 的原则 “飞你测试的东西,测试你飞的东西”。违反了这一原则 如果在交付时启用此选项,但在测试中禁用此选项。 但是,如果在测试期间启用了此选项,则并非所有分支都启用了此选项 到达。因此,不建议使用此编译时选项。

SQLITE_ZERO_MALLOC

此选项从生成中省略默认内存分配器调试内存分配器,并替换存根 内存分配器总是失败。SQLite 不会运行 存根内存分配器,因为它将无法分配内存。但 可以在启动时使用 sqlite3_configSQLITE_CONFIG_MALLOC,...) 或 sqlite3_configSQLITE_CONFIG_HEAP,...) 替换此存根。 因此,这个编译时选项的净效果是它允许 SQLite 针对不支持的系统库进行编译和链接 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

此选项强制 Win32 本机内存分配器(启用后)执行 对 HeapValidate() 函数进行策略性调用,如果 assert() 也是 启用。

12. 编译器链接和调用约定控制

以下宏指定接口详细信息 对于某些类型的 SQLite 构建。Makefile 通常会 自动处理设置这些宏。应用程序开发人员应该 无需担心这些宏。以下有关这些的文档 为了完整起见,包含宏。

SQLITE_API

此宏标识 SQLite 的外部可见接口。 此宏有时设置为“extern”。但定义是 特定于编译器。

SQLITE_APICALL

此宏标识公共接口使用的调用约定 SQLite 中接受固定数量参数的例程。 这个宏通常被定义为无, 尽管在 Windows 版本上,它有时可以设置为“__cdecl”或“__stdcall”。 “__cdecl”设置是默认设置,但在 SQLite 时使用“__stdcall” 旨在编译为 Windows 系统库。

单个函数声明应包含以下内容之一 以下内容:SQLITE_APICALLSQLITE_CDECLSQLITE_SYSAPI

SQLITE_CALLBACK

此宏指定用于回调指针的调用约定 在 SQLite 中。此宏通常被定义为无,尽管在 Windows 上 构建它有时可以设置为“__cdecl”或“__stdcall”。这 “__cdecl”设置是默认设置,但在 SQLite 时使用“__stdcall” 旨在编译为 Windows 系统库。

SQLITE_CDECL

此宏指定 varargs 接口使用的调用约定 SQLite 中的例程。这个宏通常被定义为无, 尽管在 Windows 版本上,它有时可以设置为“__cdecl”。这 宏用于 varargs 例程,因此不能设置为“__stdcall” 因为__stdcall调用约定不支持 varargs 函数。

单个函数声明应包含以下内容之一 以下内容:SQLITE_APICALLSQLITE_CDECLSQLITE_SYSAPI

SQLITE_EXTERN

此宏指定 SQLite 中公共接口变量的链接。 通常应允许它默认为“extern”。

SQLITE_STDCALL

此宏不再使用,现已弃用。

SQLITE_SYSAPI

此宏标识操作系统使用的调用约定 SQLite 构建的目标平台的接口。 这个宏通常被定义为无, 尽管在 Windows 版本上,它有时可以设置为“__stdcall”。

单个函数声明应包含以下内容之一 以下内容:SQLITE_APICALLSQLITE_CDECLSQLITE_SYSAPI

SQLITE_TCLAPI

此宏指定 TCL 库接口例程使用的调用约定。 此宏不由 SQLite 核心使用,而仅由 TCL 接口和 TCL 测试套件使用。 这个宏通常被定义为无, 尽管在 Windows 版本上,它有时可以设置为“__cdecl”。这 宏用于始终编译的 TCL 库接口例程 __cdecl,即使在喜欢使用__stdcall的平台上,这个 宏不应设置为 __stdcall,除非平台有自定义 支持__stdcall的 TCL 库构建。

此宏不能与 SQLITE_APICALLSQLITE_CALLBACKSQLITE_CDECL 或SQLITE_SYSAPI中的任何一个结合使用。

  • 48
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

界忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值