mirror of
https://github.com/postgres/postgres.git
synced 2026-04-14 21:47:31 -04:00
Some platforms throw an exception for this division, rather than returning a necessarily-overflowed result. Since we were testing for overflow after the fact, an exception isn't nice. We can avoid the problem by treating division by -1 as negation. Add some regression tests so that we'll find out if any compilers try to optimize away the overflow check conditions. This ought to be back-patched, but I'm going to see what the buildfarm reports about the regression tests first. Per discussion with Xi Wang, though this is different from the patch he submitted.
268 lines
6.4 KiB
Text
268 lines
6.4 KiB
Text
--
|
|
-- INT2
|
|
--
|
|
CREATE TABLE INT2_TBL(f1 int2);
|
|
INSERT INTO INT2_TBL(f1) VALUES ('0 ');
|
|
INSERT INTO INT2_TBL(f1) VALUES (' 1234 ');
|
|
INSERT INTO INT2_TBL(f1) VALUES (' -1234');
|
|
INSERT INTO INT2_TBL(f1) VALUES ('34.5');
|
|
ERROR: invalid input syntax for integer: "34.5"
|
|
LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('34.5');
|
|
^
|
|
-- largest and smallest values
|
|
INSERT INTO INT2_TBL(f1) VALUES ('32767');
|
|
INSERT INTO INT2_TBL(f1) VALUES ('-32767');
|
|
-- bad input values -- should give errors
|
|
INSERT INTO INT2_TBL(f1) VALUES ('100000');
|
|
ERROR: value "100000" is out of range for type smallint
|
|
LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('100000');
|
|
^
|
|
INSERT INTO INT2_TBL(f1) VALUES ('asdf');
|
|
ERROR: invalid input syntax for integer: "asdf"
|
|
LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('asdf');
|
|
^
|
|
INSERT INTO INT2_TBL(f1) VALUES (' ');
|
|
ERROR: invalid input syntax for integer: " "
|
|
LINE 1: INSERT INTO INT2_TBL(f1) VALUES (' ');
|
|
^
|
|
INSERT INTO INT2_TBL(f1) VALUES ('- 1234');
|
|
ERROR: invalid input syntax for integer: "- 1234"
|
|
LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('- 1234');
|
|
^
|
|
INSERT INTO INT2_TBL(f1) VALUES ('4 444');
|
|
ERROR: invalid input syntax for integer: "4 444"
|
|
LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('4 444');
|
|
^
|
|
INSERT INTO INT2_TBL(f1) VALUES ('123 dt');
|
|
ERROR: invalid input syntax for integer: "123 dt"
|
|
LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('123 dt');
|
|
^
|
|
INSERT INTO INT2_TBL(f1) VALUES ('');
|
|
ERROR: invalid input syntax for integer: ""
|
|
LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('');
|
|
^
|
|
SELECT '' AS five, * FROM INT2_TBL;
|
|
five | f1
|
|
------+--------
|
|
| 0
|
|
| 1234
|
|
| -1234
|
|
| 32767
|
|
| -32767
|
|
(5 rows)
|
|
|
|
SELECT '' AS four, i.* FROM INT2_TBL i WHERE i.f1 <> int2 '0';
|
|
four | f1
|
|
------+--------
|
|
| 1234
|
|
| -1234
|
|
| 32767
|
|
| -32767
|
|
(4 rows)
|
|
|
|
SELECT '' AS four, i.* FROM INT2_TBL i WHERE i.f1 <> int4 '0';
|
|
four | f1
|
|
------+--------
|
|
| 1234
|
|
| -1234
|
|
| 32767
|
|
| -32767
|
|
(4 rows)
|
|
|
|
SELECT '' AS one, i.* FROM INT2_TBL i WHERE i.f1 = int2 '0';
|
|
one | f1
|
|
-----+----
|
|
| 0
|
|
(1 row)
|
|
|
|
SELECT '' AS one, i.* FROM INT2_TBL i WHERE i.f1 = int4 '0';
|
|
one | f1
|
|
-----+----
|
|
| 0
|
|
(1 row)
|
|
|
|
SELECT '' AS two, i.* FROM INT2_TBL i WHERE i.f1 < int2 '0';
|
|
two | f1
|
|
-----+--------
|
|
| -1234
|
|
| -32767
|
|
(2 rows)
|
|
|
|
SELECT '' AS two, i.* FROM INT2_TBL i WHERE i.f1 < int4 '0';
|
|
two | f1
|
|
-----+--------
|
|
| -1234
|
|
| -32767
|
|
(2 rows)
|
|
|
|
SELECT '' AS three, i.* FROM INT2_TBL i WHERE i.f1 <= int2 '0';
|
|
three | f1
|
|
-------+--------
|
|
| 0
|
|
| -1234
|
|
| -32767
|
|
(3 rows)
|
|
|
|
SELECT '' AS three, i.* FROM INT2_TBL i WHERE i.f1 <= int4 '0';
|
|
three | f1
|
|
-------+--------
|
|
| 0
|
|
| -1234
|
|
| -32767
|
|
(3 rows)
|
|
|
|
SELECT '' AS two, i.* FROM INT2_TBL i WHERE i.f1 > int2 '0';
|
|
two | f1
|
|
-----+-------
|
|
| 1234
|
|
| 32767
|
|
(2 rows)
|
|
|
|
SELECT '' AS two, i.* FROM INT2_TBL i WHERE i.f1 > int4 '0';
|
|
two | f1
|
|
-----+-------
|
|
| 1234
|
|
| 32767
|
|
(2 rows)
|
|
|
|
SELECT '' AS three, i.* FROM INT2_TBL i WHERE i.f1 >= int2 '0';
|
|
three | f1
|
|
-------+-------
|
|
| 0
|
|
| 1234
|
|
| 32767
|
|
(3 rows)
|
|
|
|
SELECT '' AS three, i.* FROM INT2_TBL i WHERE i.f1 >= int4 '0';
|
|
three | f1
|
|
-------+-------
|
|
| 0
|
|
| 1234
|
|
| 32767
|
|
(3 rows)
|
|
|
|
-- positive odds
|
|
SELECT '' AS one, i.* FROM INT2_TBL i WHERE (i.f1 % int2 '2') = int2 '1';
|
|
one | f1
|
|
-----+-------
|
|
| 32767
|
|
(1 row)
|
|
|
|
-- any evens
|
|
SELECT '' AS three, i.* FROM INT2_TBL i WHERE (i.f1 % int4 '2') = int2 '0';
|
|
three | f1
|
|
-------+-------
|
|
| 0
|
|
| 1234
|
|
| -1234
|
|
(3 rows)
|
|
|
|
SELECT '' AS five, i.f1, i.f1 * int2 '2' AS x FROM INT2_TBL i;
|
|
ERROR: smallint out of range
|
|
SELECT '' AS five, i.f1, i.f1 * int2 '2' AS x FROM INT2_TBL i
|
|
WHERE abs(f1) < 16384;
|
|
five | f1 | x
|
|
------+-------+-------
|
|
| 0 | 0
|
|
| 1234 | 2468
|
|
| -1234 | -2468
|
|
(3 rows)
|
|
|
|
SELECT '' AS five, i.f1, i.f1 * int4 '2' AS x FROM INT2_TBL i;
|
|
five | f1 | x
|
|
------+--------+--------
|
|
| 0 | 0
|
|
| 1234 | 2468
|
|
| -1234 | -2468
|
|
| 32767 | 65534
|
|
| -32767 | -65534
|
|
(5 rows)
|
|
|
|
SELECT '' AS five, i.f1, i.f1 + int2 '2' AS x FROM INT2_TBL i;
|
|
ERROR: smallint out of range
|
|
SELECT '' AS five, i.f1, i.f1 + int2 '2' AS x FROM INT2_TBL i
|
|
WHERE f1 < 32766;
|
|
five | f1 | x
|
|
------+--------+--------
|
|
| 0 | 2
|
|
| 1234 | 1236
|
|
| -1234 | -1232
|
|
| -32767 | -32765
|
|
(4 rows)
|
|
|
|
SELECT '' AS five, i.f1, i.f1 + int4 '2' AS x FROM INT2_TBL i;
|
|
five | f1 | x
|
|
------+--------+--------
|
|
| 0 | 2
|
|
| 1234 | 1236
|
|
| -1234 | -1232
|
|
| 32767 | 32769
|
|
| -32767 | -32765
|
|
(5 rows)
|
|
|
|
SELECT '' AS five, i.f1, i.f1 - int2 '2' AS x FROM INT2_TBL i;
|
|
ERROR: smallint out of range
|
|
SELECT '' AS five, i.f1, i.f1 - int2 '2' AS x FROM INT2_TBL i
|
|
WHERE f1 > -32767;
|
|
five | f1 | x
|
|
------+-------+-------
|
|
| 0 | -2
|
|
| 1234 | 1232
|
|
| -1234 | -1236
|
|
| 32767 | 32765
|
|
(4 rows)
|
|
|
|
SELECT '' AS five, i.f1, i.f1 - int4 '2' AS x FROM INT2_TBL i;
|
|
five | f1 | x
|
|
------+--------+--------
|
|
| 0 | -2
|
|
| 1234 | 1232
|
|
| -1234 | -1236
|
|
| 32767 | 32765
|
|
| -32767 | -32769
|
|
(5 rows)
|
|
|
|
SELECT '' AS five, i.f1, i.f1 / int2 '2' AS x FROM INT2_TBL i;
|
|
five | f1 | x
|
|
------+--------+--------
|
|
| 0 | 0
|
|
| 1234 | 617
|
|
| -1234 | -617
|
|
| 32767 | 16383
|
|
| -32767 | -16383
|
|
(5 rows)
|
|
|
|
SELECT '' AS five, i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i;
|
|
five | f1 | x
|
|
------+--------+--------
|
|
| 0 | 0
|
|
| 1234 | 617
|
|
| -1234 | -617
|
|
| 32767 | 16383
|
|
| -32767 | -16383
|
|
(5 rows)
|
|
|
|
-- corner cases
|
|
SELECT (-1::int2<<15)::text;
|
|
text
|
|
--------
|
|
-32768
|
|
(1 row)
|
|
|
|
SELECT ((-1::int2<<15)+1::int2)::text;
|
|
text
|
|
--------
|
|
-32767
|
|
(1 row)
|
|
|
|
-- check sane handling of INT16_MIN overflow cases
|
|
SELECT (-32768)::int2 * (-1)::int2;
|
|
ERROR: smallint out of range
|
|
SELECT (-32768)::int2 / (-1)::int2;
|
|
ERROR: smallint out of range
|
|
SELECT (-32768)::int2 % (-1)::int2;
|
|
?column?
|
|
----------
|
|
0
|
|
(1 row)
|
|
|