diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 575ac69d90..bafdacf571 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -28,6 +28,10 @@ #include "prepare_protocol.h" #include "util.h" +#if SQLITE_VERSION_NUMBER >= 3007011 +#define HAVE_SQLITE3_STMT_READONLY +#endif + /* prototypes */ static int pysqlite_check_remaining_sql(const char* tail); @@ -48,13 +52,36 @@ typedef enum { TYPE_UNKNOWN } parameter_type; +#ifndef HAVE_SQLITE3_STMT_READONLY +/* Retain original implementation for old sqlite installs. */ +int pysqlite_statement_reaodnly(const char *sql) +{ + const char* p; + for (p = sql; *p != 0; p++) { + switch (*p) { + case ' ': + case '\r': + case '\n': + case '\t': + continue; + } + + return (PyOS_strnicmp(p, "insert", 6) == 0) + || (PyOS_strnicmp(p, "update", 6) == 0) + || (PyOS_strnicmp(p, "delete", 6) == 0) + || (PyOS_strnicmp(p, "replace", 7) == 0); + } + + return 0; +} +#endif + int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* connection, PyObject* sql) { const char* tail; int rc; const char* sql_cstr; Py_ssize_t sql_cstr_len; - const char* p; self->st = NULL; self->in_use = 0; @@ -73,31 +100,17 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con Py_INCREF(sql); self->sql = sql; - /* Determine if the statement is a DML statement. - SELECT is the only exception. See #9924. */ - self->is_dml = 0; - for (p = sql_cstr; *p != 0; p++) { - switch (*p) { - case ' ': - case '\r': - case '\n': - case '\t': - continue; - } - - self->is_dml = (PyOS_strnicmp(p, "insert", 6) == 0) - || (PyOS_strnicmp(p, "update", 6) == 0) - || (PyOS_strnicmp(p, "delete", 6) == 0) - || (PyOS_strnicmp(p, "replace", 7) == 0); - break; - } - Py_BEGIN_ALLOW_THREADS rc = sqlite3_prepare_v2(connection->db, sql_cstr, -1, &self->st, &tail); +#ifdef HAVE_SQLITE3_STMT_READONLY + self->is_dml = sqlite3_stmt_readonly(self->st); +#else + self->is_dml = pysqlite_stmt_readonly(sql_cstr); +#endif Py_END_ALLOW_THREADS self->db = connection->db;