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

SQLite C 介面

函式旗標

#define SQLITE_DETERMINISTIC    0x000000800
#define SQLITE_DIRECTONLY       0x000080000
#define SQLITE_SUBTYPE          0x000100000
#define SQLITE_INNOCUOUS        0x000200000
#define SQLITE_RESULT_SUBTYPE   0x001000000

這些常數可以與偏好的文字編碼進行 OR 運算,作為sqlite3_create_function()sqlite3_create_function16()sqlite3_create_function_v2()的第四個參數。

SQLITE_DETERMINISTIC
SQLITE_DETERMINISTIC 旗標表示,當輸入參數相同時,新函式總是會給出相同的輸出。例如,abs() 函式是確定性的,但 randomblob() 則不是。函式必須是確定性的,才能在某些情況下使用,例如在部分索引的 WHERE 子句中,或在生成的欄位中。SQLite 也可能透過將確定性函式從內部迴圈中分解出來的方式進行最佳化。

SQLITE_DIRECTONLY
SQLITE_DIRECTONLY 旗標表示該函式只能從頂層 SQL 呼叫,不能在 VIEW 或 TRIGGER 中使用,也不能在結構定義中使用,例如 CHECK 約束DEFAULT 子句表達式索引部分索引生成的欄位

對於任何具有副作用或可能洩漏敏感資訊的應用程式定義的 SQL 函式,建議使用 SQLITE_DIRECTONLY 旗標。這將防止應用程式被誘騙使用資料庫檔案的攻擊,該資料庫檔案的結構定義已被暗中修改,以有害的方式呼叫應用程式定義的函式。

有些人認為,在所有應用程式定義的 SQL 函式上設定 SQLITE_DIRECTONLY 是一個好的做法,無論它們是否對安全性敏感,因為這樣做可以防止這些函式在資料庫結構定義內被使用,從而確保可以使用通用工具(例如 命令列介面)檢查和修改資料庫,而這些工具無法存取應用程式定義的函式。

SQLITE_INNOCUOUS
SQLITE_INNOCUOUS 旗標表示即使誤用,該函式也不太可能造成問題。無害的函式應該沒有副作用,並且不應該依賴其輸入參數以外的任何值。abs() 函式就是無害函式的一個例子。load_extension() SQL 函式由於其副作用,因此並非無害的。

SQLITE_INNOCUOUS 與 SQLITE_DETERMINISTIC 類似,但不完全相同。random() 函式是無害但不確定性的函式範例。

某些較高的安全性設定(SQLITE_DBCONFIG_TRUSTED_SCHEMAPRAGMA trusted_schema=OFF)會停用在 VIEW 和 TRIGGER 內以及結構定義(例如 CHECK 約束DEFAULT 子句表達式索引部分索引生成的欄位)中使用 SQL 函式,除非該函式標記了 SQLITE_INNOCUOUS。大多數內建函式都是無害的。建議開發人員避免對應用程式定義的函式使用 SQLITE_INNOCUOUS 旗標,除非已仔細審核該函式,並且發現沒有潛在的安全副作用和資訊洩漏。

SQLITE_SUBTYPE
SQLITE_SUBTYPE 旗標告知 SQLite 函式可能會呼用 sqlite3_value_subtype() 來檢查其引數的子類型。這個旗標指示 SQLite 省略一些可能干擾 sqlite3_value_subtype() 函式運作的邊緣案例最佳化,導致它返回零而不是正確的子類型。呼叫 sqlite3_value_subtype() 的 SQL 函式應該具有此屬性。如果省略 SQLITE_SUBTYPE 屬性,那麼即使函式引數表達式指定了非零子類型,sqlite3_value_subtype() 的返回值有時也可能是零。

SQLITE_RESULT_SUBTYPE
SQLITE_RESULT_SUBTYPE 旗標告知 SQLite 函式可能會呼用 sqlite3_result_subtype() 來使其結果與子類型關聯。每個呼叫 sqlite3_result_subtype() 的函式都應該具有此屬性。如果沒有,那麼如果函式被用作表達式索引中的術語,則對 sqlite3_result_subtype() 的呼叫可能會變成無效操作。另一方面,從不呼叫 sqlite3_result_subtype() 的 SQL 函式應避免設定此屬性,因為此屬性的目的是停用與子類型不相容的某些最佳化。

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