void *sqlite3_get_auxdata(sqlite3_context*, int N); void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*));
這些函數可以被(非聚合)SQL 函數使用,以便將輔助資料與參數值關聯起來。如果在查詢執行期間,相同的參數值被傳遞給同一個 SQL 函數的多次呼叫,在某些情況下,關聯的輔助資料可能會被保留。一個可能有用的例子是在正規表達式匹配函數中。正規表達式的編譯版本可以作為與模式字串相關聯的輔助資料儲存。然後,只要模式字串保持不變,編譯後的正規表達式就可以在同一個函數的多次呼叫中重複使用。
sqlite3_get_auxdata(C,N) 介面返回一個指向由 sqlite3_set_auxdata(C,N,P,X) 函數與應用程式定義函數的第 N 個參數值關聯的輔助資料的指標。N 對於最左邊的函數參數為零。如果沒有與函數參數關聯的輔助資料,sqlite3_get_auxdata(C,N) 介面將返回 NULL 指標。
sqlite3_set_auxdata(C,N,P,X) 介面將 P 儲存為應用程式定義函數的第 N 個參數的輔助資料。如果輔助資料仍然有效,後續對 sqlite3_get_auxdata(C,N) 的呼叫將從最近的 sqlite3_set_auxdata(C,N,P,X) 呼叫返回 P;如果輔助資料已被丟棄,則返回 NULL。在每次呼叫 sqlite3_set_auxdata(C,N,P,X) 之後,如果 X 不為 NULL,SQLite 將在輔助資料被丟棄時,使用參數 P 恰好一次呼叫解構函數 X。SQLite 可以隨時丟棄輔助資料,包括
尤其要注意最後兩點。sqlite3_set_auxdata(C,N,P,X) 中的解構函數 X 可能會立即被呼叫,甚至在 sqlite3_set_auxdata() 介面返回之前。因此,sqlite3_set_auxdata() 應該在函數實現的接近尾聲時呼叫,並且函數實現不應該在呼叫 sqlite3_set_auxdata() 之後使用 P。此外,如果在 sqlite3_set_auxdata() 呼叫期間發生記憶體不足的情況,或者函數是在查詢規劃期間而不是查詢執行期間評估的,則在相應的 sqlite3_set_auxdata() 呼叫之後立即發生的 sqlite3_get_auxdata() 呼叫可能仍然返回 NULL。
在實務中,對於編譯時常數的函數參數(包括字面值、參數 以及由它們組成的表達式),輔助資料會在函數呼叫之間保留。
這些介面的 N 參數的值應該是非負的。未來的增強功能可能會使用負 N 值來定義新的函數快取行為。
這些常式必須從執行 SQL 函數的同一個執行緒中呼叫。