1997-04-05 13:26:55 +02:00
|
|
|
--
|
2000-01-04 17:21:02 +01:00
|
|
|
-- INT2
|
1997-04-05 13:26:55 +02:00
|
|
|
--
|
|
|
|
|
2022-02-08 21:30:38 +01:00
|
|
|
-- int2_tbl was already created and filled in test_setup.sql.
|
|
|
|
-- Here we just try to insert bad values.
|
1997-04-05 13:26:55 +02:00
|
|
|
|
|
|
|
INSERT INTO INT2_TBL(f1) VALUES ('34.5');
|
|
|
|
INSERT INTO INT2_TBL(f1) VALUES ('100000');
|
|
|
|
INSERT INTO INT2_TBL(f1) VALUES ('asdf');
|
2004-03-11 03:11:14 +01:00
|
|
|
INSERT INTO INT2_TBL(f1) VALUES (' ');
|
|
|
|
INSERT INTO INT2_TBL(f1) VALUES ('- 1234');
|
|
|
|
INSERT INTO INT2_TBL(f1) VALUES ('4 444');
|
|
|
|
INSERT INTO INT2_TBL(f1) VALUES ('123 dt');
|
|
|
|
INSERT INTO INT2_TBL(f1) VALUES ('');
|
1997-04-05 13:26:55 +02:00
|
|
|
|
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT * FROM INT2_TBL;
|
1997-04-05 13:26:55 +02:00
|
|
|
|
Convert a few datatype input functions to use "soft" error reporting.
This patch converts the input functions for bool, int2, int4, int8,
float4, float8, numeric, and contrib/cube to the new soft-error style.
array_in and record_in are also converted. There's lots more to do,
but this is enough to provide proof-of-concept that the soft-error
API is usable, as well as reference examples for how to convert
input functions.
This patch is mostly by me, but it owes very substantial debt to
earlier work by Nikita Glukhov, Andrew Dunstan, and Amul Sul.
Thanks to Andres Freund for review.
Discussion: https://postgr.es/m/3bbbb0df-7382-bf87-9737-340ba096e034@postgrespro.ru
2022-12-09 16:14:53 +01:00
|
|
|
-- Also try it with non-error-throwing API
|
|
|
|
SELECT pg_input_is_valid('34', 'int2');
|
|
|
|
SELECT pg_input_is_valid('asdf', 'int2');
|
|
|
|
SELECT pg_input_is_valid('50000', 'int2');
|
|
|
|
SELECT pg_input_error_message('50000', 'int2');
|
|
|
|
|
Convert a few more datatype input functions to report errors softly.
Convert assorted internal-ish datatypes, namely aclitemin,
int2vectorin, oidin, oidvectorin, pg_lsn_in, pg_snapshot_in,
and tidin to the new style.
(Some others you might expect to find in this group, such as
cidin and xidin, need no changes because they never throw
errors at all. That seems a little cheesy ... but it is not in
the charter of this patch series to add new error conditions.)
Amul Sul, minor mods by me
Discussion: https://postgr.es/m/CAAJ_b97KeDWUdpTKGOaFYPv0OicjOu6EW+QYWj-Ywrgj_aEy1g@mail.gmail.com
2022-12-14 23:50:24 +01:00
|
|
|
-- While we're here, check int2vector as well
|
|
|
|
SELECT pg_input_is_valid(' 1 3 5 ', 'int2vector');
|
|
|
|
SELECT pg_input_error_message('1 asdf', 'int2vector');
|
|
|
|
SELECT pg_input_error_message('50000', 'int2vector');
|
|
|
|
|
2022-05-18 20:28:31 +02:00
|
|
|
SELECT * FROM INT2_TBL AS f(a, b);
|
|
|
|
|
|
|
|
SELECT * FROM (TABLE int2_tbl) AS s (a, b);
|
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 <> int2 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 <> int4 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 = int2 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 = int4 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 < int2 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 < int4 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 <= int2 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 <= int4 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 > int2 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 > int4 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 >= int2 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE i.f1 >= int4 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2010-11-23 21:27:50 +01:00
|
|
|
-- positive odds
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE (i.f1 % int2 '2') = int2 '1';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2010-11-23 21:27:50 +01:00
|
|
|
-- any evens
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.* FROM INT2_TBL i WHERE (i.f1 % int4 '2') = int2 '0';
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT2_TBL i;
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT2_TBL i
|
2004-10-04 16:42:48 +02:00
|
|
|
WHERE abs(f1) < 16384;
|
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 * int4 '2' AS x FROM INT2_TBL i;
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT2_TBL i;
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT2_TBL i
|
2004-10-04 16:42:48 +02:00
|
|
|
WHERE f1 < 32766;
|
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 + int4 '2' AS x FROM INT2_TBL i;
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT2_TBL i;
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT2_TBL i
|
2004-10-04 16:42:48 +02:00
|
|
|
WHERE f1 > -32767;
|
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 - int4 '2' AS x FROM INT2_TBL i;
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 / int2 '2' AS x FROM INT2_TBL i;
|
1997-04-05 13:26:55 +02:00
|
|
|
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i;
|
2010-11-20 04:13:11 +01:00
|
|
|
|
|
|
|
-- corner cases
|
2010-11-20 07:07:04 +01:00
|
|
|
SELECT (-1::int2<<15)::text;
|
2010-11-20 18:09:36 +01:00
|
|
|
SELECT ((-1::int2<<15)+1::int2)::text;
|
2012-11-19 18:24:25 +01:00
|
|
|
|
|
|
|
-- check sane handling of INT16_MIN overflow cases
|
|
|
|
SELECT (-32768)::int2 * (-1)::int2;
|
|
|
|
SELECT (-32768)::int2 / (-1)::int2;
|
|
|
|
SELECT (-32768)::int2 % (-1)::int2;
|
2015-03-25 20:54:08 +01:00
|
|
|
|
|
|
|
-- check rounding when casting from float
|
|
|
|
SELECT x, x::int2 AS int2_value
|
|
|
|
FROM (VALUES (-2.5::float8),
|
|
|
|
(-1.5::float8),
|
|
|
|
(-0.5::float8),
|
|
|
|
(0.0::float8),
|
|
|
|
(0.5::float8),
|
|
|
|
(1.5::float8),
|
|
|
|
(2.5::float8)) t(x);
|
2015-07-03 23:04:39 +02:00
|
|
|
|
|
|
|
-- check rounding when casting from numeric
|
|
|
|
SELECT x, x::int2 AS int2_value
|
|
|
|
FROM (VALUES (-2.5::numeric),
|
|
|
|
(-1.5::numeric),
|
|
|
|
(-0.5::numeric),
|
|
|
|
(0.0::numeric),
|
|
|
|
(0.5::numeric),
|
|
|
|
(1.5::numeric),
|
|
|
|
(2.5::numeric)) t(x);
|
2022-12-14 05:40:38 +01:00
|
|
|
|
|
|
|
|
|
|
|
-- non-decimal literals
|
|
|
|
|
|
|
|
SELECT int2 '0b100101';
|
|
|
|
SELECT int2 '0o273';
|
|
|
|
SELECT int2 '0x42F';
|
|
|
|
|
|
|
|
SELECT int2 '0b';
|
|
|
|
SELECT int2 '0o';
|
|
|
|
SELECT int2 '0x';
|
|
|
|
|
|
|
|
-- cases near overflow
|
|
|
|
SELECT int2 '0b111111111111111';
|
|
|
|
SELECT int2 '0b1000000000000000';
|
|
|
|
SELECT int2 '0o77777';
|
|
|
|
SELECT int2 '0o100000';
|
|
|
|
SELECT int2 '0x7FFF';
|
|
|
|
SELECT int2 '0x8000';
|
|
|
|
|
|
|
|
SELECT int2 '-0b1000000000000000';
|
|
|
|
SELECT int2 '-0b1000000000000001';
|
|
|
|
SELECT int2 '-0o100000';
|
|
|
|
SELECT int2 '-0o100001';
|
|
|
|
SELECT int2 '-0x8000';
|
|
|
|
SELECT int2 '-0x8001';
|