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