Skip to content

Commit bbcfa82

Browse files
authored
Fix matching view's real column name (rails-sqlserver#1133)
1 parent 232fc7f commit bbcfa82

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## Unreleased
2+
3+
#### Fixed
4+
5+
- [#1133](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1133) Fix matching view's real column name
6+
17
## v7.0.5.0
28

39
#### Fixed

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -601,17 +601,19 @@ def view_information(table_name)
601601
identifier = SQLServer::Utils.extract_identifiers(table_name)
602602
information_query_table = identifier.database.present? ? "[#{identifier.database}].[INFORMATION_SCHEMA].[VIEWS]" : "[INFORMATION_SCHEMA].[VIEWS]"
603603
view_info = select_one "SELECT * FROM #{information_query_table} WITH (NOLOCK) WHERE TABLE_NAME = #{quote(identifier.object)}", "SCHEMA"
604+
604605
if view_info
605606
view_info = view_info.with_indifferent_access
606607
if view_info[:VIEW_DEFINITION].blank? || view_info[:VIEW_DEFINITION].length == 4000
607608
view_info[:VIEW_DEFINITION] = begin
608-
select_values("EXEC sp_helptext #{identifier.object_quoted}", "SCHEMA").join
609+
select_values("EXEC sp_helptext #{identifier.object_quoted}", "SCHEMA").join
609610
rescue
610611
warn "No view definition found, possible permissions problem.\nPlease run GRANT VIEW DEFINITION TO your_user;"
611612
nil
612-
end
613+
end
613614
end
614615
end
616+
615617
view_info
616618
end
617619
end
@@ -620,7 +622,8 @@ def views_real_column_name(table_name, column_name)
620622
view_definition = view_information(table_name)[:VIEW_DEFINITION]
621623
return column_name unless view_definition
622624

623-
match_data = view_definition.match(/CREATE\s+VIEW.*AS\s+SELECT.*\W([\w-]*)\s+AS\s+#{column_name}/im)
625+
# Remove "CREATE VIEW ... AS SELECT ..." and then match the column name.
626+
match_data = view_definition.sub(/CREATE\s+VIEW.*AS\s+SELECT\s/, '').match(/([\w-]*)\s+AS\s+#{column_name}\W/im)
624627
match_data ? match_data[1] : column_name
625628
end
626629

test/cases/view_test_sqlserver.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,20 @@ class ViewTestSQLServer < ActiveRecord::TestCase
99
before do
1010
connection.drop_table :view_casing_table rescue nil
1111
connection.create_table :view_casing_table, force: true do |t|
12-
t.boolean :Default_Falsey, null: false, default: false
13-
t.boolean :Default_Truthy, null: false, default: true
14-
t.string :default_string, null: false, default: "abc"
12+
t.boolean :Default_Falsey, null: false, default: false
13+
t.boolean :Default_Truthy, null: false, default: true
14+
t.string :default_string_null, null: true, default: nil
15+
t.string :default_string, null: false, default: "abc"
1516
end
1617

1718
connection.execute("DROP VIEW IF EXISTS view_casing_table_view;")
1819
connection.execute <<-SQL
1920
CREATE VIEW view_casing_table_view AS
2021
SELECT id AS id,
21-
default_falsey AS falsey,
22-
default_truthy AS truthy,
23-
default_string AS s
22+
default_falsey AS falsey,
23+
default_truthy AS truthy,
24+
default_string_null AS s_null,
25+
default_string AS s
2426
FROM view_casing_table
2527
SQL
2628
end
@@ -34,12 +36,14 @@ class ViewTestSQLServer < ActiveRecord::TestCase
3436
assert_equal false, obj.falsey
3537
assert_equal true, obj.truthy
3638
assert_equal "abc", obj.s
39+
assert_nil obj.s_null
3740
assert_equal 0, klass.count
3841

3942
obj.save!
4043
assert_equal false, obj.falsey
4144
assert_equal true, obj.truthy
4245
assert_equal "abc", obj.s
46+
assert_nil obj.s_null
4347
assert_equal 1, klass.count
4448
end
4549
end

0 commit comments

Comments
 (0)