-
-
Notifications
You must be signed in to change notification settings - Fork 62
Labels
Milestone
Description
Describe the bug
Sometimes ORM adds columns to GROUP statement, which leads to retrieving duplicate rows.
To Reproduce
Looking for books with any of Tags ID 2 or 3, which at the same time have more than one tag. Should be two books, but results in three, including one duplicate.
$books = $this->orm->books->findBy([
ICollection::AND,
[CompareGreaterThanFunction::class, [CountAggregateFunction::class, 'tags->id'], 1],
['tags->id' => [2, 3]],
]);
Assert::same($books->count(), 2);SELECT "books".*
FROM "books" AS "books"
LEFT JOIN "books_x_tags" AS "books_x_tags__COUNT" ON ("books"."id" = "books_x_tags__COUNT"."book_id")
LEFT JOIN "tags" AS "tags__COUNT" ON ("books_x_tags__COUNT"."tag_id" = "tags__COUNT"."id")
LEFT JOIN "books_x_tags" AS "books_x_tags_any" ON ("books"."id" = "books_x_tags_any"."book_id")
LEFT JOIN "tags" AS "tags_any" ON ("books_x_tags_any"."tag_id" = "tags_any"."id")
GROUP BY "books"."id", "tags_any"."id"
HAVING ((COUNT("tags__COUNT"."id") > 1) AND (("tags_any"."id" IN (2, 3))))Expected behavior
Adding "tags_any"."id" IN (2, 3) to HAVING requires column "tags_any"."id" to be added in GROUP, which leads to duplicates in selection. In MySQL, the column could be moved from GROUP to SELECT, but in Postgres, that does not do the trick. In both it would be probably ok to SELECT DISTINCT, or to remove column from GROUP and move condition to WHERE (as it was in 4.0 version).
Versions
- Database: PostgreSQL 13.13.0
- Orm: dev-main
- Dbal: 5.0.0-rc4