activerecord-sqlserver-adapter 5.2.1 → 7.0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/issue_template.md +23 -0
  4. data/.github/workflows/ci.yml +29 -0
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +29 -0
  7. data/CHANGELOG.md +17 -27
  8. data/{Dockerfile → Dockerfile.ci} +1 -1
  9. data/Gemfile +49 -41
  10. data/Guardfile +9 -8
  11. data/MIT-LICENSE +1 -1
  12. data/README.md +65 -42
  13. data/RUNNING_UNIT_TESTS.md +3 -0
  14. data/Rakefile +14 -16
  15. data/VERSION +1 -1
  16. data/activerecord-sqlserver-adapter.gemspec +25 -14
  17. data/appveyor.yml +22 -17
  18. data/docker-compose.ci.yml +7 -5
  19. data/guides/RELEASING.md +11 -0
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +5 -4
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +10 -14
  23. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +12 -5
  24. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
  25. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +10 -7
  26. data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +30 -0
  27. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -4
  28. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +117 -52
  29. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +9 -12
  30. data/lib/active_record/connection_adapters/sqlserver/errors.rb +2 -3
  31. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +51 -14
  32. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +40 -6
  33. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +18 -10
  34. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +235 -167
  35. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
  36. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
  37. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
  38. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +36 -7
  39. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -45
  40. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +8 -10
  41. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
  42. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
  43. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
  44. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
  45. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +5 -3
  46. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +7 -5
  47. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
  48. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
  49. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
  50. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
  51. data/lib/active_record/connection_adapters/sqlserver/type/decimal_without_scale.rb +22 -0
  52. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
  53. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
  54. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
  55. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
  56. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
  57. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
  58. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
  59. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
  60. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
  61. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
  62. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
  63. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
  64. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
  65. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
  66. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
  68. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
  69. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
  70. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
  71. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
  72. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
  73. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
  74. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
  75. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
  76. data/lib/active_record/connection_adapters/sqlserver/type.rb +38 -35
  77. data/lib/active_record/connection_adapters/sqlserver/utils.rb +26 -12
  78. data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
  79. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +271 -180
  80. data/lib/active_record/connection_adapters/sqlserver_column.rb +76 -16
  81. data/lib/active_record/sqlserver_base.rb +11 -9
  82. data/lib/active_record/tasks/sqlserver_database_tasks.rb +38 -39
  83. data/lib/activerecord-sqlserver-adapter.rb +3 -1
  84. data/lib/arel/visitors/sqlserver.rb +177 -56
  85. data/lib/arel_sqlserver.rb +4 -2
  86. data/test/appveyor/dbsetup.ps1 +4 -4
  87. data/test/cases/active_schema_test_sqlserver.rb +55 -0
  88. data/test/cases/adapter_test_sqlserver.rb +258 -173
  89. data/test/cases/change_column_collation_test_sqlserver.rb +33 -0
  90. data/test/cases/change_column_null_test_sqlserver.rb +14 -12
  91. data/test/cases/coerced_tests.rb +1421 -397
  92. data/test/cases/column_test_sqlserver.rb +321 -315
  93. data/test/cases/connection_test_sqlserver.rb +17 -20
  94. data/test/cases/disconnected_test_sqlserver.rb +39 -0
  95. data/test/cases/eager_load_too_many_ids_test_sqlserver.rb +18 -0
  96. data/test/cases/execute_procedure_test_sqlserver.rb +28 -19
  97. data/test/cases/fetch_test_sqlserver.rb +33 -21
  98. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
  99. data/test/cases/helper_sqlserver.rb +15 -15
  100. data/test/cases/in_clause_test_sqlserver.rb +63 -0
  101. data/test/cases/index_test_sqlserver.rb +15 -15
  102. data/test/cases/json_test_sqlserver.rb +25 -25
  103. data/test/cases/lateral_test_sqlserver.rb +35 -0
  104. data/test/cases/migration_test_sqlserver.rb +74 -27
  105. data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
  106. data/test/cases/order_test_sqlserver.rb +59 -53
  107. data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
  108. data/test/cases/primary_keys_test_sqlserver.rb +103 -0
  109. data/test/cases/rake_test_sqlserver.rb +70 -45
  110. data/test/cases/schema_dumper_test_sqlserver.rb +124 -109
  111. data/test/cases/schema_test_sqlserver.rb +20 -26
  112. data/test/cases/scratchpad_test_sqlserver.rb +4 -4
  113. data/test/cases/showplan_test_sqlserver.rb +28 -35
  114. data/test/cases/specific_schema_test_sqlserver.rb +68 -65
  115. data/test/cases/transaction_test_sqlserver.rb +18 -20
  116. data/test/cases/trigger_test_sqlserver.rb +14 -13
  117. data/test/cases/utils_test_sqlserver.rb +70 -70
  118. data/test/cases/uuid_test_sqlserver.rb +13 -14
  119. data/test/debug.rb +8 -6
  120. data/test/migrations/create_clients_and_change_column_collation.rb +19 -0
  121. data/test/migrations/create_clients_and_change_column_null.rb +3 -1
  122. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
  123. data/test/models/sqlserver/booking.rb +3 -1
  124. data/test/models/sqlserver/composite_pk.rb +9 -0
  125. data/test/models/sqlserver/customers_view.rb +3 -1
  126. data/test/models/sqlserver/datatype.rb +2 -0
  127. data/test/models/sqlserver/datatype_migration.rb +2 -0
  128. data/test/models/sqlserver/dollar_table_name.rb +3 -1
  129. data/test/models/sqlserver/edge_schema.rb +3 -3
  130. data/test/models/sqlserver/fk_has_fk.rb +3 -1
  131. data/test/models/sqlserver/fk_has_pk.rb +3 -1
  132. data/test/models/sqlserver/natural_pk_data.rb +4 -2
  133. data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
  134. data/test/models/sqlserver/no_pk_data.rb +3 -1
  135. data/test/models/sqlserver/object_default.rb +3 -1
  136. data/test/models/sqlserver/quoted_table.rb +4 -2
  137. data/test/models/sqlserver/quoted_view_1.rb +3 -1
  138. data/test/models/sqlserver/quoted_view_2.rb +3 -1
  139. data/test/models/sqlserver/sst_memory.rb +3 -1
  140. data/test/models/sqlserver/sst_string_collation.rb +3 -0
  141. data/test/models/sqlserver/string_default.rb +3 -1
  142. data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
  143. data/test/models/sqlserver/string_defaults_view.rb +3 -1
  144. data/test/models/sqlserver/tinyint_pk.rb +3 -1
  145. data/test/models/sqlserver/trigger.rb +4 -2
  146. data/test/models/sqlserver/trigger_history.rb +3 -1
  147. data/test/models/sqlserver/upper.rb +3 -1
  148. data/test/models/sqlserver/uppered.rb +3 -1
  149. data/test/models/sqlserver/uuid.rb +3 -1
  150. data/test/schema/sqlserver_specific_schema.rb +56 -21
  151. data/test/support/coerceable_test_sqlserver.rb +19 -13
  152. data/test/support/connection_reflection.rb +3 -2
  153. data/test/support/core_ext/query_cache.rb +4 -1
  154. data/test/support/load_schema_sqlserver.rb +5 -5
  155. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic.dump +0 -0
  156. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic_associations.dump +0 -0
  157. data/test/support/minitest_sqlserver.rb +3 -1
  158. data/test/support/paths_sqlserver.rb +11 -11
  159. data/test/support/rake_helpers.rb +15 -10
  160. data/test/support/sql_counter_sqlserver.rb +16 -15
  161. data/test/support/test_in_memory_oltp.rb +9 -7
  162. metadata +47 -13
  163. data/.travis.yml +0 -25
  164. data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +0 -26
