From 19372e09490f149dcba4a5b4ba52e992f24e085d Mon Sep 17 00:00:00 2001 From: Josh France <12610835+16francej@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:22:06 -0400 Subject: [PATCH] Fix PostgreSQL search rollout safety --- src/sessions/postgres-session-store.ts | 2 +- test/postgres-store.test.ts | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/sessions/postgres-session-store.ts b/src/sessions/postgres-session-store.ts index 7c1abafbb..9cfd2a37f 100644 --- a/src/sessions/postgres-session-store.ts +++ b/src/sessions/postgres-session-store.ts @@ -264,7 +264,7 @@ export function createPostgresSessionStore(connectionString: string, opts: Store `CREATE INDEX IF NOT EXISTS session_entries_user_ts ON session_entries(created_at) WHERE type = 'user'`, `CREATE INDEX IF NOT EXISTS session_entries_session_created ON session_entries(session_id, created_at DESC)`, `CREATE OR REPLACE FUNCTION entry_search_text(payload text) RETURNS text - LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE AS $entry_search_text$ + LANGUAGE plpgsql IMMUTABLE PARALLEL UNSAFE AS $entry_search_text$ DECLARE j json; BEGIN j := replace(payload, '\\u0000', '')::json; diff --git a/test/postgres-store.test.ts b/test/postgres-store.test.ts index 68f63507b..05c7b74c6 100644 --- a/test/postgres-store.test.ts +++ b/test/postgres-store.test.ts @@ -593,7 +593,7 @@ test("pg sessions table indexes scoped activity pages", { skip }, async () => { } }); -test("pg safe JSON functions are marked parallel-unsafe", { skip }, async () => { +test("pg JSON functions with exception handlers are marked parallel-unsafe", { skip }, async () => { const pg = (await import("pg")).default; const raw = new pg.Pool({ connectionString: URL }); try { @@ -610,13 +610,18 @@ test("pg safe JSON functions are marked parallel-unsafe", { skip }, async () => const result = await raw.query( `SELECT proname, proparallel FROM pg_proc - WHERE oid IN ('safe_json(text)'::regprocedure, 'safe_jsonb(text)'::regprocedure)`, + WHERE oid IN ( + 'safe_json(text)'::regprocedure, + 'safe_jsonb(text)'::regprocedure, + 'entry_search_text(text)'::regprocedure + )`, ); assert.deepEqual( new Map(result.rows.map((row) => [row.proname as string, row.proparallel as string])), new Map([ ["safe_json", "u"], ["safe_jsonb", "u"], + ["entry_search_text", "u"], ]), ); assert.equal(