Repair and cover adaption call w/ ORM having()

Fixed 1.4 regression where the use of :meth:`_orm.Query.having` in
conjunction with queries with internally adapted SQL elements (common in
inheritance scenarios) would fail due to an incorrect function call. Pull
request courtesy esoh.

Fixes: #5781
Closes: #5782
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/5782
Pull-request-sha: 5d37b0be0d

Change-Id: I123b2c0a4a23b7c7c72929dec79801726afc71ee
This commit is contained in:
esoh
2020-12-18 21:59:31 -05:00
committed by Mike Bayer
parent 8294a336b1
commit b1a24ef41e
4 changed files with 37 additions and 2 deletions
+9
View File
@@ -0,0 +1,9 @@
.. change::
:tags: bug, orm
:tickets: 5781
Fixed 1.4 regression where the use of :meth:`_orm.Query.having` in
conjunction with queries with internally adapted SQL elements (common in
inheritance scenarios) would fail due to an incorrect function call. Pull
request courtesy esoh.
+1 -1
View File
@@ -585,7 +585,7 @@ class ORMSelectCompileState(ORMCompileState, SelectState):
if query._having_criteria:
self._having_criteria = tuple(
current_adapter(crit, True, True) if current_adapter else crit
current_adapter(crit, True) if current_adapter else crit
for crit in query._having_criteria
)
+9 -1
View File
@@ -2360,4 +2360,12 @@ class PolymorphicAliasedJoinsTest(
class PolymorphicJoinsTest(_PolymorphicTestBase, _PolymorphicJoins):
pass
def test_having_group_by(self):
sess = create_session()
eq_(
sess.query(Person.name)
.group_by(Person.name)
.having(Person.name == "dilbert")
.all(),
[("dilbert",)],
)
+18
View File
@@ -416,6 +416,24 @@ class SingleInheritanceTest(testing.AssertsCompiledSQL, fixtures.MappedTest):
},
)
def test_having(self):
Engineer, Manager = self.classes("Engineer", "Manager")
sess = create_session()
self.assert_compile(
sess.query(Engineer)
.group_by(Engineer.employee_id)
.having(Engineer.name == "js"),
"SELECT employees.employee_id AS employees_employee_id, "
"employees.name AS employees_name, employees.manager_data "
"AS employees_manager_data, employees.engineer_info "
"AS employees_engineer_info, employees.type AS employees_type "
"FROM employees WHERE employees.type IN ([POSTCOMPILE_type_1]) "
"GROUP BY employees.employee_id HAVING employees.name = :name_1",
)
def test_from_self_count(self):
Engineer = self.classes.Engineer