mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-14 04:37:15 -04:00
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:
+9
@@ -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.
|
||||
@@ -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):
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user