Skip to content

Commit c6c01fa

Browse files
authored
Fix update-all for composite key (#1234)
1 parent 95118ba commit c6c01fa

File tree

1 file changed

+35
-3
lines changed

1 file changed

+35
-3
lines changed

lib/arel/visitors/sqlserver.rb

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,42 @@ 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 << "DELETE "
56+
visit o.relation.left, collector
57+
collector << " FROM "
58+
visit o.relation, collector
59+
collect_nodes_for o.wheres, collector, " WHERE ", " AND "
60+
end
61+
62+
def update_statement_using_join(o, collector)
63+
collector << "UPDATE "
64+
visit o.relation.left, collector
65+
collect_nodes_for o.values, collector, " SET "
66+
collector << " FROM "
67+
visit o.relation, collector
68+
collect_nodes_for o.wheres, collector, " WHERE ", " AND "
3769
end
3870

3971
def visit_Arel_Nodes_Lock(o, collector)

0 commit comments

Comments
 (0)