process: Literal[True] = ...,
required: bool = False,
name: Optional[str] = None,
+ force_anonymous: bool = False,
**kw: Any,
) -> str: ...
process: bool = True,
required: bool = False,
name: Optional[str] = None,
+ force_anonymous: bool = False,
**kw: Any,
) -> Union[str, elements.BindParameter[Any]]:
- if name is None:
+ if force_anonymous:
+ name = None
+ elif name is None:
name = col.key
+
bindparam = elements.BindParameter(
name, value, type_=col.type, required=required
)
)
def _column_as_key(
- key: Union[ColumnClause[Any], str]
+ key: Union[ColumnClause[Any], str],
) -> Union[str, Tuple[str, str]]:
str_key = c_key_role(key)
if hasattr(key, "table") and key.table in _et:
):
value = parameters.pop(col_key)
+ has_visiting_cte = kw.get("visiting_cte") is not None
col_value = compiler.preparer.format_column(
c, use_table=compile_state.include_table_with_column_exprs
)
else "%s_m0" % _col_bind_name(c)
),
accumulate_bind_names=accumulated_bind_names,
+ force_anonymous=has_visiting_cte,
**kw,
)
elif value._is_bind_parameter:
values_0 = initial_values
values = [initial_values]
+ has_visiting_cte = kw.get("visiting_cte") is not None
mp = compile_state._multi_parameters
assert mp is not None
for i, row in enumerate(mp[1:]):
compiler,
col,
row[key],
- name="%s_m%d" % (col.key, i + 1),
+ name=("%s_m%d" % (col.key, i + 1)),
+ force_anonymous=has_visiting_cte,
**kw,
)
else:
checkparams={"id": 1, "price": 20, "param_1": 10, "price_1": 50},
)
+ @testing.variation("num_ctes", ["one", "two"])
+ def test_multiple_multivalues_inserts(self, num_ctes):
+ """test #12363"""
+
+ t1 = table("table1", column("id"), column("a"), column("b"))
+
+ t2 = table("table2", column("id"), column("a"), column("b"))
+
+ if num_ctes.one:
+ self.assert_compile(
+ insert(t1)
+ .values([{"a": 1}, {"a": 2}])
+ .add_cte(insert(t2).values([{"a": 5}, {"a": 6}]).cte()),
+ "WITH anon_1 AS "
+ "(INSERT INTO table2 (a) VALUES (:param_1), (:param_2)) "
+ "INSERT INTO table1 (a) VALUES (:a_m0), (:a_m1)",
+ )
+
+ elif num_ctes.two:
+ self.assert_compile(
+ insert(t1)
+ .values([{"a": 1}, {"a": 2}])
+ .add_cte(insert(t1).values([{"b": 5}, {"b": 6}]).cte())
+ .add_cte(insert(t2).values([{"a": 5}, {"a": 6}]).cte()),
+ "WITH anon_1 AS "
+ "(INSERT INTO table1 (b) VALUES (:param_1), (:param_2)), "
+ "anon_2 AS "
+ "(INSERT INTO table2 (a) VALUES (:param_3), (:param_4)) "
+ "INSERT INTO table1 (a) VALUES (:a_m0), (:a_m1)",
+ )
+
def test_insert_from_select_uses_independent_cte(self):
"""test #7036"""