data/appveyor.yml CHANGED
@@ -1,12 +1,23 @@
1
+ image: Visual Studio 2017
2
+ skip_tags: true
3
+ clone_depth: 5
4
+ build: off
5
+ matrix:
6
+ fast_finish: true
7
+ allow_failures:
8
+ - ruby_version: "27"
9
+ - ruby_version: "27-x64"
10
+ - ruby_version: "30"
11
+ - ruby_version: "30-x64"
12
+ services:
13
+ - mssql2014
14
+
1
15
  init:
2
16
  - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
3
17
  - SET PATH=C:\MinGW\msys\1.0\bin;%PATH%
4
18
  - SET RAKEOPT=-rdevkit
5
- - SET TINYTDS_VERSION=2.1.0
6
- clone_depth: 5
7
- skip_tags: true
8
- matrix:
9
- fast_finish: true
19
+ - SET TINYTDS_VERSION=2.1.3.pre
20
+
10
21
  install:
11
22
  - ps: Update-AppveyorBuild -Version "$(Get-Content $env:appveyor_build_folder\VERSION).$env:appveyor_build_number"
12
23
  - ruby --version
@@ -14,26 +25,20 @@ install:
14
25
  - bundle install
15
26
  - gem uninstall bcrypt
16
27
  - gem install bcrypt --platform=ruby
