diff options
author | Yasuo Honda <yasuo.honda@gmail.com> | 2015-05-29 16:45:59 +0000 |
---|---|---|
committer | Yasuo Honda <yasuo.honda@gmail.com> | 2015-06-01 12:23:20 +0000 |
commit | a9e6e6e07aa5f433e0f66179b22c1c9575685727 (patch) | |
tree | 94aaf8b8125aded6a2b5c2e17adaee52ca259121 | |
parent | 2db8414102d1ccbaf2f293e183422c0801d4bccd (diff) | |
download | rails-a9e6e6e07aa5f433e0f66179b22c1c9575685727.tar.gz rails-a9e6e6e07aa5f433e0f66179b22c1c9575685727.tar.bz2 rails-a9e6e6e07aa5f433e0f66179b22c1c9575685727.zip |
Map :bigint as NUMBER(19) sql_type by using `:limit => 19` for Oracle
since NUMBER(8) is not enough to store the maximum number of bigint.
Oracle NUMBER(p,0) as handled as integer
because there is no dedicated integer sql data type exist in Oracle database.
Also NUMBER(p,s) precision can take up to 38. p means the number of digits, not the byte length.
bigint type needs 19 digits as follows.
$ irb
2.2.2 :001 > limit = 8
=> 8
2.2.2 :002 > maxvalue_of_bigint = 1 << ( limit * 8 - 1)
=> 9223372036854775808
2.2.2 :003 > puts maxvalue_of_bigint.to_s.length
19
=> nil
2.2.2 :004 >
-rw-r--r-- | activerecord/test/cases/connection_adapters/type_lookup_test.rb | 6 | ||||
-rw-r--r-- | activerecord/test/cases/migration/change_schema_test.rb | 2 |
2 files changed, 6 insertions, 2 deletions
diff --git a/activerecord/test/cases/connection_adapters/type_lookup_test.rb b/activerecord/test/cases/connection_adapters/type_lookup_test.rb index 05c57985a1..7566863653 100644 --- a/activerecord/test/cases/connection_adapters/type_lookup_test.rb +++ b/activerecord/test/cases/connection_adapters/type_lookup_test.rb @@ -81,7 +81,11 @@ module ActiveRecord def test_bigint_limit cast_type = @connection.type_map.lookup("bigint") - assert_equal 8, cast_type.limit + if current_adapter?(:OracleAdapter) + assert_equal 19, cast_type.limit + else + assert_equal 8, cast_type.limit + end end def test_decimal_without_scale diff --git a/activerecord/test/cases/migration/change_schema_test.rb b/activerecord/test/cases/migration/change_schema_test.rb index 46a62c272f..83e50048ec 100644 --- a/activerecord/test/cases/migration/change_schema_test.rb +++ b/activerecord/test/cases/migration/change_schema_test.rb @@ -105,7 +105,7 @@ module ActiveRecord eight = columns.detect { |c| c.name == "eight_int" } if current_adapter?(:OracleAdapter) - assert_equal 'NUMBER(8)', eight.sql_type + assert_equal 'NUMBER(19)', eight.sql_type elsif current_adapter?(:SQLite3Adapter) assert_equal 'bigint', eight.sql_type else |