int4.out 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. --
  2. -- INT4
  3. --
  4. CREATE TABLE INT4_TBL(f1 int4);
  5. INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
  6. INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
  7. INSERT INTO INT4_TBL(f1) VALUES (' -123456');
  8. INSERT INTO INT4_TBL(f1) VALUES ('34.5');
  9. ERROR: invalid input syntax for type integer: "34.5"
  10. LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('34.5');
  11. ^
  12. -- largest and smallest values
  13. INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
  14. INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
  15. -- bad input values -- should give errors
  16. INSERT INTO INT4_TBL(f1) VALUES ('1000000000000');
  17. ERROR: value "1000000000000" is out of range for type integer
  18. LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('1000000000000');
  19. ^
  20. INSERT INTO INT4_TBL(f1) VALUES ('asdf');
  21. ERROR: invalid input syntax for type integer: "asdf"
  22. LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('asdf');
  23. ^
  24. INSERT INTO INT4_TBL(f1) VALUES (' ');
  25. ERROR: invalid input syntax for type integer: " "
  26. LINE 1: INSERT INTO INT4_TBL(f1) VALUES (' ');
  27. ^
  28. INSERT INTO INT4_TBL(f1) VALUES (' asdf ');
  29. ERROR: invalid input syntax for type integer: " asdf "
  30. LINE 1: INSERT INTO INT4_TBL(f1) VALUES (' asdf ');
  31. ^
  32. INSERT INTO INT4_TBL(f1) VALUES ('- 1234');
  33. ERROR: invalid input syntax for type integer: "- 1234"
  34. LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('- 1234');
  35. ^
  36. INSERT INTO INT4_TBL(f1) VALUES ('123 5');
  37. ERROR: invalid input syntax for type integer: "123 5"
  38. LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('123 5');
  39. ^
  40. INSERT INTO INT4_TBL(f1) VALUES ('');
  41. ERROR: invalid input syntax for type integer: ""
  42. LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('');
  43. ^
  44. SELECT * FROM INT4_TBL;
  45. f1
  46. -------------
  47. 0
  48. 123456
  49. -123456
  50. 2147483647
  51. -2147483647
  52. (5 rows)
  53. SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int2 '0';
  54. f1
  55. -------------
  56. 123456
  57. -123456
  58. 2147483647
  59. -2147483647
  60. (4 rows)
  61. SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int4 '0';
  62. f1
  63. -------------
  64. 123456
  65. -123456
  66. 2147483647
  67. -2147483647
  68. (4 rows)
  69. SELECT i.* FROM INT4_TBL i WHERE i.f1 = int2 '0';
  70. f1
  71. ----
  72. 0
  73. (1 row)
  74. SELECT i.* FROM INT4_TBL i WHERE i.f1 = int4 '0';
  75. f1
  76. ----
  77. 0
  78. (1 row)
  79. SELECT i.* FROM INT4_TBL i WHERE i.f1 < int2 '0';
  80. f1
  81. -------------
  82. -123456
  83. -2147483647
  84. (2 rows)
  85. SELECT i.* FROM INT4_TBL i WHERE i.f1 < int4 '0';
  86. f1
  87. -------------
  88. -123456
  89. -2147483647
  90. (2 rows)
  91. SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int2 '0';
  92. f1
  93. -------------
  94. 0
  95. -123456
  96. -2147483647
  97. (3 rows)
  98. SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int4 '0';
  99. f1
  100. -------------
  101. 0
  102. -123456
  103. -2147483647
  104. (3 rows)
  105. SELECT i.* FROM INT4_TBL i WHERE i.f1 > int2 '0';
  106. f1
  107. ------------
  108. 123456
  109. 2147483647
  110. (2 rows)
  111. SELECT i.* FROM INT4_TBL i WHERE i.f1 > int4 '0';
  112. f1
  113. ------------
  114. 123456
  115. 2147483647
  116. (2 rows)
  117. SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int2 '0';
  118. f1
  119. ------------
  120. 0
  121. 123456
  122. 2147483647
  123. (3 rows)
  124. SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int4 '0';
  125. f1
  126. ------------
  127. 0
  128. 123456
  129. 2147483647
  130. (3 rows)
  131. -- positive odds
  132. SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int2 '2') = int2 '1';
  133. f1
  134. ------------
  135. 2147483647
  136. (1 row)
  137. -- any evens
  138. SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int4 '2') = int2 '0';
  139. f1
  140. ---------
  141. 0
  142. 123456
  143. -123456
  144. (3 rows)
  145. SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i;
  146. ERROR: integer out of range
  147. SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i
  148. WHERE abs(f1) < 1073741824;
  149. f1 | x
  150. ---------+---------
  151. 0 | 0
  152. 123456 | 246912
  153. -123456 | -246912
  154. (3 rows)
  155. SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i;
  156. ERROR: integer out of range
  157. SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i
  158. WHERE abs(f1) < 1073741824;
  159. f1 | x
  160. ---------+---------
  161. 0 | 0
  162. 123456 | 246912
  163. -123456 | -246912
  164. (3 rows)
  165. SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i;
  166. ERROR: integer out of range
  167. SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i
  168. WHERE f1 < 2147483646;
  169. f1 | x
  170. -------------+-------------
  171. 0 | 2
  172. 123456 | 123458
  173. -123456 | -123454
  174. -2147483647 | -2147483645
  175. (4 rows)
  176. SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i;
  177. ERROR: integer out of range
  178. SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i
  179. WHERE f1 < 2147483646;
  180. f1 | x
  181. -------------+-------------
  182. 0 | 2
  183. 123456 | 123458
  184. -123456 | -123454
  185. -2147483647 | -2147483645
  186. (4 rows)
  187. SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i;
  188. ERROR: integer out of range
  189. SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i
  190. WHERE f1 > -2147483647;
  191. f1 | x
  192. ------------+------------
  193. 0 | -2
  194. 123456 | 123454
  195. -123456 | -123458
  196. 2147483647 | 2147483645
  197. (4 rows)
  198. SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i;
  199. ERROR: integer out of range
  200. SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i
  201. WHERE f1 > -2147483647;
  202. f1 | x
  203. ------------+------------
  204. 0 | -2
  205. 123456 | 123454
  206. -123456 | -123458
  207. 2147483647 | 2147483645
  208. (4 rows)
  209. SELECT i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i;
  210. f1 | x
  211. -------------+-------------
  212. 0 | 0
  213. 123456 | 61728
  214. -123456 | -61728
  215. 2147483647 | 1073741823
  216. -2147483647 | -1073741823
  217. (5 rows)
  218. SELECT i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i;
  219. f1 | x
  220. -------------+-------------
  221. 0 | 0
  222. 123456 | 61728
  223. -123456 | -61728
  224. 2147483647 | 1073741823
  225. -2147483647 | -1073741823
  226. (5 rows)
  227. --
  228. -- more complex expressions
  229. --
  230. -- variations on unary minus parsing
  231. SELECT -2+3 AS one;
  232. one
  233. -----
  234. 1
  235. (1 row)
  236. SELECT 4-2 AS two;
  237. two
  238. -----
  239. 2
  240. (1 row)
  241. SELECT 2- -1 AS three;
  242. three
  243. -------
  244. 3
  245. (1 row)
  246. SELECT 2 - -2 AS four;
  247. four
  248. ------
  249. 4
  250. (1 row)
  251. SELECT int2 '2' * int2 '2' = int2 '16' / int2 '4' AS true;
  252. true
  253. ------
  254. t
  255. (1 row)
  256. SELECT int4 '2' * int2 '2' = int2 '16' / int4 '4' AS true;
  257. true
  258. ------
  259. t
  260. (1 row)
  261. SELECT int2 '2' * int4 '2' = int4 '16' / int2 '4' AS true;
  262. true
  263. ------
  264. t
  265. (1 row)
  266. SELECT int4 '1000' < int4 '999' AS false;
  267. false
  268. -------
  269. f
  270. (1 row)
  271. SELECT 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 AS ten;
  272. ten
  273. -----
  274. 10
  275. (1 row)
  276. SELECT 2 + 2 / 2 AS three;
  277. three
  278. -------
  279. 3
  280. (1 row)
  281. SELECT (2 + 2) / 2 AS two;
  282. two
  283. -----
  284. 2
  285. (1 row)
  286. -- corner case
  287. SELECT (-1::int4<<31)::text;
  288. text
  289. -------------
  290. -2147483648
  291. (1 row)
  292. SELECT ((-1::int4<<31)+1)::text;
  293. text
  294. -------------
  295. -2147483647
  296. (1 row)
  297. -- check sane handling of INT_MIN overflow cases
  298. SELECT (-2147483648)::int4 * (-1)::int4;
  299. ERROR: integer out of range
  300. SELECT (-2147483648)::int4 / (-1)::int4;
  301. ERROR: integer out of range
  302. SELECT (-2147483648)::int4 % (-1)::int4;
  303. ?column?
  304. ----------
  305. 0
  306. (1 row)
  307. SELECT (-2147483648)::int4 * (-1)::int2;
  308. ERROR: integer out of range
  309. SELECT (-2147483648)::int4 / (-1)::int2;
  310. ERROR: integer out of range
  311. SELECT (-2147483648)::int4 % (-1)::int2;
  312. ?column?
  313. ----------
  314. 0
  315. (1 row)
  316. -- check rounding when casting from float
  317. SELECT x, x::int4 AS int4_value
  318. FROM (VALUES (-2.5::float8),
  319. (-1.5::float8),
  320. (-0.5::float8),
  321. (0.0::float8),
  322. (0.5::float8),
  323. (1.5::float8),
  324. (2.5::float8)) t(x);
  325. x | int4_value
  326. ------+------------
  327. -2.5 | -2
  328. -1.5 | -2
  329. -0.5 | 0
  330. 0 | 0
  331. 0.5 | 0
  332. 1.5 | 2
  333. 2.5 | 2
  334. (7 rows)
  335. -- check rounding when casting from numeric
  336. SELECT x, x::int4 AS int4_value
  337. FROM (VALUES (-2.5::numeric),
  338. (-1.5::numeric),
  339. (-0.5::numeric),
  340. (0.0::numeric),
  341. (0.5::numeric),
  342. (1.5::numeric),
  343. (2.5::numeric)) t(x);
  344. x | int4_value
  345. ------+------------
  346. -2.5 | -3
  347. -1.5 | -2
  348. -0.5 | -1
  349. 0.0 | 0
  350. 0.5 | 1
  351. 1.5 | 2
  352. 2.5 | 3
  353. (7 rows)
  354. -- test gcd()
  355. SELECT a, b, gcd(a, b), gcd(a, -b), gcd(b, a), gcd(-b, a)
  356. FROM (VALUES (0::int4, 0::int4),
  357. (0::int4, 6410818::int4),
  358. (61866666::int4, 6410818::int4),
  359. (-61866666::int4, 6410818::int4),
  360. ((-2147483648)::int4, 1::int4),
  361. ((-2147483648)::int4, 2147483647::int4),
  362. ((-2147483648)::int4, 1073741824::int4)) AS v(a, b);
  363. a | b | gcd | gcd | gcd | gcd
  364. -------------+------------+------------+------------+------------+------------
  365. 0 | 0 | 0 | 0 | 0 | 0
  366. 0 | 6410818 | 6410818 | 6410818 | 6410818 | 6410818
  367. 61866666 | 6410818 | 1466 | 1466 | 1466 | 1466
  368. -61866666 | 6410818 | 1466 | 1466 | 1466 | 1466
  369. -2147483648 | 1 | 1 | 1 | 1 | 1
  370. -2147483648 | 2147483647 | 1 | 1 | 1 | 1
  371. -2147483648 | 1073741824 | 1073741824 | 1073741824 | 1073741824 | 1073741824
  372. (7 rows)
  373. SELECT gcd((-2147483648)::int4, 0::int4); -- overflow
  374. ERROR: integer out of range
  375. SELECT gcd((-2147483648)::int4, (-2147483648)::int4); -- overflow
  376. ERROR: integer out of range
  377. -- test lcm()
  378. SELECT a, b, lcm(a, b), lcm(a, -b), lcm(b, a), lcm(-b, a)
  379. FROM (VALUES (0::int4, 0::int4),
  380. (0::int4, 42::int4),
  381. (42::int4, 42::int4),
  382. (330::int4, 462::int4),
  383. (-330::int4, 462::int4),
  384. ((-2147483648)::int4, 0::int4)) AS v(a, b);
  385. a | b | lcm | lcm | lcm | lcm
  386. -------------+-----+------+------+------+------
  387. 0 | 0 | 0 | 0 | 0 | 0
  388. 0 | 42 | 0 | 0 | 0 | 0
  389. 42 | 42 | 42 | 42 | 42 | 42
  390. 330 | 462 | 2310 | 2310 | 2310 | 2310
  391. -330 | 462 | 2310 | 2310 | 2310 | 2310
  392. -2147483648 | 0 | 0 | 0 | 0 | 0
  393. (6 rows)
  394. SELECT lcm((-2147483648)::int4, 1::int4); -- overflow
  395. ERROR: integer out of range
  396. SELECT lcm(2147483647::int4, 2147483646::int4); -- overflow
  397. ERROR: integer out of range