int sqlite3_stmt_readonly(sqlite3_stmt * pStmt);
当且仅当准备好的语句X没有直接更改数据库文件的内容时,sqlite3_stmt_readonly(X)接口才返回true(非零)。
请注意,应用程序定义的SQL函数或 虚拟表可能会间接影响数据库的副作用。例如,如果应用程序定义了调用sqlite3_exec()的函数“ eval()” ,则以下SQL语句将通过副作用更改数据库文件:
从t2选择SELECT eval('DELETE FROM t1');
但是由于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。