diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2021-03-19 05:23:26 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2021-03-19 05:23:26 +0000 |
| commit | aabb899ea5adb437b7a9ee45edf2d492ae2a5980 (patch) | |
| tree | fc62aa8abd4b4ad83bf8ffd62d8a1a2424199496 /test | |
| parent | ffbced86711812a5cb16038092d3e181f92a1eab (diff) | |
| parent | c1c999c01d595b74fe178d9bdbff34fd8939a283 (diff) | |
| download | sqlalchemy-aabb899ea5adb437b7a9ee45edf2d492ae2a5980.tar.gz | |
Merge "Ensure ClauseAdapter treats FunctionElement as a ColumnElement"
Diffstat (limited to 'test')
| -rw-r--r-- | test/orm/test_eager_relations.py | 31 | ||||
| -rw-r--r-- | test/sql/test_external_traversal.py | 34 |
2 files changed, 65 insertions, 0 deletions
diff --git a/test/orm/test_eager_relations.py b/test/orm/test_eager_relations.py index f62d3af33..289f8e8b1 100644 --- a/test/orm/test_eager_relations.py +++ b/test/orm/test_eager_relations.py @@ -488,6 +488,37 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL): self.assert_sql_count(testing.db, go, 1) + def test_aliased_stmt_includes_unnamed_fn(self): + User, Address = self.classes("User", "Address") + users, addresses = self.tables("users", "addresses") + mapper( + User, + users, + properties={"addresses": relationship(Address, lazy="joined")}, + ) + mapper(Address, addresses) + + s = fixture_session() + + # issue #6086 + # statement wrapped in a subquery by limit() and group_by() + # func.count() is unlabeled (in 1.3 the _ColumnEntity would label it, + # in the ORM layer, hence there was no problem here). + # the _ColumnEntity needs to adapt func.count(User.id) to the anon + # count_1 label on the outside, corresponding_column can do it. + # but ClauseAdapter has to treat the FunctionElement as a ColumnElement + # whereas previously it was treating it as a FromClause (and + # FunctionElement should really not even be a FromClause but there's + # legacy baggage on that) + q = ( + s.query(User, func.count(User.id)) + .order_by(User.id) + .group_by(User.id) + .limit(1) + ) + + eq_(q.first(), (User(id=7), 1)) + def test_options_pathing(self): ( users, diff --git a/test/sql/test_external_traversal.py b/test/sql/test_external_traversal.py index bc6013791..b7e58dad9 100644 --- a/test/sql/test_external_traversal.py +++ b/test/sql/test_external_traversal.py @@ -1338,6 +1338,40 @@ class ClauseAdapterTest(fixtures.TestBase, AssertsCompiledSQL): "AS anon_1 FROM table1 AS t1alias", ) + def test_adapt_select_w_unlabeled_fn(self): + + expr = func.count(t1.c.col1) + stmt = select(t1, expr) + + self.assert_compile( + stmt, + "SELECT table1.col1, table1.col2, table1.col3, " + "count(table1.col1) AS count_1 FROM table1", + ) + + stmt2 = select(stmt.subquery()) + + self.assert_compile( + stmt2, + "SELECT anon_1.col1, anon_1.col2, anon_1.col3, anon_1.count_1 " + "FROM (SELECT table1.col1 AS col1, table1.col2 AS col2, " + "table1.col3 AS col3, count(table1.col1) AS count_1 " + "FROM table1) AS anon_1", + ) + + is_( + stmt2.selected_columns[3], + stmt2.selected_columns.corresponding_column(expr), + ) + + is_( + sql_util.ClauseAdapter(stmt2).replace(expr), + stmt2.selected_columns[3], + ) + + column_adapter = sql_util.ColumnAdapter(stmt2) + is_(column_adapter.columns[expr], stmt2.selected_columns[3]) + def test_correlate_except_on_clone(self): # test [ticket:4537]'s issue |
