From 3098467dd33e8a2ae475d0fe38cfa0b567589205 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Tue, 1 Oct 2024 20:24:14 +0100 Subject: [PATCH 1/2] Fix update-all for composite key --- lib/arel/visitors/sqlserver.rb | 42 +++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/lib/arel/visitors/sqlserver.rb b/lib/arel/visitors/sqlserver.rb index fe56bbef1..5e3ac0dc5 100644 --- a/lib/arel/visitors/sqlserver.rb +++ b/lib/arel/visitors/sqlserver.rb @@ -30,10 +30,46 @@ def visit_Arel_Nodes_Concat(o, collector) end def visit_Arel_Nodes_UpdateStatement(o, collector) - if o.orders.any? && o.limit.nil? - o.limit = Nodes::Limit.new(9_223_372_036_854_775_807) + if has_join_and_composite_primary_key?(o) + update_statement_using_join(o, collector) + else + o.limit = Nodes::Limit.new(9_223_372_036_854_775_807) if o.orders.any? && o.limit.nil? + + super end - super + end + + def visit_Arel_Nodes_DeleteStatement(o, collector) + if has_join_and_composite_primary_key?(o) + delete_statement_using_join(o, collector) + else + super + end + end + + def has_join_and_composite_primary_key?(o) + has_join_sources?(o) && o.relation.left.instance_variable_get(:@klass).composite_primary_key? + end + + def delete_statement_using_join(o, collector) + collector.retryable = false + + collector << "DELETE " + visit o.relation.left, collector + collector << " FROM " + visit o.relation, collector + collect_nodes_for o.wheres, collector, " WHERE ", " AND " + end + + def update_statement_using_join(o, collector) + collector.retryable = false + + collector << "UPDATE " + visit o.relation.left, collector + collect_nodes_for o.values, collector, " SET " + collector << " FROM " + visit o.relation, collector + collect_nodes_for o.wheres, collector, " WHERE ", " AND " end def visit_Arel_Nodes_Lock(o, collector) From 40cf576665964a8fd0e60bb877693bc52d97b181 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Wed, 2 Oct 2024 09:51:46 +0100 Subject: [PATCH 2/2] Update sqlserver.rb --- lib/arel/visitors/sqlserver.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/arel/visitors/sqlserver.rb b/lib/arel/visitors/sqlserver.rb index 5e3ac0dc5..ef6a23888 100644 --- a/lib/arel/visitors/sqlserver.rb +++ b/lib/arel/visitors/sqlserver.rb @@ -52,8 +52,6 @@ def has_join_and_composite_primary_key?(o) end def delete_statement_using_join(o, collector) - collector.retryable = false - collector << "DELETE " visit o.relation.left, collector collector << " FROM " @@ -62,8 +60,6 @@ def delete_statement_using_join(o, collector) end def update_statement_using_join(o, collector) - collector.retryable = false - collector << "UPDATE " visit o.relation.left, collector collect_nodes_for o.values, collector, " SET "