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

SQLite C 接口

函数标志

#define SQLITE_DETERMINISTIC    0x000000800
#define SQLITE_DIRECTONLY       0x000080000
#define SQLITE_SUBTYPE          0x000100000
#define SQLITE_INNOCUOUS        0x000200000
#define SQLITE_RESULT_SUBTYPE   0x001000000

这些常量可以与 首选文本编码 进行按位或运算,作为 sqlite3_create_function()sqlite3_create_function16()sqlite3_create_function_v2() 的第四个参数。

SQLITE_DETERMINISTIC
SQLITE_DETERMINISTIC 标志表示新函数在输入参数相同的情况下始终给出相同的输出。例如,abs() 函数 是确定性的,但 randomblob() 不是。函数必须是确定性的才能在某些上下文中使用,例如 部分索引 的 WHERE 子句或 生成列 中。SQLite 还可以通过将确定性函数从内部循环中分解出来来优化它们。

SQLITE_DIRECTONLY
SQLITE_DIRECTONLY 标志表示该函数只能从顶级 SQL 调用,不能在视图或触发器中使用,也不能在模式结构中使用,例如 CHECK 约束DEFAULT 子句表达式索引部分索引生成列

对于任何具有副作用或可能泄漏敏感信息的 应用程序定义的 SQL 函数,建议使用 SQLITE_DIRECTONLY 标志。这将防止攻击者诱骗应用程序使用其模式已被秘密修改以以有害方式调用应用程序定义函数的数据库文件。

有些人认为,无论 应用程序定义的 SQL 函数 是否对安全性敏感,都应该将 SQLITE_DIRECTONLY 设置为所有函数的良好实践,因为这样做可以防止这些函数在数据库模式内部使用,从而确保可以使用通用工具(例如 CLI)检查和修改数据库,而这些工具无法访问应用程序定义的函数。

SQLITE_INNOCUOUS
SQLITE_INNOCUOUS 标志表示该函数即使被误用也不太可能导致问题。无害函数不应该有副作用,并且不应该依赖于任何其他值,而只依赖于其输入参数。 abs() 函数 是无害函数的一个例子。 load_extension() SQL 函数 由于其副作用而并非无害。

SQLITE_INNOCUOUS 与 SQLITE_DETERMINISTIC 类似,但并不完全相同。 random() 函数 是一个无害但非确定性函数的例子。

某些更高的安全设置(SQLITE_DBCONFIG_TRUSTED_SCHEMAPRAGMA trusted_schema=OFF)禁用在视图和触发器以及模式结构(例如 CHECK 约束DEFAULT 子句表达式索引部分索引生成列)中使用 SQL 函数,除非该函数被标记为 SQLITE_INNOCUOUS。大多数内置函数都是无害的。建议开发人员避免对应用程序定义的函数使用 SQLITE_INNOCUOUS 标志,除非该函数已仔细审核并发现没有潜在的安全风险副作用和信息泄漏。

SQLITE_SUBTYPE
SQLITE_SUBTYPE 标志指示 SQLite 函数可能会调用 sqlite3_value_subtype() 来检查其参数的子类型。此标志指示 SQLite 省略一些可能破坏 sqlite3_value_subtype() 函数操作的极端情况优化,导致其返回零而不是正确的子类型。调用 sqlite3_value_subtype() 的 SQL 函数应该具有此属性。如果省略了 SQLITE_SUBTYPE 属性,则 sqlite3_value_subtype() 的返回值有时可能为零,即使函数参数表达式指定了非零子类型。

SQLITE_RESULT_SUBTYPE
SQLITE_RESULT_SUBTYPE 标志指示 SQLite 函数可能会调用 sqlite3_result_subtype() 以使其结果关联子类型。每个调用 sqlite3_result_subtype() 的函数都应该具有此属性。如果没有,则如果函数用作 表达式索引 中的项,则对 sqlite3_result_subtype() 的调用可能会变成无操作。另一方面,从不调用 sqlite3_result_subtype() 的 SQL 函数应该避免设置此属性,因为此属性的目的是禁用与子类型不兼容的某些优化。

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