int8.sql 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. --
  2. -- INT8
  3. -- Test int8 64-bit integers.
  4. --
  5. CREATE TABLE INT8_TBL(q1 int8, q2 int8);
  6. INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
  7. INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
  8. INSERT INTO INT8_TBL VALUES('4567890123456789','123');
  9. INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
  10. INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
  11. -- bad inputs
  12. INSERT INTO INT8_TBL(q1) VALUES (' ');
  13. INSERT INTO INT8_TBL(q1) VALUES ('xxx');
  14. INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485');
  15. INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934');
  16. INSERT INTO INT8_TBL(q1) VALUES ('- 123');
  17. INSERT INTO INT8_TBL(q1) VALUES (' 345 5');
  18. INSERT INTO INT8_TBL(q1) VALUES ('');
  19. SELECT * FROM INT8_TBL;
  20. -- int8/int8 cmp
  21. SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
  22. SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
  23. SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
  24. SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
  25. SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
  26. SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
  27. -- int8/int4 cmp
  28. SELECT * FROM INT8_TBL WHERE q2 = 456;
  29. SELECT * FROM INT8_TBL WHERE q2 <> 456;
  30. SELECT * FROM INT8_TBL WHERE q2 < 456;
  31. SELECT * FROM INT8_TBL WHERE q2 > 456;
  32. SELECT * FROM INT8_TBL WHERE q2 <= 456;
  33. SELECT * FROM INT8_TBL WHERE q2 >= 456;
  34. -- int4/int8 cmp
  35. SELECT * FROM INT8_TBL WHERE 123 = q1;
  36. SELECT * FROM INT8_TBL WHERE 123 <> q1;
  37. SELECT * FROM INT8_TBL WHERE 123 < q1;
  38. SELECT * FROM INT8_TBL WHERE 123 > q1;
  39. SELECT * FROM INT8_TBL WHERE 123 <= q1;
  40. SELECT * FROM INT8_TBL WHERE 123 >= q1;
  41. -- int8/int2 cmp
  42. SELECT * FROM INT8_TBL WHERE q2 = '456'::int2;
  43. SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2;
  44. SELECT * FROM INT8_TBL WHERE q2 < '456'::int2;
  45. SELECT * FROM INT8_TBL WHERE q2 > '456'::int2;
  46. SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2;
  47. SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2;
  48. -- int2/int8 cmp
  49. SELECT * FROM INT8_TBL WHERE '123'::int2 = q1;
  50. SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1;
  51. SELECT * FROM INT8_TBL WHERE '123'::int2 < q1;
  52. SELECT * FROM INT8_TBL WHERE '123'::int2 > q1;
  53. SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1;
  54. SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1;
  55. SELECT q1 AS plus, -q1 AS minus FROM INT8_TBL;
  56. SELECT q1, q2, q1 + q2 AS plus FROM INT8_TBL;
  57. SELECT q1, q2, q1 - q2 AS minus FROM INT8_TBL;
  58. SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL;
  59. SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL
  60. WHERE q1 < 1000 or (q2 > 0 and q2 < 1000);
  61. SELECT q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
  62. SELECT 37 + q1 AS plus4 FROM INT8_TBL;
  63. SELECT 37 - q1 AS minus4 FROM INT8_TBL;
  64. SELECT 2 * q1 AS "twice int4" FROM INT8_TBL;
  65. SELECT q1 * 2 AS "twice int4" FROM INT8_TBL;
  66. -- int8 op int4
  67. SELECT q1 + 42::int4 AS "8plus4", q1 - 42::int4 AS "8minus4", q1 * 42::int4 AS "8mul4", q1 / 42::int4 AS "8div4" FROM INT8_TBL;
  68. -- int4 op int8
  69. SELECT 246::int4 + q1 AS "4plus8", 246::int4 - q1 AS "4minus8", 246::int4 * q1 AS "4mul8", 246::int4 / q1 AS "4div8" FROM INT8_TBL;
  70. -- int8 op int2
  71. SELECT q1 + 42::int2 AS "8plus2", q1 - 42::int2 AS "8minus2", q1 * 42::int2 AS "8mul2", q1 / 42::int2 AS "8div2" FROM INT8_TBL;
  72. -- int2 op int8
  73. SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL;
  74. SELECT q2, abs(q2) FROM INT8_TBL;
  75. SELECT to_char(q2, 'MI9999999999999999') FROM INT8_TBL;
  76. SELECT to_char(q2, 'FMS9999999999999999') FROM INT8_TBL;
  77. SELECT to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL;
  78. SELECT to_char(q2, 'SG9999999999999999th') FROM INT8_TBL;
  79. SELECT to_char(q2, '0999999999999999') FROM INT8_TBL;
  80. SELECT to_char(q2, 'S0999999999999999') FROM INT8_TBL;
  81. SELECT to_char(q2, 'FM0999999999999999') FROM INT8_TBL;
  82. SELECT to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL;
  83. SELECT to_char(q2, 'L9999999999999999.000') FROM INT8_TBL;
  84. SELECT to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL;
  85. SELECT to_char(q2, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9') FROM INT8_TBL;
  86. SELECT to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL;
  87. SELECT to_char(q2, '999999SG9999999999') FROM INT8_TBL;
  88. -- check min/max values and overflow behavior
  89. select '-9223372036854775808'::int8;
  90. select '-9223372036854775809'::int8;
  91. select '9223372036854775807'::int8;
  92. select '9223372036854775808'::int8;
  93. select -('-9223372036854775807'::int8);
  94. select -('-9223372036854775808'::int8);
  95. select '9223372036854775800'::int8 + '9223372036854775800'::int8;
  96. select '-9223372036854775800'::int8 + '-9223372036854775800'::int8;
  97. select '9223372036854775800'::int8 - '-9223372036854775800'::int8;
  98. select '-9223372036854775800'::int8 - '9223372036854775800'::int8;
  99. select '9223372036854775800'::int8 * '9223372036854775800'::int8;
  100. select '9223372036854775800'::int8 / '0'::int8;
  101. select '9223372036854775800'::int8 % '0'::int8;
  102. select abs('-9223372036854775808'::int8);
  103. select '9223372036854775800'::int8 + '100'::int4;
  104. select '-9223372036854775800'::int8 - '100'::int4;
  105. select '9223372036854775800'::int8 * '100'::int4;
  106. select '100'::int4 + '9223372036854775800'::int8;
  107. select '-100'::int4 - '9223372036854775800'::int8;
  108. select '100'::int4 * '9223372036854775800'::int8;
  109. select '9223372036854775800'::int8 + '100'::int2;
  110. select '-9223372036854775800'::int8 - '100'::int2;
  111. select '9223372036854775800'::int8 * '100'::int2;
  112. select '-9223372036854775808'::int8 / '0'::int2;
  113. select '100'::int2 + '9223372036854775800'::int8;
  114. select '-100'::int2 - '9223372036854775800'::int8;
  115. select '100'::int2 * '9223372036854775800'::int8;
  116. select '100'::int2 / '0'::int8;
  117. SELECT CAST('42'::int2 AS int8), CAST('-37'::int2 AS int8);
  118. SELECT CAST('36854775807.0'::float4 AS int8);
  119. SELECT CAST('922337203685477580700.0'::float8 AS int8);
  120. SELECT CAST(q1 AS oid) FROM INT8_TBL;
  121. SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class';
  122. -- bit operations
  123. SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL;
  124. SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL;
  125. -- generate_series
  126. SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8);
  127. SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0);
  128. SELECT * FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2);
  129. -- corner case
  130. SELECT (-1::int8<<63)::text;
  131. SELECT ((-1::int8<<63)+1)::text;
  132. -- check sane handling of INT64_MIN overflow cases
  133. SELECT (-9223372036854775808)::int8 * (-1)::int8;
  134. SELECT (-9223372036854775808)::int8 / (-1)::int8;
  135. SELECT (-9223372036854775808)::int8 % (-1)::int8;
  136. SELECT (-9223372036854775808)::int8 * (-1)::int4;
  137. SELECT (-9223372036854775808)::int8 / (-1)::int4;
  138. SELECT (-9223372036854775808)::int8 % (-1)::int4;
  139. SELECT (-9223372036854775808)::int8 * (-1)::int2;
  140. SELECT (-9223372036854775808)::int8 / (-1)::int2;
  141. SELECT (-9223372036854775808)::int8 % (-1)::int2;
  142. -- check rounding when casting from float
  143. SELECT x, x::int8 AS int8_value
  144. FROM (VALUES (-2.5::float8),
  145. (-1.5::float8),
  146. (-0.5::float8),
  147. (0.0::float8),
  148. (0.5::float8),
  149. (1.5::float8),
  150. (2.5::float8)) t(x);
  151. -- check rounding when casting from numeric
  152. SELECT x, x::int8 AS int8_value
  153. FROM (VALUES (-2.5::numeric),
  154. (-1.5::numeric),
  155. (-0.5::numeric),
  156. (0.0::numeric),
  157. (0.5::numeric),
  158. (1.5::numeric),
  159. (2.5::numeric)) t(x);
  160. SELECT gcd((-9223372036854775808)::int8, 0::int8); -- overflow
  161. SELECT gcd((-9223372036854775808)::int8, (-9223372036854775808)::int8); -- overflow
  162. SELECT lcm((-9223372036854775808)::int8, 1::int8); -- overflow
  163. SELECT lcm(9223372036854775807::int8, 9223372036854775806::int8); -- overflow