aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
diff options
context:
space:
mode:
authorVictor Costan <costan@gmail.com>2012-05-09 23:38:24 -0400
committerVictor Costan <costan@gmail.com>2012-05-09 23:38:24 -0400
commit99ed99bb5178655238add0bfc45e36c2a5686daf (patch)
tree5fdf28ad4160c0bf538e01c6373324a4a1aa7e1f /activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
parentea40990f4b64e4518d9f34e3d3101d2480217e19 (diff)
downloadrails-99ed99bb5178655238add0bfc45e36c2a5686daf.tar.gz
rails-99ed99bb5178655238add0bfc45e36c2a5686daf.tar.bz2
rails-99ed99bb5178655238add0bfc45e36c2a5686daf.zip
Postgresql doesn't accept limits on binary (bytea) columns.
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb')
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb27
1 files changed, 19 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