From: Federico Caselli Date: Wed, 30 Mar 2022 20:50:18 +0000 (+0200) Subject: Update bindparam cache key X-Git-Tag: rel_1_4_33~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b1aaf0a29fdb950ac69964fb9f96dbc03cddd139;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Update bindparam cache key The ``literal_execute`` parameter now takes part of the cache generation of a bindparam, since it changes the sql string generated by the compiler. Previously the correct bind values were used, but the ``literal_execute`` would be ignored on subsequent executions of the same query. Fixes: #7876 Change-Id: I6bf887f1a2fe31f9d0ab68f5b4ff315004d006b2 (cherry picked from commit 429512d55e814b03854bc12ec541dbeee9e3b94e) --- diff --git a/doc/build/changelog/unreleased_14/7876.rst b/doc/build/changelog/unreleased_14/7876.rst new file mode 100644 index 0000000000..c3b1c77b75 --- /dev/null +++ b/doc/build/changelog/unreleased_14/7876.rst @@ -0,0 +1,9 @@ +.. change:: + :tags: bug, sql + :tickets: 7876 + + The :paramref:`.bindparam.literal_execute` parameter now takes part + of the cache generation of a :func:`.bindparam`, since it changes + the sql string generated by the compiler. + Previously the correct bind values were used, but the ``literal_execute`` + would be ignored on subsequent executions of the same query. diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 2c424a5f54..81645ad0a0 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -1230,6 +1230,7 @@ class BindParameter(roles.InElementRole, ColumnElement): ("type", InternalTraversal.dp_type), ("callable", InternalTraversal.dp_plain_dict), ("value", InternalTraversal.dp_plain_obj), + ("literal_execute", InternalTraversal.dp_boolean), ] _is_crud = False @@ -1663,6 +1664,7 @@ class BindParameter(roles.InElementRole, ColumnElement): self.__class__, self.type._static_cache_key, self.key % anon_map if self._key_is_anon else self.key, + self.literal_execute, ) def _convert_to_unique(self): diff --git a/test/sql/test_compare.py b/test/sql/test_compare.py index a4684cccff..26340d21d4 100644 --- a/test/sql/test_compare.py +++ b/test/sql/test_compare.py @@ -285,6 +285,7 @@ class CoreFixtures(object): ), lambda: ( bindparam("x"), + bindparam("x", literal_execute=True), bindparam("y"), bindparam("x", type_=Integer), bindparam("x", type_=String), @@ -1648,6 +1649,7 @@ class CompareClausesTest(fixtures.TestBase): def test_compare_binds(self): b1 = bindparam("foo", type_=Integer()) + b1l = bindparam("foo", type_=Integer(), literal_execute=True) b2 = bindparam("foo", type_=Integer()) b3 = bindparam("foo", type_=String()) @@ -1658,6 +1660,9 @@ class CompareClausesTest(fixtures.TestBase): return 6 b4 = bindparam("foo", type_=Integer(), callable_=c1) + b4l = bindparam( + "foo", type_=Integer(), callable_=c1, literal_execute=True + ) b5 = bindparam("foo", type_=Integer(), callable_=c2) b6 = bindparam("foo", type_=Integer(), callable_=c1) @@ -1678,6 +1683,22 @@ class CompareClausesTest(fixtures.TestBase): is_false(b7.compare(b8)) is_true(b7.compare(b7)) + # cache key + def compare_key(left, right, expected): + lk = left._generate_cache_key().key + rk = right._generate_cache_key().key + is_(lk == rk, expected) + + compare_key(b1, b4, True) + compare_key(b1, b5, True) + compare_key(b8, b5, True) + compare_key(b8, b7, True) + compare_key(b8, b3, False) + compare_key(b1, b1l, False) + compare_key(b1, b4l, False) + compare_key(b4, b4l, False) + compare_key(b7, b4l, False) + def test_compare_tables(self): is_true(table_a.compare(table_a_2))