Skip to content

Commit d4b6e41

Browse files
Merge pull request #653 from matthewdunbar/master
Upgrade to Rails 5.2
2 parents ed8b170 + d325d77 commit d4b6e41

20 files changed

+265
-96
lines changed

.travis.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ env:
88
- ACTIVERECORD_UNITTEST_HOST=localhost
99
- ACTIVERECORD_UNITTEST_DATASERVER=localhost
1010
rvm:
11-
- 2.2.5
12-
- 2.3.1
13-
- 2.4.0
11+
- 2.2.10
12+
- 2.3.7
13+
- 2.4.4
14+
- 2.5.1
1415
before_install:
1516
- export PATH=/opt/local/bin:$PATH
1617
- docker info

Gemfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ source 'https://rubygems.org'
33
gemspec
44

55
gem 'sqlite3'
6-
gem 'minitest', '< 5.3.4'
76
gem 'bcrypt'
87
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
98

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.1.6
1+
5.2.0

activerecord-sqlserver-adapter.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ Gem::Specification.new do |spec|
1616
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
1717
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
1818
spec.require_paths = ['lib']
19-
spec.add_dependency 'activerecord', '~> 5.1.0'
19+
spec.add_dependency 'activerecord', '~> 5.2.0'
2020
spec.add_dependency 'tiny_tds'
2121
end

circle.yml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ dependencies:
1818
- openssl version
1919
- sudo ./test/bin/install-freetds.sh
2020
- tsql -C
21-
- rvm-exec 2.2.5 bundle install
22-
- rvm-exec 2.3.1 bundle install
23-
- rvm-exec 2.4.0 bundle install
21+
- rvm-exec 2.2.10 bundle install
22+
- rvm-exec 2.3.7 bundle install
23+
- rvm-exec 2.4.4 bundle install
24+
- rvm-exec 2.5.1 bundle install
2425

2526
database:
2627
override:
@@ -31,6 +32,7 @@ database:
3132

3233
test:
3334
override:
34-
- rvm-exec 2.2.5 bundle exec rake test
35-
- rvm-exec 2.3.1 bundle exec rake test
36-
- rvm-exec 2.4.0 bundle exec rake test
35+
- rvm-exec 2.2.10 bundle exec rake test
36+
- rvm-exec 2.3.7 bundle exec rake test
37+
- rvm-exec 2.4.4 bundle exec rake test
38+
- rvm-exec 2.5.1 bundle exec rake test

lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,7 @@ module Calculations
99
private
1010

1111
def build_count_subquery(relation, column_name, distinct)
12-
relation.select_values = [
13-
if column_name == :all
14-
distinct ? table[Arel.star] : Arel.sql(FinderMethods::ONE_AS_ONE)
15-
else
16-
column_alias = Arel.sql("count_column")
17-
aggregate_column(column_name).as(column_alias)
18-
end
19-
]
20-
21-
subquery = relation.arel.as(Arel.sql("subquery_for_count"))
22-
select_value = operation_over_aggregate_column(column_alias || Arel.star, "count", false)
23-
24-
Arel::SelectManager.new(subquery).project(select_value)
12+
super(relation.unscope(:order), column_name, distinct)
2513
end
2614
end
2715
end
@@ -30,10 +18,6 @@ def build_count_subquery(relation, column_name, distinct)
3018
end
3119

3220
ActiveSupport.on_load(:active_record) do
33-
if ActiveRecord::VERSION::MAJOR == 5 &&
34-
ActiveRecord::VERSION::MINOR == 1 &&
35-
ActiveRecord::VERSION::TINY >= 4
36-
mod = ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::Calculations
37-
ActiveRecord::Relation.prepend(mod)
38-
end
21+
mod = ActiveRecord::ConnectionAdapters::SQLServer::CoreExt::Calculations
22+
ActiveRecord::Relation.prepend(mod)
3923
end

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@ def exec_update(sql, name, binds)
3333
super(sql, name, binds).rows.first.first
3434
end
3535

36-
def supports_statement_cache?
37-
true
38-
end
39-
4036
def begin_db_transaction
4137
do_execute 'BEGIN TRANSACTION'
4238
end
@@ -77,7 +73,7 @@ def release_savepoint(name = current_savepoint_name)
7773

7874
def case_sensitive_comparison(table, attribute, column, value)
7975
if column.collation && !column.case_sensitive?
80-
table[attribute].eq(Arel::Nodes::Bin.new(Arel::Nodes::BindParam.new))
76+
table[attribute].eq(Arel::Nodes::Bin.new(value))
8177
else
8278
super
8379
end
@@ -88,6 +84,21 @@ def can_perform_case_insensitive_comparison_for?(column)
8884
end
8985
private :can_perform_case_insensitive_comparison_for?
9086

87+
def combine_multi_statements(total_sql)
88+
total_sql
89+
end
90+
private :combine_multi_statements
91+
92+
def default_insert_value(column)
93+
if column.is_identity?
94+
table_name = quote(quote_table_name(column.table_name))
95+
Arel.sql("IDENT_CURRENT(#{table_name}) + IDENT_INCR(#{table_name})")
96+
else
97+
super
98+
end
99+
end
100+
private :default_insert_value
101+
91102
# === SQLServer Specific ======================================== #
92103

