int sqlite3_create_function( sqlite3 *db, const char *zFunctionName, int nArg, int eTextRep, void *pApp, void (*xFunc)(sqlite3_context*,int,sqlite3_value**), void (*xStep)(sqlite3_context*,int,sqlite3_value**), void (*xFinal)(sqlite3_context*) ); int sqlite3_create_function16( sqlite3 *db, const void *zFunctionName, int nArg, int eTextRep, void *pApp, void (*xFunc)(sqlite3_context*,int,sqlite3_value**), void (*xStep)(sqlite3_context*,int,sqlite3_value**), void (*xFinal)(sqlite3_context*) ); int sqlite3_create_function_v2( sqlite3 *db, const char *zFunctionName, int nArg, int eTextRep, void *pApp, void (*xFunc)(sqlite3_context*,int,sqlite3_value**), void (*xStep)(sqlite3_context*,int,sqlite3_value**), void (*xFinal)(sqlite3_context*), void(*xDestroy)(void*) ); int sqlite3_create_window_function( sqlite3 *db, const char *zFunctionName, int nArg, int eTextRep, void *pApp, void (*xStep)(sqlite3_context*,int,sqlite3_value**), void (*xFinal)(sqlite3_context*), void (*xValue)(sqlite3_context*), void (*xInverse)(sqlite3_context*,int,sqlite3_value**), void(*xDestroy)(void*) );
這些函數(統稱為「函數建立常式」)用於新增 SQL 函數或聚合函數,或重新定義現有 SQL 函數或聚合函數的行為。三個 "sqlite3_create_function*" 常式之間的唯一區別在於第二個參數(所建立函數的名稱)的預期文字編碼,以及應用程式數據指標的解構器回呼是否存在。 sqlite3_create_window_function() 函數類似,但允許使用者提供聚合視窗函數所需的額外回呼函數。
第一個參數是要新增 SQL 函數的資料庫連線。如果應用程式使用多個資料庫連線,則必須將應用程式定義的 SQL 函數分別新增到每個資料庫連線。
第二個參數是要建立或重新定義的 SQL 函數的名稱。名稱長度限制為 UTF-8 表示法的 255 個位元組,不包括零終止符。請注意,名稱長度限制是以 UTF-8 位元組為單位,而不是字元或 UTF-16 位元組。任何嘗試建立名稱較長函數的動作都將導致返回 SQLITE_MISUSE。
第三個參數 (nArg) 是 SQL 函數或聚合函數接受的參數數量。如果此參數為 -1,則 SQL 函數或聚合函數可以接受 0 到 sqlite3_limit(SQLITE_LIMIT_FUNCTION_ARG) 設定的限制之間的任何數量參數。如果第三個參數小於 -1 或大於 127,則行為未定義。
第四個參數 eTextRep 指定此 SQL 函數的參數偏好的文字編碼。如果函數實作在輸入上呼叫 sqlite3_value_text16le(),應用程式應將此參數設定為 SQLITE_UTF16LE;如果實作在輸入上呼叫 sqlite3_value_text16be(),則應設定為 SQLITE_UTF16BE;如果使用 sqlite3_value_text16(),則應設定為 SQLITE_UTF16;否則應設定為 SQLITE_UTF8。可以使用不同的偏好文字編碼多次註冊同一個 SQL 函數,每個編碼都有不同的實作。當同一個函數有多個實作可用時,SQLite 會選擇涉及最少數據轉換的實作。
第四個參數可以選擇性地與 SQLITE_DETERMINISTIC 進行 OR 運算,以表示在單個 SQL 陳述式中,給定相同的輸入,函數將始終返回相同的結果。大多數 SQL 函數都是確定性的。內建的 random() SQL 函數是非確定性函數的範例。SQLite 查詢規劃器能夠對確定性函數執行額外優化,因此建議盡可能使用 SQLITE_DETERMINISTIC 旗標。
第四個參數也可以選擇性地包含 SQLITE_DIRECTONLY 旗標,如果存在,則會阻止從 VIEW、TRIGGER、CHECK 限制式、產生的欄位運算式、索引運算式或部分索引的 WHERE 子句中呼叫該函數。
為了確保最佳安全性,建議所有不需要在觸發器、視圖、CHECK 條件約束或其他資料庫結構描述元素內使用的應用程式定義 SQL 函數都使用 SQLITE_DIRECTONLY 旗標。尤其建議對具有副作用或會洩漏內部應用程式狀態的 SQL 函數使用此旗標。如果沒有這個旗標,攻擊者可能會修改資料庫檔案的結構描述,加入由攻擊者選擇參數的函數呼叫,應用程式在開啟和讀取資料庫檔案時就會執行這些呼叫。
第五個參數是一個任意指標。函數的實作可以使用 sqlite3_user_data() 來存取這個指標。
傳遞給三個 "sqlite3_create_function*" 函數(xFunc、xStep 和 xFinal)的第六、第七和第八個參數是指向實作 SQL 函數或聚合函數的 C 語言函數的指標。純量 SQL 函數只需要實作 xFunc 回呼;xStep 和 xFinal 參數必須傳遞 NULL 指標。聚合 SQL 函數需要實作 xStep 和 xFinal,而 xFunc 必須傳遞 NULL 指標。要刪除現有的 SQL 函數或聚合函數,請對所有三個函數回呼傳遞 NULL 指標。
傳遞給 sqlite3_create_window_function 的第六、第七、第八和第九個參數(xStep、xFinal、xValue 和 xInverse)是指向實作新函數的 C 語言回呼的指標。xStep 和 xFinal 必須都非 NULL。xValue 和 xInverse 可以同時為 NULL,這樣會建立一般的聚合函數,或者必須同時非 NULL,這樣新的函數就可以用作聚合函數或聚合視窗函數。關於聚合視窗函數實作的更多詳細資訊,請參閱此處。
如果 sqlite3_create_function_v2() 或 sqlite3_create_window_function() 的最後一個參數不是 NULL,則它是應用程式資料指標的解構函數。當函數被刪除時(透過被覆蓋或資料庫連線關閉時),會呼叫解構函數。如果對 sqlite3_create_function_v2() 的呼叫失敗,也會呼叫解構函數。呼叫解構函數回呼時,會傳遞一個參數,該參數是 sqlite3_create_function_v2() 的第五個參數(應用程式資料指標)的副本。
允許註冊相同名稱但參數數量不同或慣用文字編碼不同的多個相同函數的實作。SQLite 會使用與 SQL 函數的使用方式最相符的實作。nArg 參數為非負數的函數實作比 nArg 參數為負數的函數實作更相符。慣用文字編碼與資料庫編碼相符的函數比編碼不同的函數更相符。編碼差異在 UTF16le 和 UTF16be 之間的函數比編碼差異在 UTF8 和 UTF16 之間的函數更相符。
內建函數可以被新的應用程式定義函數覆蓋。
應用程式定義的函數允許呼叫其他 SQLite 介面。但是,此類呼叫不得關閉資料庫連線,也不得完成或重設執行該函數的已準備好的語句。