提交 4320b778 编写于 作者: Y Yves Senn

Merge pull request #13334 from gregolsen/postgresql_infinity

pg, fix Infinity and NaN values conversion.

Closes #13334.

* rebased
* removed guard
* inlined guard into case statement
* Fix `PostgreSQLAdapter::OID::Float#type_cast` to convert Infinity and
NaN PostgreSQL values into a native Ruby `Float::INFINITY` and `Float::NAN`
Example:
# Before
Point.create(value: 1.0/0)
Point.last.value # => 0.0
# After
Point.create(value: 1.0/0)
Point.last.value # => Infinity
*Innokenty Mikhailov*
* Allow the PostgreSQL adapter to handle bigserial pk types again.
Fixes #10410.
......
......@@ -249,11 +249,16 @@ class Float < Type
def type; :float end
def type_cast(value)
return if value.nil?
case value
when nil; nil
when 'Infinity'; ::Float::INFINITY
when '-Infinity'; -::Float::INFINITY
when 'NaN'; ::Float::NAN
else
value.to_f
end
end
end
class Decimal < Type
def type; :decimal end
......
......@@ -50,7 +50,11 @@ def setup
@second_money = PostgresqlMoney.find(2)
@connection.execute("INSERT INTO postgresql_numbers (id, single, double) VALUES (1, 123.456, 123456.789)")
@connection.execute("INSERT INTO postgresql_numbers (id, single, double) VALUES (2, '-Infinity', 'Infinity')")
@connection.execute("INSERT INTO postgresql_numbers (id, single, double) VALUES (3, 123.456, 'NaN')")
@first_number = PostgresqlNumber.find(1)
@second_number = PostgresqlNumber.find(2)
@third_number = PostgresqlNumber.find(3)
@connection.execute("INSERT INTO postgresql_times (id, time_interval, scaled_time_interval) VALUES (1, '1 year 2 days ago', '3 weeks ago')")
@first_time = PostgresqlTime.find(1)
......@@ -154,6 +158,9 @@ def test_update_tsvector
def test_number_values
assert_equal 123.456, @first_number.single
assert_equal 123456.789, @first_number.double
assert_equal -::Float::INFINITY, @second_number.single
assert_equal ::Float::INFINITY, @second_number.double
assert_same ::Float::NAN, @third_number.double
end
def test_time_values
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册