int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);
sqlite3_stmt_readonly(X) 介面會傳回 true(非零值),若且唯若已準備好的陳述式 X 不會直接更改資料庫檔案的內容。
請注意,應用程式定義的 SQL 函式或虛擬表格可能會間接更改資料庫作為副作用。例如,如果應用程式定義了一個呼叫 sqlite3_exec() 的函式「eval()」,則以下 SQL 陳述式會透過副作用更改資料庫檔案
SELECT eval('DELETE FROM t1') FROM t2;
但由於 SELECT 陳述式不會直接更改資料庫檔案,因此 sqlite3_stmt_readonly() 仍會傳回 true。
交易控制陳述式,例如 BEGIN、COMMIT、ROLLBACK、SAVEPOINT 和 RELEASE,會使 sqlite3_stmt_readonly() 傳回 true,因為這些陳述式本身並不會實際修改資料庫,而是控制其他陳述式修改資料庫的時機。ATTACH 和 DETACH 陳述式也會使 sqlite3_stmt_readonly() 傳回 true,因為雖然這些陳述式會更改資料庫連線的設定,但它們不會更改磁碟上資料庫檔案的內容。sqlite3_stmt_readonly() 介面對於 BEGIN 會傳回 true,因為 BEGIN 僅設定內部旗標,但 BEGIN IMMEDIATE 和 BEGIN EXCLUSIVE 命令會觸及資料庫,因此 sqlite3_stmt_readonly() 對於這些命令會傳回 false。
如果陳述式有任何可能更改資料庫檔案,則此常式會傳回 false。傳回 false 並不保證陳述式會更改資料庫檔案。例如,UPDATE 陳述式可能有一個 WHERE 子句使其成為無效操作,但 sqlite3_stmt_readonly() 的結果仍為 false。同樣地,如果表格已存在,則 CREATE TABLE IF NOT EXISTS 陳述式是唯讀的無效操作,但 sqlite3_stmt_readonly() 對於此類陳述式仍會傳回 false。
如果已準備好的陳述式 X 是 EXPLAIN 或 EXPLAIN QUERY PLAN 陳述式,則 sqlite3_stmt_readonly(X) 會傳回與省略 EXPLAIN 或 EXPLAIN QUERY PLAN 前綴詞時相同的值。