summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGastón Avila <avila.gas@gmail.com>2024-09-04 17:32:40 -0300
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-09-11 14:40:48 +0200
commit590f5e09f001736aa1fe3f7f086f8a5ab5e4bfdb (patch)
treee05950ceef0e8eb89cc80aec6e9b2aa8b464e8ab
parentbf45f0676951243894e3686a80c3ebaa2c1cf107 (diff)
[5.1.x] 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. Backport of c3ca6075cc0ad425bcf905fe14062f38eb9fbcbf from main. Co-authored-by: Emiliano Cuenca <106986074+emicuencac@users.noreply.github.com>
-rw-r--r--django/db/models/functions/text.py2
-rw-r--r--docs/releases/5.1.2.txt4
-rw-r--r--tests/postgres_tests/test_trigram.py18
3 files changed, 22 insertions, 2 deletions
diff --git a/django/db/models/functions/text.py b/django/db/models/functions/text.py
index df826ffdb5..9c48659bf9 100644
--- a/django/db/models/functions/text.py
+++ b/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,
)
diff --git a/docs/releases/5.1.2.txt b/docs/releases/5.1.2.txt
index 234c9e0bd5..1cf3f9df09 100644
--- a/docs/releases/5.1.2.txt
+++ b/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`).
diff --git a/tests/postgres_tests/test_trigram.py b/tests/postgres_tests/test_trigram.py
index 812403a324..b6c88c38a6 100644
--- a/tests/postgres_tests/test_trigram.py
+++ b/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):
"""