From: Mike Bayer Date: Thu, 16 Mar 2017 21:28:41 +0000 (-0400) Subject: Use consistent method signature for Alias.self_group() X-Git-Tag: rel_1_2_0b1~120^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7bb4923391f98db517dde59d813322a948d10bfe;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Use consistent method signature for Alias.self_group() Fixed bug where the use of an :class:`.Alias` object in a column context would raise an argument error when it tried to group itself into a parenthesized expression. Using :class:`.Alias` in this way is not yet a fully supported API, however it applies to some end-user recipes and may have a more prominent role in support of some future Postgresql features. Change-Id: I81717e30416e0350f08d1e022c3d84656e0a9735 Fixes: #3939 --- diff --git a/doc/build/changelog/changelog_12.rst b/doc/build/changelog/changelog_12.rst index 9fd4c1936a..1d66adc8ef 100644 --- a/doc/build/changelog/changelog_12.rst +++ b/doc/build/changelog/changelog_12.rst @@ -120,6 +120,17 @@ :ref:`change_3919` + .. change:: 3939 + :tags: bug, sql + :tickets: 3939 + + Fixed bug where the use of an :class:`.Alias` object in a column + context would raise an argument error when it tried to group itself + into a parenthesized expression. Using :class:`.Alias` in this way + is not yet a fully supported API, however it applies to some end-user + recipes and may have a more prominent role in support of some + future Postgresql features. + .. change:: 3366 :tags: bug, orm :tickets: 3366 diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index b69d667c63..9db1e0844b 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -1241,13 +1241,13 @@ class Alias(FromClause): or 'anon')) self.name = name - def self_group(self, target=None): - if isinstance(target, CompoundSelect) and \ + def self_group(self, against=None): + if isinstance(against, CompoundSelect) and \ isinstance(self.original, Select) and \ self.original._needs_parens_for_grouping(): return FromGrouping(self) - return super(Alias, self).self_group(target) + return super(Alias, self).self_group(against=against) @property def description(self): @@ -2269,7 +2269,7 @@ class CompoundSelect(GenerativeSelect): n + 1, len(s.c._all_columns)) ) - self.selects.append(s.self_group(self)) + self.selects.append(s.self_group(against=self)) GenerativeSelect.__init__(self, **kwargs) diff --git a/test/sql/test_selectable.py b/test/sql/test_selectable.py index d38ee0e8a5..0cbaf33ea7 100644 --- a/test/sql/test_selectable.py +++ b/test/sql/test_selectable.py @@ -333,6 +333,20 @@ class SelectableTest( criterion = a.c.col1 == table2.c.col2 self.assert_(criterion.compare(j.onclause)) + def test_alias_handles_column_context(self): + # not quite a use case yet but this is expected to become + # prominent w/ Postgresql's tuple functions + + stmt = select([table1.c.col1, table1.c.col2]) + a = stmt.alias('a') + self.assert_compile( + select([func.foo(a)]), + "SELECT foo(SELECT table1.col1, table1.col2 FROM table1) " + "AS foo_1 FROM " + "(SELECT table1.col1 AS col1, table1.col2 AS col2 FROM table1) " + "AS a" + ) + def test_union(self): # tests that we can correspond a column in a Select statement