From 0d5ad7e9455739f2b237d84f14487bade17c236f Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Sun, 6 Sep 2026 15:30:45 +0100 Subject: [PATCH] Split query logging into separate start and finish steps Ref: https://github.com/rails/rails/pull/58049 --- .../sqlserver/database_statements.rb | 14 +++++++++++--- test/cases/coerced_tests.rb | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index 3b112acae..f784e3756 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -291,9 +291,11 @@ def execute_procedure(proc_name, *variables) end.join(", ") sql = "EXEC #{proc_name} #{vars}".strip + result = nil intent = QueryIntent.new(adapter: self, processed_sql: sql) - log(intent, "Execute Procedure") do |notification_payload| + start_intent_log(intent) + begin with_raw_connection do |conn| result = internal_raw_execute(intent.processed_sql, conn) verified! @@ -305,9 +307,15 @@ def execute_procedure(proc_name, *variables) end result = result.each.map { |row| row.is_a?(Hash) ? row.with_indifferent_access : row } - notification_payload[:row_count] = result.count - result + intent.notification_payload[:row_count] = result.count end + + finish_intent_log(intent) + result + rescue => error + error.set_query(intent.processed_sql, intent.binds) if error.is_a?(StatementInvalid) + finish_intent_log(intent, exception: error) + raise end end diff --git a/test/cases/coerced_tests.rb b/test/cases/coerced_tests.rb index 069616236..fa18d3cd4 100644 --- a/test/cases/coerced_tests.rb +++ b/test/cases/coerced_tests.rb @@ -286,7 +286,7 @@ def test_belongs_to_with_primary_key_joins_on_correct_column_coerced def test_belongs_to_coerced client = Client.find(3) first_firm = companies(:first_firm) - assert_queries_and_values_match(/FETCH NEXT @3 ROWS ONLY/, ["Firm", "Agency", 1, 1]) do + assert_queries_and_values_match(/FETCH NEXT @. ROWS ONLY/, ["Firm", "Agency", 1, 1]) do assert_equal first_firm, client.firm assert_equal first_firm.name, client.firm.name end