OSDN Git Service

Additional test coverage for int8 type (int8.c)
authorPeter Eisentraut <peter_e@gmx.net>
Sun, 5 Oct 2008 14:26:30 +0000 (14:26 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Sun, 5 Oct 2008 14:26:30 +0000 (14:26 +0000)
int8-exp-three-digits.out update untested, might need refinement.

src/test/regress/expected/int8-exp-three-digits.out
src/test/regress/expected/int8.out
src/test/regress/sql/int8.sql

index 12af98f..9821f2e 100644 (file)
@@ -6,8 +6,8 @@ CREATE TABLE INT8_TBL(q1 int8, q2 int8);
 INSERT INTO INT8_TBL VALUES('  123   ','  456');
 INSERT INTO INT8_TBL VALUES('123   ','4567890123456789');
 INSERT INTO INT8_TBL VALUES('4567890123456789','123');
-INSERT INTO INT8_TBL VALUES('4567890123456789','4567890123456789');
-INSERT INTO INT8_TBL VALUES('4567890123456789','-4567890123456789');
+INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
+INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
 -- bad inputs
 INSERT INTO INT8_TBL(q1) VALUES ('      ');
 ERROR:  invalid input syntax for integer: "      "
@@ -47,6 +47,236 @@ SELECT * FROM INT8_TBL;
  4567890123456789 | -4567890123456789
 (5 rows)
 
+-- int8/int8 cmp
+SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
+        q1        |        q2        
+------------------+------------------
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
+ q1 | q2 
+----+----
+(0 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(5 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
+        q1        |        q2        
+------------------+------------------
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(2 rows)
+
+-- int8/int4 cmp
+SELECT * FROM INT8_TBL WHERE q2 = 456;
+ q1  | q2  
+-----+-----
+ 123 | 456
+(1 row)
+
+SELECT * FROM INT8_TBL WHERE q2 <> 456;
+        q1        |        q2         
+------------------+-------------------
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(4 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 < 456;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 > 456;
+        q1        |        q2        
+------------------+------------------
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 <= 456;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 >= 456;
+        q1        |        q2        
+------------------+------------------
+              123 |              456
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(3 rows)
+
+-- int4/int8 cmp
+SELECT * FROM INT8_TBL WHERE 123 = q1;
+ q1  |        q2        
+-----+------------------
+ 123 |              456
+ 123 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 <> q1;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 < q1;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 > q1;
+ q1 | q2 
+----+----
+(0 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 <= q1;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(5 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 >= q1;
+ q1  |        q2        
+-----+------------------
+ 123 |              456
+ 123 | 4567890123456789
+(2 rows)
+
+-- int8/int2 cmp
+SELECT * FROM INT8_TBL WHERE q2 = '456'::int2;
+ q1  | q2  
+-----+-----
+ 123 | 456
+(1 row)
+
+SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2;
+        q1        |        q2         
+------------------+-------------------
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(4 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 < '456'::int2;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 > '456'::int2;
+        q1        |        q2        
+------------------+------------------
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2;
+        q1        |        q2        
+------------------+------------------
+              123 |              456
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(3 rows)
+
+-- int2/int8 cmp
+SELECT * FROM INT8_TBL WHERE '123'::int2 = q1;
+ q1  |        q2        
+-----+------------------
+ 123 |              456
+ 123 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 < q1;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 > q1;
+ q1 | q2 
+----+----
+(0 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(5 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1;
+ q1  |        q2        
+-----+------------------
+ 123 |              456
+ 123 | 4567890123456789
+(2 rows)
+
 SELECT '' AS five, q1 AS plus, -q1 AS minus FROM INT8_TBL;
  five |       plus       |       minus       
 ------+------------------+-------------------
@@ -88,34 +318,54 @@ SELECT '' AS three, q1, q2, q1 * q2 AS multiply FROM INT8_TBL
        | 4567890123456789 |              123 | 561850485185185047
 (3 rows)
 
-SELECT '' AS five, q1, q2, q1 / q2 AS divide FROM INT8_TBL;
- five |        q1        |        q2         |     divide     
-------+------------------+-------------------+----------------
-      |              123 |               456 |              0
-      |              123 |  4567890123456789 |              0
-      | 4567890123456789 |               123 | 37137318076884
-      | 4567890123456789 |  4567890123456789 |              1
-      | 4567890123456789 | -4567890123456789 |             -1
+SELECT '' AS five, q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
+ five |        q1        |        q2         |     divide     | mod 
+------+------------------+-------------------+----------------+-----
+      |              123 |               456 |              0 | 123
+      |              123 |  4567890123456789 |              0 | 123
+      | 4567890123456789 |               123 | 37137318076884 |  57
+      | 4567890123456789 |  4567890123456789 |              1 |   0
+      | 4567890123456789 | -4567890123456789 |             -1 |   0
 (5 rows)
 
 SELECT '' AS five, q1, float8(q1) FROM INT8_TBL;
- five |        q1        |        float8         
-------+------------------+-----------------------
-      |              123 |                   123
-      |              123 |                   123
-      | 4567890123456789 | 4.56789012345679e+015
-      | 4567890123456789 | 4.56789012345679e+015
-      | 4567890123456789 | 4.56789012345679e+015
+ five |        q1        |        float8        
+------+------------------+----------------------
+      |              123 |                  123
+      |              123 |                  123
+      | 4567890123456789 | 4.56789012345679e+15
+      | 4567890123456789 | 4.56789012345679e+15
+      | 4567890123456789 | 4.56789012345679e+15
 (5 rows)
 
 SELECT '' AS five, q2, float8(q2) FROM INT8_TBL;
- five |        q2         |         float8         
-------+-------------------+------------------------
-      |               456 |                    456
-      |  4567890123456789 |  4.56789012345679e+015
-      |               123 |                    123
-      |  4567890123456789 |  4.56789012345679e+015
-      | -4567890123456789 | -4.56789012345679e+015
+ five |        q2         |        float8         
+------+-------------------+-----------------------
+      |               456 |                   456
+      |  4567890123456789 |  4.56789012345679e+15
+      |               123 |                   123
+      |  4567890123456789 |  4.56789012345679e+15
+      | -4567890123456789 | -4.56789012345679e+15
+(5 rows)
+
+SELECT 37 + q1 AS plus4 FROM INT8_TBL;
+      plus4       
+------------------
+              160
+              160
+ 4567890123456826
+ 4567890123456826
+ 4567890123456826
+(5 rows)
+
+SELECT 37 - q1 AS minus4 FROM INT8_TBL;
+      minus4       
+-------------------
+               -86
+               -86
+ -4567890123456752
+ -4567890123456752
+ -4567890123456752
 (5 rows)
 
 SELECT '' AS five, 2 * q1 AS "twice int4" FROM INT8_TBL;
@@ -138,6 +388,72 @@ SELECT '' AS five, q1 * 2 AS "twice int4" FROM INT8_TBL;
       | 9135780246913578
 (5 rows)
 
+-- int8 op int4
+SELECT q1 + 42::int4 AS "8plus4", q1 - 42::int4 AS "8minus4", q1 * 42::int4 AS "8mul4", q1 / 42::int4 AS "8div4" FROM INT8_TBL;
+      8plus4      |     8minus4      |       8mul4        |      8div4      
+------------------+------------------+--------------------+-----------------
+              165 |               81 |               5166 |               2
+              165 |               81 |               5166 |               2
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+(5 rows)
+
+-- int4 op int8
+SELECT 246::int4 + q1 AS "4plus8", 246::int4 - q1 AS "4minus8", 246::int4 * q1 AS "4mul8", 246::int4 / q1 AS "4div8" FROM INT8_TBL;
+      4plus8      |      4minus8      |        4mul8        | 4div8 
+------------------+-------------------+---------------------+-------
+              369 |               123 |               30258 |     2
+              369 |               123 |               30258 |     2
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+(5 rows)
+
+-- int8 op int2
+SELECT q1 + 42::int2 AS "8plus2", q1 - 42::int2 AS "8minus2", q1 * 42::int2 AS "8mul2", q1 / 42::int2 AS "8div2" FROM INT8_TBL;
+      8plus2      |     8minus2      |       8mul2        |      8div2      
+------------------+------------------+--------------------+-----------------
+              165 |               81 |               5166 |               2
+              165 |               81 |               5166 |               2
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+(5 rows)
+
+-- int2 op int8
+SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL;
+      2plus8      |      2minus8      |        2mul8        | 2div8 
+------------------+-------------------+---------------------+-------
+              369 |               123 |               30258 |     2
+              369 |               123 |               30258 |     2
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+(5 rows)
+
+SELECT q2, abs(q2) FROM INT8_TBL;
+        q2         |       abs        
+-------------------+------------------
+               456 |              456
+  4567890123456789 | 4567890123456789
+               123 |              123
+  4567890123456789 | 4567890123456789
+ -4567890123456789 | 4567890123456789
+(5 rows)
+
+SELECT min(q1), min(q2) FROM INT8_TBL;
+ min |        min        
+-----+-------------------
+ 123 | -4567890123456789
+(1 row)
+
+SELECT max(q1), max(q2) FROM INT8_TBL;
+       max        |       max        
+------------------+------------------
+ 4567890123456789 | 4567890123456789
+(1 row)
+
 -- TO_CHAR()
 --
 SELECT '' AS to_char_1, to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999') 
@@ -314,7 +630,7 @@ SELECT '' AS to_char_17, to_char(q2, '999999SG9999999999')     FROM INT8_TBL;
             | 456789-0123456789
 (5 rows)
 
--- check min/max values
+-- check min/max values and overflow behavior
 select '-9223372036854775808'::int8;
          int8         
 ----------------------
@@ -335,3 +651,164 @@ select '9223372036854775808'::int8;
 ERROR:  value "9223372036854775808" is out of range for type bigint
 LINE 1: select '9223372036854775808'::int8;
                ^
+select -('-9223372036854775807'::int8);
+      ?column?       
+---------------------
+ 9223372036854775807
+(1 row)
+
+select -('-9223372036854775808'::int8);
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 + '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-9223372036854775800'::int8 + '-9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 - '-9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-9223372036854775800'::int8 - '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 * '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-9223372036854775808'::int8 / '-1'::int8;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 / '0'::int8;
+ERROR:  division by zero
+select '9223372036854775800'::int8 % '0'::int8;
+ERROR:  division by zero
+select abs('-9223372036854775808'::int8);
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 + '100'::int4;
+ERROR:  bigint out of range
+select '-9223372036854775800'::int8 - '100'::int4;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 * '100'::int4;
+ERROR:  bigint out of range
+select '-9223372036854775808'::int8 / '-1'::int4;
+ERROR:  bigint out of range
+select '100'::int4 + '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-100'::int4 - '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '100'::int4 * '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 + '100'::int2;
+ERROR:  bigint out of range
+select '-9223372036854775800'::int8 - '100'::int2;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 * '100'::int2;
+ERROR:  bigint out of range
+select '-9223372036854775808'::int8 / '-1'::int2;
+ERROR:  bigint out of range
+select '-9223372036854775808'::int8 / '0'::int2;
+ERROR:  division by zero
+select '100'::int2 + '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-100'::int2 - '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '100'::int2 * '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '100'::int2 / '0'::int8;
+ERROR:  division by zero
+SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456;
+ q1  
+-----
+ 123
+(1 row)
+
+SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456;
+ERROR:  integer out of range
+SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456;
+ q1  
+-----
+ 123
+(1 row)
+
+SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456;
+ERROR:  smallint out of range
+SELECT CAST('42'::int2 AS int8), CAST('-37'::int2 AS int8);
+ int8 | int8 
+------+------
+   42 |  -37
+(1 row)
+
+SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL;
+     q1      |          q2           
+-------------+-----------------------
+         123 |                   456
+         123 |  4.56789012345679e+15
+ 4.56789e+15 |                   123
+ 4.56789e+15 |  4.56789012345679e+15
+ 4.56789e+15 | -4.56789012345679e+15
+(5 rows)
+
+SELECT CAST('36854775807.0'::float4 AS int8);
+    int8     
+-------------
+ 36854775808
+(1 row)
+
+SELECT CAST('9223372036854775807.0'::float4 AS int8);
+ERROR:  bigint out of range
+SELECT CAST('9223372036854775807.0'::float8 AS int8);
+ERROR:  bigint out of range
+SELECT CAST('922337203685477580700.0'::float8 AS int8);
+ERROR:  bigint out of range
+SELECT CAST(q1 AS oid) FROM INT8_TBL;
+ERROR:  OID out of range
+SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class';
+ oid  
+------
+ 1259
+(1 row)
+
+-- bit operations
+SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL;
+        q1        |        q2         |       and        |        or        |       xor        |        not        
+------------------+-------------------+------------------+------------------+------------------+-------------------
+              123 |               456 |               72 |              507 |              435 |              -124
+              123 |  4567890123456789 |               17 | 4567890123456895 | 4567890123456878 |              -124
+ 4567890123456789 |               123 |               17 | 4567890123456895 | 4567890123456878 | -4567890123456790
+ 4567890123456789 |  4567890123456789 | 4567890123456789 | 4567890123456789 |                0 | -4567890123456790
+ 4567890123456789 | -4567890123456789 |                1 |               -1 |               -2 | -4567890123456790
+(5 rows)
+
+SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL;
+        q1        |        shl        |       shr       
+------------------+-------------------+-----------------
+              123 |               492 |              15
+              123 |               492 |              15
+ 4567890123456789 | 18271560493827156 | 570986265432098
+ 4567890123456789 | 18271560493827156 | 570986265432098
+ 4567890123456789 | 18271560493827156 | 570986265432098
+(5 rows)
+
+-- generate_series
+SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8);
+ generate_series  
+------------------
+ 4567890123456789
+ 4567890123456790
+ 4567890123456791
+ 4567890123456792
+ 4567890123456793
+ 4567890123456794
+ 4567890123456795
+ 4567890123456796
+ 4567890123456797
+ 4567890123456798
+ 4567890123456799
+(11 rows)
+
+SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0);
+ERROR:  step size cannot equal zero
+SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2);
+ generate_series  
+------------------
+ 4567890123456789
+ 4567890123456791
+ 4567890123456793
+ 4567890123456795
+ 4567890123456797
+ 4567890123456799
+(6 rows)
+
index f1cc62d..6c4f776 100644 (file)
@@ -6,8 +6,8 @@ CREATE TABLE INT8_TBL(q1 int8, q2 int8);
 INSERT INTO INT8_TBL VALUES('  123   ','  456');
 INSERT INTO INT8_TBL VALUES('123   ','4567890123456789');
 INSERT INTO INT8_TBL VALUES('4567890123456789','123');
-INSERT INTO INT8_TBL VALUES('4567890123456789','4567890123456789');
-INSERT INTO INT8_TBL VALUES('4567890123456789','-4567890123456789');
+INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
+INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
 -- bad inputs
 INSERT INTO INT8_TBL(q1) VALUES ('      ');
 ERROR:  invalid input syntax for integer: "      "
@@ -47,6 +47,236 @@ SELECT * FROM INT8_TBL;
  4567890123456789 | -4567890123456789
 (5 rows)
 
+-- int8/int8 cmp
+SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
+        q1        |        q2        
+------------------+------------------
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
+ q1 | q2 
+----+----
+(0 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(5 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
+        q1        |        q2        
+------------------+------------------
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(2 rows)
+
+-- int8/int4 cmp
+SELECT * FROM INT8_TBL WHERE q2 = 456;
+ q1  | q2  
+-----+-----
+ 123 | 456
+(1 row)
+
+SELECT * FROM INT8_TBL WHERE q2 <> 456;
+        q1        |        q2         
+------------------+-------------------
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(4 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 < 456;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 > 456;
+        q1        |        q2        
+------------------+------------------
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 <= 456;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 >= 456;
+        q1        |        q2        
+------------------+------------------
+              123 |              456
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(3 rows)
+
+-- int4/int8 cmp
+SELECT * FROM INT8_TBL WHERE 123 = q1;
+ q1  |        q2        
+-----+------------------
+ 123 |              456
+ 123 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 <> q1;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 < q1;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 > q1;
+ q1 | q2 
+----+----
+(0 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 <= q1;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(5 rows)
+
+SELECT * FROM INT8_TBL WHERE 123 >= q1;
+ q1  |        q2        
+-----+------------------
+ 123 |              456
+ 123 | 4567890123456789
+(2 rows)
+
+-- int8/int2 cmp
+SELECT * FROM INT8_TBL WHERE q2 = '456'::int2;
+ q1  | q2  
+-----+-----
+ 123 | 456
+(1 row)
+
+SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2;
+        q1        |        q2         
+------------------+-------------------
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(4 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 < '456'::int2;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 > '456'::int2;
+        q1        |        q2        
+------------------+------------------
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+ 4567890123456789 |               123
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2;
+        q1        |        q2        
+------------------+------------------
+              123 |              456
+              123 | 4567890123456789
+ 4567890123456789 | 4567890123456789
+(3 rows)
+
+-- int2/int8 cmp
+SELECT * FROM INT8_TBL WHERE '123'::int2 = q1;
+ q1  |        q2        
+-----+------------------
+ 123 |              456
+ 123 | 4567890123456789
+(2 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 < q1;
+        q1        |        q2         
+------------------+-------------------
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(3 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 > q1;
+ q1 | q2 
+----+----
+(0 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1;
+        q1        |        q2         
+------------------+-------------------
+              123 |               456
+              123 |  4567890123456789
+ 4567890123456789 |               123
+ 4567890123456789 |  4567890123456789
+ 4567890123456789 | -4567890123456789
+(5 rows)
+
+SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1;
+ q1  |        q2        
+-----+------------------
+ 123 |              456
+ 123 | 4567890123456789
+(2 rows)
+
 SELECT '' AS five, q1 AS plus, -q1 AS minus FROM INT8_TBL;
  five |       plus       |       minus       
 ------+------------------+-------------------
@@ -88,34 +318,54 @@ SELECT '' AS three, q1, q2, q1 * q2 AS multiply FROM INT8_TBL
        | 4567890123456789 |              123 | 561850485185185047
 (3 rows)
 
-SELECT '' AS five, q1, q2, q1 / q2 AS divide FROM INT8_TBL;
- five |        q1        |        q2         |     divide     
-------+------------------+-------------------+----------------
-      |              123 |               456 |              0
-      |              123 |  4567890123456789 |              0
-      | 4567890123456789 |               123 | 37137318076884
-      | 4567890123456789 |  4567890123456789 |              1
-      | 4567890123456789 | -4567890123456789 |             -1
+SELECT '' AS five, q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
+ five |        q1        |        q2         |     divide     | mod 
+------+------------------+-------------------+----------------+-----
+      |              123 |               456 |              0 | 123
+      |              123 |  4567890123456789 |              0 | 123
+      | 4567890123456789 |               123 | 37137318076884 |  57
+      | 4567890123456789 |  4567890123456789 |              1 |   0
+      | 4567890123456789 | -4567890123456789 |             -1 |   0
 (5 rows)
 
 SELECT '' AS five, q1, float8(q1) FROM INT8_TBL;
- five |        q1        |        float8        
-------+------------------+----------------------
-      |              123 |                  123
-      |              123 |                  123
-      | 4567890123456789 | 4.56789012345679e+15
-      | 4567890123456789 | 4.56789012345679e+15
-      | 4567890123456789 | 4.56789012345679e+15
+ five |        q1        |        float8         
+------+------------------+-----------------------
+      |              123 |                   123
+      |              123 |                   123
+      | 4567890123456789 | 4.56789012345679e+015
+      | 4567890123456789 | 4.56789012345679e+015
+      | 4567890123456789 | 4.56789012345679e+015
 (5 rows)
 
 SELECT '' AS five, q2, float8(q2) FROM INT8_TBL;
- five |        q2         |        float8         
-------+-------------------+-----------------------
-      |               456 |                   456
-      |  4567890123456789 |  4.56789012345679e+15
-      |               123 |                   123
-      |  4567890123456789 |  4.56789012345679e+15
-      | -4567890123456789 | -4.56789012345679e+15
+ five |        q2         |         float8         
+------+-------------------+------------------------
+      |               456 |                    456
+      |  4567890123456789 |  4.56789012345679e+015
+      |               123 |                    123
+      |  4567890123456789 |  4.56789012345679e+015
+      | -4567890123456789 | -4.56789012345679e+015
+(5 rows)
+
+SELECT 37 + q1 AS plus4 FROM INT8_TBL;
+      plus4       
+------------------
+              160
+              160
+ 4567890123456826
+ 4567890123456826
+ 4567890123456826
+(5 rows)
+
+SELECT 37 - q1 AS minus4 FROM INT8_TBL;
+      minus4       
+-------------------
+               -86
+               -86
+ -4567890123456752
+ -4567890123456752
+ -4567890123456752
 (5 rows)
 
 SELECT '' AS five, 2 * q1 AS "twice int4" FROM INT8_TBL;
@@ -138,6 +388,72 @@ SELECT '' AS five, q1 * 2 AS "twice int4" FROM INT8_TBL;
       | 9135780246913578
 (5 rows)
 
+-- int8 op int4
+SELECT q1 + 42::int4 AS "8plus4", q1 - 42::int4 AS "8minus4", q1 * 42::int4 AS "8mul4", q1 / 42::int4 AS "8div4" FROM INT8_TBL;
+      8plus4      |     8minus4      |       8mul4        |      8div4      
+------------------+------------------+--------------------+-----------------
+              165 |               81 |               5166 |               2
+              165 |               81 |               5166 |               2
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+(5 rows)
+
+-- int4 op int8
+SELECT 246::int4 + q1 AS "4plus8", 246::int4 - q1 AS "4minus8", 246::int4 * q1 AS "4mul8", 246::int4 / q1 AS "4div8" FROM INT8_TBL;
+      4plus8      |      4minus8      |        4mul8        | 4div8 
+------------------+-------------------+---------------------+-------
+              369 |               123 |               30258 |     2
+              369 |               123 |               30258 |     2
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+(5 rows)
+
+-- int8 op int2
+SELECT q1 + 42::int2 AS "8plus2", q1 - 42::int2 AS "8minus2", q1 * 42::int2 AS "8mul2", q1 / 42::int2 AS "8div2" FROM INT8_TBL;
+      8plus2      |     8minus2      |       8mul2        |      8div2      
+------------------+------------------+--------------------+-----------------
+              165 |               81 |               5166 |               2
+              165 |               81 |               5166 |               2
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+ 4567890123456831 | 4567890123456747 | 191851385185185138 | 108759288653733
+(5 rows)
+
+-- int2 op int8
+SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL;
+      2plus8      |      2minus8      |        2mul8        | 2div8 
+------------------+-------------------+---------------------+-------
+              369 |               123 |               30258 |     2
+              369 |               123 |               30258 |     2
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+ 4567890123457035 | -4567890123456543 | 1123700970370370094 |     0
+(5 rows)
+
+SELECT q2, abs(q2) FROM INT8_TBL;
+        q2         |       abs        
+-------------------+------------------
+               456 |              456
+  4567890123456789 | 4567890123456789
+               123 |              123
+  4567890123456789 | 4567890123456789
+ -4567890123456789 | 4567890123456789
+(5 rows)
+
+SELECT min(q1), min(q2) FROM INT8_TBL;
+ min |        min        
+-----+-------------------
+ 123 | -4567890123456789
+(1 row)
+
+SELECT max(q1), max(q2) FROM INT8_TBL;
+       max        |       max        
+------------------+------------------
+ 4567890123456789 | 4567890123456789
+(1 row)
+
 -- TO_CHAR()
 --
 SELECT '' AS to_char_1, to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999') 
@@ -314,7 +630,7 @@ SELECT '' AS to_char_17, to_char(q2, '999999SG9999999999')     FROM INT8_TBL;
             | 456789-0123456789
 (5 rows)
 
--- check min/max values
+-- check min/max values and overflow behavior
 select '-9223372036854775808'::int8;
          int8         
 ----------------------
@@ -335,3 +651,164 @@ select '9223372036854775808'::int8;
 ERROR:  value "9223372036854775808" is out of range for type bigint
 LINE 1: select '9223372036854775808'::int8;
                ^
+select -('-9223372036854775807'::int8);
+      ?column?       
+---------------------
+ 9223372036854775807
+(1 row)
+
+select -('-9223372036854775808'::int8);
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 + '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-9223372036854775800'::int8 + '-9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 - '-9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-9223372036854775800'::int8 - '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 * '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-9223372036854775808'::int8 / '-1'::int8;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 / '0'::int8;
+ERROR:  division by zero
+select '9223372036854775800'::int8 % '0'::int8;
+ERROR:  division by zero
+select abs('-9223372036854775808'::int8);
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 + '100'::int4;
+ERROR:  bigint out of range
+select '-9223372036854775800'::int8 - '100'::int4;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 * '100'::int4;
+ERROR:  bigint out of range
+select '-9223372036854775808'::int8 / '-1'::int4;
+ERROR:  bigint out of range
+select '100'::int4 + '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-100'::int4 - '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '100'::int4 * '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 + '100'::int2;
+ERROR:  bigint out of range
+select '-9223372036854775800'::int8 - '100'::int2;
+ERROR:  bigint out of range
+select '9223372036854775800'::int8 * '100'::int2;
+ERROR:  bigint out of range
+select '-9223372036854775808'::int8 / '-1'::int2;
+ERROR:  bigint out of range
+select '-9223372036854775808'::int8 / '0'::int2;
+ERROR:  division by zero
+select '100'::int2 + '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '-100'::int2 - '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '100'::int2 * '9223372036854775800'::int8;
+ERROR:  bigint out of range
+select '100'::int2 / '0'::int8;
+ERROR:  division by zero
+SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456;
+ q1  
+-----
+ 123
+(1 row)
+
+SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456;
+ERROR:  integer out of range
+SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456;
+ q1  
+-----
+ 123
+(1 row)
+
+SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456;
+ERROR:  smallint out of range
+SELECT CAST('42'::int2 AS int8), CAST('-37'::int2 AS int8);
+ int8 | int8 
+------+------
+   42 |  -37
+(1 row)
+
+SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL;
+     q1      |          q2           
+-------------+-----------------------
+         123 |                   456
+         123 |  4.56789012345679e+15
+ 4.56789e+15 |                   123
+ 4.56789e+15 |  4.56789012345679e+15
+ 4.56789e+15 | -4.56789012345679e+15
+(5 rows)
+
+SELECT CAST('36854775807.0'::float4 AS int8);
+    int8     
+-------------
+ 36854775808
+(1 row)
+
+SELECT CAST('9223372036854775807.0'::float4 AS int8);
+ERROR:  bigint out of range
+SELECT CAST('9223372036854775807.0'::float8 AS int8);
+ERROR:  bigint out of range
+SELECT CAST('922337203685477580700.0'::float8 AS int8);
+ERROR:  bigint out of range
+SELECT CAST(q1 AS oid) FROM INT8_TBL;
+ERROR:  OID out of range
+SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class';
+ oid  
+------
+ 1259
+(1 row)
+
+-- bit operations
+SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL;
+        q1        |        q2         |       and        |        or        |       xor        |        not        
+------------------+-------------------+------------------+------------------+------------------+-------------------
+              123 |               456 |               72 |              507 |              435 |              -124
+              123 |  4567890123456789 |               17 | 4567890123456895 | 4567890123456878 |              -124
+ 4567890123456789 |               123 |               17 | 4567890123456895 | 4567890123456878 | -4567890123456790
+ 4567890123456789 |  4567890123456789 | 4567890123456789 | 4567890123456789 |                0 | -4567890123456790
+ 4567890123456789 | -4567890123456789 |                1 |               -1 |               -2 | -4567890123456790
+(5 rows)
+
+SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL;
+        q1        |        shl        |       shr       
+------------------+-------------------+-----------------
+              123 |               492 |              15
+              123 |               492 |              15
+ 4567890123456789 | 18271560493827156 | 570986265432098
+ 4567890123456789 | 18271560493827156 | 570986265432098
+ 4567890123456789 | 18271560493827156 | 570986265432098
+(5 rows)
+
+-- generate_series
+SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8);
+ generate_series  
+------------------
+ 4567890123456789
+ 4567890123456790
+ 4567890123456791
+ 4567890123456792
+ 4567890123456793
+ 4567890123456794
+ 4567890123456795
+ 4567890123456796
+ 4567890123456797
+ 4567890123456798
+ 4567890123456799
+(11 rows)
+
+SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0);
+ERROR:  step size cannot equal zero
+SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2);
+ generate_series  
+------------------
+ 4567890123456789
+ 4567890123456791
+ 4567890123456793
+ 4567890123456795
+ 4567890123456797
+ 4567890123456799
+(6 rows)
+
index 8ef92ba..9021496 100644 (file)
@@ -7,8 +7,8 @@ CREATE TABLE INT8_TBL(q1 int8, q2 int8);
 INSERT INTO INT8_TBL VALUES('  123   ','  456');
 INSERT INTO INT8_TBL VALUES('123   ','4567890123456789');
 INSERT INTO INT8_TBL VALUES('4567890123456789','123');
-INSERT INTO INT8_TBL VALUES('4567890123456789','4567890123456789');
-INSERT INTO INT8_TBL VALUES('4567890123456789','-4567890123456789');
+INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
+INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
 
 -- bad inputs
 INSERT INTO INT8_TBL(q1) VALUES ('      ');
@@ -21,6 +21,47 @@ INSERT INTO INT8_TBL(q1) VALUES ('');
 
 SELECT * FROM INT8_TBL;
 
+-- int8/int8 cmp
+SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
+SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
+SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
+SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
+SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
+SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
+
+-- int8/int4 cmp
+SELECT * FROM INT8_TBL WHERE q2 = 456;
+SELECT * FROM INT8_TBL WHERE q2 <> 456;
+SELECT * FROM INT8_TBL WHERE q2 < 456;
+SELECT * FROM INT8_TBL WHERE q2 > 456;
+SELECT * FROM INT8_TBL WHERE q2 <= 456;
+SELECT * FROM INT8_TBL WHERE q2 >= 456;
+
+-- int4/int8 cmp
+SELECT * FROM INT8_TBL WHERE 123 = q1;
+SELECT * FROM INT8_TBL WHERE 123 <> q1;
+SELECT * FROM INT8_TBL WHERE 123 < q1;
+SELECT * FROM INT8_TBL WHERE 123 > q1;
+SELECT * FROM INT8_TBL WHERE 123 <= q1;
+SELECT * FROM INT8_TBL WHERE 123 >= q1;
+
+-- int8/int2 cmp
+SELECT * FROM INT8_TBL WHERE q2 = '456'::int2;
+SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2;
+SELECT * FROM INT8_TBL WHERE q2 < '456'::int2;
+SELECT * FROM INT8_TBL WHERE q2 > '456'::int2;
+SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2;
+SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2;
+
+-- int2/int8 cmp
+SELECT * FROM INT8_TBL WHERE '123'::int2 = q1;
+SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1;
+SELECT * FROM INT8_TBL WHERE '123'::int2 < q1;
+SELECT * FROM INT8_TBL WHERE '123'::int2 > q1;
+SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1;
+SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1;
+
+
 SELECT '' AS five, q1 AS plus, -q1 AS minus FROM INT8_TBL;
 
 SELECT '' AS five, q1, q2, q1 + q2 AS plus FROM INT8_TBL;
@@ -28,14 +69,31 @@ SELECT '' AS five, q1, q2, q1 - q2 AS minus FROM INT8_TBL;
 SELECT '' AS three, q1, q2, q1 * q2 AS multiply FROM INT8_TBL;
 SELECT '' AS three, q1, q2, q1 * q2 AS multiply FROM INT8_TBL
  WHERE q1 < 1000 or (q2 > 0 and q2 < 1000);
-SELECT '' AS five, q1, q2, q1 / q2 AS divide FROM INT8_TBL;
+SELECT '' AS five, q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
 
 SELECT '' AS five, q1, float8(q1) FROM INT8_TBL;
 SELECT '' AS five, q2, float8(q2) FROM INT8_TBL;
 
+SELECT 37 + q1 AS plus4 FROM INT8_TBL;
+SELECT 37 - q1 AS minus4 FROM INT8_TBL;
 SELECT '' AS five, 2 * q1 AS "twice int4" FROM INT8_TBL;
 SELECT '' AS five, q1 * 2 AS "twice int4" FROM INT8_TBL;
 
+-- int8 op int4
+SELECT q1 + 42::int4 AS "8plus4", q1 - 42::int4 AS "8minus4", q1 * 42::int4 AS "8mul4", q1 / 42::int4 AS "8div4" FROM INT8_TBL;
+-- int4 op int8
+SELECT 246::int4 + q1 AS "4plus8", 246::int4 - q1 AS "4minus8", 246::int4 * q1 AS "4mul8", 246::int4 / q1 AS "4div8" FROM INT8_TBL;
+
+-- int8 op int2
+SELECT q1 + 42::int2 AS "8plus2", q1 - 42::int2 AS "8minus2", q1 * 42::int2 AS "8mul2", q1 / 42::int2 AS "8div2" FROM INT8_TBL;
+-- int2 op int8
+SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL;
+
+SELECT q2, abs(q2) FROM INT8_TBL;
+SELECT min(q1), min(q2) FROM INT8_TBL;
+SELECT max(q1), max(q2) FROM INT8_TBL;
+
+
 -- TO_CHAR()
 --
 SELECT '' AS to_char_1, to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999') 
@@ -64,8 +122,76 @@ SELECT '' AS to_char_15, to_char(q2, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9'
 SELECT '' AS to_char_16, to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL;
 SELECT '' AS to_char_17, to_char(q2, '999999SG9999999999')     FROM INT8_TBL;
 
--- check min/max values
+-- check min/max values and overflow behavior
+
 select '-9223372036854775808'::int8;
 select '-9223372036854775809'::int8;
 select '9223372036854775807'::int8;
 select '9223372036854775808'::int8;
+
+select -('-9223372036854775807'::int8);
+select -('-9223372036854775808'::int8);
+
+select '9223372036854775800'::int8 + '9223372036854775800'::int8;
+select '-9223372036854775800'::int8 + '-9223372036854775800'::int8;
+
+select '9223372036854775800'::int8 - '-9223372036854775800'::int8;
+select '-9223372036854775800'::int8 - '9223372036854775800'::int8;
+
+select '9223372036854775800'::int8 * '9223372036854775800'::int8;
+select '-9223372036854775808'::int8 / '-1'::int8;
+
+select '9223372036854775800'::int8 / '0'::int8;
+select '9223372036854775800'::int8 % '0'::int8;
+
+select abs('-9223372036854775808'::int8);
+
+select '9223372036854775800'::int8 + '100'::int4;
+select '-9223372036854775800'::int8 - '100'::int4;
+select '9223372036854775800'::int8 * '100'::int4;
+select '-9223372036854775808'::int8 / '-1'::int4;
+
+select '100'::int4 + '9223372036854775800'::int8;
+select '-100'::int4 - '9223372036854775800'::int8;
+select '100'::int4 * '9223372036854775800'::int8;
+
+select '9223372036854775800'::int8 + '100'::int2;
+select '-9223372036854775800'::int8 - '100'::int2;
+select '9223372036854775800'::int8 * '100'::int2;
+select '-9223372036854775808'::int8 / '-1'::int2;
+select '-9223372036854775808'::int8 / '0'::int2;
+
+select '100'::int2 + '9223372036854775800'::int8;
+select '-100'::int2 - '9223372036854775800'::int8;
+select '100'::int2 * '9223372036854775800'::int8;
+select '100'::int2 / '0'::int8;
+
+SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456;
+SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456;
+
+SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456;
+SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456;
+
+SELECT CAST('42'::int2 AS int8), CAST('-37'::int2 AS int8);
+
+SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL;
+SELECT CAST('36854775807.0'::float4 AS int8);
+SELECT CAST('9223372036854775807.0'::float4 AS int8);
+SELECT CAST('9223372036854775807.0'::float8 AS int8);
+SELECT CAST('922337203685477580700.0'::float8 AS int8);
+
+SELECT CAST(q1 AS oid) FROM INT8_TBL;
+SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class';
+
+
+-- bit operations
+
+SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL;
+SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL;
+
+
+-- generate_series
+
+SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8);
+SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0);
+SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2);