From 63ba367cd3f19fbaadee2e0daf1a0eb71808983b Mon Sep 17 00:00:00 2001 From: Rik Smale <13023439+WikiRik@users.noreply.github.com> Date: Mon, 5 Feb 2024 08:42:20 +0100 Subject: [PATCH] fix: fix `NOT` operator sometimes producing incorrect queries (#17044) --- .../src/dialects/abstract/where-sql-builder.ts | 4 ---- packages/core/test/unit/sql/where.test.ts | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/core/src/dialects/abstract/where-sql-builder.ts b/packages/core/src/dialects/abstract/where-sql-builder.ts index 108996fdfba1..16da49ae3adf 100644 --- a/packages/core/src/dialects/abstract/where-sql-builder.ts +++ b/packages/core/src/dialects/abstract/where-sql-builder.ts @@ -879,10 +879,6 @@ function wrapWithNot(sql: string): string { return ''; } - if (sql.startsWith('(') && sql.endsWith(')')) { - return `NOT ${sql}`; - } - return `NOT (${sql})`; } diff --git a/packages/core/test/unit/sql/where.test.ts b/packages/core/test/unit/sql/where.test.ts index 32c7db499249..ab6d8eb91cb8 100644 --- a/packages/core/test/unit/sql/where.test.ts +++ b/packages/core/test/unit/sql/where.test.ts @@ -2696,6 +2696,23 @@ Caused by: "undefined" cannot be escaped`), default: 'NOT ([intAttr1] = 1 AND [intAttr2] = 2)', }); + testSql({ + [Op.not]: { + [Op.or]: { + [Op.and]: { + intAttr1: 1, + intAttr2: 2, + }, + [Op.or]: { + intAttr1: 1, + intAttr2: 2, + }, + }, + }, + }, { + default: 'NOT (([intAttr1] = 1 AND [intAttr2] = 2) OR ([intAttr1] = 1 OR [intAttr2] = 2))', + }); + // Op.not, Op.and, Op.or can reside on the same object as attributes testSql({ intAttr1: 1,