Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
Description
Bug report
blobopen internally usesint to hold the requested rowid ([1],[2]), but SQLite rowids are actually 64-bit integers:
int sqlite3_blob_open( sqlite3*, const char *zDb, const char *zTable, const char *zColumn, sqlite3_int64 iRow, // <-- the rowid parameter int flags, sqlite3_blob **ppBlob);This makes an attempt to open a blob with large rowid raise anOverflowError when Python is compiled with 32-bitint, which is the case on Windows even when compiling as 64-bit application.
This might seem like an edge case, but anyINTEGER PRIMARY KEY in a rowid tablealiases rowid, which means any application that uses non-autoincrement primary keys (e.g. timestamps, checksums) is likely to hit this very trivially -- I know I did on basically the first insert. You don't need to have more than 2**32 rows or anything like that for this to happen.
100% reproducible with:
importsqlite3con=sqlite3.connect(':memory:')rowid=2**32con.execute("create table t(t blob)")con.execute("insert into t(rowid, t) values (?, zeroblob(1))", (rowid,))con.blobopen('t','t',rowid)
Expected: nothing (i.e. successful call)
Instead:
Traceback (most recent call last): File "E:\Temp\blob.py", line 10, in <module> con.blobopen('t', 't', rowid)OverflowError: Python int too large to convert to C intYour environment
- CPython versions tested on: 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)], 3.12.0a3+ (heads/main-dirty:cb60b6131b, Dec 20 2022, 14:37:41) [MSC v.1934 64 bit (AMD64)]
- Operating system and architecture: Windows x64
Linked PRs
Metadata
Metadata
Assignees
Labels
Projects
Status