Skip to content

Commit 9807dd2

Browse files
committed
Handle delete for join with composite primary key
1 parent cdf7152 commit 9807dd2

File tree

1 file changed

+25
-5
lines changed

1 file changed

+25
-5
lines changed

lib/arel/visitors/sqlserver.rb

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,40 @@ def visit_Arel_Nodes_Concat(o, collector)
3030
end
3131

3232
def visit_Arel_Nodes_UpdateStatement(o, collector)
33-
if has_join_sources?(o) && o.relation.left.instance_variable_get(:@klass).composite_primary_key?
33+
if has_join_and_composite_primary_key?(o)
3434
update_statement_using_join(o, collector)
3535
else
36-
if o.orders.any? && o.limit.nil?
37-
o.limit = Nodes::Limit.new(9_223_372_036_854_775_807)
38-
end
36+
o.limit = Nodes::Limit.new(9_223_372_036_854_775_807) if o.orders.any? && o.limit.nil?
3937

4038
super
4139
end
4240
end
4341

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+
4464
def update_statement_using_join(o, collector)
4565
collector.retryable = false
46-
66+
4767
collector << "UPDATE "
4868
visit o.relation.left, collector
4969
collect_nodes_for o.values, collector, " SET "

0 commit comments

Comments
 (0)