From 81daac878f97383399670899b2341fc257cb78ac Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Mon, 11 Mar 2024 12:47:04 +0000 Subject: [PATCH 1/6] Register the adapter See https://github.com/rails/rails/pull/50064 --- .../connection_adapters/sqlserver_adapter.rb | 2 ++ lib/active_record/sqlserver_base.rb | 13 ------------- 2 files changed, 2 insertions(+), 13 deletions(-) delete mode 100644 lib/active_record/sqlserver_base.rb diff --git a/lib/active_record/connection_adapters/sqlserver_adapter.rb b/lib/active_record/connection_adapters/sqlserver_adapter.rb index 1e272d913..639eab68e 100644 --- a/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -35,6 +35,8 @@ module ActiveRecord module ConnectionAdapters + register "sqlserver", "ActiveRecord::ConnectionAdapters::SQLServerAdapter", "active_record/connection_adapters/sqlserver_adapter" + class SQLServerAdapter < AbstractAdapter include SQLServer::Version, SQLServer::Quoting, diff --git a/lib/active_record/sqlserver_base.rb b/lib/active_record/sqlserver_base.rb deleted file mode 100644 index 9dbcbc623..000000000 --- a/lib/active_record/sqlserver_base.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module ActiveRecord - module ConnectionHandling - def sqlserver_adapter_class - ConnectionAdapters::SQLServerAdapter - end - - def sqlserver_connection(config) #:nodoc: - sqlserver_adapter_class.new(config) - end - end -end From 86078a5f424b160265fb15e27177d508c1cdc001 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Mon, 11 Mar 2024 12:47:52 +0000 Subject: [PATCH 2/6] Lease the connection See https://github.com/rails/rails/pull/51230 --- test/cases/adapter_test_sqlserver.rb | 2 +- test/cases/coerced_tests.rb | 22 ++++++++++---------- test/cases/disconnected_test_sqlserver.rb | 2 +- test/cases/json_test_sqlserver.rb | 2 +- test/cases/lateral_test_sqlserver.rb | 4 ++-- test/cases/primary_keys_test_sqlserver.rb | 4 ++-- test/cases/schema_dumper_test_sqlserver.rb | 4 ++-- test/cases/specific_schema_test_sqlserver.rb | 4 ++-- test/cases/view_test_sqlserver.rb | 2 +- test/support/connection_reflection.rb | 2 +- test/support/test_in_memory_oltp.rb | 4 ++-- 11 files changed, 26 insertions(+), 26 deletions(-) diff --git a/test/cases/adapter_test_sqlserver.rb b/test/cases/adapter_test_sqlserver.rb index 34394732b..f02e9e706 100644 --- a/test/cases/adapter_test_sqlserver.rb +++ b/test/cases/adapter_test_sqlserver.rb @@ -508,7 +508,7 @@ class AdapterTestSQLServer < ActiveRecord::TestCase describe "block writes to a database" do def setup - @conn = ActiveRecord::Base.connection + @conn = ActiveRecord::Base.lease_connection end def test_errors_when_an_insert_query_is_called_while_preventing_writes diff --git a/test/cases/coerced_tests.rb b/test/cases/coerced_tests.rb index 315a2ac45..9445bb06b 100644 --- a/test/cases/coerced_tests.rb +++ b/test/cases/coerced_tests.rb @@ -197,7 +197,7 @@ class BasicsTest < ActiveRecord::TestCase # Use square brackets as SQL Server escaped character coerce_tests! :test_column_names_are_escaped def test_column_names_are_escaped_coerced - conn = ActiveRecord::Base.connection + conn = ActiveRecord::Base.lease_connection assert_equal "[t]]]", conn.quote_column_name("t]") end @@ -236,7 +236,7 @@ def test_update_date_time_attributes_with_default_timezone_local ActiveRecord::Base.while_preventing_writes do assert_queries(1, ignore_none: true) do Bird.transaction do - ActiveRecord::Base.connection.materialize_transactions + ActiveRecord::Base.lease_connection.materialize_transactions end end end @@ -1542,9 +1542,9 @@ def test_dump_schema_information_outputs_lexically_reverse_ordered_versions_rega @schema_migration.create_version(v) end - schema_info = ActiveRecord::Base.connection.dump_schema_information + schema_info = ActiveRecord::Base.lease_connection.dump_schema_information expected = <<~STR - INSERT INTO #{ActiveRecord::Base.connection.quote_table_name("schema_migrations")} (version) VALUES + INSERT INTO #{ActiveRecord::Base.lease_connection.quote_table_name("schema_migrations")} (version) VALUES (N'20100301010101'), (N'20100201010101'), (N'20100101010101'); @@ -1602,7 +1602,7 @@ class SchemaDumperDefaultsCoerceTest < ActiveRecord::TestCase include SchemaDumpingHelper setup do - @connection = ActiveRecord::Base.connection + @connection = ActiveRecord::Base.lease_connection @connection.create_table :dump_defaults, force: true do |t| t.string :string_with_default, default: "Hello!" t.date :date_with_default, default: "2014-06-05" @@ -2213,15 +2213,15 @@ def test_insert_all_coerced Task.cache { Task.insert({ starting: Time.now }) } end - assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do + assert_called(ActiveRecord::Base.lease_connection, :clear_query_cache, times: 2) do Task.cache { Task.insert_all!([{ starting: Time.now }]) } end - assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do + assert_called(ActiveRecord::Base.lease_connection, :clear_query_cache, times: 2) do Task.cache { Task.insert!({ starting: Time.now }) } end - assert_called(ActiveRecord::Base.connection, :clear_query_cache, times: 2) do + assert_called(ActiveRecord::Base.lease_connection, :clear_query_cache, times: 2) do Task.cache { Task.insert_all!([{ starting: Time.now }]) } end @@ -2287,7 +2287,7 @@ class MarshalSerializationTest < ActiveRecord::TestCase undef_method :marshal_fixture_path def marshal_fixture_path(file_name) File.expand_path( - "support/marshal_compatibility_fixtures/#{ActiveRecord::Base.connection.adapter_name}/#{file_name}.dump", + "support/marshal_compatibility_fixtures/#{ActiveRecord::Base.lease_connection.adapter_name}/#{file_name}.dump", ARTest::SQLServer.test_root_sqlserver ) end @@ -2379,7 +2379,7 @@ class BasePreventWritesTest < ActiveRecord::TestCase ActiveRecord::Base.while_preventing_writes do assert_queries(1, ignore_none: true) do Bird.transaction do - ActiveRecord::Base.connection.materialize_transactions + ActiveRecord::Base.lease_connection.materialize_transactions end end end @@ -2489,7 +2489,7 @@ def test_sqlcommenter_format_value_string_coercible_coerced def test_invalid_encoding_query_coerced ActiveRecord::QueryLogs.tags = [ :application ] assert_raises ActiveRecord::StatementInvalid do - ActiveRecord::Base.connection.execute "select 1 as '\xFF'" + ActiveRecord::Base.lease_connection.execute "select 1 as '\xFF'" end end end diff --git a/test/cases/disconnected_test_sqlserver.rb b/test/cases/disconnected_test_sqlserver.rb index 2936cf93f..382ca51b2 100644 --- a/test/cases/disconnected_test_sqlserver.rb +++ b/test/cases/disconnected_test_sqlserver.rb @@ -7,7 +7,7 @@ class TestDisconnectedAdapter < ActiveRecord::TestCase undef_method :setup def setup - @connection = ActiveRecord::Base.connection + @connection = ActiveRecord::Base.lease_connection end teardown do diff --git a/test/cases/json_test_sqlserver.rb b/test/cases/json_test_sqlserver.rb index a863868a8..501210a12 100644 --- a/test/cases/json_test_sqlserver.rb +++ b/test/cases/json_test_sqlserver.rb @@ -2,7 +2,7 @@ require "cases/helper_sqlserver" -if ActiveRecord::Base.connection.supports_json? +if ActiveRecord::Base.lease_connection.supports_json? class JsonTestSQLServer < ActiveRecord::TestCase before do @o1 = SSTestDatatypeMigrationJson.create! json_col: { "a" => "a", "b" => "b", "c" => "c" } diff --git a/test/cases/lateral_test_sqlserver.rb b/test/cases/lateral_test_sqlserver.rb index 17aea3c9b..fb1660110 100644 --- a/test/cases/lateral_test_sqlserver.rb +++ b/test/cases/lateral_test_sqlserver.rb @@ -16,7 +16,7 @@ class LateralTestSQLServer < ActiveRecord::TestCase eq = Arel::Nodes::Equality.new(one, one) sql = author.project(Arel.star).where(author[:name].matches("David")).outer_join(subselect.lateral.as("bar")).on(eq).to_sql - results = ActiveRecord::Base.connection.exec_query sql + results = ActiveRecord::Base.lease_connection.exec_query sql assert_equal sql, "SELECT * FROM [authors] OUTER APPLY (SELECT * FROM [posts] WHERE [posts].[author_id] = [authors].[id] AND [posts].[id] = 42 ORDER BY [posts].[id] ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY) AS bar WHERE [authors].[name] LIKE N'David'" assert_equal results.length, 1 end @@ -27,7 +27,7 @@ class LateralTestSQLServer < ActiveRecord::TestCase subselect = post.project(Arel.star).take(1).where(post[:author_id].eq(author[:id])).where(post[:id].eq(42)) sql = author.project(Arel.star).where(author[:name].matches("David")).join(subselect.lateral.as("bar")).to_sql - results = ActiveRecord::Base.connection.exec_query sql + results = ActiveRecord::Base.lease_connection.exec_query sql assert_equal sql, "SELECT * FROM [authors] CROSS APPLY (SELECT * FROM [posts] WHERE [posts].[author_id] = [authors].[id] AND [posts].[id] = 42 ORDER BY [posts].[id] ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY) AS bar WHERE [authors].[name] LIKE N'David'" assert_equal results.length, 0 diff --git a/test/cases/primary_keys_test_sqlserver.rb b/test/cases/primary_keys_test_sqlserver.rb index 433c17de0..8edf3dcfe 100644 --- a/test/cases/primary_keys_test_sqlserver.rb +++ b/test/cases/primary_keys_test_sqlserver.rb @@ -12,7 +12,7 @@ class Barcode < ActiveRecord::Base end setup do - @connection = ActiveRecord::Base.connection + @connection = ActiveRecord::Base.lease_connection @connection.create_table(:barcodes, primary_key: "code", id: :uuid, force: true) end @@ -50,7 +50,7 @@ class Widget < ActiveRecord::Base end setup do - @connection = ActiveRecord::Base.connection + @connection = ActiveRecord::Base.lease_connection end teardown do diff --git a/test/cases/schema_dumper_test_sqlserver.rb b/test/cases/schema_dumper_test_sqlserver.rb index 13ba5b5ce..f6ae6b2c3 100644 --- a/test/cases/schema_dumper_test_sqlserver.rb +++ b/test/cases/schema_dumper_test_sqlserver.rb @@ -5,7 +5,7 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase before { all_tables } - let(:all_tables) { ActiveRecord::Base.connection.tables } + let(:all_tables) { ActiveRecord::Base.lease_connection.tables } let(:schema) { @generated_schema } it "sst_datatypes" do @@ -166,7 +166,7 @@ def generate_schema_for_table(*table_names) stream = StringIO.new ActiveRecord::SchemaDumper.ignore_tables = all_tables - table_names - ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream) + ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.lease_connection, stream) @generated_schema = stream.string yield @generated_schema if block_given? @schema_lines = Hash.new diff --git a/test/cases/specific_schema_test_sqlserver.rb b/test/cases/specific_schema_test_sqlserver.rb index 6148f0874..c4590ce81 100644 --- a/test/cases/specific_schema_test_sqlserver.rb +++ b/test/cases/specific_schema_test_sqlserver.rb @@ -159,14 +159,14 @@ def quoted_id it "returns a new id via connection newid_function" do acceptable_uuid = ActiveRecord::ConnectionAdapters::SQLServer::Type::Uuid::ACCEPTABLE_UUID - db_uuid = ActiveRecord::Base.connection.newid_function + db_uuid = ActiveRecord::Base.lease_connection.newid_function _(db_uuid).must_match(acceptable_uuid) end # with similar table definition in two schemas it "returns the correct primary columns" do - connection = ActiveRecord::Base.connection + connection = ActiveRecord::Base.lease_connection assert_equal "field_1", connection.columns("test.sst_schema_test_mulitple_schema").detect(&:is_primary?).name assert_equal "field_2", connection.columns("test2.sst_schema_test_mulitple_schema").detect(&:is_primary?).name end diff --git a/test/cases/view_test_sqlserver.rb b/test/cases/view_test_sqlserver.rb index b371bd0b1..73ddf006a 100644 --- a/test/cases/view_test_sqlserver.rb +++ b/test/cases/view_test_sqlserver.rb @@ -3,7 +3,7 @@ require "cases/helper_sqlserver" class ViewTestSQLServer < ActiveRecord::TestCase - let(:connection) { ActiveRecord::Base.connection } + let(:connection) { ActiveRecord::Base.lease_connection } describe 'view with default values' do before do diff --git a/test/support/connection_reflection.rb b/test/support/connection_reflection.rb index a739f76ee..b7fe15ce2 100644 --- a/test/support/connection_reflection.rb +++ b/test/support/connection_reflection.rb @@ -8,7 +8,7 @@ module ConnectionReflection included { extend ConnectionReflection } def connection - ActiveRecord::Base.connection + ActiveRecord::Base.lease_connection end def connection_options diff --git a/test/support/test_in_memory_oltp.rb b/test/support/test_in_memory_oltp.rb index 88c918c92..2b5bb0c19 100644 --- a/test/support/test_in_memory_oltp.rb +++ b/test/support/test_in_memory_oltp.rb @@ -8,10 +8,10 @@ ARTest.connect - if ActiveRecord::Base.connection.supports_in_memory_oltp? + if ActiveRecord::Base.lease_connection.supports_in_memory_oltp? puts "Configuring In-Memory OLTP..." inmem_file = ARTest::SQLServer.test_root_sqlserver, "schema", "enable-in-memory-oltp.sql" inmem_sql = File.read File.join(inmem_file) - ActiveRecord::Base.connection.execute(inmem_sql) + ActiveRecord::Base.lease_connection.execute(inmem_sql) end end From 57e32d8a6458905fe72ebc109eec61338ecda98f Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Mon, 11 Mar 2024 14:35:36 +0000 Subject: [PATCH 3/6] Remove old require --- lib/active_record/connection_adapters/sqlserver_adapter.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/active_record/connection_adapters/sqlserver_adapter.rb b/lib/active_record/connection_adapters/sqlserver_adapter.rb index 639eab68e..bffaad63a 100644 --- a/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -29,7 +29,6 @@ require "active_record/connection_adapters/sqlserver/table_definition" require "active_record/connection_adapters/sqlserver/quoting" require "active_record/connection_adapters/sqlserver/utils" -require "active_record/sqlserver_base" require "active_record/connection_adapters/sqlserver_column" require "active_record/tasks/sqlserver_database_tasks" From 05a9ab9f7c15d3fc1c3cb73e0eed3c66067bd4ff Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Thu, 14 Mar 2024 11:29:38 +0000 Subject: [PATCH 4/6] Lease the connection See https://github.com/rails/rails/pull/51230 --- .../sqlserver/core_ext/attribute_methods.rb | 2 +- .../connection_adapters/sqlserver/core_ext/calculations.rb | 4 ++-- .../connection_adapters/sqlserver/core_ext/explain.rb | 2 +- .../connection_adapters/sqlserver/core_ext/finder_methods.rb | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb index af0e6a4e7..9cf0a7959 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb @@ -10,7 +10,7 @@ module AttributeMethods private def attributes_for_update(attribute_names) - return super unless self.class.connection.adapter_name == "SQLServer" + return super unless self.class.lease_connection.adapter_name == "SQLServer" super.reject do |name| column = self.class.columns_hash[name] diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb index 34355ef53..b35a719e6 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb @@ -9,7 +9,7 @@ module SQLServer module CoreExt module Calculations def calculate(operation, column_name) - if klass.connection.sqlserver? + if klass.lease_connection.sqlserver? _calculate(operation, column_name) else super @@ -54,7 +54,7 @@ def _calculate(operation, column_name) end def build_count_subquery(relation, column_name, distinct) - return super unless klass.connection.adapter_name == "SQLServer" + return super unless klass.lease_connection.adapter_name == "SQLServer" super(relation.unscope(:order), column_name, distinct) end diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb index 4eea43e3d..6f17fa249 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb @@ -9,7 +9,7 @@ module Explain SQLSERVER_STATEMENT_REGEXP = /N'(.+)', N'(.+)', (.+)/ def exec_explain(queries, options = []) - return super unless connection.adapter_name == "SQLServer" + return super unless lease_connection.adapter_name == "SQLServer" unprepared_queries = queries.map do |(sql, binds)| [unprepare_sqlserver_statement(sql, binds), binds] diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb index fe9271508..86b866078 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb @@ -11,7 +11,7 @@ module FinderMethods private def construct_relation_for_exists(conditions) - if klass.connection.sqlserver? + if klass.lease_connection.sqlserver? _construct_relation_for_exists(conditions) else super From bb8ae0a02b89aacf844e0477c2ed13878704db14 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Thu, 11 Apr 2024 18:53:11 +0100 Subject: [PATCH 5/6] Eliminate uses of lease_connection See https://github.com/rails/rails/pull/51353 --- .../sqlserver/core_ext/attribute_methods.rb | 10 ++++++---- .../sqlserver/core_ext/calculations.rb | 17 ++++++++++------- .../sqlserver/core_ext/explain.rb | 10 ++++++---- .../sqlserver/core_ext/finder_methods.rb | 10 ++++++---- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb index 9cf0a7959..639874a81 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb @@ -10,11 +10,13 @@ module AttributeMethods private def attributes_for_update(attribute_names) - return super unless self.class.lease_connection.adapter_name == "SQLServer" + self.class.with_connection do |connection| + return super(attribute_names) unless connection.sqlserver? - super.reject do |name| - column = self.class.columns_hash[name] - column && column.respond_to?(:is_identity?) && column.is_identity? + super(attribute_names).reject do |name| + column = self.class.columns_hash[name] + column && column.respond_to?(:is_identity?) && column.is_identity? + end end end end diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb index b35a719e6..54af006b7 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb @@ -9,10 +9,12 @@ module SQLServer module CoreExt module Calculations def calculate(operation, column_name) - if klass.lease_connection.sqlserver? - _calculate(operation, column_name) - else - super + klass.with_connection do |connection| + if connection.sqlserver? + _calculate(operation, column_name) + else + super + end end end @@ -54,9 +56,10 @@ def _calculate(operation, column_name) end def build_count_subquery(relation, column_name, distinct) - return super unless klass.lease_connection.adapter_name == "SQLServer" - - super(relation.unscope(:order), column_name, distinct) + klass.with_connection do |connection| + relation = relation.unscope(:order) if connection.sqlserver? + super(relation, column_name, distinct) + end end end end diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb index 6f17fa249..d9ca051cf 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb @@ -9,12 +9,14 @@ module Explain SQLSERVER_STATEMENT_REGEXP = /N'(.+)', N'(.+)', (.+)/ def exec_explain(queries, options = []) - return super unless lease_connection.adapter_name == "SQLServer" + with_connection do |connection| + return super(queries, options) unless connection.sqlserver? - unprepared_queries = queries.map do |(sql, binds)| - [unprepare_sqlserver_statement(sql, binds), binds] + unprepared_queries = queries.map do |(sql, binds)| + [unprepare_sqlserver_statement(sql, binds), binds] + end + super(unprepared_queries, options) end - super(unprepared_queries, options) end private diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb index 86b866078..6016369c2 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb @@ -11,10 +11,12 @@ module FinderMethods private def construct_relation_for_exists(conditions) - if klass.lease_connection.sqlserver? - _construct_relation_for_exists(conditions) - else - super + klass.with_connection do |connection| + if connection.sqlserver? + _construct_relation_for_exists(conditions) + else + super + end end end From 1557674c1dff51c70a8f4c614a18694bab3b2b09 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Mon, 15 Apr 2024 16:45:40 +0100 Subject: [PATCH 6/6] Lease connections and renamed `assert_queries` to `assert_queries_count` See https://github.com/rails/rails/pull/50373 --- .../sqlserver/core_ext/preloader.rb | 26 +++++++------ test/cases/adapter_test_sqlserver.rb | 4 +- test/cases/coerced_tests.rb | 38 +++++++++---------- .../eager_load_too_many_ids_test_sqlserver.rb | 2 +- 4 files changed, 36 insertions(+), 34 deletions(-) diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb index 046edb3ea..d7bc7b9e4 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb @@ -8,23 +8,25 @@ module SQLServer module CoreExt module LoaderQuery def load_records_for_keys(keys, &block) - return super unless scope.connection.sqlserver? + scope.with_connection do |connection| + return super unless connection.sqlserver? - return [] if keys.empty? + return [] if keys.empty? - if association_key_name.is_a?(Array) - query_constraints = Hash.new { |hsh, key| hsh[key] = Set.new } + if association_key_name.is_a?(Array) + query_constraints = Hash.new { |hsh, key| hsh[key] = Set.new } - keys.each_with_object(query_constraints) do |values_set, constraints| - association_key_name.zip(values_set).each do |key_name, value| - constraints[key_name] << value + keys.each_with_object(query_constraints) do |values_set, constraints| + association_key_name.zip(values_set).each do |key_name, value| + constraints[key_name] << value + end end - end - scope.where(query_constraints).load(&block) - else - keys.each_slice(in_clause_length).flat_map do |slice| - scope.where(association_key_name => slice).load(&block).records + scope.where(query_constraints).load(&block) + else + keys.each_slice(in_clause_length).flat_map do |slice| + scope.where(association_key_name => slice).load(&block).records + end end end end diff --git a/test/cases/adapter_test_sqlserver.rb b/test/cases/adapter_test_sqlserver.rb index f02e9e706..5c392513b 100644 --- a/test/cases/adapter_test_sqlserver.rb +++ b/test/cases/adapter_test_sqlserver.rb @@ -61,8 +61,8 @@ class AdapterTestSQLServer < ActiveRecord::TestCase end it "test table existence across database schemas" do - arunit_connection = Topic.connection - arunit2_connection = College.connection + arunit_connection = Topic.lease_connection + arunit2_connection = College.lease_connection arunit_database = arunit_connection.pool.db_config.database arunit2_database = arunit2_connection.pool.db_config.database diff --git a/test/cases/coerced_tests.rb b/test/cases/coerced_tests.rb index 9445bb06b..d2070c97a 100644 --- a/test/cases/coerced_tests.rb +++ b/test/cases/coerced_tests.rb @@ -56,7 +56,7 @@ def test_partial_index_coerced t = Topic.create!(title: "abc") t.author_name = "John" - assert_queries(1) do + assert_queries_count(1) do t.valid? end end @@ -234,7 +234,7 @@ def test_update_date_time_attributes_with_default_timezone_local coerce_tests! %r{an empty transaction does not raise if preventing writes} test "an empty transaction does not raise if preventing writes coerced" do ActiveRecord::Base.while_preventing_writes do - assert_queries(1, ignore_none: true) do + assert_queries_count(1, ignore_none: true) do Bird.transaction do ActiveRecord::Base.lease_connection.materialize_transactions end @@ -490,8 +490,8 @@ def test_limit_with_offset_is_kept_coerced coerce_tests! :test_distinct_count_all_with_custom_select_and_order def test_distinct_count_all_with_custom_select_and_order_coerced accounts = Account.distinct.select("credit_limit % 10 AS the_limit").order(Arel.sql("credit_limit % 10")) - assert_queries(1) { assert_equal 3, accounts.count(:all) } - assert_queries(1) { assert_equal 3, accounts.load.size } + assert_queries_count(1) { assert_equal 3, accounts.count(:all) } + assert_queries_count(1) { assert_equal 3, accounts.load.size } end # Leave it up to users to format selects/functions so HAVING works correctly. @@ -1018,7 +1018,7 @@ def test_implicit_order_column_is_configurable_coerced assert_equal topics(:fifth), Topic.first assert_equal topics(:third), Topic.last - c = Topic.connection + c = Topic.lease_connection assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("topics.title"))} DESC, #{Regexp.escape(c.quote_table_name("topics.id"))} DESC OFFSET 0 ROWS FETCH NEXT @0 ROWS ONLY.*@0 = 1/i) { Topic.last } @@ -1032,7 +1032,7 @@ def test_implicit_order_set_to_primary_key_coerced old_implicit_order_column = Topic.implicit_order_column Topic.implicit_order_column = "id" - c = Topic.connection + c = Topic.lease_connection assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("topics.id"))} DESC OFFSET 0 ROWS FETCH NEXT @0 ROWS ONLY.*@0 = 1/i) { Topic.last } @@ -1046,7 +1046,7 @@ def test_implicit_order_for_model_without_primary_key_coerced old_implicit_order_column = NonPrimaryKey.implicit_order_column NonPrimaryKey.implicit_order_column = "created_at" - c = NonPrimaryKey.connection + c = NonPrimaryKey.lease_connection assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("non_primary_keys.created_at"))} DESC OFFSET 0 ROWS FETCH NEXT @0 ROWS ONLY.*@0 = 1/i) { NonPrimaryKey.last @@ -1067,7 +1067,7 @@ def test_member_on_unloaded_relation_with_composite_primary_key_coerced # Check for `FETCH NEXT x ROWS` rather then `LIMIT`. coerce_tests! :test_implicit_order_column_prepends_query_constraints def test_implicit_order_column_prepends_query_constraints_coerced - c = ClothingItem.connection + c = ClothingItem.lease_connection ClothingItem.implicit_order_column = "description" quoted_type = Regexp.escape(c.quote_table_name("clothing_items.clothing_type")) quoted_color = Regexp.escape(c.quote_table_name("clothing_items.color")) @@ -1083,7 +1083,7 @@ def test_implicit_order_column_prepends_query_constraints_coerced # Check for `FETCH NEXT x ROWS` rather then `LIMIT`. coerce_tests! %r{#last for a model with composite query constraints} test "#last for a model with composite query constraints coerced" do - c = ClothingItem.connection + c = ClothingItem.lease_connection quoted_type = Regexp.escape(c.quote_table_name("clothing_items.clothing_type")) quoted_color = Regexp.escape(c.quote_table_name("clothing_items.color")) @@ -1095,7 +1095,7 @@ def test_implicit_order_column_prepends_query_constraints_coerced # Check for `FETCH NEXT x ROWS` rather then `LIMIT`. coerce_tests! %r{#first for a model with composite query constraints} test "#first for a model with composite query constraints coerced" do - c = ClothingItem.connection + c = ClothingItem.lease_connection quoted_type = Regexp.escape(c.quote_table_name("clothing_items.clothing_type")) quoted_color = Regexp.escape(c.quote_table_name("clothing_items.color")) @@ -1107,7 +1107,7 @@ def test_implicit_order_column_prepends_query_constraints_coerced # Check for `FETCH NEXT x ROWS` rather then `LIMIT`. coerce_tests! :test_implicit_order_column_reorders_query_constraints def test_implicit_order_column_reorders_query_constraints_coerced - c = ClothingItem.connection + c = ClothingItem.lease_connection ClothingItem.implicit_order_column = "color" quoted_type = Regexp.escape(c.quote_table_name("clothing_items.clothing_type")) quoted_color = Regexp.escape(c.quote_table_name("clothing_items.color")) @@ -1131,7 +1131,7 @@ def test_include_on_unloaded_relation_with_composite_primary_key_coerced # Check for `FETCH NEXT x ROWS` rather then `LIMIT`. coerce_tests! :test_nth_to_last_with_order_uses_limit def test_nth_to_last_with_order_uses_limit_coerced - c = Topic.connection + c = Topic.lease_connection assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("topics.id"))} DESC OFFSET @(\d) ROWS FETCH NEXT @(\d) ROWS ONLY.*@\1 = 1.*@\2 = 1/i) do Topic.second_to_last end @@ -1324,7 +1324,7 @@ def test_create_without_primary_key_no_extra_query_coerced self.table_name = "dashboards" end klass.create! # warmup schema cache - assert_queries(2, ignore_none: true) { klass.create! } + assert_queries_count(2, ignore_none: true) { klass.create! } end end @@ -1354,7 +1354,7 @@ def test_query_cached_even_when_types_are_reset_coerced Task.initialize_find_by_cache Task.define_attribute_methods - assert_queries(1, ignore_none: true) do + assert_queries_count(1, ignore_none: true) do Task.find(1) end @@ -1454,11 +1454,11 @@ def test_relations_dont_load_all_records_in_pretty_print_coerced def test_empty_complex_chained_relations_coerced posts = Post.select("comments_count").where("id is not null").group("author_id", "id").where("legacy_comments_count > 0") - assert_queries(1) { assert_equal false, posts.empty? } + assert_queries_count(1) { assert_equal false, posts.empty? } assert_not_predicate posts, :loaded? no_posts = posts.where(title: "") - assert_queries(1) { assert_equal true, no_posts.empty? } + assert_queries_count(1) { assert_equal true, no_posts.empty? } assert_not_predicate no_posts, :loaded? end @@ -2338,7 +2338,7 @@ def test_preloads_has_many_on_model_with_a_composite_primary_key_through_id_attr assert_equal 2, sql.size preload_sql = sql.last - c = Cpk::OrderAgreement.connection + c = Cpk::OrderAgreement.lease_connection order_id_column = Regexp.escape(c.quote_table_name("cpk_order_agreements.order_id")) order_id_constraint = /#{order_id_column} = @0.*@0 = \d+$/ expectation = /SELECT.*WHERE.* #{order_id_constraint}/ @@ -2362,7 +2362,7 @@ def test_preloads_belongs_to_a_composite_primary_key_model_through_id_attribute_ assert_equal 2, sql.size preload_sql = sql.last - c = Cpk::Order.connection + c = Cpk::Order.lease_connection order_id = Regexp.escape(c.quote_table_name("cpk_orders.id")) order_constraint = /#{order_id} = @0.*@0 = \d+$/ expectation = /SELECT.*WHERE.* #{order_constraint}/ @@ -2377,7 +2377,7 @@ class BasePreventWritesTest < ActiveRecord::TestCase coerce_tests! %r{an empty transaction does not raise if preventing writes} test "an empty transaction does not raise if preventing writes coerced" do ActiveRecord::Base.while_preventing_writes do - assert_queries(1, ignore_none: true) do + assert_queries_count(1, ignore_none: true) do Bird.transaction do ActiveRecord::Base.lease_connection.materialize_transactions end diff --git a/test/cases/eager_load_too_many_ids_test_sqlserver.rb b/test/cases/eager_load_too_many_ids_test_sqlserver.rb index 96eaa6cf9..72ba24625 100644 --- a/test/cases/eager_load_too_many_ids_test_sqlserver.rb +++ b/test/cases/eager_load_too_many_ids_test_sqlserver.rb @@ -11,7 +11,7 @@ def test_batch_preloading_too_many_ids # We Monkey patch Preloader to work with batches of 10_000 records. # Expect: N Books queries + Citation query expected_query_count = (Citation.count / in_clause_length.to_f).ceil + 1 - assert_queries(expected_query_count) do + assert_queries_count(expected_query_count) do Citation.preload(:reference_of).to_a.size end end