Skip to content

Commit 8d4c6bc

Browse files
authored
Add support for INDEX INCLUDE (#1301)
1 parent 9559629 commit 8d4c6bc

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
## Unreleased
22

3+
#### Added
4+
5+
- [#1301](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1301) Add support for INDEX INCLUDE.
6+
37
#### Changed
48

59
- [#1273](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1273) TinyTDS v3+ is now required.

lib/active_record/connection_adapters/sqlserver/schema_creation.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ module SQLServer
66
class SchemaCreation < SchemaCreation
77
private
88

9+
delegate :quoted_include_columns_for_index, to: :@conn
10+
911
def supports_index_using?
1012
false
1113
end
@@ -44,11 +46,16 @@ def visit_CreateIndexDefinition(o)
4446
sql << "INDEX"
4547
sql << "#{quote_column_name(index.name)} ON #{quote_table_name(index.table)}"
4648
sql << "(#{quoted_columns(index)})"
49+
sql << "INCLUDE (#{quoted_include_columns(index.include)})" if supports_index_include? && index.include
4750
sql << "WHERE #{index.where}" if index.where
4851

4952
sql.join(" ")
5053
end
5154

55+
def quoted_include_columns(o)
56+
(String === o) ? o : quoted_include_columns_for_index(o)
57+
end
58+
5259
def add_column_options!(sql, options)
5360
sql << " DEFAULT #{quote_default_expression_for_column_definition(options[:default], options[:column])}" if options_include_default?(options)
5461
if options[:collation].present?

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ def indexes(table_name)
4949
name = index["index_name"]
5050
unique = index["index_description"].match?(/unique/)
5151
where = select_value("SELECT [filter_definition] FROM sys.indexes WHERE name = #{quote(name)}", "SCHEMA")
52+
include_columns = index_include_columns(table_name, name)
5253
orders = {}
5354
columns = []
5455

@@ -63,11 +64,31 @@ def indexes(table_name)
6364
columns << column
6465
end
6566

66-
indexes << IndexDefinition.new(table_name, name, unique, columns, where: where, orders: orders)
67+
indexes << IndexDefinition.new(table_name, name, unique, columns, where: where, orders: orders, include: include_columns.presence)
6768
end
6869
end
6970
end
7071

72+
def index_include_columns(table_name, index_name)
73+
sql = <<~SQL
74+
SELECT
75+
ic.index_id,
76+
c.name AS column_name
77+
FROM
78+
sys.indexes i
79+
JOIN
80+
sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
81+
JOIN
82+
sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
83+
WHERE
84+
i.object_id = OBJECT_ID('#{table_name}')
85+
AND i.name = '#{index_name}'
86+
AND ic.is_included_column = 1;
87+
SQL
88+
89+
select_all(sql, "SCHEMA").map { |row| row["column_name"] }
90+
end
91+
7192
def columns(table_name)
7293
return [] if table_name.blank?
7394

@@ -421,6 +442,15 @@ def schema_names
421442
query_values(sql, "SCHEMA")
422443
end
423444

445+
def quoted_include_columns_for_index(column_names) # :nodoc:
446+
return quote_column_name(column_names) if column_names.is_a?(Symbol)
447+
448+
quoted_columns = column_names.each_with_object({}) do |name, result|
449+
result[name.to_sym] = quote_column_name(name).dup
450+
end
451+
add_options_for_index_columns(quoted_columns).values.join(", ")
452+
end
453+
424454
private
425455

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

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ def supports_partial_index?
143143
true
144144
end
145145

146+
def supports_index_include?
147+
true
148+
end
149+
146150
def supports_expression_index?
147151
false
148152
end

0 commit comments

Comments
 (0)