From 0141dd37be1bbca8f3f08f8e3602a2530ed76239 Mon Sep 17 00:00:00 2001
From: kennyj <kennyj@gmail.com>
Date: Tue, 16 Apr 2013 03:02:06 +0900
Subject: Revert "fixing bit string test"

This reverts commit cdd293cb963b895ff580eb20d10f5d56ecb3d447.

Reason: This wasn't properly fix.
---
 activerecord/test/cases/adapters/postgresql/datatype_test.rb | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/activerecord/test/cases/adapters/postgresql/datatype_test.rb b/activerecord/test/cases/adapters/postgresql/datatype_test.rb
index 1e6ae85a25..13731beb01 100644
--- a/activerecord/test/cases/adapters/postgresql/datatype_test.rb
+++ b/activerecord/test/cases/adapters/postgresql/datatype_test.rb
@@ -545,13 +545,13 @@ _SQL
 
   def test_update_bit_string
     new_bit_string = '11111111'
-    new_bit_string_varying = '11111110'
+    new_bit_string_varying = 'FF'
     assert @first_bit_string.bit_string = new_bit_string
     assert @first_bit_string.bit_string_varying = new_bit_string_varying
     assert @first_bit_string.save
     assert @first_bit_string.reload
-    assert_equal new_bit_string, @first_bit_string.bit_string
-    assert_equal new_bit_string_varying, @first_bit_string.bit_string_varying
+    assert_equal @first_bit_string.bit_string, new_bit_string
+    assert_equal @first_bit_string.bit_string, @first_bit_string.bit_string_varying
   end
 
   def test_update_oid
-- 
cgit v1.2.3


From 9339005bb5504839e2a868f9510f0610da657400 Mon Sep 17 00:00:00 2001
From: kennyj <kennyj@gmail.com>
Date: Tue, 16 Apr 2013 03:05:47 +0900
Subject: Add OID::Bit for supporting bit string.

---
 .../active_record/connection_adapters/postgresql/cast.rb   |  7 +++++++
 .../active_record/connection_adapters/postgresql/oid.rb    | 14 ++++++++++++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb b/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb
index 14ef07a75e..5789a2ae5f 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb
@@ -26,6 +26,13 @@ module ActiveRecord
           end
         end
 
+        def string_to_bit(value)
+          case value
+          when /^[01]*$/      then value             # Bit-string notation
+          when /^[0-9A-F]*$/i then value.hex.to_s(2) # Hexadecimal notation
+          end
+        end
+
         def hstore_to_string(object)
           if Hash === object
             object.map { |k,v|
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/oid.rb b/activerecord/lib/active_record/connection_adapters/postgresql/oid.rb
index 14c97dcefc..1be116ce10 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/oid.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/oid.rb
@@ -18,6 +18,16 @@ module ActiveRecord
           end
         end
 
+        class Bit < Type
+          def type_cast(value)
+            if String === value
+              ConnectionAdapters::PostgreSQLColumn.string_to_bit value
+            else
+              value
+            end
+          end
+        end
+
         class Bytea < Type
           def type_cast(value)
             return if value.nil?
@@ -323,14 +333,14 @@ module ActiveRecord
         # FIXME: why are we keeping these types as strings?
         alias_type 'tsvector', 'text'
         alias_type 'interval', 'text'
-        alias_type 'bit',      'text'
-        alias_type 'varbit',   'text'
         alias_type 'macaddr',  'text'
         alias_type 'uuid',     'text'
 
         register_type 'money', OID::Money.new
         register_type 'bytea', OID::Bytea.new
         register_type 'bool', OID::Boolean.new
+        register_type 'bit', OID::Bit.new
+        register_type 'varbit', OID::Bit.new
 
         register_type 'float4', OID::Float.new
         alias_type 'float8', 'float4'
-- 
cgit v1.2.3