activerecord-sqlserver-adapter 5.2.1 → 6.0.2

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 (153) 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 +26 -0
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +29 -0
  7. data/CHANGELOG.md +58 -20
  8. data/{Dockerfile → Dockerfile.ci} +1 -1
  9. data/Gemfile +48 -41
  10. data/Guardfile +9 -8
  11. data/README.md +28 -31
  12. data/RUNNING_UNIT_TESTS.md +3 -0
  13. data/Rakefile +14 -16
  14. data/VERSION +1 -1
  15. data/activerecord-sqlserver-adapter.gemspec +25 -14
  16. data/appveyor.yml +24 -17
  17. data/docker-compose.ci.yml +7 -5
  18. data/guides/RELEASING.md +11 -0
  19. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +3 -4
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +5 -4
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +3 -3
  23. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
  24. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +8 -7
  25. data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +36 -0
  26. data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +6 -4
  27. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -0
  28. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +88 -44
  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 +46 -8
  32. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +16 -5
  33. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +9 -7
  34. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +210 -163
  35. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
  36. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
  37. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
  38. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +2 -2
  39. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -44
  40. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +7 -9
  41. data/lib/active_record/connection_adapters/sqlserver/type.rb +38 -35
  42. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
  43. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
  44. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
  45. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
  46. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +2 -2
  47. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
  48. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
  49. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
  50. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
  51. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
  52. data/lib/active_record/connection_adapters/sqlserver/type/decimal_without_scale.rb +22 -0
  53. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
  54. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
  55. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
  56. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
  57. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
  58. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
  59. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
  60. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
  61. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
  62. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
  63. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
  64. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
  65. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
  66. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
  68. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
  69. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
  70. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
  71. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
  72. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
  73. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
  74. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
  75. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
  76. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
  77. data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -11
  78. data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
  79. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +145 -94
  80. data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
  81. data/lib/active_record/sqlserver_base.rb +9 -1
  82. data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
  83. data/lib/activerecord-sqlserver-adapter.rb +3 -1
  84. data/lib/arel/visitors/sqlserver.rb +108 -34
  85. data/lib/arel_sqlserver.rb +4 -2
  86. data/test/appveyor/dbsetup.ps1 +4 -4
  87. data/test/cases/adapter_test_sqlserver.rb +246 -171
  88. data/test/cases/change_column_null_test_sqlserver.rb +14 -12
  89. data/test/cases/coerced_tests.rb +722 -381
  90. data/test/cases/column_test_sqlserver.rb +287 -285
  91. data/test/cases/connection_test_sqlserver.rb +17 -20
  92. data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
  93. data/test/cases/fetch_test_sqlserver.rb +16 -22
  94. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
  95. data/test/cases/helper_sqlserver.rb +15 -15
  96. data/test/cases/in_clause_test_sqlserver.rb +36 -0
  97. data/test/cases/index_test_sqlserver.rb +15 -15
  98. data/test/cases/json_test_sqlserver.rb +25 -25
  99. data/test/cases/lateral_test_sqlserver.rb +35 -0
  100. data/test/cases/migration_test_sqlserver.rb +67 -27
  101. data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
  102. data/test/cases/order_test_sqlserver.rb +53 -54
  103. data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
  104. data/test/cases/rake_test_sqlserver.rb +33 -45
  105. data/test/cases/schema_dumper_test_sqlserver.rb +115 -109
  106. data/test/cases/schema_test_sqlserver.rb +20 -26
  107. data/test/cases/scratchpad_test_sqlserver.rb +4 -4
  108. data/test/cases/showplan_test_sqlserver.rb +28 -35
  109. data/test/cases/specific_schema_test_sqlserver.rb +68 -65
  110. data/test/cases/transaction_test_sqlserver.rb +18 -20
  111. data/test/cases/trigger_test_sqlserver.rb +14 -13
  112. data/test/cases/utils_test_sqlserver.rb +70 -70
  113. data/test/cases/uuid_test_sqlserver.rb +13 -14
  114. data/test/debug.rb +8 -6
  115. data/test/migrations/create_clients_and_change_column_null.rb +3 -1
  116. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
  117. data/test/models/sqlserver/booking.rb +3 -1
  118. data/test/models/sqlserver/customers_view.rb +3 -1
  119. data/test/models/sqlserver/datatype.rb +2 -0
  120. data/test/models/sqlserver/datatype_migration.rb +2 -0
  121. data/test/models/sqlserver/dollar_table_name.rb +3 -1
  122. data/test/models/sqlserver/edge_schema.rb +3 -3
  123. data/test/models/sqlserver/fk_has_fk.rb +3 -1
  124. data/test/models/sqlserver/fk_has_pk.rb +3 -1
  125. data/test/models/sqlserver/natural_pk_data.rb +4 -2
  126. data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
  127. data/test/models/sqlserver/no_pk_data.rb +3 -1
  128. data/test/models/sqlserver/object_default.rb +3 -1
  129. data/test/models/sqlserver/quoted_table.rb +4 -2
  130. data/test/models/sqlserver/quoted_view_1.rb +3 -1
  131. data/test/models/sqlserver/quoted_view_2.rb +3 -1
  132. data/test/models/sqlserver/sst_memory.rb +3 -1
  133. data/test/models/sqlserver/string_default.rb +3 -1
  134. data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
  135. data/test/models/sqlserver/string_defaults_view.rb +3 -1
  136. data/test/models/sqlserver/tinyint_pk.rb +3 -1
  137. data/test/models/sqlserver/trigger.rb +4 -2
  138. data/test/models/sqlserver/trigger_history.rb +3 -1
  139. data/test/models/sqlserver/upper.rb +3 -1
  140. data/test/models/sqlserver/uppered.rb +3 -1
  141. data/test/models/sqlserver/uuid.rb +3 -1
  142. data/test/schema/sqlserver_specific_schema.rb +31 -21
  143. data/test/support/coerceable_test_sqlserver.rb +15 -9
  144. data/test/support/connection_reflection.rb +3 -2
  145. data/test/support/core_ext/query_cache.rb +4 -1
  146. data/test/support/load_schema_sqlserver.rb +5 -5
  147. data/test/support/minitest_sqlserver.rb +3 -1
  148. data/test/support/paths_sqlserver.rb +11 -11
  149. data/test/support/rake_helpers.rb +13 -10
  150. data/test/support/sql_counter_sqlserver.rb +3 -4
  151. data/test/support/test_in_memory_oltp.rb +9 -7
  152. metadata +27 -12
  153. data/.travis.yml +0 -25
