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.
- checksums.yaml +4 -4
- data/.editorconfig +9 -0
- data/.github/issue_template.md +23 -0
- data/.github/workflows/ci.yml +26 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +29 -0
- data/CHANGELOG.md +58 -20
- data/{Dockerfile → Dockerfile.ci} +1 -1
- data/Gemfile +48 -41
- data/Guardfile +9 -8
- data/README.md +28 -31
- data/RUNNING_UNIT_TESTS.md +3 -0
- data/Rakefile +14 -16
- data/VERSION +1 -1
- data/activerecord-sqlserver-adapter.gemspec +25 -14
- data/appveyor.yml +24 -17
- data/docker-compose.ci.yml +7 -5
- data/guides/RELEASING.md +11 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +3 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +8 -7
- data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +36 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +6 -4
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -0
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +88 -44
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +9 -12
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +46 -8
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +16 -5
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +9 -7
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +210 -163
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -44
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +7 -9
- data/lib/active_record/connection_adapters/sqlserver/type.rb +38 -35
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/decimal_without_scale.rb +22 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -11
- data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +145 -94
- data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
- data/lib/active_record/sqlserver_base.rb +9 -1
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
- data/lib/activerecord-sqlserver-adapter.rb +3 -1
- data/lib/arel/visitors/sqlserver.rb +108 -34
- data/lib/arel_sqlserver.rb +4 -2
- data/test/appveyor/dbsetup.ps1 +4 -4
- data/test/cases/adapter_test_sqlserver.rb +246 -171
- data/test/cases/change_column_null_test_sqlserver.rb +14 -12
- data/test/cases/coerced_tests.rb +722 -381
- data/test/cases/column_test_sqlserver.rb +287 -285
- data/test/cases/connection_test_sqlserver.rb +17 -20
- data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
- data/test/cases/fetch_test_sqlserver.rb +16 -22
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
- data/test/cases/helper_sqlserver.rb +15 -15
- data/test/cases/in_clause_test_sqlserver.rb +36 -0
- data/test/cases/index_test_sqlserver.rb +15 -15
- data/test/cases/json_test_sqlserver.rb +25 -25
- data/test/cases/lateral_test_sqlserver.rb +35 -0
- data/test/cases/migration_test_sqlserver.rb +67 -27
- data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
- data/test/cases/order_test_sqlserver.rb +53 -54
- data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
- data/test/cases/rake_test_sqlserver.rb +33 -45
- data/test/cases/schema_dumper_test_sqlserver.rb +115 -109
- data/test/cases/schema_test_sqlserver.rb +20 -26
- data/test/cases/scratchpad_test_sqlserver.rb +4 -4
- data/test/cases/showplan_test_sqlserver.rb +28 -35
- data/test/cases/specific_schema_test_sqlserver.rb +68 -65
- data/test/cases/transaction_test_sqlserver.rb +18 -20
- data/test/cases/trigger_test_sqlserver.rb +14 -13
- data/test/cases/utils_test_sqlserver.rb +70 -70
- data/test/cases/uuid_test_sqlserver.rb +13 -14
- data/test/debug.rb +8 -6
- data/test/migrations/create_clients_and_change_column_null.rb +3 -1
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
- data/test/models/sqlserver/booking.rb +3 -1
- data/test/models/sqlserver/customers_view.rb +3 -1
- data/test/models/sqlserver/datatype.rb +2 -0
- data/test/models/sqlserver/datatype_migration.rb +2 -0
- data/test/models/sqlserver/dollar_table_name.rb +3 -1
- data/test/models/sqlserver/edge_schema.rb +3 -3
- data/test/models/sqlserver/fk_has_fk.rb +3 -1
- data/test/models/sqlserver/fk_has_pk.rb +3 -1
- data/test/models/sqlserver/natural_pk_data.rb +4 -2
- data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
- data/test/models/sqlserver/no_pk_data.rb +3 -1
- data/test/models/sqlserver/object_default.rb +3 -1
- data/test/models/sqlserver/quoted_table.rb +4 -2
- data/test/models/sqlserver/quoted_view_1.rb +3 -1
- data/test/models/sqlserver/quoted_view_2.rb +3 -1
- data/test/models/sqlserver/sst_memory.rb +3 -1
- data/test/models/sqlserver/string_default.rb +3 -1
- data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
- data/test/models/sqlserver/string_defaults_view.rb +3 -1
- data/test/models/sqlserver/tinyint_pk.rb +3 -1
- data/test/models/sqlserver/trigger.rb +4 -2
- data/test/models/sqlserver/trigger_history.rb +3 -1
- data/test/models/sqlserver/upper.rb +3 -1
- data/test/models/sqlserver/uppered.rb +3 -1
- data/test/models/sqlserver/uuid.rb +3 -1
- data/test/schema/sqlserver_specific_schema.rb +31 -21
- data/test/support/coerceable_test_sqlserver.rb +15 -9
- data/test/support/connection_reflection.rb +3 -2
- data/test/support/core_ext/query_cache.rb +4 -1
- data/test/support/load_schema_sqlserver.rb +5 -5
- data/test/support/minitest_sqlserver.rb +3 -1
- data/test/support/paths_sqlserver.rb +11 -11
- data/test/support/rake_helpers.rb +13 -10
- data/test/support/sql_counter_sqlserver.rb +3 -4
- data/test/support/test_in_memory_oltp.rb +9 -7
- metadata +27 -12
- data/.travis.yml +0 -25
data/RUNNING_UNIT_TESTS.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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[
|
|
16
|
+
t.warning = !!ENV["WARNING"]
|
|
17
17
|
t.verbose = false
|
|
18
18
|
end
|
|
19
|
-
|
|
20
19
|
end
|
|
21
20
|
|
|
22
|
-
task
|
|
23
|
-
ENV[
|
|
21
|
+
task "dblib:env" do
|
|
22
|
+
ENV["ARCONN"] = "dblib"
|
|
24
23
|
end
|
|
25
|
-
|
|
26
24
|
end
|
|
27
25
|
|
|
28
|
-
task
|
|
26
|
+
task "test:dblib" => "test:dblib:env"
|
|
29
27
|
|
|
30
28
|
namespace :profile do
|
|
31
|
-
[
|
|
29
|
+
["dblib"].each do |mode|
|
|
32
30
|
namespace mode.to_sym do
|
|
33
|
-
Dir.glob(
|
|
34
|
-
profile_case = File.basename(test_file).sub(
|
|
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
|
-
|
|
1
|
+
6.0.2
|
|
@@ -1,21 +1,32 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
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 =
|
|
7
|
-
spec.version = ActiveRecord::ConnectionAdapters::SQLServer::Version::VERSION
|
|
6
|
+
spec.name = "activerecord-sqlserver-adapter"
|
|
8
7
|
spec.platform = Gem::Platform::RUBY
|
|
9
|
-
spec.
|
|
10
|
-
|
|
11
|
-
spec.
|
|
12
|
-
|
|
13
|
-
spec.
|
|
14
|
-
spec.
|
|
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 = [
|
|
19
|
-
|
|
20
|
-
spec.add_dependency
|
|
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.
|
|
6
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: "
|
|
37
|
-
- ruby_version: "
|
|
38
|
-
- ruby_version: "
|
|
39
|
-
- ruby_version: "
|
|
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"
|
data/docker-compose.ci.yml
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
version: "2.2"
|
|
2
2
|
services:
|
|
3
|
-
|
|
3
|
+
sqlserver:
|
|
4
4
|
image: metaskills/mssql-server-linux-rails
|
|
5
5
|
ci:
|
|
6
6
|
environment:
|
|
7
|
-
- ACTIVERECORD_UNITTEST_HOST=
|
|
8
|
-
build:
|
|
9
|
-
|
|
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
|
-
- "
|
|
13
|
+
- "sqlserver"
|
data/guides/RELEASING.md
ADDED
|
@@ -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
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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 = [
|
|
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,23 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
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 =
|
|
19
|
+
relation = order(*select_values).limit!(1)
|
|
19
20
|
else
|
|
20
|
-
relation =
|
|
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
|
-
|
|
2
|
-
|
|
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.
|
|
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
|
|