summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/expression.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-11-08 00:26:23 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-11-08 00:26:23 +0000
commit7a25be0f4214720198029e85c2f1d18f4fc8bad3 (patch)
treea7036d2b53881c858e75cd0229e712798989ef53 /lib/sqlalchemy/sql/expression.py
parent004345d7c9add3647fa9b04b5c8c8c6c77be3173 (diff)
downloadsqlalchemy-7a25be0f4214720198029e85c2f1d18f4fc8bad3.tar.gz
- identified some cases where Alias needs to be cloned; but still cant clone
when its an alias of a Table; added some test coverage for one particular case from the doctests - fixed "having" example in doctests, updated eager load example
Diffstat (limited to 'lib/sqlalchemy/sql/expression.py')
-rw-r--r--lib/sqlalchemy/sql/expression.py17
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: