Skip to content

Commit

Permalink
[2.2.x] Fixed #30488 -- Removed redundant Coalesce call in SQL genera…
Browse files Browse the repository at this point in the history
…ted by SearchVector.

Regression in 405c836.

Backport of c38e7a7 from master
  • Loading branch information
Thomasina Lee authored and felixxm committed May 20, 2019
1 parent db7d790 commit 3d4e53b
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 14 deletions.
29 changes: 15 additions & 14 deletions django/contrib/postgres/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,6 @@ def __init__(self, *expressions, **extra):

def resolve_expression(self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False):
resolved = super().resolve_expression(query, allow_joins, reuse, summarize, for_save)
resolved.set_source_expressions([
Coalesce(
expression
if isinstance(expression.output_field, (CharField, TextField))
else Cast(expression, TextField()),
Value('')
) for expression in resolved.get_source_expressions()
])
if self.config:
if not hasattr(self.config, 'resolve_expression'):
resolved.config = Value(self.config).resolve_expression(query, allow_joins, reuse, summarize, for_save)
Expand All @@ -76,17 +68,26 @@ def resolve_expression(self, query=None, allow_joins=True, reuse=None, summarize
return resolved

def as_sql(self, compiler, connection, function=None, template=None):
clone = self.copy()
clone.set_source_expressions([
Coalesce(
expression
if isinstance(expression.output_field, (CharField, TextField))
else Cast(expression, TextField()),
Value('')
) for expression in clone.get_source_expressions()
])
config_params = []
if template is None:
if self.config:
config_sql, config_params = compiler.compile(self.config)
if clone.config:
config_sql, config_params = compiler.compile(clone.config)
template = '%(function)s({}::regconfig, %(expressions)s)'.format(config_sql.replace('%', '%%'))
else:
template = self.template
sql, params = super().as_sql(compiler, connection, function=function, template=template)
template = clone.template
sql, params = super(SearchVector, clone).as_sql(compiler, connection, function=function, template=template)
extra_params = []
if self.weight:
weight_sql, extra_params = compiler.compile(self.weight)
if clone.weight:
weight_sql, extra_params = compiler.compile(clone.weight)
sql = 'setweight({}, {})'.format(sql, weight_sql)
return sql, config_params + params + extra_params

Expand Down
4 changes: 4 additions & 0 deletions docs/releases/2.2.2.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ Bugfixes

* Fixed a regression in Django 2.2 where deprecation message crashes if
``Meta.ordering`` contains an expression (:ticket:`30463`).

* Fixed a regression in Django 2.2.1 where
:class:`~django.contrib.postgres.search.SearchVector` generates SQL with a
redundant ``Coalesce`` call (:ticket:`30488`).
4 changes: 4 additions & 0 deletions tests/postgres_tests/test_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ def test_existing_vector_config_explicit(self):
searched = Line.objects.filter(dialogue_search_vector=SearchQuery('cadeaux', config='french'))
self.assertSequenceEqual(searched, [self.french])

def test_single_coalesce_expression(self):
searched = Line.objects.annotate(search=SearchVector('dialogue')).filter(search='cadeaux')
self.assertNotIn('COALESCE(COALESCE', str(searched.query))


class MultipleFieldsTest(GrailTestData, PostgreSQLTestCase):

Expand Down

0 comments on commit 3d4e53b

Please sign in to comment.