Skip to content

Commit

Permalink
Merge branch 'fix_uniqueness_validation_when_value_is_out_of_range'
Browse files Browse the repository at this point in the history
  • Loading branch information
sgrif committed Apr 8, 2015
2 parents 0a120a8 + 1a36be3 commit 67c2dee
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
5 changes: 5 additions & 0 deletions activerecord/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
* Fixed a bug where uniqueness validations would error on out of range values,
even if an validation should have prevented it from hitting the database.

*Andrey Voronkov*

* MySQL: `:charset` and `:collation` support for string and text columns.

Example:
Expand Down
2 changes: 2 additions & 0 deletions activerecord/lib/active_record/validations/uniqueness.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ def build_relation(klass, table, attribute, value) #:nodoc:
klass.connection.case_sensitive_comparison(table, attribute, column, value)
end
klass.unscoped.where(comparison)
rescue RangeError
klass.none
end

def scope_relation(record, table, relation)
Expand Down
25 changes: 25 additions & 0 deletions activerecord/test/cases/validations/uniqueness_validation_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,22 @@ class TopicWithUniqEvent < Topic
validates :event, uniqueness: true
end

class BigIntTest < ActiveRecord::Base
INT_MAX_VALUE = 2147483647
self.table_name = 'cars'
validates :engines_count, uniqueness: true, inclusion: { in: 0..INT_MAX_VALUE }
end

class BigIntReverseTest < ActiveRecord::Base
INT_MAX_VALUE = 2147483647
self.table_name = 'cars'
validates :engines_count, inclusion: { in: 0..INT_MAX_VALUE }
validates :engines_count, uniqueness: true
end

class UniquenessValidationTest < ActiveRecord::TestCase
INT_MAX_VALUE = 2147483647

fixtures :topics, 'warehouse-things'

repair_validations(Topic, Reply)
Expand Down Expand Up @@ -86,6 +101,16 @@ def test_validates_uniqueness_with_validates
assert t2.errors[:title]
end

def test_validate_uniqueness_when_integer_out_of_range
entry = BigIntTest.create(engines_count: INT_MAX_VALUE + 1)
assert_equal entry.errors[:engines_count], ['is not included in the list']
end

def test_validate_uniqueness_when_integer_out_of_range_show_order_does_not_matter
entry = BigIntReverseTest.create(engines_count: INT_MAX_VALUE + 1)
assert_equal entry.errors[:engines_count], ['is not included in the list']
end

def test_validates_uniqueness_with_newline_chars
Topic.validates_uniqueness_of(:title, :case_sensitive => false)

Expand Down

0 comments on commit 67c2dee

Please sign in to comment.