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_collat​​ion()接口找到用于比较的整理顺序。对于大多数现实世界的虚拟表,约束的整理顺序并不重要(例如,因为约束是数字的),因此通常不需要 sqlite3_vtab_collat​​ion() 接口。

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