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 6364b6ee10.

Co-authored-by: Emiliano Cuenca <106986074+emicuencac@users.noreply.github.com>
This commit is contained in:
Gastón Avila 2024-09-04 17:32:40 -03:00 committed by Sarah Boyce
parent 38c2065154
commit c3ca6075cc
3 changed files with 22 additions and 2 deletions

View File

@ -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,
)

View File

@ -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`).

View File

@ -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):
"""