activerecord-jdbcsqlserver-adapter 51.1.0 → 52.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +22 -39
- data/{Dockerfile → Dockerfile.ci} +0 -0
- data/Gemfile +1 -3
- data/README.md +5 -8
- data/VERSION +1 -1
- data/activerecord-jdbcsqlserver-adapter.gemspec +2 -3
- data/docker-compose.ci.yml +7 -5
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +25 -29
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +14 -18
- data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +43 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +26 -0
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +13 -2
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +53 -10
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +1 -0
- data/lib/active_record/connection_adapters/sqlserver/jdbc_overrides.rb +5 -13
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +2 -1
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +43 -27
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +3 -4
- data/lib/active_record/connection_adapters/sqlserver/type/json.rb +1 -1
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +7 -0
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +1 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +20 -14
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +3 -1
- data/lib/activerecord-jdbcsqlserver-adapter.rb +3 -0
- data/lib/arel/visitors/sqlserver.rb +1 -1
- data/lib/arel_sqlserver.rb +0 -1
- data/test/bin/install-freetds.sh +18 -0
- data/test/cases/adapter_test_sqlserver.rb +29 -21
- data/test/cases/change_column_null_test_sqlserver.rb +42 -0
- data/test/cases/coerced_tests.rb +304 -30
- data/test/cases/column_test_sqlserver.rb +496 -462
- data/test/cases/connection_test_sqlserver.rb +2 -2
- data/test/cases/fetch_test_sqlserver.rb +5 -5
- data/test/cases/helper_sqlserver.rb +6 -0
- data/test/cases/json_test_sqlserver.rb +6 -6
- data/test/cases/migration_test_sqlserver.rb +13 -3
- data/test/cases/order_test_sqlserver.rb +19 -19
- data/test/cases/pessimistic_locking_test_sqlserver.rb +9 -9
- data/test/cases/rake_test_sqlserver.rb +20 -20
- data/test/cases/schema_dumper_test_sqlserver.rb +34 -33
- data/test/cases/schema_test_sqlserver.rb +2 -2
- data/test/cases/showplan_test_sqlserver.rb +25 -10
- data/test/cases/specific_schema_test_sqlserver.rb +11 -11
- data/test/cases/transaction_test_sqlserver.rb +9 -9
- data/test/cases/trigger_test_sqlserver.rb +8 -8
- data/test/cases/utils_test_sqlserver.rb +36 -36
- data/test/cases/uuid_test_sqlserver.rb +8 -8
- data/test/migrations/create_clients_and_change_column_null.rb +23 -0
- data/test/schema/datatypes/2012.sql +1 -0
- data/test/schema/sqlserver_specific_schema.rb +9 -1
- data/test/support/core_ext/query_cache.rb +29 -0
- metadata +19 -10
- data/BACKERS.md +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c764412410f757d3f4ee0312e3950ba5eb3cd1b3f7e21645e2d081ce4974f7b2
|
4
|
+
data.tar.gz: 463f9a3245a8d95ff78d76fd2284a8cacbc64b8510bfb95915d55c2e2b50021f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 703e10527b9d65e5e237dde6b5cdc381cb2f398f8fcd3cad780f64567694c193e9922ac58f5b4e591611157cb480ed405c75093d314e535c00210ad2ccbaeb99
|
7
|
+
data.tar.gz: f229972c054e17396b5aa1f6f554ae0a661a4e8d69ca9cb8e9ed52e4c7c3afef0f2d0eeb3e217f3e8b9c0323140329c16aa1e0986e2bc2b57da7817524a0232e
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,62 +1,45 @@
|
|
1
|
-
## v51.1.0
|
2
1
|
|
3
|
-
|
4
|
-
* Changed how the jdbc driver is loaded so that other drivers can be used if needed
|
2
|
+
## v52.0.0
|
5
3
|
|
6
|
-
|
4
|
+
- Forked to support JRuby
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
## v5.1.6
|
11
|
-
|
12
|
-
#### Added
|
13
|
-
|
14
|
-
* Use lock hint when joining table in query.
|
15
|
-
|
16
|
-
|
17
|
-
## v5.1.5
|
6
|
+
## v5.2.1
|
18
7
|
|
19
8
|
#### Fixed
|
20
9
|
|
21
|
-
|
22
|
-
|
10
|
+
- [#691](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/691) Fix constraints bug
|
11
|
+
- [#700](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/700) SET SINGLE_USER before dropping the database
|
12
|
+
- [#733](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/733) Calculate should not remove ordering for MSSQL
|
13
|
+
- [#735](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/735) Order by selected items when using distinct exists
|
14
|
+
- [#737](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/737) Use default precision for 'time' column type
|
15
|
+
- [#744](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/744) Adapter does not use prepared statement cache
|
16
|
+
- [#743](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/743) Set default time precision when registering time type
|
17
|
+
- [#745](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/745) Quoted table names containing square brackets need to be regex escaped
|
23
18
|
|
24
|
-
## v5.
|
19
|
+
## v5.2.0
|
25
20
|
|
26
21
|
#### Fixed
|
27
22
|
|
28
|
-
|
23
|
+
- [#686](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/686) sql_for_insert set table name in case when pk is not nil
|
29
24
|
|
30
|
-
|
31
|
-
## v5.1.3
|
25
|
+
## v5.2.0.rc2
|
32
26
|
|
33
27
|
#### Fixed
|
34
28
|
|
35
|
-
|
36
|
-
|
29
|
+
- [#681](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/681) change_column_null should not clear other column attributes. Fixes #582.
|
30
|
+
- [#684](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/684) Fix explain with array conditions. Fixes #673.
|
37
31
|
|
38
|
-
## v5.
|
32
|
+
## v5.2.0.rc1
|
39
33
|
|
40
34
|
#### Fixed
|
41
35
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
## v5.1.1
|
48
|
-
|
49
|
-
#### Fixed
|
50
|
-
|
51
|
-
* Use `ActiveSupport.on_load` to hook into ActiveRecord Fixes #588 #598
|
52
|
-
|
53
|
-
|
54
|
-
## v5.1.0
|
36
|
+
- [#638](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/638) Don't disable referential integrity for the same table twice.
|
37
|
+
- [#646](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/646) Make String equality check work for Type::Data values. Fixes #645.
|
38
|
+
- [#671](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/671) Fix tinyint columns schema migration. Fixes #670.
|
55
39
|
|
56
40
|
#### Changed
|
57
41
|
|
58
|
-
|
42
|
+
- [#642](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/642) Added with (nolock) hint to information_schema.views.
|
59
43
|
|
60
|
-
#### Added
|
61
44
|
|
62
|
-
|
45
|
+
Please check [5-1-stable-jdbc](https://github.com/jruby/activerecord-jdbcsqlserver-adapter/blob/5-1-stable-jdbc/CHANGELOG.md) for previous changes.
|
File without changes
|
data/Gemfile
CHANGED
@@ -2,9 +2,7 @@ require 'openssl'
|
|
2
2
|
source 'https://rubygems.org'
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
gem '
|
6
|
-
gem 'sqlite3', platform: :mri
|
7
|
-
gem 'minitest', '< 5.3.4'
|
5
|
+
gem 'sqlite3', '~> 1.3.6', platform: :mri
|
8
6
|
gem 'bcrypt'
|
9
7
|
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
|
10
8
|
|
data/README.md
CHANGED
@@ -1,18 +1,16 @@
|
|
1
|
-
# ActiveRecord SQL Server Adapter. For SQL Server 2012 And Higher.
|
1
|
+
# ActiveRecord JDBC SQL Server Adapter. For SQL Server 2012 And Higher.
|
2
2
|
|
3
3
|
[![Gem Version](http://img.shields.io/gem/v/activerecord-jdbcsqlserver-adapter.svg)](https://rubygems.org/gems/activerecord-jdbcsqlserver-adapter) - Gem Version
|
4
4
|
|
5
|
-
|
5
|
+
## About The Adapter
|
6
|
+
|
7
|
+
The JDBC SQL Server adapter for ActiveRecord v5.2 using SQL Server 2012 or higher.
|
6
8
|
|
7
9
|
We currently support JRuby 9.2+. Older versions may work but they are not tested and there is a known date issue with JRuby 9.1.
|
8
10
|
|
9
11
|
For older versions see [activerecord-jdbcmssql-adapter](https://rubygems.org/gems/activerecord-jdbcmssql-adapter)
|
10
12
|
|
11
13
|
|
12
|
-
#### Native Data Type Support
|
13
|
-
|
14
|
-
The Rails v5 adapter supports ActiveRecord's `datetime_with_precision` setting. This means that passing `:precision` to a datetime column is supported. Using a pecision with the `:datetime` type will signal the adapter to use the `datetime2` type under the hood.
|
15
|
-
|
16
14
|
#### Schemas & Users
|
17
15
|
|
18
16
|
Depending on your user and schema setup, it may be needed to use a table name prefix of `dbo.`. So something like this in your initializer file for ActiveRecord or the adapter.
|
@@ -48,7 +46,7 @@ gem 'activerecord-jdbcsqlserver-adapter'
|
|
48
46
|
|
49
47
|
## Contributing
|
50
48
|
|
51
|
-
If you would like to contribute a feature or bugfix, thanks! To make sure your fix/feature has a high chance of being added, please read the following guidelines. First, ask on the Gitter, or post a ticket on github issues. Second, make sure there are tests! We will not accept any patch that is not tested. Please read the `RUNNING_UNIT_TESTS` file for the details of how to run the unit tests.
|
49
|
+
If you would like to contribute a feature or bugfix, thanks! To make sure your fix/feature has a high chance of being added, please read the following guidelines. First, ask on the Gitter, or post a ticket on github issues. Second, make sure there are tests! We will not accept any patch that is not tested. Please read the [`RUNNING_UNIT_TESTS`](RUNNING_UNIT_TESTS.md) file for the details of how to run the unit tests.
|
52
50
|
|
53
51
|
This is a fork of the activerecord-sqlserver-adapter. If you find a bug in the base code, please submit patches to: http://github.com/rails-sqlserver/activerecord-sqlserver-adapter
|
54
52
|
|
@@ -89,4 +87,3 @@ JDBC version of the gem:
|
|
89
87
|
## License
|
90
88
|
|
91
89
|
Copyright © 2008-2019. It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.
|
92
|
-
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
52.0.0
|
@@ -15,8 +15,7 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
16
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
17
|
spec.require_paths = ['lib']
|
18
|
-
|
19
|
-
spec.add_dependency 'activerecord', '~>
|
20
|
-
spec.add_dependency 'activerecord-jdbc-adapter' , '~> 51.8'
|
18
|
+
spec.add_dependency 'activerecord', '~> 5.2.0', '>= 5.2.3'
|
19
|
+
spec.add_dependency 'activerecord-jdbc-adapter' , '~> 52.7'
|
21
20
|
spec.add_dependency 'jdbc-mssql', '>= 0.6.0'
|
22
21
|
end
|
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: test/bin/wait-for.sh sqlserver:1433 -- bundle exec rake test
|
10
12
|
depends_on:
|
11
|
-
- "
|
13
|
+
- "sqlserver"
|
@@ -7,37 +7,37 @@ module ActiveRecord
|
|
7
7
|
module CoreExt
|
8
8
|
module Calculations
|
9
9
|
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
# Same as original except we don't perform PostgreSQL hack that removes ordering.
|
11
|
+
def calculate(operation, column_name)
|
12
|
+
if has_include?(column_name)
|
13
|
+
relation = apply_join_dependency
|
14
|
+
|
15
|
+
if operation.to_s.downcase == "count"
|
16
|
+
unless distinct_value || distinct_select?(column_name || select_for_count)
|
17
|
+
relation.distinct!
|
18
|
+
relation.select_values = [ klass.primary_key || table[Arel.star] ]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
relation.calculate(operation, column_name)
|
23
|
+
else
|
24
|
+
perform_calculation(operation, column_name)
|
17
25
|
end
|
18
|
-
attrs
|
19
26
|
end
|
20
27
|
|
21
28
|
private
|
22
29
|
|
23
|
-
# @Override
|
24
30
|
def build_count_subquery(relation, column_name, distinct)
|
31
|
+
super(relation.unscope(:order), column_name, distinct)
|
32
|
+
end
|
25
33
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
if relation.projections.length == 1 && relation.projections.first.is_a?(::Arel::Nodes::SqlLiteral)
|
33
|
-
relation.projections[0] = ::Arel::Nodes::SqlLiteral.new(relation.projections.first + ' as some_name_that_hopefully_never_exists123')
|
34
|
-
end
|
35
|
-
|
36
|
-
@_setting_offset_for_count = true
|
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)
|
37
40
|
end
|
38
|
-
|
39
|
-
super
|
40
|
-
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -46,10 +46,6 @@ module ActiveRecord
|
|
46
46
|
end
|
47
47
|
|
48
48
|
ActiveSupport.on_load(:active_record) do
|
49
|
-
|
50
|
-
|
51
|
-
ActiveRecord::VERSION::TINY >= 4
|
52
|
-
mod = ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::Calculations
|
53
|
-
ActiveRecord::Relation.prepend(mod)
|
54
|
-
end
|
49
|
+
mod = ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::Calculations
|
50
|
+
ActiveRecord::Relation.prepend(mod)
|
55
51
|
end
|
@@ -5,12 +5,11 @@ module ActiveRecord
|
|
5
5
|
module Explain
|
6
6
|
|
7
7
|
SQLSERVER_STATEMENT_PREFIX = 'EXEC sp_executesql '.freeze
|
8
|
-
|
9
|
-
SQLSERVER_NATIONAL_STRING_MATCHER = /N'(.*)'/m
|
8
|
+
SQLSERVER_STATEMENT_REGEXP = /N'(.+)', N'(.+)', (.+)/
|
10
9
|
|
11
10
|
def exec_explain(queries)
|
12
11
|
unprepared_queries = queries.map do |(sql, binds)|
|
13
|
-
[unprepare_sqlserver_statement(sql), binds]
|
12
|
+
[unprepare_sqlserver_statement(sql, binds), binds]
|
14
13
|
end
|
15
14
|
super(unprepared_queries)
|
16
15
|
end
|
@@ -19,22 +18,19 @@ module ActiveRecord
|
|
19
18
|
|
20
19
|
# This is somewhat hacky, but it should reliably reformat our prepared sql statment
|
21
20
|
# which uses sp_executesql to just the first argument, then unquote it. Likewise our
|
22
|
-
# `sp_executesql` method should substitude the @n args
|
23
|
-
def unprepare_sqlserver_statement(sql)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
unprepared_sql.sub! "@#{index}", value
|
33
|
-
end
|
34
|
-
unprepared_sql
|
35
|
-
else
|
36
|
-
sql
|
21
|
+
# `sp_executesql` method should substitude the @n args with the quoted values.
|
22
|
+
def unprepare_sqlserver_statement(sql, binds)
|
23
|
+
return sql unless sql.starts_with?(SQLSERVER_STATEMENT_PREFIX)
|
24
|
+
|
25
|
+
executesql = sql.from(SQLSERVER_STATEMENT_PREFIX.length)
|
26
|
+
executesql = executesql.match(SQLSERVER_STATEMENT_REGEXP).to_a[1]
|
27
|
+
|
28
|
+
binds.each_with_index do |bind, index|
|
29
|
+
value = connection.quote(bind)
|
30
|
+
executesql = executesql.sub("@#{index}", value)
|
37
31
|
end
|
32
|
+
|
33
|
+
executesql
|
38
34
|
end
|
39
35
|
|
40
36
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'active_record/relation'
|
2
|
+
require 'active_record/version'
|
3
|
+
|
4
|
+
module ActiveRecord
|
5
|
+
module ConnectionAdapters
|
6
|
+
module SQLServer
|
7
|
+
module CoreExt
|
8
|
+
module FinderMethods
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# Same as original except we order by values in distinct select if present.
|
13
|
+
def construct_relation_for_exists(conditions)
|
14
|
+
if distinct_value && offset_value
|
15
|
+
relation = limit!(1)
|
16
|
+
|
17
|
+
if select_values.present?
|
18
|
+
relation = relation.order(*select_values)
|
19
|
+
else
|
20
|
+
relation = relation.except(:order)
|
21
|
+
end
|
22
|
+
else
|
23
|
+
relation = except(:select, :distinct, :order)._select!(::ActiveRecord::FinderMethods::ONE_AS_ONE).limit!(1)
|
24
|
+
end
|
25
|
+
|
26
|
+
case conditions
|
27
|
+
when Array, Hash
|
28
|
+
relation.where!(conditions) unless conditions.empty?
|
29
|
+
else
|
30
|
+
relation.where!(primary_key => conditions) unless conditions == :none
|
31
|
+
end
|
32
|
+
|
33
|
+
relation
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
ActiveSupport.on_load(:active_record) do
|
42
|
+
ActiveRecord::Relation.include(ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::FinderMethods)
|
43
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'active_record/relation'
|
2
|
+
require 'active_record/version'
|
3
|
+
|
4
|
+
module ActiveRecord
|
5
|
+
module ConnectionAdapters
|
6
|
+
module SQLServer
|
7
|
+
module CoreExt
|
8
|
+
module QueryMethods
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# Copy of original from Rails master. This patch can be removed when adapter supports Rails 6.
|
13
|
+
def table_name_matches?(from)
|
14
|
+
table_name = Regexp.escape(table.name)
|
15
|
+
quoted_table_name = Regexp.escape(connection.quote_table_name(table.name))
|
16
|
+
/(?:\A|(?<!FROM)\s)(?:\b#{table_name}\b|#{quoted_table_name})(?!\.)/i.match?(from.to_s)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
ActiveSupport.on_load(:active_record) do
|
25
|
+
ActiveRecord::Relation.include(ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::QueryMethods)
|
26
|
+
end
|
@@ -2,7 +2,6 @@ module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
3
3
|
module SQLServer
|
4
4
|
module DatabaseLimits
|
5
|
-
|
6
5
|
def table_alias_length
|
7
6
|
128
|
8
7
|
end
|
@@ -32,7 +31,7 @@ module ActiveRecord
|
|
32
31
|
end
|
33
32
|
|
34
33
|
def in_clause_length
|
35
|
-
|
34
|
+
10_000
|
36
35
|
end
|
37
36
|
|
38
37
|
def sql_query_length
|
@@ -43,6 +42,18 @@ module ActiveRecord
|
|
43
42
|
256
|
44
43
|
end
|
45
44
|
|
45
|
+
private
|
46
|
+
|
47
|
+
# The max number of binds is 2100, but because sp_executesql takes
|
48
|
+
# the first 2 params as the query string and the list of types,
|
49
|
+
# we have only 2098 spaces left
|
50
|
+
def bind_params_length
|
51
|
+
2_098
|
52
|
+
end
|
53
|
+
|
54
|
+
def insert_rows_length
|
55
|
+
1_000
|
56
|
+
end
|
46
57
|
end
|
47
58
|
end
|
48
59
|
end
|
@@ -33,10 +33,6 @@ module ActiveRecord
|
|
33
33
|
super(sql, name, binds).rows.first.first
|
34
34
|
end
|
35
35
|
|
36
|
-
def supports_statement_cache?
|
37
|
-
true
|
38
|
-
end
|
39
|
-
|
40
36
|
def begin_db_transaction
|
41
37
|
do_execute 'BEGIN TRANSACTION'
|
42
38
|
end
|
@@ -77,17 +73,55 @@ module ActiveRecord
|
|
77
73
|
|
78
74
|
def case_sensitive_comparison(table, attribute, column, value)
|
79
75
|
if column.collation && !column.case_sensitive?
|
80
|
-
table[attribute].eq(Arel::Nodes::Bin.new(
|
76
|
+
table[attribute].eq(Arel::Nodes::Bin.new(value))
|
81
77
|
else
|
82
78
|
super
|
83
79
|
end
|
84
80
|
end
|
85
81
|
|
82
|
+
# We should propose this change to Rails team
|
83
|
+
def insert_fixtures_set(fixture_set, tables_to_delete = [])
|
84
|
+
fixture_inserts = []
|
85
|
+
|
86
|
+
fixture_set.each do |table_name, fixtures|
|
87
|
+
fixtures.each_slice(insert_rows_length) do |batch|
|
88
|
+
fixture_inserts << build_fixture_sql(batch, table_name)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name table}".dup }
|
93
|
+
total_sql = Array.wrap(combine_multi_statements(table_deletes + fixture_inserts))
|
94
|
+
|
95
|
+
disable_referential_integrity do
|
96
|
+
transaction(requires_new: true) do
|
97
|
+
total_sql.each do |sql|
|
98
|
+
execute sql, "Fixtures Load"
|
99
|
+
yield if block_given?
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
86
105
|
def can_perform_case_insensitive_comparison_for?(column)
|
87
106
|
column.type == :string && (!column.collation || column.case_sensitive?)
|
88
107
|
end
|
89
108
|
private :can_perform_case_insensitive_comparison_for?
|
90
109
|
|
110
|
+
def combine_multi_statements(total_sql)
|
111
|
+
total_sql
|
112
|
+
end
|
113
|
+
private :combine_multi_statements
|
114
|
+
|
115
|
+
def default_insert_value(column)
|
116
|
+
if column.is_identity?
|
117
|
+
table_name = quote(quote_table_name(column.table_name))
|
118
|
+
Arel.sql("IDENT_CURRENT(#{table_name}) + IDENT_INCR(#{table_name})")
|
119
|
+
else
|
120
|
+
super
|
121
|
+
end
|
122
|
+
end
|
123
|
+
private :default_insert_value
|
124
|
+
|
91
125
|
# === SQLServer Specific ======================================== #
|
92
126
|
|
93
127
|
def execute_procedure(proc_name, *variables)
|
@@ -238,6 +272,8 @@ module ActiveRecord
|
|
238
272
|
def sp_executesql_types_and_parameters(binds)
|
239
273
|
types, params = [], []
|
240
274
|
binds.each_with_index do |attr, index|
|
275
|
+
attr = attr.value if attr.is_a?(Arel::Nodes::BindParam)
|
276
|
+
|
241
277
|
types << "@#{index} #{sp_executesql_sql_type(attr)}"
|
242
278
|
params << sp_executesql_sql_param(attr)
|
243
279
|
end
|
@@ -255,12 +291,12 @@ module ActiveRecord
|
|
255
291
|
end
|
256
292
|
|
257
293
|
def sp_executesql_sql_param(attr)
|
258
|
-
case attr.value_for_database
|
294
|
+
case value = attr.value_for_database
|
259
295
|
when Type::Binary::Data,
|
260
296
|
ActiveRecord::Type::SQLServer::Data
|
261
|
-
quote(
|
297
|
+
quote(value)
|
262
298
|
else
|
263
|
-
quote(type_cast(
|
299
|
+
quote(type_cast(value))
|
264
300
|
end
|
265
301
|
end
|
266
302
|
|
@@ -282,7 +318,14 @@ module ActiveRecord
|
|
282
318
|
def raw_connection_do(sql)
|
283
319
|
case @connection_options[:mode]
|
284
320
|
when :dblib
|
285
|
-
@connection.execute(sql)
|
321
|
+
result = @connection.execute(sql)
|
322
|
+
|
323
|
+
# TinyTDS returns false instead of raising an exception if connection fails.
|
324
|
+
# Getting around this by raising an exception ourselves while this PR
|
325
|
+
# https://github.com/rails-sqlserver/tiny_tds/pull/469 is not released.
|
326
|
+
raise TinyTds::Error, "failed to execute statement" if result.is_a?(FalseClass)
|
327
|
+
|
328
|
+
result.do
|
286
329
|
end
|
287
330
|
ensure
|
288
331
|
@update_sql = false
|
@@ -306,7 +349,7 @@ module ActiveRecord
|
|
306
349
|
end
|
307
350
|
|
308
351
|
def exec_insert_requires_identity?(sql, pk, binds)
|
309
|
-
query_requires_identity_insert?(sql)
|
352
|
+
query_requires_identity_insert?(sql)
|
310
353
|
end
|
311
354
|
|
312
355
|
def query_requires_identity_insert?(sql)
|