Skip to content

Commit 331ca6b

Browse files
authored
Fix update-all for composite key (#1189)
1 parent ccb357b commit 331ca6b

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

lib/arel/visitors/sqlserver.rb

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,46 @@ def visit_Arel_Nodes_Concat(o, collector)
3030
end
3131

3232
def visit_Arel_Nodes_UpdateStatement(o, collector)
33-
if o.orders.any? && o.limit.nil?
34-
o.limit = Nodes::Limit.new(9_223_372_036_854_775_807)
33+
if has_join_and_composite_primary_key?(o)
34+
update_statement_using_join(o, collector)
35+
else
36+
o.limit = Nodes::Limit.new(9_223_372_036_854_775_807) if o.orders.any? && o.limit.nil?
37+
38+
super
3539
end
36-
super
40+
end
41+
42+
def visit_Arel_Nodes_DeleteStatement(o, collector)
43+
if has_join_and_composite_primary_key?(o)
44+
delete_statement_using_join(o, collector)
45+
else
46+
super
47+
end
48+
end
49+
50+
def has_join_and_composite_primary_key?(o)
51+
has_join_sources?(o) && o.relation.left.instance_variable_get(:@klass).composite_primary_key?
52+
end
53+
54+
def delete_statement_using_join(o, collector)
55+
collector.retryable = false
56+
57+
collector << "DELETE "
58+
visit o.relation.left, collector
59+
collector << " FROM "
60+
visit o.relation, collector
61+
collect_nodes_for o.wheres, collector, " WHERE ", " AND "
62+
end
63+
64+
def update_statement_using_join(o, collector)
65+
collector.retryable = false
66+
67+
collector << "UPDATE "
68+
visit o.relation.left, collector
69+
collect_nodes_for o.values, collector, " SET "
70+
collector << " FROM "
71+
visit o.relation, collector
72+
collect_nodes_for o.wheres, collector, " WHERE ", " AND "
3773
end
3874

3975
def visit_Arel_Nodes_Lock(o, collector)

0 commit comments

Comments
 (0)