Skip to content

Commit 969c18f

Browse files
committed
[Rails5] Avoid un-needed collation dumps.
1 parent fdaa64c commit 969c18f

File tree

7 files changed

+31
-11
lines changed

7 files changed

+31
-11
lines changed

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,15 @@ def release_savepoint(name = current_savepoint_name)
8080
end
8181

8282
def case_sensitive_comparison(table, attribute, column, value)
83-
if !value.nil? && column.collation && !column.case_sensitive?
83+
if value && value.acts_like?(:string)
8484
table[attribute].eq(Arel::Nodes::Bin.new(Arel::Nodes::BindParam.new))
8585
else
8686
super
8787
end
8888
end
8989

9090
def can_perform_case_insensitive_comparison_for?(column)
91-
column.case_sensitive?
91+
column.type == :string
9292
end
9393
private :can_perform_case_insensitive_comparison_for?
9494

lib/active_record/connection_adapters/sqlserver/database_tasks.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,9 @@ def charset
2424
end
2525

2626
def collation
27-
select_value "SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation')"
27+
@collation ||= select_value "SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation')"
2828
end
2929

30-
3130
private
3231

3332
def create_database_options(options={})
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module ActiveRecord
2+
module ConnectionAdapters
3+
module SQLServer
4+
module SchemaDumper
5+
6+
private
7+
8+
def schema_collation(column)
9+
return unless column.collation
10+
column.collation if column.collation != collation
11+
end
12+
13+
end
14+
end
15+
end
16+
end

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,7 @@ def column_definitions(table_name)
301301
columns.NUMERIC_SCALE AS numeric_scale,
302302
columns.NUMERIC_PRECISION AS numeric_precision,
303303
columns.DATETIME_PRECISION AS datetime_precision,
304-
CASE
305-
WHEN columns.COLLATION_NAME <> DATABASEPROPERTYEX(DB_NAME(), 'Collation') THEN columns.COLLATION_NAME
306-
ELSE NULL
307-
END AS [collation],
304+
columns.COLLATION_NAME AS [collation],
308305
columns.ordinal_position,
309306
CASE
310307
WHEN columns.DATA_TYPE IN ('nchar','nvarchar','char','varchar') THEN columns.CHARACTER_MAXIMUM_LENGTH

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
require 'active_record/connection_adapters/sqlserver/transaction'
1515
require 'active_record/connection_adapters/sqlserver/errors'
1616
require 'active_record/connection_adapters/sqlserver/schema_creation'
17+
require 'active_record/connection_adapters/sqlserver/schema_dumper'
1718
require 'active_record/connection_adapters/sqlserver/schema_statements'
1819
require 'active_record/connection_adapters/sqlserver/sql_type_metadata'
1920
require 'active_record/connection_adapters/sqlserver/showplan'
@@ -32,6 +33,7 @@ class SQLServerAdapter < AbstractAdapter
3233
SQLServer::Quoting,
3334
SQLServer::DatabaseStatements,
3435
SQLServer::Showplan,
36+
SQLServer::SchemaDumper,
3537
SQLServer::SchemaStatements,
3638
SQLServer::DatabaseLimits,
3739
SQLServer::DatabaseTasks
@@ -169,14 +171,19 @@ def reconnect!
169171

170172
def disconnect!
171173
super
172-
@spid = nil
173174
case @connection_options[:mode]
174175
when :dblib
175176
@connection.close rescue nil
176177
end
177178
@connection = nil
178179
end
179180

181+
def clear_cache!
182+
super
183+
@spid = nil
184+
@collation = nil
185+
end
186+
180187
def reset!
181188
reset_transaction
182189
do_execute 'IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION'

lib/active_record/connection_adapters/sqlserver_column.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def is_utf8?
2020
end
2121

2222
def case_sensitive?
23-
collation && !collation.match(/_CI/)
23+
collation && collation.match(/_CS/)
2424
end
2525

2626
end

test/support/sql_counter_sqlserver.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ def capture_sql_ss
1717
/SELECT @@version/,
1818
/SELECT @@TRANCOUNT/,
1919
/(BEGIN|COMMIT|ROLLBACK|SAVE) TRANSACTION/,
20-
/SELECT CAST\(.* AS .*\) AS value/
20+
/SELECT CAST\(.* AS .*\) AS value/,
21+
/SELECT DATABASEPROPERTYEX/im
2122
]
2223

2324
sqlcounter = ObjectSpace.each_object(ActiveRecord::SQLCounter).to_a.first

0 commit comments

Comments
 (0)