summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2017-03-16 17:28:41 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2017-04-03 12:14:33 -0400
commit7bb4923391f98db517dde59d813322a948d10bfe (patch)
tree7221ab187fa4307a116d1a6fc3100ad4122515c7
parentb32a0fd286de3cd4cbfd248d74e200985d7e214a (diff)
downloadsqlalchemy-7bb4923391f98db517dde59d813322a948d10bfe.tar.gz
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
-rw-r--r--doc/build/changelog/changelog_12.rst11
-rw-r--r--lib/sqlalchemy/sql/selectable.py8
-rw-r--r--test/sql/test_selectable.py14
3 files changed, 29 insertions, 4 deletions
diff --git a/doc/build/changelog/changelog_12.rst b/doc/build/changelog/changelog_12.rst
index 9fd4c1936..1d66adc8e 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 b69d667c6..9db1e0844 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 d38ee0e8a..0cbaf33ea 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