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

SQLite C 接口

虚拟表约束操作符代码

#define SQLITE_INDEX_CONSTRAINT_EQ          2
#define SQLITE_INDEX_CONSTRAINT_GT          4
#define SQLITE_INDEX_CONSTRAINT_LE          8
#define SQLITE_INDEX_CONSTRAINT_LT         16
#define SQLITE_INDEX_CONSTRAINT_GE         32
#define SQLITE_INDEX_CONSTRAINT_MATCH      64
#define SQLITE_INDEX_CONSTRAINT_LIKE       65
#define SQLITE_INDEX_CONSTRAINT_GLOB       66
#define SQLITE_INDEX_CONSTRAINT_REGEXP     67
#define SQLITE_INDEX_CONSTRAINT_NE         68
#define SQLITE_INDEX_CONSTRAINT_ISNOT      69
#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL  70
#define SQLITE_INDEX_CONSTRAINT_ISNULL     71
#define SQLITE_INDEX_CONSTRAINT_IS         72
#define SQLITE_INDEX_CONSTRAINT_LIMIT      73
#define SQLITE_INDEX_CONSTRAINT_OFFSET     74
#define SQLITE_INDEX_CONSTRAINT_FUNCTION  150

这些宏定义了 sqlite3_index_info.aConstraint[].op 字段允许的值。每个值代表一个操作符,该操作符是使用 虚拟表 的查询 WHERE 子句中约束项的一部分。

操作符的左侧操作数由相应的 aConstraint[].iColumn 字段给出。iColumn 为 -1 表示左侧操作数是 rowid。SQLITE_INDEX_CONSTRAINT_LIMIT 和 SQLITE_INDEX_CONSTRAINT_OFFSET 操作符没有左侧操作数,因此对于这些操作符,相应的 aConstraint[].iColumn 是无意义的,不应该使用。

从 SQLITE_INDEX_CONSTRAINT_FUNCTION 到值 255 的所有操作符值都保留用于表示由虚拟表实现的 xFindFunction 方法 重载的函数。

可以使用 sqlite3_vtab_rhs_value() 接口访问每个约束的右侧操作数。通常,只有当右侧操作数在输入 SQL 中以单个常量字面量出现时,它才可用。如果右侧操作数是另一个列或表达式(即使是常量表达式)或参数,则 sqlite3_vtab_rhs_value() 可能无法提取它。SQLITE_INDEX_CONSTRAINT_ISNULL 和 SQLITE_INDEX_CONSTRAINT_ISNOTNULL 操作符没有右侧操作数,因此对这些操作符的 sqlite3_vtab_rhs_value() 调用将始终返回 SQLITE_NOTFOUND。

可以使用 sqlite3_vtab_collation() 接口找到用于比较的排序规则。对于大多数现实世界的虚拟表,约束的排序规则并不重要(例如,因为约束是数字),因此通常不需要 sqlite3_vtab_collation() 接口。

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