Skip to content

Commit ad83df8

Browse files
committed
Change column/view cache to happen at class level. Allows connection pool to share same caches as well as the ability to expire the caches when needed. Also fix change_column so that exceptions are not raised when the column contains an existing default.
1 parent 4d208ac commit ad83df8

File tree

3 files changed

+38
-22
lines changed

3 files changed

+38
-22
lines changed

CHANGELOG

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

22
MASTER
33

4+
* Change column/view cache to happen at class level. Allows connection pool to share same
5+
caches as well as the ability to expire the caches when needed. Also fix change_column so
6+
that exceptions are not raised when the column contains an existing default. [Ken Collins]
7+
48
* Allow query_requires_identity_insert? method to return quoted table name in situations where the
59
INSERT parts are not quoted themselves. [Gary/iawgens, Richard Penwell, Ken Collins]
610

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -568,13 +568,13 @@ def tables(name = nil)
568568
end
569569

570570
def views(name = nil)
571-
@sqlserver_views_cache ||=
571+
@@sqlserver_views_cache ||=
572572
info_schema_query { select_values("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME NOT IN ('sysconstraints','syssegments')") }
573573
end
574574

575575
def view_information(table_name)
576576
table_name = unqualify_table_name(table_name)
577-
@sqlserver_view_information_cache[table_name] ||= begin
577+
@@sqlserver_view_information_cache[table_name] ||= begin
578578
view_info = info_schema_query { select_one("SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = '#{table_name}'") }
579579
if view_info
580580
if view_info['VIEW_DEFINITION'].blank? || view_info['VIEW_DEFINITION'].length == 4000
@@ -615,15 +615,15 @@ def indexes(table_name, name = nil)
615615
def columns(table_name, name = nil)
616616
return [] if table_name.blank?
617617
cache_key = unqualify_table_name(table_name)
618-
@sqlserver_columns_cache[cache_key] ||= column_definitions(table_name).collect do |ci|
618+
@@sqlserver_columns_cache[cache_key] ||= column_definitions(table_name).collect do |ci|
619619
sqlserver_options = ci.except(:name,:default_value,:type,:null)
620620
SQLServerColumn.new ci[:name], ci[:default_value], ci[:type], ci[:null], sqlserver_options
621621
end
622622
end
623623

624624
def create_table(table_name, options = {})
625625
super
626-
remove_sqlserver_columns_cache_for(table_name)
626+
initialize_sqlserver_caches
627627
end
628628

629629
def rename_table(table_name, new_name)
@@ -632,12 +632,12 @@ def rename_table(table_name, new_name)
632632

633633
def drop_table(table_name, options = {})
634634
super
635-
remove_sqlserver_columns_cache_for(table_name)
635+
initialize_sqlserver_caches
636636
end
637637

638638
def add_column(table_name, column_name, type, options = {})
639639
super
640-
remove_sqlserver_columns_cache_for(table_name)
640+
initialize_sqlserver_caches
641641
end
642642

643643
def remove_column(table_name, *column_names)
@@ -647,32 +647,32 @@ def remove_column(table_name, *column_names)
647647
remove_indexes(table_name, column_name)
648648
do_execute "ALTER TABLE #{quote_table_name(table_name)} DROP COLUMN #{quote_column_name(column_name)}"
649649
end
650-
remove_sqlserver_columns_cache_for(table_name)
650+
initialize_sqlserver_caches
651651
end
652652

653653
def change_column(table_name, column_name, type, options = {})
654654
sql_commands = []
655+
remove_default_constraint(table_name, column_name)
655656
change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
656657
change_column_sql << " NOT NULL" if options[:null] == false
657658
sql_commands << change_column_sql
658659
if options_include_default?(options)
659-
remove_default_constraint(table_name, column_name)
660660
sql_commands << "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{default_name(table_name,column_name)} DEFAULT #{quote(options[:default])} FOR #{quote_column_name(column_name)}"
661661
end
662662
sql_commands.each { |c| do_execute(c) }
663-
remove_sqlserver_columns_cache_for(table_name)
663+
initialize_sqlserver_caches
664664
end
665665

666666
def change_column_default(table_name, column_name, default)
667667
remove_default_constraint(table_name, column_name)
668668
do_execute "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{default_name(table_name, column_name)} DEFAULT #{quote(default)} FOR #{quote_column_name(column_name)}"
669-
remove_sqlserver_columns_cache_for(table_name)
669+
initialize_sqlserver_caches
670670
end
671671

672672
def rename_column(table_name, column_name, new_column_name)
673673
column_for(table_name,column_name)
674674
do_execute "EXEC sp_rename '#{table_name}.#{column_name}', '#{new_column_name}', 'COLUMN'"
675-
remove_sqlserver_columns_cache_for(table_name)
675+
initialize_sqlserver_caches
676676
end
677677

678678
def remove_index(table_name, options = {})
@@ -1020,16 +1020,10 @@ def sql_for_association_limiting?(sql)
10201020
end
10211021
end
10221022

1023-
def remove_sqlserver_columns_cache_for(table_name)
1024-
cache_key = unqualify_table_name(table_name)
1025-
@sqlserver_columns_cache[cache_key] = nil
1026-
initialize_sqlserver_caches(false)
1027-
end
1028-
1029-
def initialize_sqlserver_caches(reset_columns=true)
1030-
@sqlserver_columns_cache = {} if reset_columns
1031-
@sqlserver_views_cache = nil
1032-
@sqlserver_view_information_cache = {}
1023+
def initialize_sqlserver_caches
1024+
@@sqlserver_columns_cache = {}
1025+
@@sqlserver_views_cache = nil
1026+
@@sqlserver_view_information_cache = {}
10331027
end
10341028

10351029
def column_definitions(table_name)

test/cases/migration_test_sqlserver.rb

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33

44
class MigrationTestSqlserver < ActiveRecord::TestCase
55

6+
def setup
7+
@connection = ActiveRecord::Base.connection
8+
end
9+
610
context 'For transactions' do
711

812
setup do
9-
@connection = ActiveRecord::Base.connection
1013
@trans_test_table1 = 'sqlserver_trans_table1'
1114
@trans_test_table2 = 'sqlserver_trans_table2'
1215
@trans_tables = [@trans_test_table1,@trans_test_table2]
@@ -30,6 +33,21 @@ class MigrationTestSqlserver < ActiveRecord::TestCase
3033

3134
end
3235

36+
context 'For changing column' do
37+
38+
should 'not raise exception when column contains default constraint' do
39+
lock_version_column = Person.columns_hash['lock_version']
40+
assert_equal :integer, lock_version_column.type
41+
assert lock_version_column.default.present?
42+
assert_nothing_raised { @connection.change_column 'people', 'lock_version', :string }
43+
Person.reset_column_information
44+
lock_version_column = Person.columns_hash['lock_version']
45+
assert_equal :string, lock_version_column.type
46+
assert lock_version_column.default.nil?
47+
end
48+
49+
end
50+
3351

3452
end
3553

0 commit comments

Comments
 (0)