From 0a707621eaba814ab56ef66e028d983ac50f28ee Mon Sep 17 00:00:00 2001 From: Joe Thom Date: Thu, 27 Aug 2026 07:12:49 -0700 Subject: [PATCH] Bound unique constraint row checks --- drizzle-kit/src/ext/api.ts | 7 ++----- drizzle-kit/tests/api.test.ts | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/drizzle-kit/src/ext/api.ts b/drizzle-kit/src/ext/api.ts index 436975b59e..8585347321 100644 --- a/drizzle-kit/src/ext/api.ts +++ b/drizzle-kit/src/ext/api.ts @@ -104,7 +104,6 @@ export type SelectResolverInput = { entity: { type: 'createUniqueConstraint'; name: string; - count: number; tableName: string; }; items: string[]; @@ -363,9 +362,8 @@ async function maybeAddUniqueTruncateStatement({ const unique = statement.unique; const tableName = quotedIdentifier({ schema: unique.schema, name: unique.table }); - const res = await db.query<{ count: string | number }>(`select count(*) as count from ${tableName}`); - const count = Number(res[0]?.count ?? 0); - if (count <= 0) { + const rows = await db.query(`select 1 from ${tableName} limit 1`); + if (rows.length === 0) { return; } @@ -373,7 +371,6 @@ async function maybeAddUniqueTruncateStatement({ entity: { type: 'createUniqueConstraint', name: unique.name, - count, tableName: unique.table, }, items: ['no', 'yes'], diff --git a/drizzle-kit/tests/api.test.ts b/drizzle-kit/tests/api.test.ts index 35fa2e8fa6..6c844193d1 100644 --- a/drizzle-kit/tests/api.test.ts +++ b/drizzle-kit/tests/api.test.ts @@ -129,4 +129,35 @@ describe('Replit compatibility API', () => { expect(result.statementsToExecute).toEqual(['CREATE SCHEMA "private";\n']); expect(result.shouldAskForApprove).toBe(false); }); + + test('uses a bounded row-existence query for unique constraints', async () => { + const db = { query: vi.fn().mockResolvedValue([{}]) }; + const selectResolver = vi.fn().mockResolvedValue({ + data: { index: 0, value: 'no' }, + }); + const statements: JsonStatement[] = [{ + type: 'add_unique', + unique: { + entityType: 'uniques', + schema: 'public', + table: 'users', + name: 'users_email_unique', + nameExplicit: true, + columns: ['email'], + nullsNotDistinct: false, + }, + }]; + + await pgSuggestions(db, statements, selectResolver); + + expect(db.query).toHaveBeenCalledWith('select 1 from "users" limit 1'); + expect(selectResolver).toHaveBeenCalledWith({ + entity: { + type: 'createUniqueConstraint', + name: 'users_email_unique', + tableName: 'users', + }, + items: ['no', 'yes'], + }); + }); });