diff options
| -rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 7 | ||||
| -rw-r--r-- | test/sql/test_selectable.py | 69 | ||||
| -rw-r--r-- | test/sql/test_text.py | 77 |
3 files changed, 144 insertions, 9 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index d4b080720..d597837bd 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -616,10 +616,9 @@ class SQLCompiler(Compiled): ) if populate_result_map: - for c in taf.c: - self._add_to_result_map( - c.key, c.key, (c,), c.type - ) + for c in taf.column_args: + self.process(c, within_columns_clause=True, + add_to_result_map=self._add_to_result_map) text = self.process(taf.element, **kw) if asfrom and parens: diff --git a/test/sql/test_selectable.py b/test/sql/test_selectable.py index 3c29d9784..dbd73a836 100644 --- a/test/sql/test_selectable.py +++ b/test/sql/test_selectable.py @@ -1927,6 +1927,75 @@ class WithLabelsTest(fixtures.TestBase): ) self._assert_result_keys(sel, ['t1_a', 't2_b']) +class SelectProxyTest(fixtures.TestBase): + def _fixture(self): + m = MetaData() + t = Table('t', m, Column('x', Integer), Column('y', Integer)) + return t + + def _mapping(self, stmt): + compiled = stmt.compile() + return dict( + (elem, key) + for key, elements in compiled.result_map.items() + for elem in elements[1] + ) + + def test_select_label_alt_name(self): + t = self._fixture() + l1, l2 = t.c.x.label('a'), t.c.y.label('b') + s = select([l1, l2]) + mapping = self._mapping(s) + assert l1 in mapping + + assert t.c.x not in mapping + + def test_select_alias_label_alt_name(self): + t = self._fixture() + l1, l2 = t.c.x.label('a'), t.c.y.label('b') + s = select([l1, l2]).alias() + mapping = self._mapping(s) + assert l1 in mapping + + assert t.c.x not in mapping + + def test_select_alias_column(self): + t = self._fixture() + x, y = t.c.x, t.c.y + s = select([x, y]).alias() + mapping = self._mapping(s) + + assert t.c.x in mapping + + def test_select_alias_column_apply_labels(self): + t = self._fixture() + x, y = t.c.x, t.c.y + s = select([x, y]).apply_labels().alias() + mapping = self._mapping(s) + assert t.c.x in mapping + + def test_select_table_alias_column(self): + t = self._fixture() + x, y = t.c.x, t.c.y + + ta = t.alias() + s = select([ta.c.x, ta.c.y]) + mapping = self._mapping(s) + assert x not in mapping + + def test_select_label_alt_name_table_alias_column(self): + t = self._fixture() + x, y = t.c.x, t.c.y + + ta = t.alias() + l1, l2 = ta.c.x.label('a'), ta.c.y.label('b') + + s = select([l1, l2]) + mapping = self._mapping(s) + assert x not in mapping + assert l1 in mapping + assert ta.c.x not in mapping + class ForUpdateTest(fixtures.TestBase, AssertsCompiledSQL): __dialect__ = "default" diff --git a/test/sql/test_text.py b/test/sql/test_text.py index 37346437e..57dadfb16 100644 --- a/test/sql/test_text.py +++ b/test/sql/test_text.py @@ -2,7 +2,7 @@ from sqlalchemy.testing import fixtures, AssertsCompiledSQL, eq_, assert_raises_message from sqlalchemy import text, select, Integer, String, Float, \ - bindparam, and_, func, literal_column, exc + bindparam, and_, func, literal_column, exc, MetaData, Table, Column from sqlalchemy.types import NullType from sqlalchemy.sql import table, column @@ -291,8 +291,8 @@ class AsFromTest(fixtures.TestBase, AssertsCompiledSQL): eq_( compiled.result_map, { - 'id': ('id', (t.c.id,), t.c.id.type), - 'name': ('name', (t.c.name,), t.c.name.type) + 'id': ('id', (t.c.id._proxies[0], 'id', 'id'), t.c.id.type), + 'name': ('name', (t.c.name._proxies[0], 'name', 'name'), t.c.name.type) } ) @@ -303,8 +303,8 @@ class AsFromTest(fixtures.TestBase, AssertsCompiledSQL): eq_( compiled.result_map, { - 'id': ('id', (t.c.id,), t.c.id.type), - 'name': ('name', (t.c.name,), t.c.name.type) + 'id': ('id', (t.c.id._proxies[0], 'id', 'id'), t.c.id.type), + 'name': ('name', (t.c.name._proxies[0], 'name', 'name'), t.c.name.type) } ) @@ -322,6 +322,73 @@ class AsFromTest(fixtures.TestBase, AssertsCompiledSQL): } ) + def _xy_table_fixture(self): + m = MetaData() + t = Table('t', m, Column('x', Integer), Column('y', Integer)) + return t + + def _mapping(self, stmt): + compiled = stmt.compile() + return dict( + (elem, key) + for key, elements in compiled.result_map.items() + for elem in elements[1] + ) + + def test_select_label_alt_name(self): + t = self._xy_table_fixture() + l1, l2 = t.c.x.label('a'), t.c.y.label('b') + s = text("select x AS a, y AS b FROM t").columns(l1, l2) + mapping = self._mapping(s) + assert l1 in mapping + + assert t.c.x not in mapping + + def test_select_alias_label_alt_name(self): + t = self._xy_table_fixture() + l1, l2 = t.c.x.label('a'), t.c.y.label('b') + s = text("select x AS a, y AS b FROM t").columns(l1, l2).alias() + mapping = self._mapping(s) + assert l1 in mapping + + assert t.c.x not in mapping + + def test_select_column(self): + t = self._xy_table_fixture() + x, y = t.c.x, t.c.y + s = text("select x, y FROM t").columns(x, y) + mapping = self._mapping(s) + assert t.c.x in mapping + + def test_select_alias_column(self): + t = self._xy_table_fixture() + x, y = t.c.x, t.c.y + s = text("select x, y FROM t").columns(x, y).alias() + mapping = self._mapping(s) + assert t.c.x in mapping + + def test_select_table_alias_column(self): + t = self._xy_table_fixture() + x, y = t.c.x, t.c.y + + ta = t.alias() + s = text("select ta.x, ta.y FROM t AS ta").columns(ta.c.x, ta.c.y) + mapping = self._mapping(s) + assert x not in mapping + + def test_select_label_alt_name_table_alias_column(self): + t = self._xy_table_fixture() + x, y = t.c.x, t.c.y + + ta = t.alias() + l1, l2 = ta.c.x.label('a'), ta.c.y.label('b') + + s = text("SELECT ta.x AS a, ta.y AS b FROM t AS ta").columns(l1, l2) + mapping = self._mapping(s) + assert x not in mapping + assert l1 in mapping + assert ta.c.x not in mapping + def test_cte(self): t = text("select id, name from user").columns(id=Integer, name=String).cte('t') |
