Skip to content

Fix catalog refresh hitting SQLite bound-parameter limit#443

Merged
arviceblot merged 1 commit into
arviceblot:masterfrom
raggi:fix-update-tx
May 17, 2026
Merged

Fix catalog refresh hitting SQLite bound-parameter limit#443
arviceblot merged 1 commit into
arviceblot:masterfrom
raggi:fix-update-tx

Conversation

@raggi
Copy link
Copy Markdown
Contributor

@raggi raggi commented May 17, 2026

update() was issuing insert_many for the entire ESOUI catalog (~5000 addons * 10 columns) as a single statement, exceeding SQLITE_MAX_VARIABLE_NUMBER (32766). The failure left the addon list empty and the UI displayed "No addons installed!".

Wrap update() and update_categories() in a transaction and switch from multi-row insert_many to per-row Entity::insert() reused inside the transaction. sqlx caches the prepared statement by SQL text, so each row reuses the same plan. The transaction also gives atomicity: a partial failure no longer leaves the catalog in a half-written state.

is_in filters still bind one parameter per ID, so the three delete statements are chunked by SQLITE_MAX_VARS for safety (no chunking actually triggers at the current catalog size).

`update()` was issuing `insert_many` for the entire ESOUI catalog
(~5000 addons * 10 columns) as a single statement, exceeding
SQLITE_MAX_VARIABLE_NUMBER (32766). The failure left the addon list
empty and the UI displayed "No addons installed!".

Wrap update() and update_categories() in a transaction and switch from
multi-row `insert_many` to per-row `Entity::insert()` reused inside the
transaction. sqlx caches the prepared statement by SQL text, so each
row reuses the same plan. The transaction also gives atomicity: a
partial failure no longer leaves the catalog in a half-written state.

is_in filters still bind one parameter per ID, so the three delete
statements are chunked by SQLITE_MAX_VARS for safety (no chunking
actually triggers at the current catalog size).
@arviceblot arviceblot merged commit 5daea3f into arviceblot:master May 17, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants