mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-12 19:27:47 +02:00
1f7cb5c309
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.
138 lines
3.6 KiB
SQL
138 lines
3.6 KiB
SQL
--
|
|
-- INT4
|
|
--
|
|
|
|
CREATE TABLE INT4_TBL(f1 int4);
|
|
|
|
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
|
|
|
|
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
|
|
|
|
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
|
|
|
|
INSERT INTO INT4_TBL(f1) VALUES ('34.5');
|
|
|
|
-- largest and smallest values
|
|
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
|
|
|
|
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
|
|
|
|
-- bad input values -- should give errors
|
|
INSERT INTO INT4_TBL(f1) VALUES ('1000000000000');
|
|
INSERT INTO INT4_TBL(f1) VALUES ('asdf');
|
|
INSERT INTO INT4_TBL(f1) VALUES (' ');
|
|
INSERT INTO INT4_TBL(f1) VALUES (' asdf ');
|
|
INSERT INTO INT4_TBL(f1) VALUES ('- 1234');
|
|
INSERT INTO INT4_TBL(f1) VALUES ('123 5');
|
|
INSERT INTO INT4_TBL(f1) VALUES ('');
|
|
|
|
|
|
SELECT '' AS five, * FROM INT4_TBL;
|
|
|
|
SELECT '' AS four, i.* FROM INT4_TBL i WHERE i.f1 <> int2 '0';
|
|
|
|
SELECT '' AS four, i.* FROM INT4_TBL i WHERE i.f1 <> int4 '0';
|
|
|
|
SELECT '' AS one, i.* FROM INT4_TBL i WHERE i.f1 = int2 '0';
|
|
|
|
SELECT '' AS one, i.* FROM INT4_TBL i WHERE i.f1 = int4 '0';
|
|
|
|
SELECT '' AS two, i.* FROM INT4_TBL i WHERE i.f1 < int2 '0';
|
|
|
|
SELECT '' AS two, i.* FROM INT4_TBL i WHERE i.f1 < int4 '0';
|
|
|
|
SELECT '' AS three, i.* FROM INT4_TBL i WHERE i.f1 <= int2 '0';
|
|
|
|
SELECT '' AS three, i.* FROM INT4_TBL i WHERE i.f1 <= int4 '0';
|
|
|
|
SELECT '' AS two, i.* FROM INT4_TBL i WHERE i.f1 > int2 '0';
|
|
|
|
SELECT '' AS two, i.* FROM INT4_TBL i WHERE i.f1 > int4 '0';
|
|
|
|
SELECT '' AS three, i.* FROM INT4_TBL i WHERE i.f1 >= int2 '0';
|
|
|
|
SELECT '' AS three, i.* FROM INT4_TBL i WHERE i.f1 >= int4 '0';
|
|
|
|
-- positive odds
|
|
SELECT '' AS one, i.* FROM INT4_TBL i WHERE (i.f1 % int2 '2') = int2 '1';
|
|
|
|
-- any evens
|
|
SELECT '' AS three, i.* FROM INT4_TBL i WHERE (i.f1 % int4 '2') = int2 '0';
|
|
|
|
SELECT '' AS five, i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i
|
|
WHERE abs(f1) < 1073741824;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i
|
|
WHERE abs(f1) < 1073741824;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i
|
|
WHERE f1 < 2147483646;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i
|
|
WHERE f1 < 2147483646;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i
|
|
WHERE f1 > -2147483647;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i
|
|
WHERE f1 > -2147483647;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i;
|
|
|
|
SELECT '' AS five, i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i;
|
|
|
|
--
|
|
-- more complex expressions
|
|
--
|
|
|
|
-- variations on unary minus parsing
|
|
SELECT -2+3 AS one;
|
|
|
|
SELECT 4-2 AS two;
|
|
|
|
SELECT 2- -1 AS three;
|
|
|
|
SELECT 2 - -2 AS four;
|
|
|
|
SELECT int2 '2' * int2 '2' = int2 '16' / int2 '4' AS true;
|
|
|
|
SELECT int4 '2' * int2 '2' = int2 '16' / int4 '4' AS true;
|
|
|
|
SELECT int2 '2' * int4 '2' = int4 '16' / int2 '4' AS true;
|
|
|
|
SELECT int4 '1000' < int4 '999' AS false;
|
|
|
|
SELECT 4! AS twenty_four;
|
|
|
|
SELECT !!3 AS six;
|
|
|
|
SELECT 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 AS ten;
|
|
|
|
SELECT 2 + 2 / 2 AS three;
|
|
|
|
SELECT (2 + 2) / 2 AS two;
|
|
|
|
-- corner case
|
|
SELECT (-1::int4<<31)::text;
|
|
SELECT ((-1::int4<<31)+1)::text;
|
|
|
|
-- check sane handling of INT_MIN overflow cases
|
|
SELECT (-2147483648)::int4 * (-1)::int4;
|
|
SELECT (-2147483648)::int4 / (-1)::int4;
|
|
SELECT (-2147483648)::int4 % (-1)::int4;
|
|
SELECT (-2147483648)::int4 * (-1)::int2;
|
|
SELECT (-2147483648)::int4 / (-1)::int2;
|
|
SELECT (-2147483648)::int4 % (-1)::int2;
|