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)
This commit is contained in:
Federico Caselli
2022-03-30 22:50:18 +02:00
parent aade197363
commit b1aaf0a29f
3 changed files with 32 additions and 0 deletions
+9
View File
@@ -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.
+2
View File
@@ -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):
+21
View File
@@ -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))