SQLite C 接口

虚拟表索引信息

struct sqlite3_index_info {
  /* Inputs */
  int nConstraint;           /* Number of entries in aConstraint */
  struct sqlite3_index_constraint {
     int iColumn;              /* Column constrained.  -1 for ROWID */
     unsigned char op;         /* Constraint operator */
     unsigned char usable;     /* True if this constraint is usable */
     int iTermOffset;          /* Used internally - xBestIndex should ignore */
  } *aConstraint;            /* Table of WHERE clause constraints */
  int nOrderBy;              /* Number of terms in the ORDER BY clause */
  struct sqlite3_index_orderby {
     int iColumn;              /* Column number */
     unsigned char desc;       /* True for DESC.  False for ASC. */
  } *aOrderBy;               /* The ORDER BY clause */
  /* Outputs */
  struct sqlite3_index_constraint_usage {
    int argvIndex;           /* if >0, constraint is part of argv to xFilter */
    unsigned char omit;      /* Do not code a test for this constraint */
  } *aConstraintUsage;
  int idxNum;                /* Number used to identify the index */
  char *idxStr;              /* String, possibly obtained from sqlite3_malloc */
  int needToFreeIdxStr;      /* Free idxStr using sqlite3_free() if true */
  int orderByConsumed;       /* True if output is already ordered */
  double estimatedCost;           /* Estimated cost of using this index */
  /* Fields below are only available in SQLite 3.8.2 and later */
  sqlite3_int64 estimatedRows;    /* Estimated number of rows returned */
  /* Fields below are only available in SQLite 3.9.0 and later */
  int idxFlags;              /* Mask of SQLITE_INDEX_SCAN_* flags */
  /* Fields below are only available in SQLite 3.10.0 and later */
  sqlite3_uint64 colUsed;    /* Input: Mask of columns used by statement */
};

sqlite3_index_info 结构及其子结构用作虚拟表接口的一部分,用于将信息传递到虚拟表模块的xBestIndex 方法并从中接收回复**Inputs** 下的字段是 xBestIndex 的输入并且是只读的。xBestIndex 将其结果插入 **Outputs** 字段。

aConstraint[] 数组记录以下形式的 WHERE 子句约束:

column OP expr

其中 OP 是 =、<、<=、> 或 >=。特定运算符使用SQLITE_INDEX_CONSTRAINT_ 值之一存储在 aConstraint[].op 中 列的索引存储在 aConstraint[].iColumn 中。aConstraint[].usable 如果可以计算右侧的 expr(因此约束可用),则为 TRUE,如果不能,则为 false。

优化器自动反转“expr OP column”形式的术语并对 WHERE 子句进行其他简化,以尝试将尽可能多的 WHERE 子句术语放入上面显示的形式中。aConstraint[] 数组仅报告与正在查询的特定虚拟表相关的 WHERE 子句术语。

有关 ORDER BY 子句的信息存储在 aOrderBy[] 中。aOrderBy 的每一项记录 ORDER BY 子句的一列。

colUsed 字段指示当前扫描可能需要虚拟表的哪些列。虚拟表列按照它们在传递给 sqlite3_declare_vtab() 的 CREATE TABLE 语句中出现的顺序从零开始编号。对于前 63 列(0-62 列),如果 SQLite 可能需要该列,则在 colUsed 掩码中设置相应的位。如果该表至少有 64 列,并且需要前 63 列右侧的任何列,则还会设置 colUsed 的第 63 位。换句话说,如果表达式 (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) 计算结果为非零,则可能需要列 iCol。

xBestIndex方法必须使用有关要传递给 xFilter 的参数的信息填充 aConstraintUsage[]。如果 argvIndex>0,则评估相应 aConstraint[] 的右侧并成为 argv 中的第 argvIndex 项。如果 aConstraintUsage[].omit 为 true,则假定约束完全由虚拟表处理,字节代码可能不会再次检查。aConstraintUsage[].omit 标志是一个优化提示。当 omit 标志保留其默认设置 false 时,将始终在字节代码中单独检查约束。如果 omit 标志更改为 true,则可能会或可能不会在字节代码中检查约束。换句话说,当 omit 标志为真时,不能保证不会使用字节代码再次检查约束。

idxNum 和 idxPtr 值被记录并传递给 xFilter方法。 当且仅当 needToFreeIdxPtr 为真时, sqlite3_free()用于释放 idxPtr。

orderByConsumed 意味着xFilter / xNext的输出将以正确的顺序出现以满足 ORDER BY 子句,因此不需要单独的排序步骤。

estimatedCost 值是对特定策略成本的估计。成本 N 表示该策略的成本类似于具有 N 行的 SQLite 表的线性扫描。log(N) 的成本表示该操作的开销类似于对具有 N 行的 SQLite 表的唯一索引字段进行二进制搜索的开销。

estimatedRows 值是策略将返回的行数的估计值。

xBestIndex 方法可以选择使用 SQLITE_INDEX_SCAN_* 标志的掩码填充 idxFlags 字段。目前只有一个这样的标志——SQLITE_INDEX_SCAN_UNIQUE。如果 xBestIndex 方法设置了这个标志,SQLite 假定该策略最多可以访问一行。

此外,如果 xBestIndex 设置了 SQLITE_INDEX_SCAN_UNIQUE 标志,则 SQLite 还假设如果调用 xUpdate() 方法作为删除或更新虚拟表行的同一语句的一部分并且实现返回 SQLITE_CONSTRAINT,则不需要回滚任何数据库更改。换句话说,如果 xUpdate() 返回 SQLITE_CONSTRAINT,则数据库内容必须与调用 xUpdate 之前完全相同。相反,如果未设置 SQLITE_INDEX_SCAN_UNIQUE 并且 xUpdate 返回 SQLITE_CONSTRAINT,则 xUpdate 方法所做的任何数据库更改都会由 SQLite 自动回滚。

重要提示:已将 estimatedRows 字段添加到 SQLite版本 3.8.2 (2013-12-06)的 sqlite3_index_info 结构中。如果虚拟表扩展与 3.8.2 之前的 SQLite 版本一起使用,则尝试读取或写入 estimatedRows 字段的结果是未定义的(但可能包括使应用程序崩溃)。因此,只有当sqlite3_libversion_number()返回的值大于或等于 3008002 时,才应使用 estimatedRows 字段。同样,idxFlags 字段是为版本 3.9.0 (2015-10-14) 添加的。因此,它只能在 sqlite3_libversion_number() 返回大于或等于 3009000 的值时使用。

3 个方法: sqlite3_vtab_collat​​ion()sqlite3_vtab_distinct()sqlite3_vtab_rhs_value()

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