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

SQLite C 介面

識別並處理 xBestIndex 中的 IN 約束條件

int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle);

此介面只能在虛擬表格實作的 xBestIndex() 方法內使用。從任何其他上下文呼叫此介面的結果未定義,而且可能造成損害。

虛擬表格上格式為「column IN (...)」的約束條件會以 SQLITE_INDEX_CONSTRAINT_EQ 約束條件傳達給 xBestIndex 方法。如果 xBestIndex 想要使用此約束條件,它必須將對應的 aConstraintUsage[].argvIndex 設定為正整數。然後,在處理 IN 運算子的常用模式下,SQLite 會產生呼叫 xFilter() 方法位元組碼,針對 IN 運算子右側的每個值各呼叫一次。因此,虛擬表格一次只會看到 IN 運算子右側的單一值。

然而,在某些情況下,讓虛擬表格一次看到 IN 運算子右側的所有值會更有利。sqlite3_vtab_in() 介面以兩種方式促進這一點

  1. 呼叫 sqlite3_vtab_in(P,N,-1) 將會傳回 true(非零),若且唯若 P->aConstraint[N] 約束條件是一個可以一次處理的 IN 運算子。換句話說,在第三個引數為 -1 的情況下,sqlite3_vtab_in() 是一種機制,虛擬表格可以藉此詢問 SQLite 是否可以一次處理 IN 運算子。

  2. 以 F==1 或 F==0 呼叫 sqlite3_vtab_in(P,N,F) 向 SQLite 指示虛擬表格是否要一次處理 IN 運算子。因此,當第三個參數 (F) 為非負數時,此介面是虛擬表格告知 SQLite 它想要如何處理 IN 運算子的機制。

sqlite3_vtab_in(P,N,F) 介面可以在同一個 xBestIndex 方法呼叫中多次呼叫。對於任何給定的 P,N 對,在同一個 xBestIndex 呼叫中,sqlite3_vtab_in(P,N,F) 的傳回值將始終相同。如果介面傳回 true(非零),則表示該約束條件是一個可以一次處理的 IN 運算子。如果約束條件不是 IN 運算子或無法一次處理,則介面會傳回 false。

如果同時滿足以下兩個條件,就會選擇一次處理 IN 運算子

  1. P->aConstraintUsage[N].argvIndex 值設定為正整數。這是虛擬表格告知 SQLite 它想要使用第 N 個約束條件的方式。

  2. 最後一次呼叫 sqlite3_vtab_in(P,N,F) 且 F 為非負數時,F>=1。

如果上述任一條件或兩個條件均為 false,則 SQLite 會對 IN 約束條件使用傳統的一次一個值的處理策略。如果兩個條件都為 true,則 xFilter 方法的 argvIndex-th 參數將是一個看起來為 NULL 的 sqlite3_value,但可以將其傳遞給 sqlite3_vtab_in_first()sqlite3_vtab_in_next() 以找出 IN 約束條件右側的所有值。

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