@@ -3,6 +3,9 @@
3
3
 
4
4
  This process is much easier than it has been before!
5
5
 
6
+ ## MS SQL SERVER
7
+
8
+ If you don't have easy access to MS SQL Server, you can set up a Vagrant/VirtualBox virtual machine with MS SQL Server. [Here's how](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter-dev-box).
6
9
 
7
10
  ## TL;DR
8
11
 
data/Rakefile CHANGED
@@ -1,37 +1,35 @@
1
- require 'bundler/gem_tasks'
2
- require 'rake/testtask'
3
- require_relative 'test/support/paths_sqlserver'
4
- require_relative 'test/support/rake_helpers'
1
+ # frozen_string_literal: true
5
2
 
6
- task test: ['test:dblib']
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+ require_relative "test/support/paths_sqlserver"
6
+ require_relative "test/support/rake_helpers"
7
+
8
+ task test: ["test:dblib"]
7
9
  task default: [:test]
8
10
 
9
11
  namespace :test do
10
-
11
12
  %w(dblib).each do |mode|
12
-
13
13
  Rake::TestTask.new(mode) do |t|
14
14
  t.libs = ARTest::SQLServer.test_load_paths
15
15
  t.test_files = test_files
16
- t.warning = !!ENV['WARNING']
16
+ t.warning = !!ENV["WARNING"]
17
17
  t.verbose = false
18
18
  end
19
-
20
19
  end
21
20
 
22
- task 'dblib:env' do
23
- ENV['ARCONN'] = 'dblib'
21
+ task "dblib:env" do
22
+ ENV["ARCONN"] = "dblib"
24
23
  end
25
-
26
24
  end
27
25
 
28
- task 'test:dblib' => 'test:dblib:env'
26
+ task "test:dblib" => "test:dblib:env"
29
27
 
30
28
  namespace :profile do
31
- ['dblib'].each do |mode|
29
+ ["dblib"].each do |mode|
32
30
  namespace mode.to_sym do
33
- Dir.glob('test/profile/*_profile_case.rb').sort.each do |test_file|
34
- profile_case = File.basename(test_file).sub('_profile_case.rb', '')
31
+ Dir.glob("test/profile/*_profile_case.rb").sort.each do |test_file|
32
+ profile_case = File.basename(test_file).sub("_profile_case.rb", "")
35
33
  Rake::TestTask.new(profile_case) do |t|
36
34
  t.libs = ARTest::SQLServer.test_load_paths
37
35
  t.test_files = [test_file]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.2.1
1
+ 6.0.2
@@ -1,21 +1,32 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "active_record/connection_adapters/sqlserver/version"
1
+ # frozen_string_literal: true
2
+
3
+ version = File.read(File.expand_path("VERSION", __dir__)).strip
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = 'activerecord-sqlserver-adapter'
7
- spec.version = ActiveRecord::ConnectionAdapters::SQLServer::Version::VERSION
6
+ spec.name = "activerecord-sqlserver-adapter"
8
7
  spec.platform = Gem::Platform::RUBY
