Bladeren bron

Fixed #35732 -- Wrapped ConcatPair expression in parentheses to ensure operator precedence.

When ConcatPair was updated to use || this lost the implicit wrapping from CONCAT(...).
This broke the WHERE clauses when used in combination with PostgreSQL trigram similarity.

Regression in 6364b6ee1071381eb3a23ba6b821fc0d6f0fce75.

Co-authored-by: Emiliano Cuenca <106986074+emicuencac@users.noreply.github.com>
Gastón Avila 6 maanden geleden
bovenliggende
commit
c3ca6075cc
3 gewijzigde bestanden met toevoegingen van 22 en 2 verwijderingen
  1. 1 1
      django/db/models/functions/text.py
  2. 3 1
      docs/releases/5.1.2.txt
  3. 18 0
      tests/postgres_tests/test_trigram.py

+ 1 - 1
django/db/models/functions/text.py

@@ -78,7 +78,7 @@ class ConcatPair(Func):
         return super(ConcatPair, coalesced).as_sql(
             compiler,
             connection,
-            template="%(expressions)s",
+            template="(%(expressions)s)",
             arg_joiner=" || ",
             **extra_context,
         )

+ 3 - 1
docs/releases/5.1.2.txt

@@ -9,4 +9,6 @@ Django 5.1.2 fixes several bugs in 5.1.1.
 Bugfixes
 ========
 
-* ...
+* Fixed a regression in Django 5.1 that caused a crash when using the
+  PostgreSQL lookup :lookup:`trigram_similar` on output fields from ``Concat``
+  (:ticket:`35732`).

+ 18 - 0
tests/postgres_tests/test_trigram.py

@@ -1,3 +1,6 @@
+from django.db.models import F, Value
+from django.db.models.functions import Concat
+
 from . import PostgreSQLTestCase
 from .models import CharFieldModel, TextFieldModel
 
@@ -149,6 +152,21 @@ class TrigramTest(PostgreSQLTestCase):
             ],
         )
 
+    def test_trigram_concat_precedence(self):
+        search_term = "im matthew"
+        self.assertSequenceEqual(
+            self.Model.objects.annotate(
+                concat_result=Concat(
+                    Value("I'm "),
+                    F("field"),
+                    output_field=self.Model._meta.get_field("field"),
+                ),
+            )
+            .filter(concat_result__trigram_similar=search_term)
+            .values("field"),
+            [{"field": "Matthew"}],
+        )
+
 
 class TrigramTextFieldTest(TrigramTest):
     """