Browse Source

Fix float special values decoding. #109

Сергей Прохоров 7 years ago
parent
commit
721d7f50b9

+ 5 - 0
src/datatypes/epgsql_codec_datetime.erl

@@ -13,6 +13,11 @@
 -export([init/2, names/0, encode/3, decode/3]).
 
 -export_type([data/0]).
+-export_type([pg_date/0,
+              pg_time/0,
+              pg_datetime/0,
+              pg_interval/0,
+              pg_timetz/0]).
 
 -type data() :: pg_date() | pg_time() | pg_datetime() | pg_interval() | pg_timetz().
 

+ 3 - 3
src/datatypes/epgsql_codec_float.erl

@@ -47,9 +47,9 @@ encode(minus_infinity, float8, _) -> ?NEG_INF8.
 
 decode(<<N:1/big-float-unit:32>>, float4, _) -> N;
 decode(<<N:1/big-float-unit:64>>, float8, _) -> N;
-decode(?NAN_PATTERN, float4, _) -> nan;
-decode(?NAN_PATTERN8, float8, _) -> nan;
 decode(?POS_INF, float4, _) -> plus_infinity;
 decode(?POS_INF8, float8, _) -> plus_infinity;
 decode(?NEG_INF, float4, _) -> minus_infinity;
-decode(?NEG_INF8, float8, _) -> minus_infinity.
+decode(?NEG_INF8, float8, _) -> minus_infinity;
+decode(?NAN_PATTERN, float4, _) -> nan;
+decode(?NAN_PATTERN8, float8, _) -> nan.

+ 5 - 3
test/epgsql_SUITE.erl

@@ -659,7 +659,9 @@ numeric_type(Config) ->
     check_type(Config, int4, "1", 1, [0, 512, -2147483648, +2147483647]),
     check_type(Config, int8, "1", 1, [0, 1024, -9223372036854775808, +9223372036854775807]),
     check_type(Config, float4, "1.0", 1.0, [0.0, 1.23456, -1.23456]),
-    check_type(Config, float8, "1.0", 1.0, [0.0, 1.23456789012345, -1.23456789012345]).
+    check_type(Config, float4, "'-Infinity'", minus_infinity, [minus_infinity, plus_infinity, nan]),
+    check_type(Config, float8, "1.0", 1.0, [0.0, 1.23456789012345, -1.23456789012345]),
+    check_type(Config, float8, "'nan'", nan, [minus_infinity, plus_infinity, nan]).
 
 character_type(Config) ->
     Alpha = unicode:characters_to_binary([16#03B1]),
@@ -1141,8 +1143,8 @@ check_type(Config, Type, In, Out, Values, Column) ->
 
 compare(_Type, null, null)      -> true;
 compare(_Type, undefined, null) -> true;
-compare(float4, V1, V2)         -> abs(V2 - V1) < 0.000001;
-compare(float8, V1, V2)         -> abs(V2 - V1) < 0.000000000000001;
+compare(float4, V1, V2) when is_float(V1) -> abs(V2 - V1) < 0.000001;
+compare(float8, V1, V2) when is_float(V1) -> abs(V2 - V1) < 0.000000000000001;
 compare(hstore, {V1}, V2)       -> compare(hstore, V1, V2);
 compare(hstore, V1, {V2})       -> compare(hstore, V1, V2);
 compare(hstore, V1, V2)         ->