mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-05 05:36:57 +02:00
342b83fdca
This reverts commit 500cf66d55
. As was
more or less expected, a small minority of platforms won't accept
denormalized input even with the recent changes. It doesn't seem
especially helpful to test this if we're going to have to provide an
alternate expected-file to allow failure.
447 lines
13 KiB
Plaintext
447 lines
13 KiB
Plaintext
--
|
|
-- FLOAT8
|
|
--
|
|
CREATE TABLE FLOAT8_TBL(f1 float8);
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
|
|
-- test for underflow and overflow handling
|
|
SELECT '10e400'::float8;
|
|
ERROR: "10e400" is out of range for type double precision
|
|
LINE 1: SELECT '10e400'::float8;
|
|
^
|
|
SELECT '-10e400'::float8;
|
|
ERROR: "-10e400" is out of range for type double precision
|
|
LINE 1: SELECT '-10e400'::float8;
|
|
^
|
|
SELECT '10e-400'::float8;
|
|
ERROR: "10e-400" is out of range for type double precision
|
|
LINE 1: SELECT '10e-400'::float8;
|
|
^
|
|
SELECT '-10e-400'::float8;
|
|
ERROR: "-10e-400" is out of range for type double precision
|
|
LINE 1: SELECT '-10e-400'::float8;
|
|
^
|
|
-- bad input
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('');
|
|
ERROR: invalid input syntax for type double precision: ""
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
|
|
ERROR: invalid input syntax for type double precision: " "
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
|
|
ERROR: invalid input syntax for type double precision: "xyz"
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
|
|
ERROR: invalid input syntax for type double precision: "5.0.0"
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
|
|
ERROR: invalid input syntax for type double precision: "5 . 0"
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
|
|
ERROR: invalid input syntax for type double precision: "5. 0"
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
|
|
ERROR: invalid input syntax for type double precision: " - 3"
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
|
|
ERROR: invalid input syntax for type double precision: "123 5"
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
|
|
^
|
|
-- special inputs
|
|
SELECT 'NaN'::float8;
|
|
float8
|
|
--------
|
|
NaN
|
|
(1 row)
|
|
|
|
SELECT 'nan'::float8;
|
|
float8
|
|
--------
|
|
NaN
|
|
(1 row)
|
|
|
|
SELECT ' NAN '::float8;
|
|
float8
|
|
--------
|
|
NaN
|
|
(1 row)
|
|
|
|
SELECT 'infinity'::float8;
|
|
float8
|
|
----------
|
|
Infinity
|
|
(1 row)
|
|
|
|
SELECT ' -INFINiTY '::float8;
|
|
float8
|
|
-----------
|
|
-Infinity
|
|
(1 row)
|
|
|
|
-- bad special inputs
|
|
SELECT 'N A N'::float8;
|
|
ERROR: invalid input syntax for type double precision: "N A N"
|
|
LINE 1: SELECT 'N A N'::float8;
|
|
^
|
|
SELECT 'NaN x'::float8;
|
|
ERROR: invalid input syntax for type double precision: "NaN x"
|
|
LINE 1: SELECT 'NaN x'::float8;
|
|
^
|
|
SELECT ' INFINITY x'::float8;
|
|
ERROR: invalid input syntax for type double precision: " INFINITY x"
|
|
LINE 1: SELECT ' INFINITY x'::float8;
|
|
^
|
|
SELECT 'Infinity'::float8 + 100.0;
|
|
?column?
|
|
----------
|
|
Infinity
|
|
(1 row)
|
|
|
|
SELECT 'Infinity'::float8 / 'Infinity'::float8;
|
|
?column?
|
|
----------
|
|
NaN
|
|
(1 row)
|
|
|
|
SELECT 'nan'::float8 / 'nan'::float8;
|
|
?column?
|
|
----------
|
|
NaN
|
|
(1 row)
|
|
|
|
SELECT 'nan'::numeric::float8;
|
|
float8
|
|
--------
|
|
NaN
|
|
(1 row)
|
|
|
|
SELECT '' AS five, * FROM FLOAT8_TBL;
|
|
five | f1
|
|
------+----------------------
|
|
| 0
|
|
| 1004.3
|
|
| -34.84
|
|
| 1.2345678901234e+200
|
|
| 1.2345678901234e-200
|
|
(5 rows)
|
|
|
|
SELECT '' AS four, f.* FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3';
|
|
four | f1
|
|
------+----------------------
|
|
| 0
|
|
| -34.84
|
|
| 1.2345678901234e+200
|
|
| 1.2345678901234e-200
|
|
(4 rows)
|
|
|
|
SELECT '' AS one, f.* FROM FLOAT8_TBL f WHERE f.f1 = '1004.3';
|
|
one | f1
|
|
-----+--------
|
|
| 1004.3
|
|
(1 row)
|
|
|
|
SELECT '' AS three, f.* FROM FLOAT8_TBL f WHERE '1004.3' > f.f1;
|
|
three | f1
|
|
-------+----------------------
|
|
| 0
|
|
| -34.84
|
|
| 1.2345678901234e-200
|
|
(3 rows)
|
|
|
|
SELECT '' AS three, f.* FROM FLOAT8_TBL f WHERE f.f1 < '1004.3';
|
|
three | f1
|
|
-------+----------------------
|
|
| 0
|
|
| -34.84
|
|
| 1.2345678901234e-200
|
|
(3 rows)
|
|
|
|
SELECT '' AS four, f.* FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1;
|
|
four | f1
|
|
------+----------------------
|
|
| 0
|
|
| 1004.3
|
|
| -34.84
|
|
| 1.2345678901234e-200
|
|
(4 rows)
|
|
|
|
SELECT '' AS four, f.* FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3';
|
|
four | f1
|
|
------+----------------------
|
|
| 0
|
|
| 1004.3
|
|
| -34.84
|
|
| 1.2345678901234e-200
|
|
(4 rows)
|
|
|
|
SELECT '' AS three, f.f1, f.f1 * '-10' AS x
|
|
FROM FLOAT8_TBL f
|
|
WHERE f.f1 > '0.0';
|
|
three | f1 | x
|
|
-------+----------------------+-----------------------
|
|
| 1004.3 | -10043
|
|
| 1.2345678901234e+200 | -1.2345678901234e+201
|
|
| 1.2345678901234e-200 | -1.2345678901234e-199
|
|
(3 rows)
|
|
|
|
SELECT '' AS three, f.f1, f.f1 + '-10' AS x
|
|
FROM FLOAT8_TBL f
|
|
WHERE f.f1 > '0.0';
|
|
three | f1 | x
|
|
-------+----------------------+----------------------
|
|
| 1004.3 | 994.3
|
|
| 1.2345678901234e+200 | 1.2345678901234e+200
|
|
| 1.2345678901234e-200 | -10
|
|
(3 rows)
|
|
|
|
SELECT '' AS three, f.f1, f.f1 / '-10' AS x
|
|
FROM FLOAT8_TBL f
|
|
WHERE f.f1 > '0.0';
|
|
three | f1 | x
|
|
-------+----------------------+-----------------------
|
|
| 1004.3 | -100.43
|
|
| 1.2345678901234e+200 | -1.2345678901234e+199
|
|
| 1.2345678901234e-200 | -1.2345678901234e-201
|
|
(3 rows)
|
|
|
|
SELECT '' AS three, f.f1, f.f1 - '-10' AS x
|
|
FROM FLOAT8_TBL f
|
|
WHERE f.f1 > '0.0';
|
|
three | f1 | x
|
|
-------+----------------------+----------------------
|
|
| 1004.3 | 1014.3
|
|
| 1.2345678901234e+200 | 1.2345678901234e+200
|
|
| 1.2345678901234e-200 | 10
|
|
(3 rows)
|
|
|
|
SELECT '' AS one, f.f1 ^ '2.0' AS square_f1
|
|
FROM FLOAT8_TBL f where f.f1 = '1004.3';
|
|
one | square_f1
|
|
-----+------------
|
|
| 1008618.49
|
|
(1 row)
|
|
|
|
-- absolute value
|
|
SELECT '' AS five, f.f1, @f.f1 AS abs_f1
|
|
FROM FLOAT8_TBL f;
|
|
five | f1 | abs_f1
|
|
------+----------------------+----------------------
|
|
| 0 | 0
|
|
| 1004.3 | 1004.3
|
|
| -34.84 | 34.84
|
|
| 1.2345678901234e+200 | 1.2345678901234e+200
|
|
| 1.2345678901234e-200 | 1.2345678901234e-200
|
|
(5 rows)
|
|
|
|
-- truncate
|
|
SELECT '' AS five, f.f1, trunc(f.f1) AS trunc_f1
|
|
FROM FLOAT8_TBL f;
|
|
five | f1 | trunc_f1
|
|
------+----------------------+----------------------
|
|
| 0 | 0
|
|
| 1004.3 | 1004
|
|
| -34.84 | -34
|
|
| 1.2345678901234e+200 | 1.2345678901234e+200
|
|
| 1.2345678901234e-200 | 0
|
|
(5 rows)
|
|
|
|
-- round
|
|
SELECT '' AS five, f.f1, round(f.f1) AS round_f1
|
|
FROM FLOAT8_TBL f;
|
|
five | f1 | round_f1
|
|
------+----------------------+----------------------
|
|
| 0 | 0
|
|
| 1004.3 | 1004
|
|
| -34.84 | -35
|
|
| 1.2345678901234e+200 | 1.2345678901234e+200
|
|
| 1.2345678901234e-200 | 0
|
|
(5 rows)
|
|
|
|
-- ceil / ceiling
|
|
select ceil(f1) as ceil_f1 from float8_tbl f;
|
|
ceil_f1
|
|
----------------------
|
|
0
|
|
1005
|
|
-34
|
|
1.2345678901234e+200
|
|
1
|
|
(5 rows)
|
|
|
|
select ceiling(f1) as ceiling_f1 from float8_tbl f;
|
|
ceiling_f1
|
|
----------------------
|
|
0
|
|
1005
|
|
-34
|
|
1.2345678901234e+200
|
|
1
|
|
(5 rows)
|
|
|
|
-- floor
|
|
select floor(f1) as floor_f1 from float8_tbl f;
|
|
floor_f1
|
|
----------------------
|
|
0
|
|
1004
|
|
-35
|
|
1.2345678901234e+200
|
|
0
|
|
(5 rows)
|
|
|
|
-- sign
|
|
select sign(f1) as sign_f1 from float8_tbl f;
|
|
sign_f1
|
|
---------
|
|
0
|
|
1
|
|
-1
|
|
1
|
|
1
|
|
(5 rows)
|
|
|
|
-- square root
|
|
SELECT sqrt(float8 '64') AS eight;
|
|
eight
|
|
-------
|
|
8
|
|
(1 row)
|
|
|
|
SELECT |/ float8 '64' AS eight;
|
|
eight
|
|
-------
|
|
8
|
|
(1 row)
|
|
|
|
SELECT '' AS three, f.f1, |/f.f1 AS sqrt_f1
|
|
FROM FLOAT8_TBL f
|
|
WHERE f.f1 > '0.0';
|
|
three | f1 | sqrt_f1
|
|
-------+----------------------+-----------------------
|
|
| 1004.3 | 31.6906926399535
|
|
| 1.2345678901234e+200 | 1.11111110611109e+100
|
|
| 1.2345678901234e-200 | 1.11111110611109e-100
|
|
(3 rows)
|
|
|
|
-- power
|
|
SELECT power(float8 '144', float8 '0.5');
|
|
power
|
|
-------
|
|
12
|
|
(1 row)
|
|
|
|
-- take exp of ln(f.f1)
|
|
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
|
|
FROM FLOAT8_TBL f
|
|
WHERE f.f1 > '0.0';
|
|
three | f1 | exp_ln_f1
|
|
-------+----------------------+-----------------------
|
|
| 1004.3 | 1004.3
|
|
| 1.2345678901234e+200 | 1.23456789012338e+200
|
|
| 1.2345678901234e-200 | 1.23456789012339e-200
|
|
(3 rows)
|
|
|
|
-- cube root
|
|
SELECT ||/ float8 '27' AS three;
|
|
three
|
|
-------
|
|
3
|
|
(1 row)
|
|
|
|
SELECT '' AS five, f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
|
|
five | f1 | cbrt_f1
|
|
------+----------------------+-----------------------
|
|
| 0 | 0
|
|
| 1004.3 | 10.014312837827
|
|
| -34.84 | -3.26607421344208
|
|
| 1.2345678901234e+200 | 4.97933859234765e+066
|
|
| 1.2345678901234e-200 | 2.3112042409018e-067
|
|
(5 rows)
|
|
|
|
SELECT '' AS five, * FROM FLOAT8_TBL;
|
|
five | f1
|
|
------+----------------------
|
|
| 0
|
|
| 1004.3
|
|
| -34.84
|
|
| 1.2345678901234e+200
|
|
| 1.2345678901234e-200
|
|
(5 rows)
|
|
|
|
UPDATE FLOAT8_TBL
|
|
SET f1 = FLOAT8_TBL.f1 * '-1'
|
|
WHERE FLOAT8_TBL.f1 > '0.0';
|
|
SELECT '' AS bad, f.f1 * '1e200' from FLOAT8_TBL f;
|
|
ERROR: value out of range: overflow
|
|
SELECT '' AS bad, f.f1 ^ '1e200' from FLOAT8_TBL f;
|
|
ERROR: value out of range: overflow
|
|
SELECT 0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5;
|
|
?column?
|
|
----------
|
|
2
|
|
(1 row)
|
|
|
|
SELECT '' AS bad, ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ;
|
|
ERROR: cannot take logarithm of zero
|
|
SELECT '' AS bad, ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ;
|
|
ERROR: cannot take logarithm of a negative number
|
|
SELECT '' AS bad, exp(f.f1) from FLOAT8_TBL f;
|
|
ERROR: value out of range: underflow
|
|
SELECT '' AS bad, f.f1 / '0.0' from FLOAT8_TBL f;
|
|
ERROR: division by zero
|
|
SELECT '' AS five, * FROM FLOAT8_TBL;
|
|
five | f1
|
|
------+-----------------------
|
|
| 0
|
|
| -34.84
|
|
| -1004.3
|
|
| -1.2345678901234e+200
|
|
| -1.2345678901234e-200
|
|
(5 rows)
|
|
|
|
-- test for over- and underflow
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
|
|
ERROR: "10e400" is out of range for type double precision
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
|
|
ERROR: "-10e400" is out of range for type double precision
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
|
|
ERROR: "10e-400" is out of range for type double precision
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
|
|
^
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
|
|
ERROR: "-10e-400" is out of range for type double precision
|
|
LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
|
|
^
|
|
-- maintain external table consistency across platforms
|
|
-- delete all values and reinsert well-behaved ones
|
|
DELETE FROM FLOAT8_TBL;
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0');
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84');
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30');
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200');
|
|
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200');
|
|
SELECT '' AS five, * FROM FLOAT8_TBL;
|
|
five | f1
|
|
------+-----------------------
|
|
| 0
|
|
| -34.84
|
|
| -1004.3
|
|
| -1.2345678901234e+200
|
|
| -1.2345678901234e-200
|
|
(5 rows)
|
|
|