From 61ea3718224e6264f2d21858da70e3cbff3bd72e Mon Sep 17 00:00:00 2001 From: Josh Smeaton Date: Mon, 19 Oct 2015 12:06:11 +1100 Subject: [PATCH] Refs #25517 -- Fixed backport inconsistencies. --- django/db/models/expressions.py | 11 +++++++++++ django/db/models/functions.py | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index d3769b49a9..5d6fab6595 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -339,6 +339,17 @@ class BaseExpression(object): def reverse_ordering(self): return self + def flatten(self): + """ + Recursively yield this expression and all subexpressions, in + depth-first order. + """ + yield self + for expr in self.get_source_expressions(): + if expr: + for inner_expr in expr.flatten(): + yield inner_expr + class Expression(BaseExpression, Combinable): """ diff --git a/django/db/models/functions.py b/django/db/models/functions.py index 531f9a882f..92665a658a 100644 --- a/django/db/models/functions.py +++ b/django/db/models/functions.py @@ -47,8 +47,8 @@ class ConcatPair(Func): return super(ConcatPair, coalesced).as_sql(compiler, connection) def as_mysql(self, compiler, connection): - self.coalesce() - return super(ConcatPair, self).as_sql(compiler, connection) + coalesced = self.coalesce() + return super(ConcatPair, coalesced).as_sql(compiler, connection) def coalesce(self): # null on either side results in null for expression, wrap with coalesce