diff options
author | Tom Lane | 2016-09-27 15:38:33 +0000 |
---|---|---|
committer | Tom Lane | 2016-09-27 15:38:33 +0000 |
commit | f31a931fade868d788ef4480c59753a2d5059246 (patch) | |
tree | 614246ea47696b568ad5b7ea06f7c75d932802cf /contrib/cube/sql/cube.sql | |
parent | 51c3e9fade76c12e4aa37bffdf800bbf74fb3fb1 (diff) |
Improve contrib/cube's handling of zero-D cubes, infinities, and NaNs.
It's always been possible to create a zero-dimensional cube by converting
from a zero-length float8 array, but cube_in failed to accept the '()'
representation that cube_out produced for that case, resulting in a
dump/reload hazard. Make it accept the case. Also fix a couple of
other places that didn't behave sanely for zero-dimensional cubes:
cube_size would produce 1.0 when surely the answer should be 0.0,
and g_cube_distance risked a divide-by-zero failure.
Likewise, it's always been possible to create cubes containing float8
infinity or NaN coordinate values, but cube_in couldn't parse such input,
and cube_out produced platform-dependent spellings of the values. Convert
them to use float8in_internal and float8out_internal so that the behavior
will be the same as for float8, as we recently did for the core geometric
types (cf commit 50861cd68). As in that commit, I don't pretend that this
patch fixes all insane corner-case behaviors that may exist for NaNs, but
it's a step forward.
(This change allows removal of the separate cube_1.out and cube_3.out
expected-files, as the platform dependency that previously required them
is now gone: an underflowing coordinate value will now produce an error
not plus or minus zero.)
Make errors from cube_in follow project conventions as to spelling
("invalid input syntax for cube" not "bad cube representation")
and errcode (INVALID_TEXT_REPRESENTATION not SYNTAX_ERROR).
Also a few marginal code cleanups and comment improvements.
Tom Lane, reviewed by Amul Sul
Discussion: <[email protected]>
Diffstat (limited to 'contrib/cube/sql/cube.sql')
-rw-r--r-- | contrib/cube/sql/cube.sql | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/contrib/cube/sql/cube.sql b/contrib/cube/sql/cube.sql index e225fb7da18..cc5a1ce4588 100644 --- a/contrib/cube/sql/cube.sql +++ b/contrib/cube/sql/cube.sql @@ -29,8 +29,11 @@ SELECT '1e-7'::cube AS cube; SELECT '-1e-7'::cube AS cube; SELECT '1.0e-7'::cube AS cube; SELECT '-1.0e-7'::cube AS cube; -SELECT '1e-700'::cube AS cube; -SELECT '-1e-700'::cube AS cube; +SELECT '1e-300'::cube AS cube; +SELECT '-1e-300'::cube AS cube; +SELECT 'infinity'::cube AS cube; +SELECT '-infinity'::cube AS cube; +SELECT 'NaN'::cube AS cube; SELECT '1234567890123456'::cube AS cube; SELECT '+1234567890123456'::cube AS cube; SELECT '-1234567890123456'::cube AS cube; @@ -39,12 +42,14 @@ SELECT '+.1234567890123456'::cube AS cube; SELECT '-.1234567890123456'::cube AS cube; -- simple lists (points) +SELECT '()'::cube AS cube; SELECT '1,2'::cube AS cube; SELECT '(1,2)'::cube AS cube; SELECT '1,2,3,4,5'::cube AS cube; SELECT '(1,2,3,4,5)'::cube AS cube; -- double lists (cubes) +SELECT '(),()'::cube AS cube; SELECT '(0),(0)'::cube AS cube; SELECT '(0),(1)'::cube AS cube; SELECT '[(0),(0)]'::cube AS cube; @@ -57,7 +62,6 @@ SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube; -- invalid input: parse errors SELECT ''::cube AS cube; SELECT 'ABC'::cube AS cube; -SELECT '()'::cube AS cube; SELECT '[]'::cube AS cube; SELECT '[()]'::cube AS cube; SELECT '[(1)]'::cube AS cube; @@ -85,6 +89,7 @@ SELECT '1,2ab'::cube AS cube; -- 6 SELECT '1 e7'::cube AS cube; -- 6 SELECT '1,2a'::cube AS cube; -- 7 SELECT '1..2'::cube AS cube; -- 7 +SELECT '-1e-700'::cube AS cube; -- out of range -- -- Testing building cubes from float8 values |