Permalink
Browse files

Postgresql doesn't accept limits on text columns.

  • Loading branch information...
1 parent bd87bd9 commit f307cbf42b4b29c97e6a39cfceef10e266f56d7a @pwnall committed Nov 20, 2012
View
5 activerecord/CHANGELOG.md
@@ -1,5 +1,10 @@
## Rails 3.2.10 (unreleased)
+* When running migrations on Postgresql, the `:limit` option for `binary` and `text` columns is silently dropped.
+ Previously, these migrations caused sql exceptions, because Postgresql doesn't support limits on these types.
+
+ *Victor Costan*
+
* Calling `include?` on `has_many` associations on unsaved records no longer
returns `true` when passed a record with a `nil` foreign key.
Fixes #7950.
View
7 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -1078,6 +1078,13 @@ def type_to_sql(type, limit = nil, precision = nil, scale = nil)
when nil, 0..0x3fffffff; super(type)
else raise(ActiveRecordError, "No binary type has byte size #{limit}.")
end
+ when 'text'
+ # PostgreSQL doesn't support limits on text columns.
+ # The hard limit is 1Gb, according to section 8.3 in the manual.
+ case limit
+ when nil, 0..0x3fffffff; super(type)
+ else raise(ActiveRecordError, "The limit on text can be at most 1GB - 1byte.")
+ end
when 'integer'
return 'integer' unless limit
View
18 activerecord/test/cases/adapters/postgresql/sql_types_test.rb
@@ -0,0 +1,18 @@
+require "cases/helper"
+
+class SqlTypesTest < ActiveRecord::TestCase
+ def test_binary_types
+ assert_equal 'bytea', type_to_sql(:binary, 100_000)
+ assert_raise ActiveRecord::ActiveRecordError do
+ type_to_sql :binary, 4294967295
+ end
+ assert_equal 'text', type_to_sql(:text, 100_000)
+ assert_raise ActiveRecord::ActiveRecordError do
+ type_to_sql :text, 4294967295
+ end
+ end
+
+ def type_to_sql(*args)
+ ActiveRecord::Base.connection.type_to_sql(*args)
+ end
+end
View
5 activerecord/test/schema/postgresql_specific_schema.rb
@@ -132,5 +132,10 @@
_SQL
rescue #This version of PostgreSQL either has no XML support or is was not compiled with XML support: skipping table
end
+
+ create_table :limitless_fields, force: true do |t|
+ t.binary :binary, limit: 100_000
+ t.text :text, limit: 100_000
+ end
end

0 comments on commit f307cbf

Please sign in to comment.