17
- build: off
28
+
18
29
  test_script:
19
30
  - powershell -File "%APPVEYOR_BUILD_FOLDER%\test\appveyor\dbsetup.ps1"
20
31
  - timeout /t 4 /nobreak > NUL
21
- - ps: Start-Service 'MSSQL$SQL2014'
22
- - timeout /t 4 /nobreak > NUL
23
32
  - sqlcmd -S ".\SQL2014" -U sa -P Password12! -i %APPVEYOR_BUILD_FOLDER%\test\appveyor\dbsetup.sql
24
33
  - bundle exec rake test ACTIVERECORD_UNITTEST_DATASERVER="localhost\SQL2014"
25
- - ps: Stop-Service 'MSSQL$SQL2014'
26
- - ps: Start-Service 'MSSQL$SQL2012SP1'
27
- - timeout /t 4 /nobreak > NUL
28
- - sqlcmd -S ".\SQL2012SP1" -U sa -P Password12! -i %APPVEYOR_BUILD_FOLDER%\test\appveyor\dbsetup.sql
29
- - bundle exec rake test ACTIVERECORD_UNITTEST_DATASERVER="localhost\SQL2012SP1"
34
+
30
35
  environment:
31
36
  CI_AZURE_HOST:
32
37
  secure: VChrioaIWkf9iuuaSs4cryiA4honrADgZqNC0++begg=
33
38
  CI_AZURE_PASS:
34
39
  secure: cSQp8sk4urJYvq0utpsK+r7J+snJ2wpcdp8RdXJfB+w=
35
40
  matrix:
36
- - ruby_version: "23-x64"
37
- - ruby_version: "23"
38
- - ruby_version: "22-x64"
39
- - ruby_version: "22"
41
+ - ruby_version: "27-x64"
42
+ - ruby_version: "27"
43
+ - ruby_version: "30-x64"
44
+ - ruby_version: "30"
@@ -1,11 +1,13 @@
1
1
  version: "2.2"
2
2
  services:
3
- database:
3
+ sqlserver:
4
4
  image: metaskills/mssql-server-linux-rails
5
5
  ci:
6
6
  environment:
7
- - ACTIVERECORD_UNITTEST_HOST=database
8
- build: .
9
- command: wait-for database:1433 -- bundle exec rake test
7
+ - ACTIVERECORD_UNITTEST_HOST=sqlserver
8
+ build:
9
+ context: .
10
+ dockerfile: Dockerfile.ci
11
+ command: wait-for sqlserver:1433 -- bundle exec rake test
10
12
  depends_on:
11
- - "database"
13
+ - "sqlserver"
@@ -0,0 +1,11 @@
1
+ # Releasing
2
+
3
+ ## Building locally
4
+
5
+ If you want to build the gem to test it locally run `bundle exec rake build`.
6
+
7
+ This command will build the gem in `pkg/activerecord-sqlserver-adapter-A.B.C.gem`, where `A.B.C` is the version in `VERSION` file.
8
+
9
+ ## Releasing to RubyGems
10
+
11
+ Run `bundle exec rake release` to build the gem locally and push the `gem` file to RubyGems.
@@ -1,13 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLServer
4
6
  module CoreExt
5
7
  module ActiveRecord
6
-
7
8
  extend ActiveSupport::Concern
8
9
 
9
10
  module ClassMethods
