diff options
author | Victor Costan <costan@gmail.com> | 2012-05-09 23:38:24 -0400 |
---|---|---|
committer | Victor Costan <costan@gmail.com> | 2012-05-09 23:38:24 -0400 |
commit | 99ed99bb5178655238add0bfc45e36c2a5686daf (patch) | |
tree | 5fdf28ad4160c0bf538e01c6373324a4a1aa7e1f | |
parent | ea40990f4b64e4518d9f34e3d3101d2480217e19 (diff) | |
download | rails-99ed99bb5178655238add0bfc45e36c2a5686daf.tar.gz rails-99ed99bb5178655238add0bfc45e36c2a5686daf.tar.bz2 rails-99ed99bb5178655238add0bfc45e36c2a5686daf.zip |
Postgresql doesn't accept limits on binary (bytea) columns.
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | 27 | ||||
-rw-r--r-- | activerecord/test/schema/schema.rb | 1 |
2 files changed, 20 insertions, 8 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index 4d5459939b..5ec1ffd704 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -1216,14 +1216,25 @@ module ActiveRecord # Maps logical Rails types to PostgreSQL-specific data types. def type_to_sql(type, limit = nil, precision = nil, scale = nil) - return super unless type.to_s == 'integer' - return 'integer' unless limit - - case limit - when 1, 2; 'smallint' - when 3, 4; 'integer' - when 5..8; 'bigint' - else raise(ActiveRecordError, "No integer type has byte size #{limit}. Use a numeric with precision 0 instead.") + case type.to_s + when 'binary' + # PostgreSQL doesn't support limits on binary (bytea) columns. + # The hard limit is 1Gb, because of a 32-bit size field, and TOAST. + case limit + when nil, 0..0x3fffffff; super(type) + else raise(ActiveRecordError, "No binary type has byte size #{limit}.") + end + when 'integer' + return 'integer' unless limit + + case limit + when 1, 2; 'smallint' + when 3, 4; 'integer' + when 5..8; 'bigint' + else raise(ActiveRecordError, "No integer type has byte size #{limit}. Use a numeric with precision 0 instead.") + end + else + super end end diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index cef08cd99c..b18f9779be 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -78,6 +78,7 @@ ActiveRecord::Schema.define do create_table :binaries, :force => true do |t| t.string :name t.binary :data + t.binary :short_data, :limit => 2048 end create_table :birds, :force => true do |t| |