#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() 接口。