SQLite C 接口

确定 SQL 语句是否写入数据库

int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);

当且仅当准备好的语句X 不直接更改数据库文件的内容时, sqlite3_stmt_readonly(X) 接口才返回 true(非零) 。

请注意,应用程序定义的 SQL 函数虚拟表可能会作为副作用间接更改数据库。例如,如果应用程序定义了一个调用sqlite3_exec()的函数“eval()” ,那么以下 SQL 语句将通过副作用更改数据库文件:

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

但是因为SELECT语句没有直接改变数据库文件,sqlite3_stmt_readonly() 仍然会返回 true。

诸如BEGINCOMMITROLLBACKSAVEPOINTRELEASE之类的事务控制语句会导致 sqlite3_stmt_readonly() 返回 true,因为这些语句本身实际上并不修改数据库,而是控制其他语句修改数据库的时间。ATTACHDETACH语句也会导致 sqlite3_stmt_readonly() 返回 true ,因为当这些语句更改数据库连接的配置时,它们不会更改磁盘上数据库文件的内容。sqlite3_stmt_readonly() 接口BEGIN开始为BEGIN返回 true仅设置内部标志,但BEGIN IMMEDIATEBEGIN EXCLUSIVE命令确实触及数据库,因此 sqlite3_stmt_readonly() 对这些命令返回 false。

如果该语句有可能更改数据库文件,则此例程返回 false。错误的返回并不能保证该语句会更改数据库文件。例如,UPDATE 语句可能有一个 WHERE 子句使其成为空操作,但 sqlite3_stmt_readonly() 结果仍然为 false。类似地,如果表已经存在,则 CREATE TABLE IF NOT EXISTS 语句是只读的空操作,但 sqlite3_stmt_readonly() 仍会为此类语句返回 false。

如果准备语句 X 是EXPLAINEXPLAIN QUERY PLAN 语句,则 sqlite3_stmt_readonly(X) 返回相同的值,就好像省略了 EXPLAIN 或 EXPLAIN QUERY PLAN 前缀一样。

另请参阅 对象常量函数的列表。