9
- spec.license = 'MIT'
10
- spec.authors = ['Ken Collins', 'Anna Carey', 'Will Bond', 'Murray Steele', 'Shawn Balestracci', 'Joe Rafaniello', 'Tom Ward']
11
- spec.email = ['ken@metaskills.net', 'will@wbond.net']
12
- spec.homepage = 'http://github.com/rails-sqlserver/activerecord-sqlserver-adapter'
13
- spec.summary = 'ActiveRecord SQL Server Adapter.'
14
- spec.description = 'ActiveRecord SQL Server Adapter. SQL Server 2012 and upward.'
8
+ spec.version = version
9
+
10
+ spec.required_ruby_version = ">= 2.5.0"
11
+
12
+ spec.license = "MIT"
13
+ spec.authors = ["Ken Collins", "Anna Carey", "Will Bond", "Murray Steele", "Shawn Balestracci", "Joe Rafaniello", "Tom Ward"]
14
+ spec.email = ["ken@metaskills.net", "will@wbond.net"]
15
+ spec.homepage = "http://github.com/rails-sqlserver/activerecord-sqlserver-adapter"
16
+ spec.summary = "ActiveRecord SQL Server Adapter."
17
+ spec.description = "ActiveRecord SQL Server Adapter. SQL Server 2012 and upward."
18
+
19
+ spec.metadata = {
20
+ "bug_tracker_uri" => "https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/issues",
21
+ "changelog_uri" => "https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v#{version}/CHANGELOG.md",
22
+ "source_code_uri" => "https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v#{version}",
23
+ }
24
+
15
25
  spec.files = `git ls-files -z`.split("\x0")
16
26
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
27
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
- spec.require_paths = ['lib']
19
- spec.add_dependency 'activerecord', '~> 5.2.0'
20
- spec.add_dependency 'tiny_tds'
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_dependency "activerecord", "~> 6.0.0"
31
+ spec.add_dependency "tiny_tds"
21
32
  end
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: "25"
9
+ - ruby_version: "26"
10
+ - ruby_version: "27"
11
+ - ruby_version: "27-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,22 @@ 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: "25-x64"
42
+ - ruby_version: "25"
43
+ - ruby_version: "26-x64"
44
+ - ruby_version: "26"
45
+ - ruby_version: "27-x64"
46
+ - ruby_version: "27"
@@ -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,12 +1,12 @@
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)
@@ -15,7 +15,6 @@ module ActiveRecord
15
15
  column && column.respond_to?(:is_identity?) && column.is_identity?
16
16
  end
17
17
  end
18
-
19
18
  end
20
19
  end
21
20
  end
@@ -1,12 +1,13 @@
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)
12
13
  if has_include?(column_name)
@@ -15,7 +16,7 @@ module ActiveRecord
15
16
  if operation.to_s.downcase == "count"
16
17
  unless distinct_value || distinct_select?(column_name || select_for_count)
17
18
  relation.distinct!
18
- relation.select_values = [ klass.primary_key || table[Arel.star] ]
19
+ relation.select_values = [klass.primary_key || table[Arel.star]]
19
20
  end
20
21
  end
21
22
 
@@ -1,10 +1,11 @@
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)
@@ -32,7 +33,6 @@ module ActiveRecord
32
33
 
33
34
  executesql
34
35
  end
35
-
36
36
  end
37
37
  end
38
38
  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,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 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
+ conditions = sanitize_forbidden_attributes(conditions)
16
16
 
17
+ if distinct_value && offset_value
17
18
  if select_values.present?
18
- relation = relation.order(*select_values)
19
+ relation = order(*select_values).limit!(1)
19
20
  else
20
- relation = relation.except(:order)
21
+ relation = except(:order).limit!(1)
21
22
  end
22
23
  else
23
24
  relation = except(:select, :distinct, :order)._select!(::ActiveRecord::FinderMethods::ONE_AS_ONE).limit!(1)
@@ -0,0 +1,36 @@
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 Preloader
10
+ private
11
+
12
+ def records_for(ids)
13
+ ids.each_slice(in_clause_length).flat_map do |slice|
14
+ scope.where(association_key_name => slice).load do |record|
15
+ # Processing only the first owner
16
+ # because the record is modified but not an owner
17
+ owner = owners_by_key[convert_key(record[association_key_name])].first
18
+ association = owner.association(reflection.name)
19
+ association.set_inverse_instance(record)
20
+ end.records
21
+ end
22
+ end
23
+
24
+ def in_clause_length
25
+ 10_000
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ ActiveSupport.on_load(:active_record) do
34
+ mod = ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::Preloader
35
+ ActiveRecord::Associations::Preloader::Association.prepend(mod)
36
+ end
@@ -1,15 +1,17 @@
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 QueryMethods
9
-
10
11
  private
11
12
 
12
- # Copy of original from Rails master. This patch can be removed when adapter supports Rails 6.
13
+ # Copy of original from Rails master.
14
+ # This patch can be removed when adapter supports Rails version greater than 6.0.2.2
13
15
  def table_name_matches?(from)
14
16
  table_name = Regexp.escape(table.name)
15
17
  quoted_table_name = Regexp.escape(connection.quote_table_name(table.name))
@@ -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,14 +25,17 @@ 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
38
+ deprecate :columns_per_multicolumn_index
32
39
 
33
40
  def in_clause_length
34
41
  10_000
@@ -37,10 +44,12 @@ module ActiveRecord
37
44
  def sql_query_length
38
45
  65_536 * 4_096
39
46
  end
47
+ deprecate :sql_query_length
40
48
 
41
49
  def joins_per_query
42
50
  256
43
51
  end
52
+ deprecate :joins_per_query
44
53
 
45
54
  private
46
55