diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-05-11 00:21:29 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-05-11 00:21:29 +0000 |
commit | 3de128138a896bc7373aa2684c920271c4781b7d (patch) | |
tree | 8ac21a6767187636e6243043b989be160cf52a7b | |
parent | 48648eedda50a84f5518ac2055286e1fde22fa00 (diff) | |
download | sqlalchemy-3de128138a896bc7373aa2684c920271c4781b7d.tar.gz |
- _Label propigates "_hide_froms()" so that scalar selects
behave more properly with regards to FROM clause #574
-rw-r--r-- | CHANGES | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/sql.py | 5 | ||||
-rw-r--r-- | test/sql/select.py | 6 |
3 files changed, 11 insertions, 2 deletions
@@ -7,6 +7,8 @@ - _Label class overrides compare_self to return its ultimate object. meaning, if you say someexpr.label('foo') == 5, it produces the correct "someexpr == 5". + - _Label propigates "_hide_froms()" so that scalar selects + behave more properly with regards to FROM clause #574 - fix to long name generation when using oid_column as an order by (oids used heavily in mapper queries) - orm diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index 0dcba3698..5adef46f2 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -2393,6 +2393,9 @@ class _Label(ColumnElement): def _get_from_objects(self): return self.obj._get_from_objects() + def _hide_froms(self): + return self.obj._hide_froms() + def _make_proxy(self, selectable, name = None): if isinstance(self.obj, Selectable): return self.obj._make_proxy(selectable, name=self.name) @@ -2829,7 +2832,7 @@ class Select(_SelectBaseMixin, FromClause): if self.is_scalar and not hasattr(self, 'type'): self.type = column.type - + # if the column is a Select statement itself, # accept visitor self.__correlator.traverse(column) diff --git a/test/sql/select.py b/test/sql/select.py index ccd5c33a8..34a37c978 100644 --- a/test/sql/select.py +++ b/test/sql/select.py @@ -134,8 +134,12 @@ sq.myothertable_othername AS sq_myothertable_othername FROM (" + sqstring + ") A def testdontovercorrelate(self): self.runtest(select([table1], from_obj=[table1, table1.select()]), """SELECT mytable.myid, mytable.name, mytable.description FROM mytable, (SELECT mytable.myid AS myid, mytable.name AS name, mytable.description AS description FROM mytable)""") - def testselectexists(self): + def testexistsascolumnclause(self): self.runtest(exists([table1.c.myid], table1.c.myid==5).select(), "SELECT EXISTS (SELECT mytable.myid AS myid FROM mytable WHERE mytable.myid = :mytable_myid)", params={'mytable_myid':5}) + + self.runtest(select([table1, exists([1], from_obj=[table2])]), "SELECT mytable.myid, mytable.name, mytable.description, EXISTS (SELECT 1 FROM myothertable) FROM mytable", params={}) + + self.runtest(select([table1, exists([1], from_obj=[table2]).label('foo')]), "SELECT mytable.myid, mytable.name, mytable.description, (EXISTS (SELECT 1 FROM myothertable)) AS foo FROM mytable", params={}) def testwheresubquery(self): # TODO: this tests that you dont get a "SELECT column" without a FROM but its not working yet. |