10
-
11
11
  def execute_procedure(proc_name, *variables)
12
12
  if connection.respond_to?(:execute_procedure)
13
13
  connection.execute_procedure(proc_name, *variables)
@@ -15,9 +15,7 @@ module ActiveRecord
15
15
  []
16
16
  end
17
17
  end
18
-
19
18
  end
20
-
21
19
  end
22
20
  end
23
21
  end
@@ -1,21 +1,22 @@
1
- require 'active_record/attribute_methods'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/attribute_methods"
2
4
 
3
5
  module ActiveRecord
4
6
  module ConnectionAdapters
5
7
  module SQLServer
6
8
  module CoreExt
7
9
  module AttributeMethods
8
-
9
-
10
10
  private
11
11
 
12
12
  def attributes_for_update(attribute_names)
13
+ return super unless self.class.connection.adapter_name == "SQLServer"
14
+
13
15
  super.reject do |name|
14
16
  column = self.class.columns_hash[name]
15
17
  column && column.respond_to?(:is_identity?) && column.is_identity?
16
18
  end
17
19
  end
18
-
19
20
  end
20
21
  end
21
22
  end
@@ -1,21 +1,24 @@
1
- require 'active_record/relation'
2
- require 'active_record/version'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/relation"
4
+ require "active_record/version"
3
5
 
4
6
  module ActiveRecord
5
7
  module ConnectionAdapters
6
8
  module SQLServer
7
9
  module CoreExt
8
10
  module Calculations
9
-
10
11
  # Same as original except we don't perform PostgreSQL hack that removes ordering.
11
12
  def calculate(operation, column_name)
13
+ return super unless klass.connection.adapter_name == "SQLServer"
14
+
12
15
  if has_include?(column_name)
13
16
  relation = apply_join_dependency
14
17
 
15
18
  if operation.to_s.downcase == "count"
16
19
  unless distinct_value || distinct_select?(column_name || select_for_count)
17
20
  relation.distinct!
18
- relation.select_values = [ klass.primary_key || table[Arel.star] ]
21
+ relation.select_values = [klass.primary_key || table[Arel.star]]
19
22
  end
20
23
  end
21
24
 
@@ -28,16 +31,9 @@ module ActiveRecord
28
31
  private
29
32
 
30
33
  def build_count_subquery(relation, column_name, distinct)
31
- super(relation.unscope(:order), column_name, distinct)
32
- end
34
+ return super unless klass.connection.adapter_name == "SQLServer"
33
35
 
34
- def type_cast_calculated_value(value, type, operation = nil)
35
- case operation
36
- when "count" then value.to_i
37
- when "sum" then type.deserialize(value || 0)
38
- when "average" then value&.respond_to?(:to_d) ? value.to_d : value
39
- else type.deserialize(value)
40
- end
36
+ super(relation.unscope(:order), column_name, distinct)
41
37
  end
42
38
  end
43
39
  end
@@ -47,5 +43,5 @@ end
47
43
 
48
44
  ActiveSupport.on_load(:active_record) do
49
45
  mod = ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::Calculations
50
- ActiveRecord::Relation.prepend(mod)
46
+ ActiveRecord::Relation.include(mod)
51
47
  end
@@ -1,13 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLServer
4
6
  module CoreExt
5
7
  module Explain
6
-
7
- SQLSERVER_STATEMENT_PREFIX = 'EXEC sp_executesql '.freeze
8
+ SQLSERVER_STATEMENT_PREFIX = "EXEC sp_executesql "
8
9
  SQLSERVER_STATEMENT_REGEXP = /N'(.+)', N'(.+)', (.+)/
9
10
 
10
11
  def exec_explain(queries)
12
+ return super unless connection.adapter_name == "SQLServer"
13
+
11
14
  unprepared_queries = queries.map do |(sql, binds)|
12
15
  [unprepare_sqlserver_statement(sql, binds), binds]
13
16
  end
@@ -20,19 +23,23 @@ module ActiveRecord
20
23
  # which uses sp_executesql to just the first argument, then unquote it. Likewise our
21
24
  # `sp_executesql` method should substitude the @n args with the quoted values.
22
25
  def unprepare_sqlserver_statement(sql, binds)
