From: Mike Bayer Date: Fri, 11 May 2007 00:21:29 +0000 (+0000) Subject: - _Label propigates "_hide_froms()" so that scalar selects X-Git-Tag: rel_0_3_8~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3de128138a896bc7373aa2684c920271c4781b7d;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - _Label propigates "_hide_froms()" so that scalar selects behave more properly with regards to FROM clause #574 --- diff --git a/CHANGES b/CHANGES index 3526f74864..a7d1477c86 100644 --- a/CHANGES +++ b/CHANGES @@ -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 0dcba3698d..5adef46f27 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 ccd5c33a8a..34a37c9784 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.