Skip to content

Commit 13efaae

Browse files
committed
Fix issue with default view value not being found because of case sensitivity (#1113)
(cherry picked from commit 0871ed8)
1 parent 8c4c4bc commit 13efaae

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ def column_definitions(table_name)
425425

426426
if view_exists
427427
results = sp_executesql %{
428-
SELECT c.COLUMN_NAME AS [name], c.COLUMN_DEFAULT AS [default]
428+
SELECT LOWER(c.COLUMN_NAME) AS [name], c.COLUMN_DEFAULT AS [default]
429429
FROM #{database}.INFORMATION_SCHEMA.COLUMNS c
430430
WHERE c.TABLE_NAME = #{quote(view_tblnm)}
431431
}.squish, "SCHEMA", []
@@ -463,7 +463,7 @@ def column_definitions(table_name)
463463
ci[:default_function] = begin
464464
default = ci[:default_value]
465465
if default.nil? && view_exists
466-
view_column = views_real_column_name(table_name, ci[:name])
466+
view_column = views_real_column_name(table_name, ci[:name]).downcase
467467
default = default_functions[view_column] if view_column.present?
468468
end
469469
case default

test/cases/view_test_sqlserver.rb

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# frozen_string_literal: true
2+
3+
require "cases/helper_sqlserver"
4+
5+
class ViewTestSQLServer < ActiveRecord::TestCase
6+
let(:connection) { ActiveRecord::Base.connection }
7+
8+
describe 'view with default values' do
9+
before do
10+
connection.drop_table :view_casing_table rescue nil
11+
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+
end
15+
16+
connection.execute("DROP VIEW IF EXISTS view_casing_table_view;")
17+
connection.execute("CREATE VIEW view_casing_table_view AS SELECT id AS id, default_falsey AS falsey, default_truthy AS truthy FROM view_casing_table")
18+
end
19+
20+
it "default values are correct when column casing used in tables and views are different" do
21+
klass = Class.new(ActiveRecord::Base) do
22+
self.table_name = "view_casing_table_view"
23+
end
24+
25+
obj = klass.new
26+
assert_equal false, obj.falsey
27+
assert_equal true, obj.truthy
28+
assert_equal 0, klass.count
29+
30+
obj.save!
31+
assert_equal false, obj.falsey
32+
assert_equal true, obj.truthy
33+
assert_equal 1, klass.count
34+
end
35+
end
36+
end

0 commit comments

Comments
 (0)