diff options
author | Gerhard Häring <gh@ghaering.de> | 2007-11-25 17:40:35 +0000 |
---|---|---|
committer | Gerhard Häring <gh@ghaering.de> | 2007-11-25 17:40:35 +0000 |
commit | 344cda85dd4f4f514db30276ac99e2f00bbe229c (patch) | |
tree | 4222981970c1be5f62c8439af963819b871466f9 | |
parent | c85a5e1bb55e5c5d7fbf5536343d0acad5380add (diff) | |
download | cpython-344cda85dd4f4f514db30276ac99e2f00bbe229c.tar.gz |
- Backported a workaround for a bug in SQLite 3.2.x/3.3.x versions where a
statement recompilation with no bound parameters lead to a segfault
- Backported a fix necessary because of an SQLite API change in version 3.5.
This prevents segfaults when executing empty queries, like our test suite
does.
-rw-r--r-- | Modules/_sqlite/statement.c | 6 | ||||
-rw-r--r-- | Modules/_sqlite/util.c | 12 |
2 files changed, 14 insertions, 4 deletions
diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 55923e785f..dee811f53f 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -237,7 +237,11 @@ int statement_recompile(Statement* self, PyObject* params) */ #ifdef SQLITE_VERSION_NUMBER #if SQLITE_VERSION_NUMBER >= 3002002 - (void)sqlite3_transfer_bindings(self->st, new_st); + /* The check for the number of parameters is necessary to not trigger a + * bug in certain SQLite versions (experienced in 3.2.8 and 3.3.4). */ + if (sqlite3_bind_parameter_count(self->st) > 0) { + (void)sqlite3_transfer_bindings(self->st, new_st); + } #endif #else statement_bind_parameters(self, params); diff --git a/Modules/_sqlite/util.c b/Modules/_sqlite/util.c index f5a7233a9f..cbaee92cce 100644 --- a/Modules/_sqlite/util.c +++ b/Modules/_sqlite/util.c @@ -29,9 +29,15 @@ int _sqlite_step_with_busyhandler(sqlite3_stmt* statement, Connection* connectio { int rc; - Py_BEGIN_ALLOW_THREADS - rc = sqlite3_step(statement); - Py_END_ALLOW_THREADS + if (statement == NULL) { + /* this is a workaround for SQLite 3.5 and later. it now apparently + * returns NULL for "no-operation" statements */ + rc = SQLITE_OK; + } else { + Py_BEGIN_ALLOW_THREADS + rc = sqlite3_step(statement); + Py_END_ALLOW_THREADS + } return rc; } |