What happened?
sqlite3.Blob crashes when you use a negative step in a slice — both for reading and writing.
The sequence operations docs say s[i:j:k] with negative k is valid, and bytearray handles it fine.
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE t(b BLOB)")
data = b"this blob data string is exactly fifty bytes long!"
con.execute("INSERT INTO t(b) VALUES (?)", (data,))
# bytearray works
ba = bytearray(data)
ba[9:0:-2] = b"12345"
print(ba)
# b't5i4 3l2b1data string is exactly fifty bytes long!'
# Blob crashes
blob = con.blobopen("t", "b", 1)
blob[9:0:-2] = b"12345"
blob.close()
>>> blob[9:0:-2] = b"12345"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
SystemError: Negative size passed to PyBytes_FromStringAndSize
Reading also crashes: blob[9:0:-2] raises the same error.
On Python 3.11.6 and 3.14.5 the error is SystemError: Negative size passed to PyBytes_FromStringAndSize.
On the current main branch read_multiple was changed to use PyBytesWriter_Create, so the message is now ValueError: size must be >= 0 — but the root cause is the same.
CPython versions tested on:
3.11.6, 3.14.5, main(629da5c)
Operating systems tested on:
macOS - 26.3.1 (a)(25D771280a)
Related
I'd like to work on a fix for this. I'll submit a PR.
Linked PRs
What happened?
sqlite3.Blobcrashes when you use a negative step in a slice — both for reading and writing.The sequence operations docs say
s[i:j:k]with negativekis valid, andbytearrayhandles it fine.Reading also crashes:
blob[9:0:-2]raises the same error.On Python 3.11.6 and 3.14.5 the error is
SystemError: Negative size passed to PyBytes_FromStringAndSize.On the current main branch
read_multiplewas changed to usePyBytesWriter_Create, so the message is nowValueError: size must be >= 0— but the root cause is the same.CPython versions tested on:
3.11.6, 3.14.5, main(629da5c)
Operating systems tested on:
macOS - 26.3.1 (a)(25D771280a)
Related
PyObject *read_multiple(pysqlite_Blob *, Py_ssize_t, Py_ssize_t): Assertion 'offset < sqlite3_blob_bytes(self->blob)' failed#142787 / gh-142787: Fix assertion failure in sqlite3 blob slice #142824 — different bug (assertion failure on empty slice, already fixed)s[i:j:k], negative k)I'd like to work on a fix for this. I'll submit a PR.
Linked PRs