From 7002b2b0b109e70b47d4ae4f5f6a4d7df5586f21 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 29 Apr 2021 16:38:03 -0400 Subject: Ensure iterable passed to Select is not a mapped class Fixed regression caused by :ticket:`5395` where tuning back the check for sequences in :func:`_sql.select` now caused failures when doing 2.0-style querying with a mapped class that also happens to have an ``__iter__()`` method. Tuned the check some more to accommodate this as well as some other interesting ``__iter__()`` scenarios. Fixes: #6300 Change-Id: Idf1983fd764b91a7d5fa8117aee8a3def3cfe5ff --- test/sql/test_select.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'test/sql') diff --git a/test/sql/test_select.py b/test/sql/test_select.py index 96c6abd07..1dfb4cd19 100644 --- a/test/sql/test_select.py +++ b/test/sql/test_select.py @@ -82,6 +82,54 @@ class FutureSelectTest(fixtures.TestBase, AssertsCompiledSQL): "WHERE mytable.myid = myothertable.otherid", ) + def test_new_calling_style_clauseelement_thing_that_has_iter(self): + class Thing(object): + def __clause_element__(self): + return table1 + + def __iter__(self): + return iter(["a", "b", "c"]) + + stmt = select(Thing()) + self.assert_compile( + stmt, + "SELECT mytable.myid, mytable.name, " + "mytable.description FROM mytable", + ) + + def test_new_calling_style_inspectable_ce_thing_that_has_iter(self): + class Thing(object): + def __iter__(self): + return iter(["a", "b", "c"]) + + class InspectedThing(object): + def __clause_element__(self): + return table1 + + from sqlalchemy.inspection import _inspects + + @_inspects(Thing) + def _ce(thing): + return InspectedThing() + + stmt = select(Thing()) + self.assert_compile( + stmt, + "SELECT mytable.myid, mytable.name, " + "mytable.description FROM mytable", + ) + + def test_new_calling_style_thing_ok_actually_use_iter(self): + class Thing(object): + def __iter__(self): + return iter([table1.c.name, table1.c.description]) + + stmt = select(Thing()) + self.assert_compile( + stmt, + "SELECT mytable.name, mytable.description FROM mytable", + ) + def test_kw_triggers_old_style(self): assert_raises_message( -- cgit v1.2.1