From 97ca005b1d1eb360a796cb4bb238a57e96b2fc5d Mon Sep 17 00:00:00 2001 From: abdoulrasheed Date: Tue, 16 Dec 2025 13:21:59 +0000 Subject: [PATCH 1/4] gh-142787: Fix assertion failure in sqlite3 blob slice --- .../Library/2024-12-16-142787.gh-issue-142787.blob_slice.rst | 2 ++ Modules/_sqlite/blob.c | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2024-12-16-142787.gh-issue-142787.blob_slice.rst diff --git a/Misc/NEWS.d/next/Library/2024-12-16-142787.gh-issue-142787.blob_slice.rst b/Misc/NEWS.d/next/Library/2024-12-16-142787.gh-issue-142787.blob_slice.rst new file mode 100644 index 00000000000000..8238a1cde1b5c3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-12-16-142787.gh-issue-142787.blob_slice.rst @@ -0,0 +1,2 @@ +Fix assertion failure in :mod:`sqlite3` blob subscript when slicing with +indices that result in an empty slice. diff --git a/Modules/_sqlite/blob.c b/Modules/_sqlite/blob.c index 4a213f348881b9..8dad94556236bd 100644 --- a/Modules/_sqlite/blob.c +++ b/Modules/_sqlite/blob.c @@ -439,6 +439,10 @@ subscript_slice(pysqlite_Blob *self, PyObject *item) return NULL; } + if (len == 0) { + return PyBytes_FromStringAndSize(NULL, 0); + } + if (step == 1) { return read_multiple(self, len, start); } From 577803cd6628cd1d7a68d785ab40de7991960c0f Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 13:34:49 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...slice.rst => 2025-12-16-13-34-48.gh-issue-142787.wNitJX.rst} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename Misc/NEWS.d/next/Library/{2024-12-16-142787.gh-issue-142787.blob_slice.rst => 2025-12-16-13-34-48.gh-issue-142787.wNitJX.rst} (99%) diff --git a/Misc/NEWS.d/next/Library/2024-12-16-142787.gh-issue-142787.blob_slice.rst b/Misc/NEWS.d/next/Library/2025-12-16-13-34-48.gh-issue-142787.wNitJX.rst similarity index 99% rename from Misc/NEWS.d/next/Library/2024-12-16-142787.gh-issue-142787.blob_slice.rst rename to Misc/NEWS.d/next/Library/2025-12-16-13-34-48.gh-issue-142787.wNitJX.rst index 8238a1cde1b5c3..e928bd2cac72a8 100644 --- a/Misc/NEWS.d/next/Library/2024-12-16-142787.gh-issue-142787.blob_slice.rst +++ b/Misc/NEWS.d/next/Library/2025-12-16-13-34-48.gh-issue-142787.wNitJX.rst @@ -1,2 +1,2 @@ -Fix assertion failure in :mod:`sqlite3` blob subscript when slicing with +Fix assertion failure in :mod:`sqlite3` blob subscript when slicing with indices that result in an empty slice. From c7a12b3eee8765c7cc036feaec623d8ae34e7e44 Mon Sep 17 00:00:00 2001 From: abdoulrasheed Date: Tue, 16 Dec 2025 13:56:38 +0000 Subject: [PATCH 3/4] Add regression test for gh-142787 --- Lib/test/test_sqlite3/test_dbapi.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 20e39f61e4dedb..804f55f23241e8 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -1379,6 +1379,12 @@ def test_blob_get_slice(self): def test_blob_get_empty_slice(self): self.assertEqual(self.blob[5:5], b"") + def test_blob_get_empty_slice_oob_indices(self): + self.cx.execute("delete from test") + self.cx.execute("insert into test(b) values (?)", (b"abc",)) + with self.cx.blobopen("test", "b", 1) as blob: + self.assertEqual(blob[5:-5], b"") + def test_blob_get_slice_negative_index(self): self.assertEqual(self.blob[5:-5], self.data[5:-5]) From e1556e87461729524cce9e5e600d2ad700c6445a Mon Sep 17 00:00:00 2001 From: abdoulrasheed Date: Tue, 16 Dec 2025 18:37:12 +0000 Subject: [PATCH 4/4] Update test: insert new row instead of deleting --- Lib/test/test_sqlite3/test_dbapi.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 804f55f23241e8..73b40e82a96811 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -1380,9 +1380,8 @@ def test_blob_get_empty_slice(self): self.assertEqual(self.blob[5:5], b"") def test_blob_get_empty_slice_oob_indices(self): - self.cx.execute("delete from test") self.cx.execute("insert into test(b) values (?)", (b"abc",)) - with self.cx.blobopen("test", "b", 1) as blob: + with self.cx.blobopen("test", "b", 2) as blob: self.assertEqual(blob[5:-5], b"") def test_blob_get_slice_negative_index(self):