From d57721a41bad5e85c3232c72867d853c0e7b80e5 Mon Sep 17 00:00:00 2001 From: stumpylog <797416+stumpylog@users.noreply.github.com> Date: Thu, 16 Jul 2026 12:54:03 -0700 Subject: [PATCH] Fix: avoid HAVING clause conflicts in custom field query filter on MariaDB --- src/documents/filters.py | 9 ++++++++- src/documents/tests/test_api_filter_by_custom_fields.py | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/documents/filters.py b/src/documents/filters.py index 39c6eb467..e2e2501ce 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -771,7 +771,14 @@ class CustomFieldQueryFilter(Filter): ) q, annotations = parser.parse(value) - return qs.annotate(**annotations).filter(q) + # The Count(...) annotations above require a GROUP BY/HAVING to evaluate. + # Applying them directly to `qs` mixes that HAVING with `qs`'s existing + # joins (e.g. repeated tag joins from tags__id__all, the object-permission + # OR-filter), which some backends (e.g. MariaDB) fail to plan correctly, + # raising "Unknown column ... in 'HAVING'". Evaluating the annotation on + # an isolated queryset keeps the GROUP BY/HAVING self-contained. + matching_ids = Document.objects.annotate(**annotations).filter(q).values("pk") + return qs.filter(pk__in=matching_ids) class DocumentFilterSet(FilterSet): diff --git a/src/documents/tests/test_api_filter_by_custom_fields.py b/src/documents/tests/test_api_filter_by_custom_fields.py index 4388d6ec5..396b07b72 100644 --- a/src/documents/tests/test_api_filter_by_custom_fields.py +++ b/src/documents/tests/test_api_filter_by_custom_fields.py @@ -138,7 +138,7 @@ class TestCustomFieldsSearch(DirectoriesMixin, APITestCase): title = str(kwargs) document = Document.objects.create( title=title, - checksum=title, + checksum=title[:64], archive_serial_number=len(self.documents) + 1, ) data = {