diff options
| author | Thomasina Lee <thomasina.lee@titanemail.com> | 2019-05-17 15:27:01 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-05-20 09:12:32 +0200 |
| commit | 3d4e53bcb1f94e451f291e832bfa668361cd64a2 (patch) | |
| tree | afd21c21825aa14b543b4a7b8fb3bcc66fb961f4 /django | |
| parent | db7d7901eeacf37f0a6f124e3733c4f121a23e76 (diff) | |
[2.2.x] Fixed #30488 -- Removed redundant Coalesce call in SQL generated by SearchVector.
Regression in 405c8363362063542e9e79beac53c8437d389520.
Backport of c38e7a79f4354ee831f92deb7a658fc0387e3bec from master
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/postgres/search.py | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/django/contrib/postgres/search.py b/django/contrib/postgres/search.py index f8c691d73b..08d92e3514 100644 --- a/django/contrib/postgres/search.py +++ b/django/contrib/postgres/search.py @@ -60,14 +60,6 @@ class SearchVector(SearchVectorCombinable, Func): 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) @@ -76,17 +68,26 @@ class SearchVector(SearchVectorCombinable, Func): 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 |
