Permalink
Browse files

Merge pull request #6418 from pwnall/pgsql_bytea_limit3

Postgresql doesn't accept limits on binary (bytea) columns (for 3-2-stable)
  • Loading branch information...
2 parents f051071 + 36fdb72 commit 5d6cca1d649d370cbb08b88c4af9008edd35b04b @tenderlove tenderlove committed May 21, 2012
@@ -1067,14 +1067,25 @@ def index_name_length
# 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
@@ -75,6 +75,7 @@ def create_table(*args, &block)
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|

0 comments on commit 5d6cca1

Please sign in to comment.