From 1f1ec9df6b87ae471906739e70c35d17124b95b2 Mon Sep 17 00:00:00 2001 From: CyJay Date: Wed, 18 Mar 2026 21:46:55 +0800 Subject: [PATCH] fix: wrap WHERE conditions in parentheses when soft-delete AND WhereOr are combined (#1321) When using WhereOr() with a soft-delete model, the AND deleted_at IS NULL condition was only binding to the last OR branch due to SQL operator precedence, allowing soft-deleted records to be returned through other OR branches. Fix: track whether any WHERE condition uses OR separator via a whereHasOr flag on whereBaseQuery. When soft-delete or whereFields conditions need to be ANDed, wrap user WHERE conditions in parentheses if OR is present. Before: WHERE (cond1) OR (cond2) AND deleted_at IS NULL After: WHERE ((cond1) OR (cond2)) AND deleted_at IS NULL Also save/restore the whereHasOr flag in WhereGroup to prevent group-internal OR conditions from incorrectly triggering the outer wrapping. --- internal/dbtest/query_test.go | 50 +++++++++++++++++++ .../testdata/snapshots/TestQuery-mariadb-118 | 2 +- .../testdata/snapshots/TestQuery-mariadb-124 | 2 +- .../testdata/snapshots/TestQuery-mariadb-205 | 1 + .../testdata/snapshots/TestQuery-mariadb-206 | 1 + .../testdata/snapshots/TestQuery-mariadb-207 | 1 + .../testdata/snapshots/TestQuery-mariadb-208 | 1 + .../testdata/snapshots/TestQuery-mariadb-209 | 1 + .../testdata/snapshots/TestQuery-mariadb-210 | 1 + .../snapshots/TestQuery-mssql2019-118 | 2 +- .../snapshots/TestQuery-mssql2019-124 | 2 +- .../snapshots/TestQuery-mssql2019-205 | 1 + .../snapshots/TestQuery-mssql2019-206 | 1 + .../snapshots/TestQuery-mssql2019-207 | 1 + .../snapshots/TestQuery-mssql2019-208 | 1 + .../snapshots/TestQuery-mssql2019-209 | 1 + .../snapshots/TestQuery-mssql2019-210 | 1 + .../testdata/snapshots/TestQuery-mysql5-118 | 2 +- .../testdata/snapshots/TestQuery-mysql5-124 | 2 +- .../testdata/snapshots/TestQuery-mysql5-205 | 1 + .../testdata/snapshots/TestQuery-mysql5-206 | 1 + .../testdata/snapshots/TestQuery-mysql5-207 | 1 + .../testdata/snapshots/TestQuery-mysql5-208 | 1 + .../testdata/snapshots/TestQuery-mysql5-209 | 1 + .../testdata/snapshots/TestQuery-mysql5-210 | 1 + .../testdata/snapshots/TestQuery-mysql8-118 | 2 +- .../testdata/snapshots/TestQuery-mysql8-124 | 2 +- .../testdata/snapshots/TestQuery-mysql8-205 | 1 + .../testdata/snapshots/TestQuery-mysql8-206 | 1 + .../testdata/snapshots/TestQuery-mysql8-207 | 1 + .../testdata/snapshots/TestQuery-mysql8-208 | 1 + .../testdata/snapshots/TestQuery-mysql8-209 | 1 + .../testdata/snapshots/TestQuery-mysql8-210 | 1 + .../testdata/snapshots/TestQuery-pg-118 | 2 +- .../testdata/snapshots/TestQuery-pg-124 | 2 +- .../testdata/snapshots/TestQuery-pg-205 | 1 + .../testdata/snapshots/TestQuery-pg-206 | 1 + .../testdata/snapshots/TestQuery-pg-207 | 1 + .../testdata/snapshots/TestQuery-pg-208 | 1 + .../testdata/snapshots/TestQuery-pg-209 | 1 + .../testdata/snapshots/TestQuery-pg-210 | 1 + .../testdata/snapshots/TestQuery-pgx-118 | 2 +- .../testdata/snapshots/TestQuery-pgx-124 | 2 +- .../testdata/snapshots/TestQuery-pgx-205 | 1 + .../testdata/snapshots/TestQuery-pgx-206 | 1 + .../testdata/snapshots/TestQuery-pgx-207 | 1 + .../testdata/snapshots/TestQuery-pgx-208 | 1 + .../testdata/snapshots/TestQuery-pgx-209 | 1 + .../testdata/snapshots/TestQuery-pgx-210 | 1 + .../testdata/snapshots/TestQuery-sqlite-118 | 2 +- .../testdata/snapshots/TestQuery-sqlite-124 | 2 +- .../testdata/snapshots/TestQuery-sqlite-205 | 1 + .../testdata/snapshots/TestQuery-sqlite-206 | 1 + .../testdata/snapshots/TestQuery-sqlite-207 | 1 + .../testdata/snapshots/TestQuery-sqlite-208 | 1 + .../testdata/snapshots/TestQuery-sqlite-209 | 1 + .../testdata/snapshots/TestQuery-sqlite-210 | 1 + query_base.go | 12 +++++ query_delete.go | 6 +-- query_select.go | 6 +-- query_update.go | 6 +-- 61 files changed, 127 insertions(+), 23 deletions(-) create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mariadb-205 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mariadb-206 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mariadb-207 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mariadb-208 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mariadb-209 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mariadb-210 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mssql2019-205 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mssql2019-206 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mssql2019-207 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mssql2019-208 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mssql2019-209 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mssql2019-210 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql5-205 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql5-206 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql5-207 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql5-208 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql5-209 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql5-210 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql8-205 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql8-206 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql8-207 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql8-208 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql8-209 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-mysql8-210 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pg-205 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pg-206 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pg-207 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pg-208 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pg-209 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pg-210 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pgx-205 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pgx-206 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pgx-207 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pgx-208 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pgx-209 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-pgx-210 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-sqlite-205 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-sqlite-206 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-sqlite-207 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-sqlite-208 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-sqlite-209 create mode 100644 internal/dbtest/testdata/snapshots/TestQuery-sqlite-210 diff --git a/internal/dbtest/query_test.go b/internal/dbtest/query_test.go index 5f99804c4..8885ca455 100644 --- a/internal/dbtest/query_test.go +++ b/internal/dbtest/query_test.go @@ -1945,6 +1945,56 @@ func TestQuery(t *testing.T) { })) }, }, + { + id: 205, + query: func(db *bun.DB) schema.QueryAppender { + return db.NewSelect().Model(new(SoftDelete1)). + Where("id = 1"). + WhereOr("id = 2") + }, + }, + { + id: 206, + query: func(db *bun.DB) schema.QueryAppender { + return db.NewSelect().Model(new(SoftDelete1)). + WhereOr("id = 1"). + WhereOr("id = 2") + }, + }, + { + id: 207, + query: func(db *bun.DB) schema.QueryAppender { + return db.NewSelect().Model(new(SoftDelete1)). + Where("id = 1"). + WhereOr("id = 2"). + WhereDeleted() + }, + }, + { + id: 208, + query: func(db *bun.DB) schema.QueryAppender { + return db.NewSelect().Model(new(SoftDelete1)). + Where("id = 1"). + Where("id = 2") + }, + }, + { + id: 209, + query: func(db *bun.DB) schema.QueryAppender { + return db.NewDelete().Model(new(SoftDelete1)). + Where("id = 1"). + WhereOr("id = 2") + }, + }, + { + id: 210, + query: func(db *bun.DB) schema.QueryAppender { + return db.NewUpdate().Model(new(SoftDelete1)). + Set("id = id"). + Where("id = 1"). + WhereOr("id = 2") + }, + }, } timeRE := regexp.MustCompile(`'2\d{3}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(\.\d+)?(\+\d{2}:\d{2})?'`) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-118 b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-118 index c0b9bc5a1..5bbf58fe5 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-118 +++ b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-118 @@ -1 +1 @@ -UPDATE `soft_deletes` AS `soft_delete` SET `deleted_at` = DEFAULT WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) +UPDATE `soft_deletes` AS `soft_delete` SET `deleted_at` = DEFAULT WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-124 b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-124 index 0f5d5fde0..8a9838a76 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-124 +++ b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-124 @@ -1 +1 @@ -UPDATE `soft_deletes` AS `soft_delete` SET `soft_delete`.`deleted_at` = [TIME] WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) +UPDATE `soft_deletes` AS `soft_delete` SET `soft_delete`.`deleted_at` = [TIME] WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-205 b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-205 new file mode 100644 index 000000000..072f67d38 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-205 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-206 b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-206 new file mode 100644 index 000000000..072f67d38 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-206 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-207 b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-207 new file mode 100644 index 000000000..d607d8b32 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-207 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NOT NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-208 b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-208 new file mode 100644 index 000000000..0f48e1b21 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-208 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE (id = 1) AND (id = 2) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-209 b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-209 new file mode 100644 index 000000000..a4b294773 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-209 @@ -0,0 +1 @@ +UPDATE `soft_deletes` AS `soft_delete` SET `soft_delete`.`deleted_at` = [TIME] WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mariadb-210 b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-210 new file mode 100644 index 000000000..412fe4f3a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mariadb-210 @@ -0,0 +1 @@ +UPDATE `soft_deletes` AS `soft_delete` SET id = id WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-118 b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-118 index 33aa77b50..96dbbf10d 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-118 +++ b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-118 @@ -1 +1 @@ -UPDATE "soft_deletes" SET "deleted_at" = DEFAULT WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND "soft_deletes"."deleted_at" IS NULL AND ("id" = NULL) +UPDATE "soft_deletes" SET "deleted_at" = DEFAULT WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND "soft_deletes"."deleted_at" IS NULL AND ("id" = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-124 b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-124 index 40336d30f..ca0a320b5 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-124 +++ b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-124 @@ -1 +1 @@ -UPDATE "soft_deletes" SET "deleted_at" = [TIME] WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND "soft_deletes"."deleted_at" IS NULL AND ("id" = NULL) +UPDATE "soft_deletes" SET "deleted_at" = [TIME] WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND "soft_deletes"."deleted_at" IS NULL AND ("id" = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-205 b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-205 new file mode 100644 index 000000000..98947901a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-205 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-206 b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-206 new file mode 100644 index 000000000..98947901a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-206 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-207 b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-207 new file mode 100644 index 000000000..04664e15a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-207 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NOT NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-208 b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-208 new file mode 100644 index 000000000..74468736b --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-208 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE (id = 1) AND (id = 2) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-209 b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-209 new file mode 100644 index 000000000..2bd6b80d8 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-209 @@ -0,0 +1 @@ +UPDATE "soft_deletes" SET "deleted_at" = [TIME] WHERE ((id = 1) OR (id = 2)) AND "soft_deletes"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-210 b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-210 new file mode 100644 index 000000000..1c55bab3b --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mssql2019-210 @@ -0,0 +1 @@ +UPDATE "soft_deletes" SET id = id WHERE ((id = 1) OR (id = 2)) AND "soft_deletes"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-118 b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-118 index c0b9bc5a1..5bbf58fe5 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-118 +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-118 @@ -1 +1 @@ -UPDATE `soft_deletes` AS `soft_delete` SET `deleted_at` = DEFAULT WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) +UPDATE `soft_deletes` AS `soft_delete` SET `deleted_at` = DEFAULT WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-124 b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-124 index 0f5d5fde0..8a9838a76 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-124 +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-124 @@ -1 +1 @@ -UPDATE `soft_deletes` AS `soft_delete` SET `soft_delete`.`deleted_at` = [TIME] WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) +UPDATE `soft_deletes` AS `soft_delete` SET `soft_delete`.`deleted_at` = [TIME] WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-205 b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-205 new file mode 100644 index 000000000..072f67d38 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-205 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-206 b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-206 new file mode 100644 index 000000000..072f67d38 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-206 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-207 b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-207 new file mode 100644 index 000000000..d607d8b32 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-207 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NOT NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-208 b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-208 new file mode 100644 index 000000000..0f48e1b21 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-208 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE (id = 1) AND (id = 2) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-209 b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-209 new file mode 100644 index 000000000..a4b294773 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-209 @@ -0,0 +1 @@ +UPDATE `soft_deletes` AS `soft_delete` SET `soft_delete`.`deleted_at` = [TIME] WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql5-210 b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-210 new file mode 100644 index 000000000..412fe4f3a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql5-210 @@ -0,0 +1 @@ +UPDATE `soft_deletes` AS `soft_delete` SET id = id WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-118 b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-118 index c0b9bc5a1..5bbf58fe5 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-118 +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-118 @@ -1 +1 @@ -UPDATE `soft_deletes` AS `soft_delete` SET `deleted_at` = DEFAULT WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) +UPDATE `soft_deletes` AS `soft_delete` SET `deleted_at` = DEFAULT WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-124 b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-124 index 0f5d5fde0..8a9838a76 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-124 +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-124 @@ -1 +1 @@ -UPDATE `soft_deletes` AS `soft_delete` SET `soft_delete`.`deleted_at` = [TIME] WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) +UPDATE `soft_deletes` AS `soft_delete` SET `soft_delete`.`deleted_at` = [TIME] WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND `soft_delete`.`deleted_at` IS NULL AND (`soft_delete`.`id` = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-205 b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-205 new file mode 100644 index 000000000..072f67d38 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-205 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-206 b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-206 new file mode 100644 index 000000000..072f67d38 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-206 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-207 b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-207 new file mode 100644 index 000000000..d607d8b32 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-207 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NOT NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-208 b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-208 new file mode 100644 index 000000000..0f48e1b21 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-208 @@ -0,0 +1 @@ +SELECT `soft_delete`.`id`, `soft_delete`.`deleted_at` FROM `soft_deletes` AS `soft_delete` WHERE (id = 1) AND (id = 2) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-209 b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-209 new file mode 100644 index 000000000..a4b294773 --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-209 @@ -0,0 +1 @@ +UPDATE `soft_deletes` AS `soft_delete` SET `soft_delete`.`deleted_at` = [TIME] WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-mysql8-210 b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-210 new file mode 100644 index 000000000..412fe4f3a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-mysql8-210 @@ -0,0 +1 @@ +UPDATE `soft_deletes` AS `soft_delete` SET id = id WHERE ((id = 1) OR (id = 2)) AND `soft_delete`.`deleted_at` IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pg-118 b/internal/dbtest/testdata/snapshots/TestQuery-pg-118 index 3a511e665..ea31773fc 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-pg-118 +++ b/internal/dbtest/testdata/snapshots/TestQuery-pg-118 @@ -1 +1 @@ -UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = DEFAULT WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) +UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = DEFAULT WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pg-124 b/internal/dbtest/testdata/snapshots/TestQuery-pg-124 index 5faf019c8..a7ac1577f 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-pg-124 +++ b/internal/dbtest/testdata/snapshots/TestQuery-pg-124 @@ -1 +1 @@ -UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = [TIME] WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) +UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = [TIME] WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pg-205 b/internal/dbtest/testdata/snapshots/TestQuery-pg-205 new file mode 100644 index 000000000..98947901a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pg-205 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pg-206 b/internal/dbtest/testdata/snapshots/TestQuery-pg-206 new file mode 100644 index 000000000..98947901a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pg-206 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pg-207 b/internal/dbtest/testdata/snapshots/TestQuery-pg-207 new file mode 100644 index 000000000..04664e15a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pg-207 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NOT NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pg-208 b/internal/dbtest/testdata/snapshots/TestQuery-pg-208 new file mode 100644 index 000000000..74468736b --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pg-208 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE (id = 1) AND (id = 2) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pg-209 b/internal/dbtest/testdata/snapshots/TestQuery-pg-209 new file mode 100644 index 000000000..59628ef6f --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pg-209 @@ -0,0 +1 @@ +UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = [TIME] WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pg-210 b/internal/dbtest/testdata/snapshots/TestQuery-pg-210 new file mode 100644 index 000000000..82d1f98ff --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pg-210 @@ -0,0 +1 @@ +UPDATE "soft_deletes" AS "soft_delete" SET id = id WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pgx-118 b/internal/dbtest/testdata/snapshots/TestQuery-pgx-118 index 3a511e665..ea31773fc 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-pgx-118 +++ b/internal/dbtest/testdata/snapshots/TestQuery-pgx-118 @@ -1 +1 @@ -UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = DEFAULT WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) +UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = DEFAULT WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pgx-124 b/internal/dbtest/testdata/snapshots/TestQuery-pgx-124 index 5faf019c8..a7ac1577f 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-pgx-124 +++ b/internal/dbtest/testdata/snapshots/TestQuery-pgx-124 @@ -1 +1 @@ -UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = [TIME] WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) +UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = [TIME] WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pgx-205 b/internal/dbtest/testdata/snapshots/TestQuery-pgx-205 new file mode 100644 index 000000000..98947901a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pgx-205 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pgx-206 b/internal/dbtest/testdata/snapshots/TestQuery-pgx-206 new file mode 100644 index 000000000..98947901a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pgx-206 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pgx-207 b/internal/dbtest/testdata/snapshots/TestQuery-pgx-207 new file mode 100644 index 000000000..04664e15a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pgx-207 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NOT NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pgx-208 b/internal/dbtest/testdata/snapshots/TestQuery-pgx-208 new file mode 100644 index 000000000..74468736b --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pgx-208 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE (id = 1) AND (id = 2) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pgx-209 b/internal/dbtest/testdata/snapshots/TestQuery-pgx-209 new file mode 100644 index 000000000..59628ef6f --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pgx-209 @@ -0,0 +1 @@ +UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = [TIME] WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-pgx-210 b/internal/dbtest/testdata/snapshots/TestQuery-pgx-210 new file mode 100644 index 000000000..82d1f98ff --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-pgx-210 @@ -0,0 +1 @@ +UPDATE "soft_deletes" AS "soft_delete" SET id = id WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-118 b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-118 index 5d773cf33..f3ed5febc 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-118 +++ b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-118 @@ -1 +1 @@ -UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = NULL WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) +UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = NULL WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-124 b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-124 index 5faf019c8..a7ac1577f 100644 --- a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-124 +++ b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-124 @@ -1 +1 @@ -UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = [TIME] WHERE ((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2)) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) +UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = [TIME] WHERE (((a = 1) AND (b = 1)) OR ((a = 2) AND (b = 2))) AND "soft_delete"."deleted_at" IS NULL AND ("soft_delete"."id" = NULL) diff --git a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-205 b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-205 new file mode 100644 index 000000000..98947901a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-205 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-206 b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-206 new file mode 100644 index 000000000..98947901a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-206 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-207 b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-207 new file mode 100644 index 000000000..04664e15a --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-207 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NOT NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-208 b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-208 new file mode 100644 index 000000000..74468736b --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-208 @@ -0,0 +1 @@ +SELECT "soft_delete"."id", "soft_delete"."deleted_at" FROM "soft_deletes" AS "soft_delete" WHERE (id = 1) AND (id = 2) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-209 b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-209 new file mode 100644 index 000000000..59628ef6f --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-209 @@ -0,0 +1 @@ +UPDATE "soft_deletes" AS "soft_delete" SET "deleted_at" = [TIME] WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/internal/dbtest/testdata/snapshots/TestQuery-sqlite-210 b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-210 new file mode 100644 index 000000000..82d1f98ff --- /dev/null +++ b/internal/dbtest/testdata/snapshots/TestQuery-sqlite-210 @@ -0,0 +1 @@ +UPDATE "soft_deletes" AS "soft_delete" SET id = id WHERE ((id = 1) OR (id = 2)) AND "soft_delete"."deleted_at" IS NULL diff --git a/query_base.go b/query_base.go index 8646ed043..ac60c1920 100644 --- a/query_base.go +++ b/query_base.go @@ -772,9 +772,13 @@ type whereBaseQuery struct { where []schema.QueryWithSep whereFields []*schema.Field + whereHasOr bool } func (q *whereBaseQuery) addWhere(where schema.QueryWithSep) { + if strings.Contains(where.Sep, "OR") { + q.whereHasOr = true + } q.where = append(q.where, where) } @@ -844,11 +848,19 @@ func (q *whereBaseQuery) appendWhere( b = append(b, " WHERE "...) startLen := len(b) + needsExtraCondition := q.isSoftDelete() || q.whereFields != nil if len(q.where) > 0 { + wrapParens := needsExtraCondition && q.whereHasOr + if wrapParens { + b = append(b, '(') + } b, err = appendWhere(gen, b, q.where) if err != nil { return nil, err } + if wrapParens { + b = append(b, ')') + } } if q.isSoftDelete() { diff --git a/query_delete.go b/query_delete.go index d6c4d9c0b..7cf1815cc 100644 --- a/query_delete.go +++ b/query_delete.go @@ -109,13 +109,13 @@ func (q *DeleteQuery) WhereOr(query string, args ...any) *DeleteQuery { } func (q *DeleteQuery) WhereGroup(sep string, fn func(*DeleteQuery) *DeleteQuery) *DeleteQuery { - saved := q.where - q.where = nil + saved, savedHasOr := q.where, q.whereHasOr + q.where, q.whereHasOr = nil, false q = fn(q) where := q.where - q.where = saved + q.where, q.whereHasOr = saved, savedHasOr q.addWhereGroup(sep, where) diff --git a/query_select.go b/query_select.go index 081dde451..5d21ecea7 100644 --- a/query_select.go +++ b/query_select.go @@ -173,13 +173,13 @@ func (q *SelectQuery) WhereOr(query string, args ...any) *SelectQuery { // WhereGroup groups WHERE conditions with the given separator (AND/OR). func (q *SelectQuery) WhereGroup(sep string, fn func(*SelectQuery) *SelectQuery) *SelectQuery { - saved := q.where - q.where = nil + saved, savedHasOr := q.where, q.whereHasOr + q.where, q.whereHasOr = nil, false q = fn(q) where := q.where - q.where = saved + q.where, q.whereHasOr = saved, savedHasOr q.addWhereGroup(sep, where) diff --git a/query_update.go b/query_update.go index f1c35d660..c11b8c4da 100644 --- a/query_update.go +++ b/query_update.go @@ -185,13 +185,13 @@ func (q *UpdateQuery) WhereOr(query string, args ...any) *UpdateQuery { } func (q *UpdateQuery) WhereGroup(sep string, fn func(*UpdateQuery) *UpdateQuery) *UpdateQuery { - saved := q.where - q.where = nil + saved, savedHasOr := q.where, q.whereHasOr + q.where, q.whereHasOr = nil, false q = fn(q) where := q.where - q.where = saved + q.where, q.whereHasOr = saved, savedHasOr q.addWhereGroup(sep, where)