From 66695711071aed166d0d88f55836426de036b58a Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 2 Jun 2021 15:13:52 +0200 Subject: [PATCH 1/4] bpo-44165: Add tests for sqlite3 SQL string length --- Lib/sqlite3/test/dbapi.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py index 39c9bf5b61143d..4e9e546f349b3a 100644 --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -229,6 +229,13 @@ def test_execute_too_much_sql3(self): */ """) + def test_execute_too_long_string(self): + # The default value of SQLITE_MAX_LENGTH is 1_000_000_000, but it may + # be up to 2_147_483_647. + too_long = " " * 2_147_483_648 + self.assertRaises(sqlite.DataError, self.cx, too_long) + self.assertRaises(sqlite.DataError, self.cu.executescript, too_long) + def test_execute_wrong_sql_arg(self): with self.assertRaises(TypeError): self.cu.execute(42) From 4e04464362793951db145704fdc37c56eab5fe0b Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 2 Jun 2021 15:57:21 +0200 Subject: [PATCH 2/4] Use assertRaisesRegex --- Lib/sqlite3/test/dbapi.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py index 4e9e546f349b3a..485eb8e27133f2 100644 --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -233,8 +233,9 @@ def test_execute_too_long_string(self): # The default value of SQLITE_MAX_LENGTH is 1_000_000_000, but it may # be up to 2_147_483_647. too_long = " " * 2_147_483_648 - self.assertRaises(sqlite.DataError, self.cx, too_long) - self.assertRaises(sqlite.DataError, self.cu.executescript, too_long) + regex = "query string is too large" + self.assertRaisesRegex(sqlite.DataError, regex, self.cx, too_long) + self.assertRaisesRegex(sqlite.DataError, regex, self.cu.executescript, too_long) def test_execute_wrong_sql_arg(self): with self.assertRaises(TypeError): From 7d35abf4e75f2dced95894c8f3cafce8c516d962 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 2 Jun 2021 15:59:35 +0200 Subject: [PATCH 3/4] Skip if we cannot set up test environment --- Lib/sqlite3/test/dbapi.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py index 485eb8e27133f2..d2ac063bead675 100644 --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -232,7 +232,10 @@ def test_execute_too_much_sql3(self): def test_execute_too_long_string(self): # The default value of SQLITE_MAX_LENGTH is 1_000_000_000, but it may # be up to 2_147_483_647. - too_long = " " * 2_147_483_648 + try: + too_long = " " * 2_147_483_648 + except OverflowError: + self.skipTest("Unable to create too large SQL string") regex = "query string is too large" self.assertRaisesRegex(sqlite.DataError, regex, self.cx, too_long) self.assertRaisesRegex(sqlite.DataError, regex, self.cu.executescript, too_long) From 3687feaa7f38cc0d1134a000747bfe6514091ba2 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 2 Jun 2021 19:09:04 +0200 Subject: [PATCH 4/4] Fetch max string length limit from compile time options --- Lib/sqlite3/test/dbapi.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py index d2ac063bead675..b5a17564623f06 100644 --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -232,8 +232,14 @@ def test_execute_too_much_sql3(self): def test_execute_too_long_string(self): # The default value of SQLITE_MAX_LENGTH is 1_000_000_000, but it may # be up to 2_147_483_647. + res = self.cu.execute("pragma compile_options") + opts = {k: v for k, v in [o[0].split("=") for o in res if "=" in o[0]]} try: - too_long = " " * 2_147_483_648 + max_length = int(opts['MAX_LENGTH']) + except (KeyError, TypeError): + max_length = 1_000_000_000 + try: + too_long = " " * (max_length + 1) except OverflowError: self.skipTest("Unable to create too large SQL string") regex = "query string is too large"