bpo-40810: Require SQLite 3.7.15
Remove code required to support SQLite pre 3.7.15.
This commit is contained in:
parent
e40e2a2cc9
commit
93372c0805
|
@ -19,7 +19,7 @@ PostgreSQL or Oracle.
|
||||||
|
|
||||||
The sqlite3 module was written by Gerhard Häring. It provides a SQL interface
|
The sqlite3 module was written by Gerhard Häring. It provides a SQL interface
|
||||||
compliant with the DB-API 2.0 specification described by :pep:`249`, and
|
compliant with the DB-API 2.0 specification described by :pep:`249`, and
|
||||||
requires SQLite 3.7.3 or newer.
|
requires SQLite 3.7.15 or newer.
|
||||||
|
|
||||||
To use the module, you must first create a :class:`Connection` object that
|
To use the module, you must first create a :class:`Connection` object that
|
||||||
represents the database. Here the data will be stored in the
|
represents the database. Here the data will be stored in the
|
||||||
|
|
|
@ -577,13 +577,12 @@ CPython bytecode changes
|
||||||
Build Changes
|
Build Changes
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
|
||||||
* The C99 functions :c:func:`snprintf` and :c:func:`vsnprintf` are now required
|
* The C99 functions :c:func:`snprintf` and :c:func:`vsnprintf` are now required
|
||||||
to build Python.
|
to build Python.
|
||||||
(Contributed by Victor Stinner in :issue:`36020`.)
|
(Contributed by Victor Stinner in :issue:`36020`.)
|
||||||
|
|
||||||
* :mod:`sqlite3` requires SQLite 3.7.3 or higher.
|
* :mod:`sqlite3` requires SQLite 3.7.15 or higher. (Contributed by Sergey Fedoseev
|
||||||
(Contributed by Sergey Fedoseev and Erlend E. Aasland :issue:`40744`.)
|
and Erlend E. Aasland :issue:`40744` and :issue:`40810`.)
|
||||||
|
|
||||||
* The :mod:`atexit` module must now always be built as a built-in module.
|
* The :mod:`atexit` module must now always be built as a built-in module.
|
||||||
(Contributed by Victor Stinner in :issue:`42639`.)
|
(Contributed by Victor Stinner in :issue:`42639`.)
|
||||||
|
|
|
@ -172,10 +172,6 @@ class ConnectionTests(unittest.TestCase):
|
||||||
cx.execute('create table test(id integer)')
|
cx.execute('create table test(id integer)')
|
||||||
|
|
||||||
def CheckOpenUri(self):
|
def CheckOpenUri(self):
|
||||||
if sqlite.sqlite_version_info < (3, 7, 7):
|
|
||||||
with self.assertRaises(sqlite.NotSupportedError):
|
|
||||||
sqlite.connect(':memory:', uri=True)
|
|
||||||
return
|
|
||||||
self.addCleanup(unlink, TESTFN)
|
self.addCleanup(unlink, TESTFN)
|
||||||
with sqlite.connect(TESTFN) as cx:
|
with sqlite.connect(TESTFN) as cx:
|
||||||
cx.execute('create table test(id integer)')
|
cx.execute('create table test(id integer)')
|
||||||
|
|
|
@ -260,14 +260,6 @@ class TraceCallbackTests(unittest.TestCase):
|
||||||
cur.execute(queries[0])
|
cur.execute(queries[0])
|
||||||
con2.execute("create table bar(x)")
|
con2.execute("create table bar(x)")
|
||||||
cur.execute(queries[1])
|
cur.execute(queries[1])
|
||||||
|
|
||||||
# Extract from SQLite 3.7.15 changelog:
|
|
||||||
# Avoid invoking the sqlite3_trace() callback multiple times when a
|
|
||||||
# statement is automatically reprepared due to SQLITE_SCHEMA errors.
|
|
||||||
#
|
|
||||||
# See bpo-40810
|
|
||||||
if sqlite.sqlite_version_info < (3, 7, 15):
|
|
||||||
queries.append(queries[-1])
|
|
||||||
self.assertEqual(traced_statements, queries)
|
self.assertEqual(traced_statements, queries)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Require SQLite 3.7.15 or newer. Patch by Erlend E. Aasland.
|
|
@ -233,7 +233,7 @@ void pysqlite_connection_dealloc(pysqlite_Connection* self)
|
||||||
|
|
||||||
/* Clean up if user has not called .close() explicitly. */
|
/* Clean up if user has not called .close() explicitly. */
|
||||||
if (self->db) {
|
if (self->db) {
|
||||||
SQLITE3_CLOSE(self->db);
|
sqlite3_close_v2(self->db);
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_XDECREF(self->isolation_level);
|
Py_XDECREF(self->isolation_level);
|
||||||
|
@ -338,7 +338,7 @@ pysqlite_connection_close_impl(pysqlite_Connection *self)
|
||||||
pysqlite_do_all_statements(self, ACTION_FINALIZE, 1);
|
pysqlite_do_all_statements(self, ACTION_FINALIZE, 1);
|
||||||
|
|
||||||
if (self->db) {
|
if (self->db) {
|
||||||
rc = SQLITE3_CLOSE(self->db);
|
rc = sqlite3_close_v2(self->db);
|
||||||
|
|
||||||
if (rc != SQLITE_OK) {
|
if (rc != SQLITE_OK) {
|
||||||
_pysqlite_seterror(self->db, NULL);
|
_pysqlite_seterror(self->db, NULL);
|
||||||
|
@ -1687,33 +1687,7 @@ pysqlite_connection_backup_impl(pysqlite_Connection *self,
|
||||||
if (rc == SQLITE_NOMEM) {
|
if (rc == SQLITE_NOMEM) {
|
||||||
(void)PyErr_NoMemory();
|
(void)PyErr_NoMemory();
|
||||||
} else {
|
} else {
|
||||||
#if SQLITE_VERSION_NUMBER > 3007015
|
|
||||||
PyErr_SetString(pysqlite_OperationalError, sqlite3_errstr(rc));
|
PyErr_SetString(pysqlite_OperationalError, sqlite3_errstr(rc));
|
||||||
#else
|
|
||||||
switch (rc) {
|
|
||||||
case SQLITE_ERROR:
|
|
||||||
/* Description of SQLITE_ERROR in SQLite 3.7.14 and older
|
|
||||||
releases. */
|
|
||||||
PyErr_SetString(pysqlite_OperationalError,
|
|
||||||
"SQL logic error or missing database");
|
|
||||||
break;
|
|
||||||
case SQLITE_READONLY:
|
|
||||||
PyErr_SetString(pysqlite_OperationalError,
|
|
||||||
"attempt to write a readonly database");
|
|
||||||
break;
|
|
||||||
case SQLITE_BUSY:
|
|
||||||
PyErr_SetString(pysqlite_OperationalError, "database is locked");
|
|
||||||
break;
|
|
||||||
case SQLITE_LOCKED:
|
|
||||||
PyErr_SetString(pysqlite_OperationalError,
|
|
||||||
"database table is locked");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
PyErr_Format(pysqlite_OperationalError,
|
|
||||||
"unrecognized error code: %d", rc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,8 @@
|
||||||
#include "microprotocols.h"
|
#include "microprotocols.h"
|
||||||
#include "row.h"
|
#include "row.h"
|
||||||
|
|
||||||
#if SQLITE_VERSION_NUMBER < 3007003
|
#if SQLITE_VERSION_NUMBER < 3007015
|
||||||
#error "SQLite 3.7.3 or higher required"
|
#error "SQLite 3.7.15 or higher required"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "clinic/module.c.h"
|
#include "clinic/module.c.h"
|
||||||
|
@ -365,8 +365,8 @@ PyMODINIT_FUNC PyInit__sqlite3(void)
|
||||||
{
|
{
|
||||||
PyObject *module;
|
PyObject *module;
|
||||||
|
|
||||||
if (sqlite3_libversion_number() < 3007003) {
|
if (sqlite3_libversion_number() < 3007015) {
|
||||||
PyErr_SetString(PyExc_ImportError, MODULE_NAME ": SQLite 3.7.3 or higher required");
|
PyErr_SetString(PyExc_ImportError, MODULE_NAME ": SQLite 3.7.15 or higher required");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,10 +39,4 @@ int _pysqlite_seterror(sqlite3* db, sqlite3_stmt* st);
|
||||||
|
|
||||||
sqlite_int64 _pysqlite_long_as_int64(PyObject * value);
|
sqlite_int64 _pysqlite_long_as_int64(PyObject * value);
|
||||||
|
|
||||||
#if SQLITE_VERSION_NUMBER >= 3007014
|
|
||||||
#define SQLITE3_CLOSE sqlite3_close_v2
|
|
||||||
#else
|
|
||||||
#define SQLITE3_CLOSE sqlite3_close
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
3
setup.py
3
setup.py
|
@ -1444,8 +1444,7 @@ class PyBuildExt(build_ext):
|
||||||
]
|
]
|
||||||
if CROSS_COMPILING:
|
if CROSS_COMPILING:
|
||||||
sqlite_inc_paths = []
|
sqlite_inc_paths = []
|
||||||
# We need to find >= sqlite version 3.7.3, for sqlite3_create_function_v2()
|
MIN_SQLITE_VERSION_NUMBER = (3, 7, 15) # Issue 40810
|
||||||
MIN_SQLITE_VERSION_NUMBER = (3, 7, 3)
|
|
||||||
MIN_SQLITE_VERSION = ".".join([str(x)
|
MIN_SQLITE_VERSION = ".".join([str(x)
|
||||||
for x in MIN_SQLITE_VERSION_NUMBER])
|
for x in MIN_SQLITE_VERSION_NUMBER])
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue