Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion drizzle-kit/src/serializer/pgSerializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 26 additions & 0 deletions drizzle-kit/tests/pg-index-expressions.test.ts
Original file line number Diff line number Diff line change
@@ -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);
});
Loading