← All fixes
Generated tsvector column fails: generation expression is not immutable
#14Error
ERROR: generation expression is not immutable
Fix
to_tsvector(text) without a config depends on default_text_search_config, so Postgres won't allow it in a generated column. Pass the config explicitly: GENERATED ALWAYS AS (to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''))) STORED. Avoid non-immutable functions like array_to_string on arrays inside the expression; compute those in the INSERT instead.Verified in a clean sandbox
Yarrow reproduced the error from scratch, applied the fix, and the error went away.
- Passed on
- Node 24.21.0 · @electric-sql/pglite 0.5.10 · Ubuntu 26.04.1 LTS, Oct 18, 2026
- Last checked
- Oct 18, 2026. Yarrow re-runs it every 30 days to catch dependency changes.
How it was tested
1. Build the broken project
npm init -y >/dev/null && npm i --silent @electric-sql/pglite@0.5.10 cat > check.mjs <<'EOF' import { PGlite } from "@electric-sql/pglite"; import { readFileSync } from "node:fs"; const db = new PGlite(); await db.exec(readFileSync("schema.sql", "utf8")); await db.query("INSERT INTO docs (title) VALUES ('hello world')"); console.log("generated column works"); EOF echo "CREATE TABLE docs (title text, search tsvector GENERATED ALWAYS AS (to_tsvector(title)) STORED);" > schema.sql2. Test fails (the error reproduces)
node check.mjs
3. Apply the fix
echo "CREATE TABLE docs (title text, search tsvector GENERATED ALWAYS AS (to_tsvector('english', title)) STORED);" > schema.sql4. Same test passes
node check.mjs
Sandbox log
Reproduced the error, applied the fix, and the error went away.
$ setup (exit 0)
$ test (exit 1)
…l/sandbox/repro/node_modules/@electric-sql/pglite/dist/index.js:6:1151
at wasm://wasm/0280c65e:wasm-function[10964]:0x58cc19
at wasm://wasm/0280c65e:wasm-function[3606]:0x2792af
at wasm://wasm/0280c65e:wasm-function[3648]:0x2807ba
at wasm://wasm/0280c65e:wasm-function[3658]:0x2809ef
at wasm://wasm/0280c65e:wasm-function[9946]:0x5393b2 {
length: 93,
severity: 'ERROR',
code: '42P17',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'heap.c',
line: '3383',
routine: 'cookDefault',
query: 'CREATE TABLE docs (title text, search tsvector GENERATED ALWAYS AS (to_tsvector(title)) STORED);\n',
params: undefined,
queryOptions: undefined
}
Node.js v24.21.0
$ apply (exit 0)
$ test (exit 0)
generated column worksKeep it fixed
The test that proved this fix also works as a regression check. Add it to your project's tests so a later migration or upgrade can't quietly bring the bug back.
# Regression check from Yarrow fix #14: Generated tsvector column fails: generation expression is not immutable
# Fails (non-zero exit) if the bug comes back. Written for a minimal repro project,
# so point paths and files at your own project before adding it to CI.
# Files the test needs (from the repro setup):
npm init -y >/dev/null && npm i --silent @electric-sql/pglite@0.5.10
cat > check.mjs <<'EOF'
import { PGlite } from "@electric-sql/pglite";
import { readFileSync } from "node:fs";
const db = new PGlite();
await db.exec(readFileSync("schema.sql", "utf8"));
await db.query("INSERT INTO docs (title) VALUES ('hello world')");
console.log("generated column works");
EOF
echo "CREATE TABLE docs (title text, search tsvector GENERATED ALWAYS AS (to_tsvector(title)) STORED);" > schema.sql
# The check:
node check.mjsDid it work?
No reports yet0 worked0 didn't
Tried it yourself?