for c in clause.inferred_target_elements
)
if clause.inferred_target_whereclause is not None:
+ whereclause_kw = dict(kw)
+ whereclause_kw.update(include_table=False, use_schema=False)
target_text += " WHERE %s" % self.process(
clause.inferred_target_whereclause,
- include_table=False,
- use_schema=False,
+ **whereclause_kw,
)
else:
target_text = ""
insert_statement = self.stack[-1]["selectable"]
cols = insert_statement.table.c
+ set_kw = dict(kw)
+ set_kw.update(use_schema=False)
for c in cols:
col_key = c.key
and value.type._isnull
):
value = value._with_binary_element_type(c.type)
- value_text = self.process(value.self_group(), use_schema=False)
+ value_text = self.process(value.self_group(), **set_kw)
key_text = self.preparer.quote(c.name)
action_set_ops.append("%s = %s" % (key_text, value_text))
)
value_text = self.process(
coercions.expect(roles.ExpressionElementRole, v),
- use_schema=False,
+ **set_kw,
)
action_set_ops.append("%s = %s" % (key_text, value_text))
action_text = ", ".join(action_set_ops)
if clause.update_whereclause is not None:
+ where_kw = dict(kw)
+ where_kw.update(include_table=True, use_schema=False)
action_text += " WHERE %s" % self.process(
- clause.update_whereclause, include_table=True, use_schema=False
+ clause.update_whereclause, **where_kw
)
return "ON CONFLICT %s DO UPDATE SET %s" % (target_text, action_text)
},
)
+ def test_on_conflict_literal_binds(self):
+ i = insert(self.table_with_metadata).values(myid=1, name="foo")
+ i = i.on_conflict_do_update(
+ index_elements=["myid"],
+ set_=OrderedDict(
+ [("name", "I'm a name"), ("other_param", literal("this too"))]
+ ),
+ where=self.table_with_metadata.c.name == "foo",
+ index_where=self.goofy_index.dialect_options["postgresql"][
+ "where"
+ ],
+ )
+ with expect_warnings(
+ "Additional column names not matching any column keys"
+ ):
+ self.assert_compile(
+ i,
+ "INSERT INTO mytable (myid, name) VALUES (1, 'foo')"
+ " ON CONFLICT (myid) WHERE name > 'm' DO UPDATE"
+ " SET name = 'I''m a name', other_param = 'this too'"
+ " WHERE mytable.name = 'foo'",
+ {},
+ literal_binds=True,
+ )
+
class DistinctOnTest(
fixtures.MappedTest,