Small. Fast. Reliable.
Choose any three.

SQLite C Interface

Determine If An SQL Statement Writes The Database

int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);

R-23332-64992:[The sqlite3_stmt_readonly(X) interface returns true (non-zero) if and only if the prepared statement X makes no direct changes to the content of the database file. ]

Note that application-defined SQL functions or virtual tables might change the database indirectly as a side effect. R-21769-42523:[For example, if an application defines a function "eval()" that calls sqlite3_exec(), then the following SQL statement would change the database file through side-effects:

SELECT eval('DELETE FROM t1') FROM t2;

But because the SELECT statement does not change the database file directly, sqlite3_stmt_readonly() would still return true. ]

R-07474-04783:[Transaction control statements such as BEGIN, COMMIT, ROLLBACK, SAVEPOINT, and RELEASE cause sqlite3_stmt_readonly() to return true, since the statements themselves do not actually modify the database but rather they control the timing of when other statements modify the database. ] R-37014-01401:[The ATTACH and DETACH statements also cause sqlite3_stmt_readonly() to return true since, while those statements change the configuration of a database connection, they do not make changes to the content of the database files on disk. ] R-36961-63052:[The sqlite3_stmt_readonly() interface returns true for BEGIN since BEGIN merely sets internal flags, but the BEGIN IMMEDIATE and BEGIN EXCLUSIVE commands do touch the database and so sqlite3_stmt_readonly() returns false for those commands. ]

R-04929-09147:[This routine returns false if there is any possibility that the statement might change the database file. ] R-13288-53765:[A false return does not guarantee that the statement will change the database file. ] R-22182-18548:[For example, an UPDATE statement might have a WHERE clause that makes it a no-op, but the sqlite3_stmt_readonly() result would still be false. ] R-50998-48593:[Similarly, a CREATE TABLE IF NOT EXISTS statement is a read-only no-op if the table already exists, but sqlite3_stmt_readonly() still returns false for such a statement. ]

R-61212-30018:[If prepared statement X is an EXPLAIN or EXPLAIN QUERY PLAN statement, then sqlite3_stmt_readonly(X) returns the same value as if the EXPLAIN or EXPLAIN QUERY PLAN prefix were omitted. ]

See also lists of Objects, Constants, and Functions.