From 889cbe53121c8fd50c845357dd52b24594346b68 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 1 May 2022 12:28:36 -0400 Subject: use bindparam_type in BinaryElementImpl._post_coercion if available Fixed an issue where using :func:`.bindparam` with no explicit data or type given could be coerced into the incorrect type when used in expressions such as when using :meth:`.ARRAY.comparator.any` and :meth:`.ARRAY.comparator.all`. Fixes: #7979 Change-Id: If7779e713c9a3a5fee496b66e417cfd3fca5b1f9 --- test/sql/test_operators.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'test/sql') diff --git a/test/sql/test_operators.py b/test/sql/test_operators.py index 77ca95de7..186b93c54 100644 --- a/test/sql/test_operators.py +++ b/test/sql/test_operators.py @@ -5,6 +5,7 @@ import pickle from sqlalchemy import and_ from sqlalchemy import between +from sqlalchemy import bindparam from sqlalchemy import exc from sqlalchemy import Integer from sqlalchemy import join @@ -3790,6 +3791,24 @@ class AnyAllTest(fixtures.TestBase, testing.AssertsCompiledSQL): t.c.data + all_(t.c.arrval), "tab1.data + ALL (tab1.arrval)" ) + @testing.combinations("all", "any", argnames="op") + def test_any_all_bindparam_coercion(self, t_fixture, op): + """test #7979""" + t = t_fixture + + if op == "all": + expr = t.c.arrval.all(bindparam("param")) + expected = "%(param)s = ALL (tab1.arrval)" + elif op == "any": + expr = t.c.arrval.any(bindparam("param")) + expected = "%(param)s = ANY (tab1.arrval)" + else: + assert False + + is_(expr.left.type._type_affinity, Integer) + + self.assert_compile(expr, expected, dialect="postgresql") + def test_any_array_comparator_accessor(self, t_fixture): t = t_fixture -- cgit v1.2.1