93104
def execute_procedure(proc_name, *variables)
@@ -237,6 +248,8 @@ def sp_executesql(sql, name, binds, options = {})
237248
def sp_executesql_types_and_parameters(binds)
238249
types, params = [], []
239250
binds.each_with_index do |attr, index|
251+
attr = attr.value if attr.is_a?(Arel::Nodes::BindParam)
252+
240253
types << "@#{index} #{sp_executesql_sql_type(attr)}"
241254
params << sp_executesql_sql_param(attr)
242255
end
@@ -254,12 +267,12 @@ def sp_executesql_sql_type(attr)
254267
end
255268

256269
def sp_executesql_sql_param(attr)
257-
case attr.value_for_database
270+
case value = attr.value_for_database
258271
when Type::Binary::Data,
259272
ActiveRecord::Type::SQLServer::Data
260-
quote(attr.value_for_database)
273+
quote(value)
261274
else
262-
quote(type_cast(attr.value_for_database))
275+
quote(type_cast(value))
263276
end
264277
end
265278

@@ -305,7 +318,7 @@ def exclude_output_inserted_table_name?(table_name, sql)
305318
end
306319

307320
def exec_insert_requires_identity?(sql, pk, binds)
308-
query_requires_identity_insert?(sql) if pk && binds.map(&:name).include?(pk)
321+
query_requires_identity_insert?(sql)
309322
end
310323

311324
def query_requires_identity_insert?(sql)

lib/active_record/connection_adapters/sqlserver/schema_creation.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ class SchemaCreation < AbstractAdapter::SchemaCreation
88
def visit_TableDefinition(o)
99
if o.as
1010
table_name = quote_table_name(o.temporary ? "##{o.name}" : o.name)
11-
projections, source = @conn.to_sql(o.as).match(%r{SELECT\s+(.*)?\s+FROM\s+(.*)?}).captures
11+
query = o.as.respond_to?(:to_sql) ? o.as.to_sql : o.as
12+
projections, source = query.match(%r{SELECT\s+(.*)?\s+FROM\s+(.*)?}).captures
1213
select_into = "SELECT #{projections} INTO #{table_name} FROM #{source}"
1314
else
1415
o.instance_variable_set :@as, nil

lib/active_record/connection_adapters/sqlserver/schema_dumper.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module ActiveRecord
22
module ConnectionAdapters
33
module SQLServer
4-
module SchemaDumper
4+
class SchemaDumper < ConnectionAdapters::SchemaDumper
55

66
SQLSEVER_NO_LIMIT_TYPES = [
77
'text',
@@ -24,7 +24,7 @@ def schema_limit(column)
2424

2525
def schema_collation(column)
2626
return unless column.collation
27-
column.collation if column.collation != collation
27+
column.collation if column.collation != @connection.collation
2828
end
2929

3030
def default_primary_key?(column)

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,33 @@ def drop_table(table_name, options = {})
3232
end
3333
end
3434

35-
def indexes(table_name, name = nil)
36-
data = select("EXEC sp_helpindex #{quote(table_name)}", name) rescue []
35+
def indexes(table_name)
36+
data = select("EXEC sp_helpindex #{quote(table_name)}", "SCHEMA") rescue []
37+
3738
data.reduce([]) do |indexes, index|
3839
index = index.with_indifferent_access
40+
3941
if index[:index_description] =~ /primary key/
4042
indexes
4143
else
4244
name = index[:index_name]
4345
unique = index[:index_description] =~ /unique/
4446
where = select_value("SELECT [filter_definition] FROM sys.indexes WHERE name = #{quote(name)}")
45-
columns = index[:index_keys].split(',').map do |column|
47+
orders = {}
48+
columns = []
49+
50+
index[:index_keys].split(',').each do |column|
4651
column.strip!
47-
column.gsub! '(-)', '' if column.ends_with?('(-)')
48-
column
52+
53+
if column.ends_with?('(-)')
54+
column.gsub! '(-)', ''
55+
orders[column] = :desc
56+
end
57+
58+
columns << column
4959
end
50-
indexes << IndexDefinition.new(table_name, name, unique, columns, nil, nil, where)
60+
61+
indexes << IndexDefinition.new(table_name, name, unique, columns, where: where, orders: orders)
5162
end
5263
end
5364
end
@@ -235,7 +246,8 @@ def columns_for_distinct(columns, orders)
235246
s.gsub(/\s+(?:ASC|DESC)\b/i, '')
236247
.gsub(/\s+NULLS\s+(?:FIRST|LAST)\b/i, '')
237248
}.reject(&:blank?).map.with_index { |column, i| "#{column} AS alias_#{i}" }
238-
[super, *order_columns].join(', ')
249+
250+
(order_columns << super).join(", ")
239251
end
240252

241253
def update_table_definition(table_name, base)
@@ -254,6 +266,10 @@ def change_column_null(table_name, column_name, allow_null, default = nil)
254266
do_execute sql
255267
end
256268

269+
def create_schema_dumper(options)
270+
SQLServer::SchemaDumper.create(self, options)
271+
end
272+
257273
private
258274

259275
def data_source_sql(name = nil, type: nil)

0 commit comments

Comments
 (0)