{
  "status": "shipping",
  "advantages": [],
  "limitations": [],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-10-19",
  "slug": "fts5-external-content",
  "term": "FTS5 external-content table",
  "aliases": [
    "external-content FTS5"
  ],
  "definition": "An FTS5 external-content table stores a full-text index while retrieving document values from another database object.",
  "note": "The content option names the document source, and content_rowid identifies its row key. Application logic must keep that source and the index aligned. [fts5]\n\nIn a controlled fixture, triggers added after two documents existed indexed a later third document but did not backfill the first two. A plain virtual-table read returned all three, while MATCH found only the new document. Explicit FTS5 rebuild restored the expected results. [experiment] [data]\n\nAll maintenance triggers can exist while a base-table REPLACE still leaves old postings: in a second fixture with recursive_triggers off, replacing alpha with delta recorded only an insert event and searching alpha returned the current delta row. Recursive triggers on caused delete then insert; a conflict-targeted UPSERT recorded an update under either setting. These are ordinary-table writes, not direct writes to the FTS virtual table. [replace-contract] [replace-data]",
  "related": [
    "fts5-integrity-check",
    "sqlite-expression-index",
    "sqlite-online-backup"
  ],
  "citations": [
    {
      "id": "fts5",
      "title": "SQLite FTS5: external content and integrity checking",
      "url": "https://sqlite.org/fts5.html",
      "accessed": "2026-10-18"
    },
    {
      "id": "experiment",
      "title": "Hesela: FTS5 query and verification controls",
      "url": "https://hesela.com/analyses/sqlite-index-runtime-dependencies/#fts5-content",
      "accessed": "2026-10-18"
    },
    {
      "id": "data",
      "title": "Hesela: eight executed FTS5 states and full query results",
      "url": "https://hesela.dev/research/sqlite-fts5/results.json",
      "accessed": "2026-10-18"
    },
    {
      "id": "replace-data",
      "title": "Hesela: four REPLACE/UPSERT cases with rollback, trigger events and full query results",
      "url": "https://hesela.dev/research/sqlite-fts5/replace-results.json",
      "accessed": "2026-10-19"
    },
    {
      "id": "replace-contract",
      "title": "SQLite ON CONFLICT: REPLACE deletion and recursive triggers",
      "url": "https://sqlite.org/lang_conflict.html",
      "accessed": "2026-10-19"
    }
  ],
  "provenance": [
    "Designed fixtures on SQLite 3.45.1, default tokenizer and closed DELETE-journal files. Not a failure-rate estimate."
  ]
}
