@@ -30,10 +30,46 @@ def visit_Arel_Nodes_Concat(o, collector)
30
30
end
31
31
32
32
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
35
39
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 "
37
73
end
38
74
39
75
def visit_Arel_Nodes_Lock ( o , collector )
0 commit comments