SQLite C 接口
函数标志
#define SQLITE_DETERMINISTIC 0x000000800 #define SQLITE_DIRECTONLY 0x000080000 #define SQLITE_SUBTYPE 0x000100000 #define SQLITE_INNOCUOUS 0x000200000
这些常量可以与 首选文本编码一起作为sqlite3_create_function()、sqlite3_create_function16()或 sqlite3_create_function_v2()的第四个参数进行或运算。
- SQLITE_DETERMINISTIC
- SQLITE_DETERMINISTIC 标志意味着当输入参数相同时,新函数总是给出相同的输出。例如, abs() 函数是确定性的,但 randomblob()不是。函数必须是确定性的,以便在某些上下文中使用,例如与部分索引的 WHERE 子句一起使用或在生成的列中使用。SQLite 还可以通过将确定性函数从内部循环中分解出来来优化确定性函数。
- SQLITE_DIRECTONLY
- SQLITE_DIRECTONLY 标志意味着该函数只能从顶级 SQL 调用,不能在 VIEW 或 TRIGGER 中使用,也不能在模式结构中使用,例如CHECK 约束、DEFAULT 子句、 表达式索引、部分索引或生成的列。SQLITE_DIRECTONLY 标志是一项安全功能,推荐用于所有应用程序定义的 SQL 函数,尤其是具有副作用或可能泄露敏感信息的函数。
- SQLITE_INNOCUOUS
-
SQLITE_INNOCUOUS 标志意味着该函数即使被误用也不太可能导致问题。一个无害的函数应该没有副作用,并且不应该依赖于它的输入参数以外的任何值。abs() 函数是一个无害函数的例子。load_extension () SQL 函数并非无害,因为它有副作用。
SQLITE_INNOCUOUS 类似于 SQLITE_DETERMINISTIC,但并不完全相同。random() 函数是一个无害但不确定的函数示例 。
某些增强的安全设置(SQLITE_DBCONFIG_TRUSTED_SCHEMA和PRAGMA trusted_schema=OFF)禁止在视图和触发器以及模式结构(例如CHECK 约束、DEFAULT 子句、 表达式索引、部分索引和生成的列)中使用 SQL 函数,除非函数被标记为 SQLITE_INNOCUOUS . 大多数内置函数都是无害的。建议开发人员避免将 SQLITE_INNOCUOUS 标志用于应用程序定义的函数,除非该函数经过仔细审核并发现没有潜在的安全不利副作用和信息泄漏。
- SQLITE_SUBTYPE
- SQLITE_SUBTYPE 标志向 SQLite 表明函数可以调用 sqlite3_value_subtype()来检查其参数的子类型。指定此标志对标量或聚合用户函数没有影响。但是,如果没有为用户定义的窗口函数指定,则在调用窗口函数之前,属于传递给窗口函数的参数的任何子类型都可能被丢弃(即 sqlite3_value_subtype() 将始终返回 0)。