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
- assertion failure at Modules/_sqlite/blob.c:146:
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) - https://docs.python.org/3/library/stdtypes.html#typesseq-common (
s[i:j:k], negative k)
I'd like to work on a fix for this. I'll submit a PR.