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.
- checksums.yaml +4 -4
- data/.editorconfig +9 -0
- data/.github/issue_template.md +23 -0
- data/.github/workflows/ci.yml +29 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +29 -0
- data/CHANGELOG.md +17 -27
- data/{Dockerfile → Dockerfile.ci} +1 -1
- data/Gemfile +49 -41
- data/Guardfile +9 -8
- data/MIT-LICENSE +1 -1
- data/README.md +65 -42
- 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 +22 -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 +5 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +10 -14
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +12 -5
- 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 +10 -7
- data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +30 -0
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -4
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +117 -52
- 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 +51 -14
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +40 -6
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +18 -10
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +235 -167
- 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/showplan.rb +8 -8
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +36 -7
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -45
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +8 -10
- 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 +5 -3
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +7 -5
- 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/type.rb +38 -35
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +26 -12
- data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +271 -180
- data/lib/active_record/connection_adapters/sqlserver_column.rb +76 -16
- data/lib/active_record/sqlserver_base.rb +11 -9
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +38 -39
- data/lib/activerecord-sqlserver-adapter.rb +3 -1
- data/lib/arel/visitors/sqlserver.rb +177 -56
- data/lib/arel_sqlserver.rb +4 -2
- data/test/appveyor/dbsetup.ps1 +4 -4
- data/test/cases/active_schema_test_sqlserver.rb +55 -0
- data/test/cases/adapter_test_sqlserver.rb +258 -173
- data/test/cases/change_column_collation_test_sqlserver.rb +33 -0
- data/test/cases/change_column_null_test_sqlserver.rb +14 -12
- data/test/cases/coerced_tests.rb +1421 -397
- data/test/cases/column_test_sqlserver.rb +321 -315
- data/test/cases/connection_test_sqlserver.rb +17 -20
- data/test/cases/disconnected_test_sqlserver.rb +39 -0
- data/test/cases/eager_load_too_many_ids_test_sqlserver.rb +18 -0
- data/test/cases/execute_procedure_test_sqlserver.rb +28 -19
- data/test/cases/fetch_test_sqlserver.rb +33 -21
- 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 +63 -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 +74 -27
- data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
- data/test/cases/order_test_sqlserver.rb +59 -53
- data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
- data/test/cases/primary_keys_test_sqlserver.rb +103 -0
- data/test/cases/rake_test_sqlserver.rb +70 -45
- data/test/cases/schema_dumper_test_sqlserver.rb +124 -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_collation.rb +19 -0
- 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/composite_pk.rb +9 -0
- 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/sst_string_collation.rb +3 -0
- 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 +56 -21
- data/test/support/coerceable_test_sqlserver.rb +19 -13
- 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/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic_associations.dump +0 -0
- data/test/support/minitest_sqlserver.rb +3 -1
- data/test/support/paths_sqlserver.rb +11 -11
- data/test/support/rake_helpers.rb +15 -10
- data/test/support/sql_counter_sqlserver.rb +16 -15
- data/test/support/test_in_memory_oltp.rb +9 -7
- metadata +47 -13
- data/.travis.yml +0 -25
- 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.
|
|
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,20 @@ 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: "27-x64"
|
|
42
|
+
- ruby_version: "27"
|
|
43
|
+
- ruby_version: "30-x64"
|
|
44
|
+
- ruby_version: "30"
|
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,21 +1,22 @@
|
|
|
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)
|
|
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
|
-
|
|
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)
|
|
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 = [
|
|
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
|
|
32
|
-
end
|
|
34
|
+
return super unless klass.connection.adapter_name == "SQLServer"
|
|
33
35
|
|
|
34
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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,23 +1,26 @@
|
|
|
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
|
+
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 =
|
|
21
|
+
relation = order(*select_values).limit!(1)
|
|
19
22
|
else
|
|
20
|
-
relation =
|
|
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
|
|