Skip to content

Commit 9d0786e

Browse files
committed
Use INFORMATION_SCHEMA.KEY_COLUMN_USAGE for schema reflection speed. Fixes #125.
1 parent c3893c8 commit 9d0786e

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

CHANGELOG

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11

22
* master *
33

4+
* Use INFORMATION_SCHEMA.KEY_COLUMN_USAGE for schema reflection speed.
5+
Fixes #125. [Wüthrich Hannes @hwuethrich]
6+
47
* New deadlock victim retry using the #retry_deadlock_victim config. [Joe Rafaniello]
58

69
* Renamed #with_auto_reconnect to #with_sqlserver_error_handling now that it handles both dropped

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,20 +193,25 @@ def column_definitions(table_name)
193193
ELSE NULL
194194
END AS [is_nullable],
195195
CASE
196-
WHEN CCU.COLUMN_NAME IS NOT NULL AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY' THEN 1
196+
WHEN KCU.COLUMN_NAME IS NOT NULL AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY' THEN 1
197197
ELSE NULL
198198
END AS [is_primary],
199199
CASE
200200
WHEN COLUMNPROPERTY(OBJECT_ID(columns.TABLE_SCHEMA+'.'+columns.TABLE_NAME), columns.COLUMN_NAME, 'IsIdentity') = 1 THEN 1
201201
ELSE NULL
202202
END AS [is_identity]
203203
FROM #{db_name_with_period}INFORMATION_SCHEMA.COLUMNS columns
204-
LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON TC.TABLE_NAME = columns.TABLE_NAME AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY'
205-
LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CCU ON TC.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME AND CCU.COLUMN_NAME = columns.COLUMN_NAME
204+
LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
205+
ON TC.TABLE_NAME = columns.TABLE_NAME
206+
AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY'
207+
LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
208+
ON KCU.COLUMN_NAME = columns.COLUMN_NAME
209+
AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
210+
AND KCU.CONSTRAINT_CATALOG = TC.CONSTRAINT_CATALOG
211+
AND KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA
206212
WHERE columns.TABLE_NAME = @0
207213
AND columns.TABLE_SCHEMA = #{table_schema.blank? ? "schema_name()" : "@1"}
208214
ORDER BY columns.ordinal_position
209-
210215
}.gsub(/[ \t\r\n]+/,' ')
211216
binds = [['table_name', table_name]]
212217
binds << ['table_schema',table_schema] unless table_schema.blank?

0 commit comments

Comments
 (0)