diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/sql/expression.py | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 479ce6425..6276f33bd 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -842,7 +842,6 @@ class ClauseElement(object): part of the "deep" copy afforded by a traversal that combines the _copy_internals() method. """ - c = self.__class__.__new__(self.__class__) c.__dict__ = self.__dict__.copy() return c @@ -2396,11 +2395,21 @@ class Alias(FromClause): return self.selectable.columns def _clone(self): - # Alias is immutable - return self + # TODO: need test coverage to assert ClauseAdapter behavior + # here; must identify non-ORM failure cases when a. _clone() returns 'self' in all + # cases and b. when _clone() does an actual _clone() in all cases. + if isinstance(self.selectable, TableClause): + return self + else: + return super(Alias, self)._clone() def _copy_internals(self, clone=_clone): - pass + self._clone_from_clause() + self.selectable = _clone(self.selectable) + baseselectable = self.selectable + while isinstance(baseselectable, Alias): + baseselectable = baseselectable.selectable + self.original = baseselectable def get_children(self, **kwargs): for c in self.c: |
