From ba82dba2a4b613ddca4fb8306f2d6b6e5bd91a5d Mon Sep 17 00:00:00 2001 From: Angelelz Date: Sat, 16 Dec 2023 21:16:32 -0500 Subject: [PATCH 1/2] When passed an empty array inArray now returns false and notInArray now return true instead of throwing --- drizzle-orm/src/sql/expressions/conditions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drizzle-orm/src/sql/expressions/conditions.ts b/drizzle-orm/src/sql/expressions/conditions.ts index 5974f9f7e..a927e56da 100644 --- a/drizzle-orm/src/sql/expressions/conditions.ts +++ b/drizzle-orm/src/sql/expressions/conditions.ts @@ -289,7 +289,7 @@ export function inArray( ): SQL { if (Array.isArray(values)) { if (values.length === 0) { - throw new Error('inArray requires at least one value'); + return sql`false`; } return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`; } @@ -335,7 +335,7 @@ export function notInArray( ): SQL { if (Array.isArray(values)) { if (values.length === 0) { - throw new Error('notInArray requires at least one value'); + return sql`true`; } return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`; } From 41bde97de74a45e8cbfd4d6bdd35969870376ca9 Mon Sep 17 00:00:00 2001 From: Angelelz Date: Sat, 16 Dec 2023 21:16:49 -0500 Subject: [PATCH 2/2] Added tests to all dialects --- integration-tests/tests/libsql.test.ts | 23 +++++++++++++++++++++ integration-tests/tests/mysql.test.ts | 23 +++++++++++++++++++++ integration-tests/tests/pg.test.ts | 23 +++++++++++++++++++++ integration-tests/tests/postgres.js.test.ts | 23 +++++++++++++++++++++ 4 files changed, 92 insertions(+) diff --git a/integration-tests/tests/libsql.test.ts b/integration-tests/tests/libsql.test.ts index 7fc84e5b2..cef50ba3c 100644 --- a/integration-tests/tests/libsql.test.ts +++ b/integration-tests/tests/libsql.test.ts @@ -20,6 +20,7 @@ import { min, Name, name, + notInArray, placeholder, sql, sum, @@ -956,6 +957,28 @@ test.serial('select with group by complex query', async (t) => { t.deepEqual(result, [{ name: 'Jane' }]); }); +test.serial('select with empty array in inArray', async (t) => { + const { db } = t.context; + + await db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); + + const result = await db.select({ name: usersTable.name }).from(usersTable) + .where(inArray(usersTable.id, [])); + + t.deepEqual(result, []); +}); + +test.serial('select with empty array in notInArray', async (t) => { + const { db } = t.context; + + await db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); + + const result = await db.select({ name: usersTable.name }).from(usersTable) + .where(notInArray(usersTable.id, [])); + + t.deepEqual(result, [{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); +}); + test.serial('build query', async (t) => { const { db } = t.context; diff --git a/integration-tests/tests/mysql.test.ts b/integration-tests/tests/mysql.test.ts index e14f1105f..574d74fd5 100644 --- a/integration-tests/tests/mysql.test.ts +++ b/integration-tests/tests/mysql.test.ts @@ -20,6 +20,7 @@ import { max, min, Name, + notInArray, placeholder, sql, sum, @@ -760,6 +761,28 @@ test.serial('select with group by as column + sql', async (t) => { t.deepEqual(result, [{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); }); +test.serial('select with empty array in inArray', async (t) => { + const { db } = t.context; + + await db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); + + const result = await db.select({ name: usersTable.name }).from(usersTable) + .where(inArray(usersTable.id, [])); + + t.deepEqual(result, []); +}); + +test.serial('select with empty array in notInArray', async (t) => { + const { db } = t.context; + + await db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); + + const result = await db.select({ name: usersTable.name }).from(usersTable) + .where(notInArray(usersTable.id, [])); + + t.deepEqual(result, [{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); +}); + test.serial('select with group by complex query', async (t) => { const { db } = t.context; diff --git a/integration-tests/tests/pg.test.ts b/integration-tests/tests/pg.test.ts index e67a4780b..54e912627 100644 --- a/integration-tests/tests/pg.test.ts +++ b/integration-tests/tests/pg.test.ts @@ -22,6 +22,7 @@ import { max, min, name, + notInArray, placeholder, type SQL, sql, @@ -1728,6 +1729,28 @@ test.serial('array types', async (t) => { t.deepEqual(res, values); }); +test.serial('select with empty array in inArray', async (t) => { + const { db } = t.context; + + await db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); + + const result = await db.select({ name: usersTable.name }).from(usersTable) + .where(inArray(usersTable.id, [])); + + t.deepEqual(result, []); +}); + +test.serial('select with empty array in notInArray', async (t) => { + const { db } = t.context; + + await db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); + + const result = await db.select({ name: usersTable.name }).from(usersTable) + .where(notInArray(usersTable.id, [])); + + t.deepEqual(result, [{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); +}); + test.serial('select for ...', (t) => { const { db } = t.context; diff --git a/integration-tests/tests/postgres.js.test.ts b/integration-tests/tests/postgres.js.test.ts index 50424c71d..ba18eb527 100644 --- a/integration-tests/tests/postgres.js.test.ts +++ b/integration-tests/tests/postgres.js.test.ts @@ -17,6 +17,7 @@ import { lt, Name, name, + notInArray, placeholder, type SQL, sql, @@ -1318,6 +1319,28 @@ test.serial('select count w/ custom mapper', async (t) => { t.deepEqual(res, [{ count: 2 }]); }); +test.serial('select with empty array in inArray', async (t) => { + const { db } = t.context; + + await db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); + + const result = await db.select({ name: usersTable.name }).from(usersTable) + .where(inArray(usersTable.id, [])); + + t.deepEqual(result, []); +}); + +test.serial('select with empty array in notInArray', async (t) => { + const { db } = t.context; + + await db.insert(usersTable).values([{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); + + const result = await db.select({ name: usersTable.name }).from(usersTable) + .where(notInArray(usersTable.id, [])); + + t.deepEqual(result, [{ name: 'John' }, { name: 'Jane' }, { name: 'Jane' }]); +}); + test.serial('select for ...', (t) => { const { db } = t.context;