Browse Source

Fixed #34459 -- Fixed SearchVector() crash for parameters with % symbol.

Thanks Patryk Zawadzki for the report.

Regression in 09ffc5c1212d4ced58b708cbbf3dfbfb77b782ca.
Mariusz Felisiak 2 years ago
parent
commit
4bf4222010

+ 1 - 4
django/contrib/postgres/search.py

@@ -144,10 +144,7 @@ class SearchVector(SearchVectorCombinable, Func):
             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):

+ 4 - 0
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`).

+ 6 - 0
tests/postgres_tests/test_search.py

@@ -160,6 +160,12 @@ class SearchVectorFieldTest(GrailTestData, PostgreSQLTestCase):
         )
         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):