<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,6 +1,10 @@
 
 MASTER
 
+* 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. [Ken Collins]
+
 * Allow query_requires_identity_insert? method to return quoted table name in situations where the 
   INSERT parts are not quoted themselves. [Gary/iawgens, Richard Penwell, Ken Collins]
 </diff>
      <filename>CHANGELOG</filename>
    </modified>
    <modified>
      <diff>@@ -568,13 +568,13 @@ module ActiveRecord
       end
       
       def views(name = nil)
-        @sqlserver_views_cache ||= 
+        @@sqlserver_views_cache ||= 
           info_schema_query { select_values(&quot;SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME NOT IN ('sysconstraints','syssegments')&quot;) }
       end
       
       def view_information(table_name)
         table_name = unqualify_table_name(table_name)
-        @sqlserver_view_information_cache[table_name] ||= begin
+        @@sqlserver_view_information_cache[table_name] ||= begin
           view_info = info_schema_query { select_one(&quot;SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = '#{table_name}'&quot;) }
           if view_info
             if view_info['VIEW_DEFINITION'].blank? || view_info['VIEW_DEFINITION'].length == 4000
@@ -615,7 +615,7 @@ module ActiveRecord
       def columns(table_name, name = nil)
         return [] if table_name.blank?
         cache_key = unqualify_table_name(table_name)
-        @sqlserver_columns_cache[cache_key] ||= column_definitions(table_name).collect do |ci|
+        @@sqlserver_columns_cache[cache_key] ||= column_definitions(table_name).collect do |ci|
           sqlserver_options = ci.except(:name,:default_value,:type,:null)
           SQLServerColumn.new ci[:name], ci[:default_value], ci[:type], ci[:null], sqlserver_options
         end
@@ -623,7 +623,7 @@ module ActiveRecord
       
       def create_table(table_name, options = {})
         super
-        remove_sqlserver_columns_cache_for(table_name)
+        initialize_sqlserver_caches
       end
       
       def rename_table(table_name, new_name)
@@ -632,12 +632,12 @@ module ActiveRecord
       
       def drop_table(table_name, options = {})
         super
-        remove_sqlserver_columns_cache_for(table_name)
+        initialize_sqlserver_caches
       end
       
       def add_column(table_name, column_name, type, options = {})
         super
-        remove_sqlserver_columns_cache_for(table_name)
+        initialize_sqlserver_caches
       end
       
       def remove_column(table_name, *column_names)
@@ -647,32 +647,32 @@ module ActiveRecord
           remove_indexes(table_name, column_name)
           do_execute &quot;ALTER TABLE #{quote_table_name(table_name)} DROP COLUMN #{quote_column_name(column_name)}&quot;
         end
-        remove_sqlserver_columns_cache_for(table_name)
+        initialize_sqlserver_caches
       end
       
       def change_column(table_name, column_name, type, options = {})
         sql_commands = []
+        remove_default_constraint(table_name, column_name)
         change_column_sql = &quot;ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}&quot;
         change_column_sql &lt;&lt; &quot; NOT NULL&quot; if options[:null] == false
         sql_commands &lt;&lt; change_column_sql
         if options_include_default?(options)
-          remove_default_constraint(table_name, column_name)
           sql_commands &lt;&lt; &quot;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)}&quot;
         end
         sql_commands.each { |c| do_execute(c) }
-        remove_sqlserver_columns_cache_for(table_name)
+        initialize_sqlserver_caches
       end
       
       def change_column_default(table_name, column_name, default)
         remove_default_constraint(table_name, column_name)
         do_execute &quot;ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{default_name(table_name, column_name)} DEFAULT #{quote(default)} FOR #{quote_column_name(column_name)}&quot;
-        remove_sqlserver_columns_cache_for(table_name)
+        initialize_sqlserver_caches
       end
       
       def rename_column(table_name, column_name, new_column_name)
         column_for(table_name,column_name)
         do_execute &quot;EXEC sp_rename '#{table_name}.#{column_name}', '#{new_column_name}', 'COLUMN'&quot;
-        remove_sqlserver_columns_cache_for(table_name)
+        initialize_sqlserver_caches
       end
       
       def remove_index(table_name, options = {})
@@ -1020,16 +1020,10 @@ module ActiveRecord
         end
       end
       
-      def remove_sqlserver_columns_cache_for(table_name)
-        cache_key = unqualify_table_name(table_name)
-        @sqlserver_columns_cache[cache_key] = nil
-        initialize_sqlserver_caches(false)
-      end
-      
-      def initialize_sqlserver_caches(reset_columns=true)
-        @sqlserver_columns_cache = {} if reset_columns
-        @sqlserver_views_cache = nil
-        @sqlserver_view_information_cache = {}
+      def initialize_sqlserver_caches
+        @@sqlserver_columns_cache = {}
+        @@sqlserver_views_cache = nil
+        @@sqlserver_view_information_cache = {}
       end
       
       def column_definitions(table_name)</diff>
      <filename>lib/active_record/connection_adapters/sqlserver_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,10 +3,13 @@ require 'models/person'
 
 class MigrationTestSqlserver &lt; ActiveRecord::TestCase
   
+  def setup
+    @connection = ActiveRecord::Base.connection
+  end
+  
   context 'For transactions' do
     
     setup do
-      @connection = ActiveRecord::Base.connection
       @trans_test_table1 = 'sqlserver_trans_table1'
       @trans_test_table2 = 'sqlserver_trans_table2'
       @trans_tables = [@trans_test_table1,@trans_test_table2]
@@ -30,6 +33,21 @@ class MigrationTestSqlserver &lt; ActiveRecord::TestCase
     
   end
   
+  context 'For changing column' do
+    
+    should 'not raise exception when column contains default constraint' do
+      lock_version_column = Person.columns_hash['lock_version']
+      assert_equal :integer, lock_version_column.type
+      assert lock_version_column.default.present?
+      assert_nothing_raised { @connection.change_column 'people', 'lock_version', :string }
+      Person.reset_column_information
+      lock_version_column = Person.columns_hash['lock_version']
+      assert_equal :string, lock_version_column.type
+      assert lock_version_column.default.nil?
+    end
+    
+  end
+  
   
 end
 </diff>
      <filename>test/cases/migration_test_sqlserver.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>4d208acc503bfb31f67857dfc1acae48e857d954</id>
    </parent>
  </parents>
  <author>
    <name>Ken Collins</name>
    <email>ken@metaskills.net</email>
  </author>
  <url>http://github.com/rails-sqlserver/2000-2005-adapter/commit/ad83df821022a7ff5297ba0a1ceee5335093a7a7</url>
  <id>ad83df821022a7ff5297ba0a1ceee5335093a7a7</id>
  <committed-date>2009-11-02T13:52:43-08:00</committed-date>
  <authored-date>2009-11-02T13:52:43-08:00</authored-date>
  <message>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.</message>
  <tree>efdd762ce784774f137742f6cdc78d78f6221c59</tree>
  <committer>
    <name>Ken Collins</name>
    <email>ken@metaskills.net</email>
  </committer>
</commit>
