diff --git a/django/contrib/postgres/search.py b/django/contrib/postgres/search.py index 4e370aa167740..936709c2f840c 100644 --- a/django/contrib/postgres/search.py +++ b/django/contrib/postgres/search.py @@ -144,10 +144,7 @@ def as_sql(self, compiler, connection, function=None, template=None): weight_sql, extra_params = compiler.compile(clone.weight) sql = "setweight({}, {})".format(sql, weight_sql) - # These parameters must be bound on the client side because we may - # want to create an index on this expression. - sql = connection.ops.compose_sql(sql, config_params + params + extra_params) - return sql, [] + return sql, config_params + params + extra_params class CombinedSearchVector(SearchVectorCombinable, CombinedExpression): diff --git a/docs/releases/4.2.1.txt b/docs/releases/4.2.1.txt index 2dd051b8fa181..c768b98b18bfa 100644 --- a/docs/releases/4.2.1.txt +++ b/docs/releases/4.2.1.txt @@ -11,3 +11,7 @@ Bugfixes * Fixed a regression in Django 4.2 that caused a crash of ``QuerySet.defer()`` when deferring fields by attribute names (:ticket:`34458`). + +* Fixed a regression in Django 4.2 that caused a crash of + :class:`~django.contrib.postgres.search.SearchVector` function with ``%`` + characters (:ticket:`34459`). diff --git a/tests/postgres_tests/test_search.py b/tests/postgres_tests/test_search.py index fa7d885221ca0..6f6318899c271 100644 --- a/tests/postgres_tests/test_search.py +++ b/tests/postgres_tests/test_search.py @@ -160,6 +160,12 @@ def test_single_coalesce_expression(self): ) self.assertNotIn("COALESCE(COALESCE", str(searched.query)) + def test_values_with_percent(self): + searched = Line.objects.annotate( + search=SearchVector(Value("This week everything is 10% off")) + ).filter(search="10 % off") + self.assertEqual(len(searched), 9) + class SearchConfigTests(PostgreSQLSimpleTestCase): def test_from_parameter(self):