From 9f9c405375a87717a7b70849de6048d764265879 Mon Sep 17 00:00:00 2001 From: Josh McFarlin <32019743+Josh-McFarlin@users.noreply.github.com> Date: Mon, 21 Sep 2026 18:33:23 +0000 Subject: [PATCH] Preserve PostgreSQL index expressions --- drizzle-kit/src/serializer/pgSerializer.ts | 2 +- .../tests/pg-index-expressions.test.ts | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 drizzle-kit/tests/pg-index-expressions.test.ts diff --git a/drizzle-kit/src/serializer/pgSerializer.ts b/drizzle-kit/src/serializer/pgSerializer.ts index 350109c87..b255761ba 100644 --- a/drizzle-kit/src/serializer/pgSerializer.ts +++ b/drizzle-kit/src/serializer/pgSerializer.ts @@ -1605,7 +1605,7 @@ WHERE i.indisunique as is_unique, am.amname as method, ic.reloptions as with, - coalesce(a.attname, pg_get_indexdef(i.indexrelid, k.i, false)) AS column_name, + coalesce(a.attname::text, pg_get_indexdef(i.indexrelid, k.i, false)) AS column_name, CASE WHEN pg_get_expr(i.indexprs, i.indrelid) IS NOT NULL THEN 1 ELSE 0 diff --git a/drizzle-kit/tests/pg-index-expressions.test.ts b/drizzle-kit/tests/pg-index-expressions.test.ts new file mode 100644 index 000000000..c1b08686e --- /dev/null +++ b/drizzle-kit/tests/pg-index-expressions.test.ts @@ -0,0 +1,26 @@ +import { PGlite } from '@electric-sql/pglite'; +import { expect, test } from 'vitest'; +import type { DrizzlePgDB } from '../src/api'; +import { fromDatabase } from '../src/serializer/pgSerializer'; + +const expression = + "lower(regexp_replace(TRIM(BOTH FROM description), '\\s+'::text, ' '::text, 'g'::text))"; + +test('preserves index expressions longer than PostgreSQL names', async () => { + const client = new PGlite(); + await client.exec(` + CREATE TABLE search_records (description text); + CREATE INDEX search_records_description_idx + ON search_records (${expression}); + `); + + const db = { + query: async (sql: string, params?: unknown[]) => (await client.query(sql, params)).rows, + } as DrizzlePgDB; + const schema = await fromDatabase(db, () => true, ['public']); + + expect(new TextEncoder().encode(expression)).toHaveLength(85); + expect( + schema.tables['public.search_records']!.indexes.search_records_description_idx!.columns[0]!.expression, + ).toBe(expression); +}); \ No newline at end of file