小巧。快速。可靠。
三者选其二。

SQLite C 接口

虚拟表配置选项

#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1
#define SQLITE_VTAB_INNOCUOUS          2
#define SQLITE_VTAB_DIRECTONLY         3
#define SQLITE_VTAB_USES_ALL_SCHEMAS   4

这些宏定义了sqlite3_vtab_config() 接口的各种选项,虚拟表 实现可以使用这些选项来自定义和优化其行为。

SQLITE_VTAB_CONSTRAINT_SUPPORT
支持以下形式的调用:sqlite3_vtab_config(db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X),其中 X 为整数。如果 X 为零,则虚拟表(其xCreatexConnect 方法调用了sqlite3_vtab_config())不支持约束。在此配置(默认配置)中,如果对xUpdate 方法的调用返回SQLITE_CONSTRAINT,则整个语句将回滚,就像OR ABORT 已被指定为用户 SQL 语句的一部分一样,而不管实际指定的 ON CONFLICT 模式是什么。

如果 X 为非零值,则虚拟表实现保证,如果xUpdate 返回SQLITE_CONSTRAINT,它将在对内部或持久数据结构进行任何修改之前这样做。如果ON CONFLICT 模式为 ABORT、FAIL、IGNORE 或 ROLLBACK,则 SQLite 能够回滚语句或数据库事务,并根据需要放弃或继续处理当前的 SQL 语句。如果 ON CONFLICT 模式为 REPLACE 且xUpdate 方法返回SQLITE_CONSTRAINT,则 SQLite 将其处理为 ON CONFLICT 模式为 ABORT 的情况。

需要处理 OR REPLACE 的虚拟表实现必须在xUpdate 方法中进行处理。如果对sqlite3_vtab_on_conflict() 函数的调用指示当前的 ON CONFLICT 策略为 REPLACE,则虚拟表实现应在 xUpdate 回调中静默替换相应的行并返回 SQLITE_OK。或者,如果这不可行,它可以返回 SQLITE_CONSTRAINT,在这种情况下,SQLite 将回退到 OR ABORT 约束处理。

SQLITE_VTAB_DIRECTONLY
虚拟表 实现的xConnectxCreate 方法中,如果调用了sqlite3_vtab_config(db,SQLITE_VTAB_DIRECTONLY),则禁止从触发器和视图中使用该虚拟表。

SQLITE_VTAB_INNOCUOUS
虚拟表 实现的xConnectxCreate 方法中,如果调用了sqlite3_vtab_config(db,SQLITE_VTAB_INNOCUOUS),则将该虚拟表识别为可在触发器和视图中安全使用。从概念上讲,SQLITE_VTAB_INNOCUOUS 标记意味着即使虚拟表受恶意黑客控制,也不会造成严重危害。开发人员应避免设置 SQLITE_VTAB_INNOCUOUS 标志,除非绝对必要。

SQLITE_VTAB_USES_ALL_SCHEMAS
虚拟表 实现的xConnectxCreate 方法中,如果调用了sqlite3_vtab_config(db,SQLITE_VTAB_USES_ALL_SCHEMA),则指示查询计划器在每次使用虚拟表时,至少对所有模式(“main”、“temp”和任何 ATTACH-ed 数据库)开始读取事务。

另请参见对象常量函数列表。