--- /dev/null
+.. change::
+ :tags: bug, sql
+ :tickets: 10142
+ :versions: 2.0.23
+
+ Fixed issue where using the same bound parameter more than once with
+ ``literal_execute=True`` in some combinations with other literal rendering
+ parameters would cause the wrong values to render due to an iteration
+ issue.
parameter = self.binds[name]
if parameter in self.literal_execute_params:
if escaped_name not in replacement_expressions:
- value = parameters.pop(name)
-
- replacement_expressions[
- escaped_name
- ] = self.render_literal_bindparam(
- parameter,
- render_literal_value=value,
- )
+ replacement_expressions[
+ escaped_name
+ ] = self.render_literal_bindparam(
+ parameter,
+ render_literal_value=parameters.pop(escaped_name),
+ )
continue
if parameter in self.post_compile_params:
{"myid_1": 20, "myid_2": 18},
)
+ @testing.combinations("default", "default_qmark", argnames="dialect")
+ def test_literal_execute_combinations(self, dialect):
+ """test #10142"""
+
+ a = bindparam("a", value="abc", literal_execute=True)
+ b = bindparam("b", value="def", literal_execute=True)
+ c = bindparam("c", value="ghi", literal_execute=True)
+ self.assert_compile(
+ select(a, b, a, c),
+ "SELECT 'abc' AS anon_1, 'def' AS anon_2, 'abc' AS anon__1, "
+ "'ghi' AS anon_3",
+ render_postcompile=True,
+ dialect=dialect,
+ )
+
def test_tuple_expanding_in_no_values(self):
expr = tuple_(table1.c.myid, table1.c.name).in_(
[(1, "foo"), (5, "bar")]