小巧、快速、可靠。
選擇其中三項。

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方法,並從虛擬表格模組的該方法接收回覆。「輸入」下的欄位是 xBestIndex 的輸入,且為唯讀。xBestIndex 將其結果插入「輸出」欄位。

aConstraint[] 陣列記錄格式為以下的 WHERE 子句約束:

column OP expr

其中 OP 為 =、<、<=、> 或 >=。特定運算子使用其中一個SQLITE_INDEX_CONSTRAINT_ 值儲存在 aConstraint[].op 中。欄位的索引儲存在 aConstraint[].iColumn 中。如果右側的 expr 可以被評估(因此約束可用),則 aConstraint[].usable 為 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 旗標為 true 時,不能保證不會使用位元組碼再次檢查約束。

idxNum 和 idxStr 值會被記錄並傳遞到 xFilter 方法。若且唯若 needToFreeIdxStr 為 true 時,才會使用 sqlite3_free() 釋放 idxStr。

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,則 SQLite 會自動回滾 xUpdate 方法所做的任何資料庫變更。

重要事項: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_collation()sqlite3_vtab_distinct()sqlite3_vtab_rhs_value()

另請參閱物件常數函式的列表。