diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-02-24 00:17:08 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-02-24 00:17:08 +0000 |
commit | 41802e102cf1436930f43d1ec19005bcceb41691 (patch) | |
tree | d7b7e1f77685f4e553fcb70ce725417b3672cb3c /lib/sqlalchemy/sql.py | |
parent | 736bc3bd5194a9a9f9dbb2424e4c0b6139bc8a77 (diff) | |
download | sqlalchemy-41802e102cf1436930f43d1ec19005bcceb41691.tar.gz |
- correlated subqueries work inside of ORDER BY, GROUP BY
Diffstat (limited to 'lib/sqlalchemy/sql.py')
-rw-r--r-- | lib/sqlalchemy/sql.py | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index 3acd76258..ffb4dc751 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -918,6 +918,8 @@ class ClauseList(ClauseElement): if c is None: continue self.append(c) self.parens = kwargs.get('parens', False) + def __iter__(self): + return iter(self.clauses) def copy_container(self): clauses = [clause.copy_container() for clause in self.clauses] return ClauseList(parens=self.parens, *clauses) @@ -1494,16 +1496,22 @@ class Select(_SelectBaseMixin, FromClause): self.__correlator = Select._CorrelatedVisitor(self, False) self.__wherecorrelator = Select._CorrelatedVisitor(self, True) - self.group_by(*(group_by or [None])) - self.order_by(*(order_by or [None])) - + if columns is not None: for c in columns: self.append_column(c) + self.order_by(*(order_by or [None])) + self.group_by(*(group_by or [None])) + for c in self.order_by_clause: + c.accept_visitor(self.__correlator) + for c in self.group_by_clause: + c.accept_visitor(self.__correlator) + for f in from_obj: self.append_from(f) + # whereclauses must be appended after the columns/FROM, since it affects # the correlation of subqueries. see test/sql/select.py SelectTest.testwheresubquery if whereclause is not None: @@ -1549,7 +1557,8 @@ class Select(_SelectBaseMixin, FromClause): # visit the FROM objects of the column looking for more Selects for f in column._get_from_objects(): - f.accept_visitor(self.__correlator) + if f is not self: + f.accept_visitor(self.__correlator) self._process_froms(column, False) def _make_proxy(self, selectable, name): if self.is_scalar: |