SQLite 3.53: a WAL corruption fix, and a proper table for the CLI
SQLite 3.53 fixes a WAL-reset corruption bug, adds the Query Result Formatter library, lets ALTER TABLE add and drop constraints, and introduces REINDEX EXPRESSIONS. That last one is the tool for repairing stale expression indexes.
SQLite 3.53.0 shipped on 9 April 2026. The entry that matters most is the first one:
Fix the WAL-reset database corruption bug.
No explanation, no CVE number. But the words “database corruption” in a SQLite release note are reason enough for anyone storing important data in it to upgrade.
ALTER TABLE can touch constraints now
SQLite’s ALTER TABLE has always been limited — add a column, rename things, and otherwise rebuild the table by hand. As of 3.53 you can:
- Add
NOT NULLandCHECKconstraints - Remove
NOT NULLandCHECKconstraints
Both are routine elsewhere and have always been the ugliest part of a SQLite migration script.
REINDEX EXPRESSIONS: repair stale expression indexes
The new REINDEX EXPRESSIONS rebuilds expression indexes.
The trouble with an index like CREATE INDEX ... ON t(lower(name)) is that its contents are computed from the expression. If anything the expression depends on changes — a custom function’s implementation, or COLLATE behaviour — the stored values no longer match what the expression now produces. Queries return wrong results, silently.
The only previous remedy was DROP INDEX followed by CREATE INDEX. Now there is a statement for it.
TEMP triggers can reach main-schema tables
Triggers on temporary tables may now modify or query tables in the main schema. They could not before, which limited patterns like using a temp table as an audit or shadow table.
VACUUM INTO can set the reserve
When VACUUM INTO targets a URI filename carrying reserve=N (0–255), the generated copy gets that reserve. This sounds minor, but SQLite’s reserve is how many bytes are held back at the end of every page for future growth — it determines whether an update later forces a page split. Being able to match the original when making a copy is a real capability.
QRF: the CLI finally gets a real table
A new Query Result Formatter (QRF) library formats SQL results as human-readable fixed-pitch tables. The TCL interface gained a format method, and the CLI uses it.
Concretely:
- Interactive CLI sessions now default to QRF, drawing boxes with Unicode box-drawing characters
- Numeric values are right-justified by default
- Batch sessions keep the legacy format, for script compatibility
That last point is restraint: changing the default output would break every script that parses the CLI, so they changed it only where a human is watching.
One incompatibility
Bare semicolons at the end of dot-commands are silently ignored.
So .tables; no longer errors; it is treated as .tables. Officially flagged as a potential incompatibility — if your tooling depended on that semicolon producing an error, it now fails silently instead.
Where I land
For most projects using SQLite, the first entry is the whole reason to upgrade. WAL reset is touched by VACUUM, by checkpoints, and by some recovery paths, so a bug there means corruption during ordinary operation.
REINDEX EXPRESSIONS is the second one worth filing away. When an expression index goes stale the symptom is silently wrong results rather than a crash — the hardest class of bug to notice, and exactly the one that needs a dedicated rebuild command.

Comments
…