From 959ef0ed712b3b3f87ccd9184cd372e2a549d990 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Fri, 27 Sep 2024 15:44:16 +0100 Subject: [PATCH 1/5] Handle insert returning using symbol Support using symbol for returning. Eg: "Book.insert!({ name: book_name }, returning: :id)" --- .../connection_adapters/sqlserver/database_statements.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index 7a825101d..ebf933e9e 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -142,11 +142,7 @@ def build_insert_sql(insert) # :nodoc: sql = +"INSERT #{insert.into}" if returning = insert.send(:insert_all).returning - returning_sql = if returning.is_a?(String) - returning - else - returning.map { |column| "INSERTED.#{quote_column_name(column)}" }.join(", ") - end + returning_sql = Array(returning).map { |column| "INSERTED.#{quote_column_name(column)}" }.join(", ") sql << " OUTPUT #{returning_sql}" end From 6afe0cfbc4e7be881061a448c349f48ccfecd391 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Fri, 27 Sep 2024 15:58:26 +0100 Subject: [PATCH 2/5] Update database_statements.rb --- .../connection_adapters/sqlserver/database_statements.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index ebf933e9e..97e66c155 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -142,7 +142,11 @@ def build_insert_sql(insert) # :nodoc: sql = +"INSERT #{insert.into}" if returning = insert.send(:insert_all).returning - returning_sql = Array(returning).map { |column| "INSERTED.#{quote_column_name(column)}" }.join(", ") + returning_sql = if returning.is_a?(String) + returning + else + Array(returning).map { |column| "INSERTED.#{quote_column_name(column)}" }.join(", ") + end sql << " OUTPUT #{returning_sql}" end From bcd620f57983108a831fd7f144776e0a426dbbb1 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Fri, 27 Sep 2024 19:17:24 +0100 Subject: [PATCH 3/5] Coerce test --- test/cases/coerced_tests.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/cases/coerced_tests.rb b/test/cases/coerced_tests.rb index 26ff4d15a..14949ead2 100644 --- a/test/cases/coerced_tests.rb +++ b/test/cases/coerced_tests.rb @@ -2487,6 +2487,18 @@ def test_insert_all_returns_requested_sql_fields_coerced result = Book.insert_all! [{ name: "Rework", author_id: 1 }], returning: Arel.sql("UPPER(INSERTED.name) as name") assert_equal %w[ REWORK ], result.pluck("name") end + + # Need to remove index as SQL Server considers NULLs on a unique-index to be equal unlike PostgreSQL/MySQL/SQLite. + coerce_tests! :test_insert_with_type_casting_and_serialize_is_consistent + def test_insert_with_type_casting_and_serialize_is_consistent_coerced + connection.remove_index(:books, column: [:author_id, :name]) + + original_test_insert_with_type_casting_and_serialize_is_consistent + ensure + Book.where(author_id: nil, name: 'Array').delete_all + Book.lease_connection.add_index(:books, [:author_id, :name], unique: true) + end + end module ActiveRecord From 314e6dcc54d0e0b0569770ebf11d1ae59c01e465 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Fri, 27 Sep 2024 20:21:05 +0100 Subject: [PATCH 4/5] Update coerced_tests.rb --- test/cases/coerced_tests.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cases/coerced_tests.rb b/test/cases/coerced_tests.rb index 14949ead2..a803ef59c 100644 --- a/test/cases/coerced_tests.rb +++ b/test/cases/coerced_tests.rb @@ -2495,7 +2495,7 @@ def test_insert_with_type_casting_and_serialize_is_consistent_coerced original_test_insert_with_type_casting_and_serialize_is_consistent ensure - Book.where(author_id: nil, name: 'Array').delete_all + Book.where(author_id: nil, name: ["Array"]).delete_all Book.lease_connection.add_index(:books, [:author_id, :name], unique: true) end From 383056704c060d1df4abb526eaee9b80a092b6be Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Sun, 29 Sep 2024 12:36:16 +0100 Subject: [PATCH 5/5] Update coerced_tests.rb --- test/cases/coerced_tests.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/cases/coerced_tests.rb b/test/cases/coerced_tests.rb index a803ef59c..a5a171203 100644 --- a/test/cases/coerced_tests.rb +++ b/test/cases/coerced_tests.rb @@ -2495,10 +2495,9 @@ def test_insert_with_type_casting_and_serialize_is_consistent_coerced original_test_insert_with_type_casting_and_serialize_is_consistent ensure - Book.where(author_id: nil, name: ["Array"]).delete_all + Book.where(author_id: nil, name: '["Array"]').delete_all Book.lease_connection.add_index(:books, [:author_id, :name], unique: true) end - end module ActiveRecord