summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/expression.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/sql/expression.py')
-rw-r--r--lib/sqlalchemy/sql/expression.py19
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py
index edab9e290..633a3ddba 100644
--- a/lib/sqlalchemy/sql/expression.py
+++ b/lib/sqlalchemy/sql/expression.py
@@ -795,7 +795,7 @@ def intersect_all(*selects, **kwargs):
return CompoundSelect(CompoundSelect.INTERSECT_ALL, *selects, **kwargs)
-def alias(selectable, name=None):
+def alias(selectable, name=None, flat=False):
"""Return an :class:`.Alias` object.
An :class:`.Alias` represents any :class:`.FromClause`
@@ -2634,7 +2634,7 @@ class FromClause(Selectable):
return Join(self, right, onclause, True)
- def alias(self, name=None):
+ def alias(self, name=None, flat=False):
"""return an alias of this :class:`.FromClause`.
This is shorthand for calling::
@@ -3971,7 +3971,7 @@ class Join(FromClause):
def bind(self):
return self.left.bind or self.right.bind
- def alias(self, name=None):
+ def alias(self, name=None, flat=False):
"""return an alias of this :class:`.Join`.
Used against a :class:`.Join` object,
@@ -3999,7 +3999,16 @@ class Join(FromClause):
aliases.
"""
- return self.select(use_labels=True, correlate=False).alias(name)
+ if flat:
+ assert name is None, "Can't send name argument with flat"
+ left_a, right_a = self.left.alias(), self.right.alias()
+ adapter = sqlutil.ClauseAdapter(left_a).\
+ chain(sqlutil.ClauseAdapter(right_a))
+
+ return left_a.join(right_a,
+ adapter.traverse(self.onclause), isouter=self.isouter)
+ else:
+ return self.select(use_labels=True, correlate=False).alias(name)
@property
def _hide_froms(self):
@@ -4129,7 +4138,7 @@ class CTE(Alias):
self._restates = _restates
super(CTE, self).__init__(selectable, name=name)
- def alias(self, name=None):
+ def alias(self, name=None, flat=False):
return CTE(
self.original,
name=name,