@@ -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