]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45754: Use correct SQLite limit when checking statement length (GH-29489)
authorErlend Egeberg Aasland <erlend.aasland@innova.no>
Wed, 10 Nov 2021 18:46:11 +0000 (19:46 +0100)
committerGitHub <noreply@github.com>
Wed, 10 Nov 2021 18:46:11 +0000 (18:46 +0000)
Lib/test/test_sqlite3/test_dbapi.py
Lib/test/test_sqlite3/test_regression.py
Misc/NEWS.d/next/Library/2021-11-09-15-48-38.bpo-45754.c-JDto.rst [new file with mode: 0644]
Modules/_sqlite/cursor.c
Modules/_sqlite/statement.c

index 6628eee975d3555d930720a67473883774244804..a5ec66fe22a2a725f0e1c312ef3ad4393119a537 100644 (file)
@@ -55,7 +55,7 @@ def memory_database():
 
 # Temporarily limit a database connection parameter
 @contextlib.contextmanager
-def cx_limit(cx, category=sqlite.SQLITE_LIMIT_LENGTH, limit=128):
+def cx_limit(cx, category=sqlite.SQLITE_LIMIT_SQL_LENGTH, limit=128):
     try:
         _prev = cx.setlimit(category, limit)
         yield limit
@@ -495,7 +495,7 @@ class ConnectionTests(unittest.TestCase):
             prev_limit = self.cx.setlimit(category, new_limit)
             self.assertEqual(saved_limit, prev_limit)
             self.assertEqual(self.cx.getlimit(category), new_limit)
-            msg = "string or blob too big"
+            msg = "query string is too large"
             self.assertRaisesRegex(sqlite.DataError, msg,
                                    self.cx.execute, "select 1 as '16'")
         finally:  # restore saved limit
@@ -1063,9 +1063,9 @@ class ExtensionTests(unittest.TestCase):
     def test_cursor_executescript_too_large_script(self):
         msg = "query string is too large"
         with memory_database() as cx, cx_limit(cx) as lim:
-            cx.executescript("select 'almost too large'".ljust(lim-1))
+            cx.executescript("select 'almost too large'".ljust(lim))
             with self.assertRaisesRegex(sqlite.DataError, msg):
-                cx.executescript("select 'too large'".ljust(lim))
+                cx.executescript("select 'too large'".ljust(lim+1))
 
     def test_cursor_executescript_tx_control(self):
         con = sqlite.connect(":memory:")
index 158f4cf86f55caecb2132c0352f477df2cdb9456..eb34069d3e5544bff3e0aa335a1a25966c585cd1 100644 (file)
@@ -362,11 +362,11 @@ class RegressionTests(unittest.TestCase):
         with memory_database() as cx, cx_limit(cx) as lim:
             cu = cx.cursor()
 
-            cx("select 1".ljust(lim-1))
+            cx("select 1".ljust(lim))
             # use a different SQL statement; don't reuse from the LRU cache
-            cu.execute("select 2".ljust(lim-1))
+            cu.execute("select 2".ljust(lim))
 
-            sql = "select 3".ljust(lim)
+            sql = "select 3".ljust(lim+1)
             self.assertRaisesRegex(sqlite.DataError, msg, cx, sql)
             self.assertRaisesRegex(sqlite.DataError, msg, cu.execute, sql)
 
diff --git a/Misc/NEWS.d/next/Library/2021-11-09-15-48-38.bpo-45754.c-JDto.rst b/Misc/NEWS.d/next/Library/2021-11-09-15-48-38.bpo-45754.c-JDto.rst
new file mode 100644 (file)
index 0000000..196bfc9
--- /dev/null
@@ -0,0 +1,3 @@
+Fix a regression in Python 3.11a1 and 3.11a2 where :mod:`sqlite3`
+incorrectly would use ``SQLITE_LIMIT_LENGTH`` when checking SQL statement
+lengths. Now, ``SQLITE_LIMIT_SQL_LENGTH`` is used. Patch by Erlend E. Aasland.
index 1d7c0b46a616d449ce9b679cd31df251abb07beb..3ee1c5da9d0b4b77b3899a79d56c76392fbc851c 100644 (file)
@@ -729,8 +729,8 @@ pysqlite_cursor_executescript_impl(pysqlite_Cursor *self,
 
     size_t sql_len = strlen(sql_script);
     int max_length = sqlite3_limit(self->connection->db,
-                                   SQLITE_LIMIT_LENGTH, -1);
-    if (sql_len >= (unsigned)max_length) {
+                                   SQLITE_LIMIT_SQL_LENGTH, -1);
+    if (sql_len > (unsigned)max_length) {
         PyErr_SetString(self->connection->DataError,
                         "query string is too large");
         return NULL;
index b20c91da3179c49f6aae1f670b863cb63960c68a..66fadb63e53ca4ef78fc22233892db3d26471209 100644 (file)
@@ -60,8 +60,8 @@ pysqlite_statement_create(pysqlite_Connection *connection, PyObject *sql)
     }
 
     sqlite3 *db = connection->db;
-    int max_length = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
-    if (size >= max_length) {
+    int max_length = sqlite3_limit(db, SQLITE_LIMIT_SQL_LENGTH, -1);
+    if (size > max_length) {
         PyErr_SetString(connection->DataError,
                         "query string is too large");
         return NULL;