23
- return sql unless sql.starts_with?(SQLSERVER_STATEMENT_PREFIX)
26
+ return sql unless sql.start_with?(SQLSERVER_STATEMENT_PREFIX)
24
27
 
25
28
  executesql = sql.from(SQLSERVER_STATEMENT_PREFIX.length)
26
29
  executesql = executesql.match(SQLSERVER_STATEMENT_REGEXP).to_a[1]
27
30
 
28
31
  binds.each_with_index do |bind, index|
29
- value = connection.quote(bind)
32
+
33
+ value = if bind.is_a?(::ActiveModel::Attribute) then
34
+ connection.quote(bind.value_for_database)
35
+ else
36
+ connection.quote(bind)
37
+ end
30
38
  executesql = executesql.sub("@#{index}", value)
31
39
  end
32
40
 
33
41
  executesql
34
42
  end
35
-
36
43
  end
37
44
  end
38
45
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveSupport.on_load(:active_record) do
2
4
  silence_warnings do
3
5
  # Already defined in Rails
@@ -1,23 +1,26 @@
1
- require 'active_record/relation'
2
- require 'active_record/version'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/relation"
4
+ require "active_record/version"
3
5
 
4
6
  module ActiveRecord
5
7
  module ConnectionAdapters
6
8
  module SQLServer
7
9
  module CoreExt
8
10
  module FinderMethods
9
-
10
11
  private
11
12
 
12
13
  # Same as original except we order by values in distinct select if present.
13
14
  def construct_relation_for_exists(conditions)
14
- if distinct_value && offset_value
15
- relation = limit!(1)
15
+ return super unless klass.connection.adapter_name == "SQLServer"
16
16
 
17
+ conditions = sanitize_forbidden_attributes(conditions)
18
+
19
+ if distinct_value && offset_value
17
20
  if select_values.present?
18
- relation = relation.order(*select_values)
21
+ relation = order(*select_values).limit!(1)
19
22
  else
20
- relation = relation.except(:order)
23
+ relation = except(:order).limit!(1)
21
24
  end
22
25
  else
23
26
  relation = except(:select, :distinct, :order)._select!(::ActiveRecord::FinderMethods::ONE_AS_ONE).limit!(1)
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/associations/preloader"
4
+
5
+ module ActiveRecord
6
+ module ConnectionAdapters
7
+ module SQLServer
8
+ module CoreExt
9
+ module LoaderQuery
10
+ def load_records_for_keys(keys, &block)
11
+ return super unless scope.connection.adapter_name == "SQLServer"
12
+
13
+ keys.each_slice(in_clause_length).flat_map do |slice|
14
+ scope.where(association_key_name => slice).load(&block).records
15
+ end
16
+ end
17
+
18
+ def in_clause_length
19
+ 10_000
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ ActiveSupport.on_load(:active_record) do
28
+ mod = ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::LoaderQuery
29
+ ActiveRecord::Associations::Preloader::Association::LoaderQuery.prepend(mod)
30
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module SQLServer
@@ -9,10 +11,12 @@ module ActiveRecord
9
11
  def column_name_length
10
12
  128
11
13
  end
14
+ deprecate :column_name_length
12
15
 
13
16
  def table_name_length
14
17
  128
15
18
  end
19
+ deprecate :table_name_length
16
20
 
17
21
  def index_name_length
18
22
  128
@@ -21,26 +25,27 @@ module ActiveRecord
21
25
  def columns_per_table
22
26
  1024
23
27
  end
28
+ deprecate :columns_per_table
24
29
 
25
30
  def indexes_per_table
26
31
  999
27
32
  end
33
+ deprecate :indexes_per_table
28
34
 
29
35
  def columns_per_multicolumn_index
30
36
  16
31
37
  end
32
-
33
- def in_clause_length
34
- 10_000
35
- end
38
+ deprecate :columns_per_multicolumn_index
36
39
 
37
40
  def sql_query_length
38
41
  65_536 * 4_096
39
42
  end
43
+ deprecate :sql_query_length
40
44
 
41
45
  def joins_per_query
42
46
  256
43
47
  end
48
+ deprecate :joins_per_query
44
49
 
45
50
  private
46
51