Skip to content

fix(core): remove FTS5 integrity-check to prevent D1 shadow table corruption#313

Open
mvanhorn wants to merge 2 commits intoemdash-cms:mainfrom
mvanhorn:fix/252-fts5-d1-integrity-check
Open

fix(core): remove FTS5 integrity-check to prevent D1 shadow table corruption#313
mvanhorn wants to merge 2 commits intoemdash-cms:mainfrom
mvanhorn:fix/252-fts5-d1-integrity-check

Conversation

@mvanhorn
Copy link
Copy Markdown
Contributor

@mvanhorn mvanhorn commented Apr 6, 2026

What does this PR do?

Removes the FTS5 integrity-check INSERT from verifyAndRepairIndex() in packages/core/src/search/fts-manager.ts. This command corrupts D1's FTS5 shadow tables on every Worker cold start, causing all content publishing to fail with SQLITE_CORRUPT_VTAB.

The row-count mismatch check (Check 1) is retained -- it catches the most common corruption case without triggering D1's shadow table bug.

Closes #252

Type of change

  • Bug fix
  • Feature (requires approved Discussion)
  • Refactor (no behavior change)
  • Documentation
  • Performance improvement
  • Tests
  • Chore (dependencies, CI, tooling)

Checklist

  • I have read CONTRIBUTING.md
  • pnpm typecheck passes
  • pnpm --silent lint:json | jq '.diagnostics | length' returns 0
  • pnpm test passes (or targeted tests for my change)
  • pnpm format has been run
  • I have added/updated tests for my changes (if applicable)
  • I have added a changeset (if this PR changes a published package)
  • New features link to an approved Discussion: https://github.com/emdash-cms/emdash/discussions/...

AI-generated code disclosure

  • This PR includes AI-generated code

Details

The root cause is at fts-manager.ts:407:

INSERT INTO "ftsTable"("ftsTable") VALUES('integrity-check')

This FTS5 command is safe on standard SQLite but corrupts D1's shadow tables. Once corrupted, every content UPDATE fires FTS triggers that fail with SQLITE_CORRUPT_VTAB, blocking all publishing across all collections.

The fix removes the integrity-check entirely. The row-count mismatch check already handles the primary corruption case (count drift between content and FTS tables). The integrity-check was meant to catch subtle shadow table inconsistencies, but on D1 it causes the very corruption it was designed to detect.

Note: 3 pre-existing auth test failures on main (invite, magic-link, signup URL assertions) are unrelated to this change.

This contribution was developed with AI assistance (Codex).

mvanhorn added 2 commits April 6, 2026 07:38
…ruption

The FTS5 integrity-check INSERT corrupts D1's shadow tables even when
they are healthy, causing SQLITE_CORRUPT_VTAB on all content publishing.
Row-count mismatch detection is retained as a safe alternative.

Fixes emdash-cms#252

This contribution was developed with AI assistance (Codex).
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Apr 6, 2026

🦋 Changeset detected

Latest commit: 22f262e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 9 packages
Name Type
emdash Patch
@emdash-cms/cloudflare Patch
@emdash-cms/plugin-ai-moderation Patch
@emdash-cms/plugin-atproto Patch
@emdash-cms/plugin-audit-log Patch
@emdash-cms/plugin-color Patch
@emdash-cms/plugin-embeds Patch
@emdash-cms/plugin-forms Patch
@emdash-cms/plugin-webhook-notifier Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

FTS5 integrity-check corrupts D1 shadow tables — publish fails with SQLITE_CORRUPT_VTAB on all collections

1 participant