From 32ea84df6f4236125ea9e1f91a0685ccea2bfe4a Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Mon, 21 Nov 2016 17:40:05 +0900 Subject: [PATCH] Fix that unsigned with zerofill is treated as signed Fixes #27125. --- activerecord/CHANGELOG.md | 6 ++++++ .../connection_adapters/abstract_mysql_adapter.rb | 2 +- .../lib/active_record/connection_adapters/mysql/column.rb | 2 +- .../test/cases/adapters/mysql2/unsigned_type_test.rb | 1 + 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 64a0e22af2..08dd40080f 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,9 @@ +* Fix that unsigned with zerofill is treated as signed. + + Fixes #27125. + + *Ryuta Kamizono* + * Fix the uniqueness validation scope with a polymorphic association. *Sergey Alekseev* diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb index cbbba5b1a5..98152853c2 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -693,7 +693,7 @@ def initialize_type_map(m) # :nodoc: def register_integer_type(mapping, key, options) # :nodoc: mapping.register_type(key) do |sql_type| - if /\bunsigned\z/.match?(sql_type) + if /\bunsigned\b/.match?(sql_type) Type::UnsignedInteger.new(options) else Type::Integer.new(options) diff --git a/activerecord/lib/active_record/connection_adapters/mysql/column.rb b/activerecord/lib/active_record/connection_adapters/mysql/column.rb index f82c556a6f..22b9df5309 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql/column.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql/column.rb @@ -5,7 +5,7 @@ class Column < ConnectionAdapters::Column # :nodoc: delegate :extra, to: :sql_type_metadata, allow_nil: true def unsigned? - /\bunsigned\z/.match?(sql_type) + !/\A(?:enum|set)\b/.match?(sql_type) && /\bunsigned\b/.match?(sql_type) end def case_sensitive? diff --git a/activerecord/test/cases/adapters/mysql2/unsigned_type_test.rb b/activerecord/test/cases/adapters/mysql2/unsigned_type_test.rb index 452f8d5ae8..59475ad177 100644 --- a/activerecord/test/cases/adapters/mysql2/unsigned_type_test.rb +++ b/activerecord/test/cases/adapters/mysql2/unsigned_type_test.rb @@ -48,6 +48,7 @@ class UnsignedType < ActiveRecord::Base t.unsigned_bigint :unsigned_bigint_t t.unsigned_float :unsigned_float_t t.unsigned_decimal :unsigned_decimal_t, precision: 10, scale: 2 + t.column :unsigned_zerofill, "int unsigned zerofill" end @connection.columns("unsigned_types").select { |c| /^unsigned_/.match?(c.name) }.each do |column| -- GitLab