arithmetic.slt 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. mode cockroach
  10. # TODO: The types supported by mod are SMALLINT, BIGINT, INTEGER, DECIMAL, and NUMERIC.
  11. # Tests all types?
  12. ### mod ###
  13. # positive dividend and divisor
  14. query I
  15. SELECT mod(34, 7)
  16. ----
  17. 6
  18. query I
  19. SELECT mod(35, 7)
  20. ----
  21. 0
  22. query I
  23. SELECT mod(4, 4)
  24. ----
  25. 0
  26. query I
  27. SELECT mod(7, 11)
  28. ----
  29. 7
  30. query R
  31. SELECT mod(4.3, 2.1)
  32. ----
  33. 0.1
  34. query R
  35. SELECT mod(4, 2.1)
  36. ----
  37. 1.9
  38. query R
  39. SELECT mod(0.34, 1.1)
  40. ----
  41. 0.34
  42. query R
  43. SELECT mod(4.2, 2.1)
  44. ----
  45. 0
  46. # negative dividend
  47. query I
  48. SELECT mod(-3234, 73)
  49. ----
  50. -22
  51. query I
  52. SELECT mod(-100, 10)
  53. ----
  54. 0
  55. query I
  56. SELECT mod(-5, 5)
  57. ----
  58. 0
  59. query I
  60. SELECT mod(-237, 1100)
  61. ----
  62. -237
  63. query R
  64. SELECT mod(-2.254, 2.2)
  65. ----
  66. -0.054
  67. query R
  68. SELECT mod(-4, 1.75)
  69. ----
  70. -0.5
  71. query R
  72. SELECT mod(-0.3234, 200)
  73. ----
  74. -0.3234
  75. query R
  76. SELECT mod(-7.5, 1.5)
  77. ----
  78. 0
  79. # negative divisor
  80. query I
  81. SELECT mod(23, -5)
  82. ----
  83. 3
  84. query I
  85. SELECT mod(20, -2)
  86. ----
  87. 0
  88. query I
  89. SELECT mod(29, -29)
  90. ----
  91. 0
  92. query I
  93. SELECT mod(7, -11)
  94. ----
  95. 7
  96. query R
  97. SELECT mod(8.5, -4.6)
  98. ----
  99. 3.9
  100. query R
  101. SELECT mod(30, -11.9)
  102. ----
  103. 6.2
  104. query R
  105. SELECT mod(0.0019, -0.013)
  106. ----
  107. 0.0019
  108. query R
  109. SELECT mod(14.4, -0.002)
  110. ----
  111. 0
  112. # negative dividend and negative divisor
  113. query I
  114. SELECT mod(-121, -17)
  115. ----
  116. -2
  117. query I
  118. SELECT mod(-64, -8)
  119. ----
  120. 0
  121. query I
  122. SELECT mod(-344, -344)
  123. ----
  124. 0
  125. query I
  126. SELECT mod(-13, -123)
  127. ----
  128. -13
  129. query R
  130. SELECT mod(-5.6, -2.3)
  131. ----
  132. -1
  133. query R
  134. SELECT mod(-10.4, -2)
  135. ----
  136. -0.4
  137. query R
  138. SELECT mod(-2.45, -45.6)
  139. ----
  140. -2.45
  141. query R
  142. SELECT mod(-12.15, -4.05)
  143. ----
  144. 0
  145. # special values: 0/NULL dividend and/or divisor
  146. query I
  147. SELECT mod(0, 4)
  148. ----
  149. 0
  150. query R
  151. SELECT mod(0.000, 2)
  152. ----
  153. 0
  154. query R
  155. SELECT mod(0, 1.23)
  156. ----
  157. 0
  158. query error division by zero
  159. SELECT mod(4, 0.0)
  160. query error division by zero
  161. SELECT mod(0, 0)
  162. query I
  163. SELECT mod(0, NULL)
  164. ----
  165. NULL
  166. query I
  167. SELECT mod(NULL, 0)
  168. ----
  169. NULL
  170. query I
  171. SELECT mod(-5, NULL)
  172. ----
  173. NULL
  174. query I
  175. SELECT mod(NULL, 0.45)
  176. ----
  177. NULL
  178. query error division by zero
  179. SELECT 1 % 0
  180. query error division by zero
  181. SELECT 1 % 0.0
  182. query error division by zero
  183. SELECT 1.0 % 0
  184. query error division by zero
  185. SELECT 1.0 % 0.0
  186. query error division by zero
  187. SELECT 1 % CAST (0.0 AS float)
  188. query error division by zero
  189. SELECT 1 / 0
  190. query error division by zero
  191. SELECT 1 / 0.0
  192. query error division by zero
  193. SELECT 1.0 / 0
  194. query error division by zero
  195. SELECT 1.0 / 0.0
  196. query error division by zero
  197. SELECT 1 / CAST (0.0 AS float)
  198. query I
  199. SELECT 1 + CAST ('5' AS double precision)
  200. ----
  201. 6
  202. query TT
  203. SELECT CAST ('+Inf' AS double precision), CAST ('inf' AS double precision)
  204. ----
  205. inf inf
  206. query T
  207. SELECT CAST (CAST (1.1 AS double precision) AS text)
  208. ----
  209. 1.1
  210. query T
  211. SELECT CAST (CAST (1 as int) AS text)
  212. ----
  213. 1
  214. query TT
  215. SELECT FALSE::text, TRUE::text
  216. ----
  217. false true
  218. query TTTTT
  219. SELECT 1::smallint::text, 1::bigint::text, 1.0::text, 1.0::float::text, 1.0::double::text
  220. ----
  221. 1 1 1 1 1
  222. query TTTTT
  223. SELECT (-1)::smallint::text, (-1)::bigint::text, (-1.0)::text, (-1.0)::float::text, (-1.0)::double::text
  224. ----
  225. -1 -1 -1 -1 -1
  226. query TTT
  227. SELECT 1.1::text, 1.1::float::text, 1.1::double::text
  228. ----
  229. 1.1 1.1 1.1
  230. query R
  231. SELECT round(CAST (1.5678 AS float))
  232. ----
  233. 2
  234. query R
  235. SELECT round(CAST (-1.4678 AS float))
  236. ----
  237. -1
  238. query R
  239. SELECT round(CAST (1.5678 AS double precision))
  240. ----
  241. 2
  242. query R
  243. SELECT round(CAST (-1.4678 AS double precision))
  244. ----
  245. -1
  246. statement ok
  247. CREATE TABLE nums (
  248. n integer
  249. )
  250. statement ok
  251. INSERT INTO nums VALUES (4)
  252. query R
  253. SELECT round(1.5678, CAST ((SELECT n FROM nums) AS integer))
  254. ----
  255. 1.5678
  256. statement ok
  257. DELETE FROM nums
  258. query R
  259. SELECT floor(1.5678)
  260. ----
  261. 1
  262. query R
  263. SELECT round(1.5678, 3)
  264. ----
  265. 1.568
  266. query R
  267. SELECT round(1.5678, 2)
  268. ----
  269. 1.57
  270. query R
  271. SELECT round(1.5678, 1)
  272. ----
  273. 1.6
  274. query R
  275. SELECT round(1.5678, 0)
  276. ----
  277. 2
  278. query R
  279. SELECT round(1.5678, 7)
  280. ----
  281. 1.5678
  282. query R
  283. SELECT round(515, 0)
  284. ----
  285. 515
  286. query R
  287. SELECT round(515, 1)
  288. ----
  289. 515
  290. query R
  291. SELECT round(515, -1)
  292. ----
  293. 520
  294. query R
  295. SELECT round(515, -2)
  296. ----
  297. 500
  298. query RRR
  299. SELECT round(CAST (515 AS decimal), -3), round(515, -3), round(CAST (515 AS decimal(4, 0)), -3)
  300. ----
  301. 1000 1000 1000
  302. query R
  303. SELECT round(748.58, -4)
  304. ----
  305. 0
  306. query RR
  307. SELECT round(123.9994, 3), round(123.9995, 3)
  308. ----
  309. 123.999 124
  310. query RR
  311. SELECT round(123.4545, 2), round(123.45, -2)
  312. ----
  313. 123.45 100
  314. query R
  315. SELECT round(150.75, 0)
  316. ----
  317. 151
  318. query R
  319. SELECT round(NULL)
  320. ----
  321. NULL
  322. # This needs an explicit cast while we develop the new decimal type in parallel.
  323. query R
  324. SELECT round(NULL::decimal, 2)
  325. ----
  326. NULL
  327. query R
  328. SELECT round(1.567, NULL)
  329. ----
  330. NULL
  331. # This needs an explicit cast while we develop the new decimal type in parallel.
  332. query R
  333. SELECT round(NULL::decimal, NULL)
  334. ----
  335. NULL
  336. statement ok
  337. INSERT INTO nums VALUES (NULL)
  338. query R
  339. SELECT round((SELECT * FROM nums))
  340. ----
  341. NULL
  342. query R
  343. SELECT round((SELECT * FROM nums), 2)
  344. ----
  345. NULL
  346. query R
  347. SELECT round(2, (SELECT * FROM nums))
  348. ----
  349. NULL
  350. query R
  351. SELECT round((SELECT * FROM nums), (SELECT * FROM nums))
  352. ----
  353. NULL
  354. statement ok
  355. DROP TABLE nums
  356. statement ok
  357. CREATE TABLE nums (
  358. n float
  359. )
  360. statement ok
  361. INSERT INTO nums VALUES (NULL)
  362. query R
  363. SELECT round((SELECT * FROM nums));
  364. ----
  365. NULL
  366. query error db error: ERROR: function round\(double precision, integer\) does not exist
  367. SELECT round((SELECT * FROM nums), 2)
  368. query error db error: ERROR: function round\(double precision, double precision\) does not exist
  369. SELECT round((SELECT * FROM nums), (SELECT * FROM nums))
  370. query error db error: ERROR: function round\(numeric, double precision\) does not exist
  371. SELECT round(5.0, (SELECT * FROM nums))
  372. query R
  373. SELECT round(5.0, CAST ((SELECT * FROM nums) AS integer))
  374. ----
  375. NULL
  376. query error db error: ERROR: function round\(double precision, integer\) does not exist
  377. SELECT round(CAST (5.0 AS double precision), 3)
  378. query error db error: ERROR: function round\(double precision, integer\) does not exist
  379. SELECT round(CAST (5.0 AS float), 3)
  380. query error db error: ERROR: function round\(boolean, integer\) does not exist
  381. SELECT round(true, 3)
  382. query error
  383. SELECT round(true)
  384. query error db error: ERROR: function round\(double precision, numeric\) does not exist
  385. SELECT round(CAST (5.0 AS float), 3.0)
  386. query error db error: ERROR: function round\(double precision, double precision\) does not exist
  387. SELECT round(CAST (5.0 AS float), CAST (3.0 AS float))
  388. query R
  389. SELECT trunc(CAST (1.5678 AS float))
  390. ----
  391. 1
  392. query R
  393. SELECT trunc(CAST (-1.4678 AS float))
  394. ----
  395. -1
  396. query R
  397. SELECT trunc(CAST (1.5678 AS double precision))
  398. ----
  399. 1
  400. query R
  401. SELECT trunc(CAST (-1.4678 AS double precision))
  402. ----
  403. -1
  404. query R
  405. SELECT trunc(1.5678)
  406. ----
  407. 1
  408. query R
  409. SELECT trunc(-1.5678)
  410. ----
  411. -1
  412. query RRRRR
  413. SELECT trunc(1.1), trunc(1.111), trunc(100.1), trunc(100.11), trunc(-4.1)
  414. ----
  415. 1 1 100 100 -4
  416. # postgres converts ints to floats on trunc
  417. query R
  418. SELECT trunc(1)
  419. ----
  420. 1
  421. query R
  422. SELECT trunc(NULL)
  423. ----
  424. NULL
  425. query R
  426. SELECT trunc(NULL::decimal)
  427. ----
  428. NULL
  429. query R
  430. SELECT trunc((SELECT * FROM nums))
  431. ----
  432. NULL
  433. query RRRR
  434. SELECT trunc('NaN'::decimal), trunc('Inf'::float), trunc(0), trunc(-0)
  435. ----
  436. NaN inf 0 0
  437. statement ok
  438. DELETE FROM nums
  439. statement ok
  440. INSERT INTO nums VALUES (1.5678)
  441. query R
  442. SELECT trunc(1.5678)
  443. ----
  444. 1
  445. statement ok
  446. DROP TABLE nums
  447. query error db error: ERROR: function trunc\(boolean\) does not exist
  448. SELECT trunc(true)
  449. query I
  450. SELECT 2147483646+1
  451. ----
  452. 2147483647
  453. query error numeric field overflow
  454. SELECT 2147483647+1
  455. statement error numeric field overflow
  456. SELECT 1073741824*2
  457. query I
  458. SELECT 9223372036854775806::bigint+1::bigint
  459. ----
  460. 9223372036854775807
  461. query error numeric field overflow
  462. SELECT 9223372036854775807::bigint+1::bigint
  463. query error numeric field overflow
  464. SELECT 9223372036854775807::bigint-(-1)::bigint
  465. query error numeric field overflow
  466. SELECT (-6734743351254754)::bigint * (-99783359317598)::bigint
  467. query error numeric field overflow
  468. SELECT (CAST(-6734743351254754 AS bigint) * CAST(-99783359317598 AS bigint))
  469. ### overflow and underflow checking ###
  470. statement ok
  471. SELECT '1e300'::float
  472. query error value out of range: overflow
  473. SELECT '1e300'::float * '1e200'::float
  474. query R
  475. SELECT 'Inf'::float * '1e200'::float
  476. ----
  477. inf
  478. query R
  479. SELECT '1e200'::float * '-Inf'::float
  480. ----
  481. -inf
  482. query error value out of range: underflow
  483. SELECT '1e-300'::float * '1e-200'::float
  484. query R
  485. SELECT '0.0'::float * '1e-200'::float
  486. ----
  487. 0
  488. query R
  489. SELECT '1e-300'::float * '0.0'::float
  490. ----
  491. 0
  492. query error value out of range: overflow
  493. SELECT '1e308'::float + '1e308'::float
  494. query R
  495. SELECT 'Inf'::float + '1e308'::float
  496. ----
  497. inf
  498. query R
  499. SELECT '1e308'::float + '-Inf'::float
  500. ----
  501. -inf
  502. query error value out of range: overflow
  503. SELECT '-1e308'::float - '1e308'::float
  504. query R
  505. SELECT 'Inf'::float - '1e308'::float
  506. ----
  507. inf
  508. query R
  509. SELECT '1e308'::float - '-Inf'::float
  510. ----
  511. inf
  512. query error division by zero
  513. SELECT '1e-300'::float / '0.0'::float
  514. query error value out of range: overflow
  515. SELECT '1e300'::float / '1e-30'::float
  516. query R
  517. SELECT 'Inf'::float / '1e-30'::float
  518. ----
  519. inf
  520. query error value out of range: underflow
  521. SELECT '1e-300'::float / '1e30'::float
  522. query R
  523. SELECT '1e-300'::float / 'Inf'::float
  524. ----
  525. 0
  526. query R
  527. SELECT '0.0'::float / 'Inf'::float
  528. ----
  529. 0
  530. statement ok
  531. SELECT '3e38'::float4
  532. query error value out of range: overflow
  533. SELECT '1e30'::float4 * '1e10'::float4
  534. query R
  535. SELECT 'Inf'::float4 * '1e10'::float4
  536. ----
  537. inf
  538. query R
  539. SELECT '1e30'::float4 * '-Inf'::float4
  540. ----
  541. -inf
  542. query error value out of range: underflow
  543. SELECT '1e-30'::float4 * '1e-20'::float4
  544. query R
  545. SELECT '0.0'::float4 * '1e-20'::float4
  546. ----
  547. 0
  548. query R
  549. SELECT '1e-30'::float4 * '0.0'::float4
  550. ----
  551. 0
  552. query error value out of range: overflow
  553. SELECT '3e38'::float4 + '3e38'::float4
  554. query R
  555. SELECT 'Inf'::float4 + '3e38'::float4
  556. ----
  557. inf
  558. query R
  559. SELECT '3e38'::float4 + '-Inf'::float4
  560. ----
  561. -inf
  562. query error value out of range: overflow
  563. SELECT '-3e38'::float4 - '3e38'::float4
  564. query R
  565. SELECT 'Inf'::float4 - '3e38'::float4
  566. ----
  567. inf
  568. query R
  569. SELECT '3e38'::float4 - '-Inf'::float4
  570. ----
  571. inf
  572. query error division by zero
  573. SELECT '1e-30'::float4 / '0.0'::float4
  574. query error value out of range: overflow
  575. SELECT '1e30'::float4 / '1e-20'::float4
  576. query R
  577. SELECT 'Inf'::float4 / '1e-20'::float4
  578. ----
  579. inf
  580. query error value out of range: underflow
  581. SELECT '1e-30'::float4 / '1e20'::float4
  582. query R
  583. SELECT '1e-30'::float4 / 'Inf'::float4
  584. ----
  585. 0
  586. query R
  587. SELECT '0.0'::float4 / 'Inf'::float4
  588. ----
  589. 0
  590. ### bitwise operators ###
  591. # dummy table and data needed for tests
  592. statement ok
  593. DROP TABLE IF EXISTS nums
  594. statement ok
  595. CREATE TABLE nums (
  596. x1 int2,
  597. x2 int2,
  598. x3 int2,
  599. y1 int4,
  600. y2 int4,
  601. y3 int4,
  602. z1 int8,
  603. z2 int8,
  604. z3 int8
  605. )
  606. statement ok
  607. INSERT INTO nums VALUES (11, 12, 13, 21, 22, 23, 31, 32, 33)
  608. # negation
  609. query IIIII
  610. SELECT ~0, ~1, ~65535, ~2147483647, ~9223372036854775807
  611. ----
  612. -1 -2 -65536 -2147483648 -9223372036854775808
  613. # bitwise and
  614. query IIIII
  615. SELECT
  616. 3 & 4,
  617. 7 & 4,
  618. 7 & 14,
  619. 1342579021 & 1035032143,
  620. 2309456347094635094 & 4321056356463245221
  621. ----
  622. 0 4 6 268435533 2307057198754714116
  623. # bitwise or
  624. query IIIII
  625. SELECT
  626. 3 | 4,
  627. 7 | 4,
  628. 7 | 14,
  629. 1342579021 | 1035032143,
  630. 2309456347094635094 | 4321056356463245221
  631. ----
  632. 7 7 15 2109175631 4323455504803166199
  633. # bitwise xor
  634. query IIIII
  635. SELECT
  636. 3 # 4,
  637. 7 # 4,
  638. 7 # 14,
  639. 1342579021 # 1035032143,
  640. 2309456347094635094 # 4321056356463245221
  641. ----
  642. 7 3 9 1840740098 2016398306048452083
  643. # bitwise left shift
  644. query IIII
  645. SELECT
  646. no_bits,
  647. 1::int2 << no_bits as r2,
  648. 1::int4 << no_bits as r4,
  649. 1::int8 << no_bits as r8
  650. FROM
  651. (VALUES
  652. (-65), (-64), (-63),
  653. (-49), (-48), (-47),
  654. (-33), (-32), (-31),
  655. (-17), (-16), (-15),
  656. (-1), ( 0 ), ( +1),
  657. (+15), (+16), (+17),
  658. (+31), (+32), (+33),
  659. (+47), (+48), (+49),
  660. (+63), (+64), (+65)
  661. ) as params(no_bits)
  662. ORDER by
  663. no_bits
  664. ----
  665. -65 0 -2147483648 -9223372036854775808
  666. -64 1 1 1
  667. -63 2 2 2
  668. -49 -32768 32768 32768
  669. -48 0 65536 65536
  670. -47 0 131072 131072
  671. -33 0 -2147483648 2147483648
  672. -32 1 1 4294967296
  673. -31 2 2 8589934592
  674. -17 -32768 32768 140737488355328
  675. -16 0 65536 281474976710656
  676. -15 0 131072 562949953421312
  677. -1 0 -2147483648 -9223372036854775808
  678. 0 1 1 1
  679. 1 2 2 2
  680. 15 -32768 32768 32768
  681. 16 0 65536 65536
  682. 17 0 131072 131072
  683. 31 0 -2147483648 2147483648
  684. 32 1 1 4294967296
  685. 33 2 2 8589934592
  686. 47 -32768 32768 140737488355328
  687. 48 0 65536 281474976710656
  688. 49 0 131072 562949953421312
  689. 63 0 -2147483648 -9223372036854775808
  690. 64 1 1 1
  691. 65 2 2 2
  692. # bitwise right shift
  693. query IIII
  694. SELECT
  695. no_bits,
  696. -32767::int2 >> no_bits as r2,
  697. -2147483647::int4 >> no_bits as r4,
  698. -9223372036854775807::int8 >> no_bits as r8
  699. FROM
  700. (VALUES
  701. (-65), (-64), (-63),
  702. (-49), (-48), (-47),
  703. (-33), (-32), (-31),
  704. (-17), (-16), (-15),
  705. (-1), ( 0 ), ( +1),
  706. (+15), (+16), (+17),
  707. (+31), (+32), (+33),
  708. (+47), (+48), (+49),
  709. (+63), (+64), (+65)
  710. ) as params(no_bits)
  711. ORDER by
  712. no_bits
  713. ----
  714. -65 -1 -1 -1
  715. -64 -32767 -2147483647 -9223372036854775807
  716. -63 -16384 -1073741824 -4611686018427387904
  717. -49 -1 -65536 -281474976710656
  718. -48 -1 -32768 -140737488355328
  719. -47 -1 -16384 -70368744177664
  720. -33 -1 -1 -4294967296
  721. -32 -32767 -2147483647 -2147483648
  722. -31 -16384 -1073741824 -1073741824
  723. -17 -1 -65536 -65536
  724. -16 -1 -32768 -32768
  725. -15 -1 -16384 -16384
  726. -1 -1 -1 -1
  727. 0 -32767 -2147483647 -9223372036854775807
  728. 1 -16384 -1073741824 -4611686018427387904
  729. 15 -1 -65536 -281474976710656
  730. 16 -1 -32768 -140737488355328
  731. 17 -1 -16384 -70368744177664
  732. 31 -1 -1 -4294967296
  733. 32 -32767 -2147483647 -2147483648
  734. 33 -16384 -1073741824 -1073741824
  735. 47 -1 -65536 -65536
  736. 48 -1 -32768 -32768
  737. 49 -1 -16384 -16384
  738. 63 -1 -1 -1
  739. 64 -32767 -2147483647 -9223372036854775807
  740. 65 -16384 -1073741824 -4611686018427387904
  741. # precedence between bitwise operators
  742. query III
  743. SELECT
  744. 5 >> 1 << 3 as implicit_l,
  745. (5 >> 1) << 3 as explicit_l,
  746. 5 >> (1 << 3) as explicit_r
  747. ----
  748. 16 16 0
  749. query III
  750. SELECT
  751. 5 << 1 >> 3 as implicit_l,
  752. (5 << 1) >> 3 as explicit_l,
  753. 5 << (1 >> 3) as explicit_r
  754. ----
  755. 1 1 5
  756. query T multiline
  757. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT
  758. x1 >> x2 << x3 as r1,
  759. y1 << y2 >> y3 as r2
  760. FROM nums
  761. ----
  762. Explained Query:
  763. Project (#9, #10) // { arity: 2 }
  764. Map (((#0{x1} >> smallint_to_integer(#1{x2})) << smallint_to_integer(#2{x3})), ((#3{y1} << #4{y2}) >> #5{y3})) // { arity: 11 }
  765. ReadStorage materialize.public.nums // { arity: 9 }
  766. Source materialize.public.nums
  767. Target cluster: quickstart
  768. EOF
  769. # precedence between bitwise operators and '&'
  770. query III
  771. SELECT
  772. 5 >> 1 & 12 as implicit_l,
  773. (5 >> 1) & 12 as explicit_l,
  774. 5 >> (1 & 12) as explicit_r
  775. ----
  776. 0 0 5
  777. query III
  778. SELECT
  779. 5 << 1 & 12 as implicit_l,
  780. (5 << 1) & 12 as explicit_l,
  781. 5 << (1 & 12) as explicit_r
  782. ----
  783. 8 8 5
  784. query T multiline
  785. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT
  786. x1 >> x2 & x3 as r1,
  787. y1 << y2 & y3 as r2
  788. FROM nums
  789. ----
  790. Explained Query:
  791. Project (#9, #10) // { arity: 2 }
  792. Map (((#0{x1} >> smallint_to_integer(#1{x2})) & #2{x3}), ((#3{y1} << #4{y2}) & #5{y3})) // { arity: 11 }
  793. ReadStorage materialize.public.nums // { arity: 9 }
  794. Source materialize.public.nums
  795. Target cluster: quickstart
  796. EOF
  797. # precedence between '&' and '|'
  798. query III
  799. SELECT
  800. 0 & 0 | 1 as implicit_l,
  801. (0 & 0) | 1 as explicit_l,
  802. 0 & (0 | 1) as explicit_r
  803. ----
  804. 1 1 0
  805. query III
  806. SELECT
  807. 1 | 0 & 0 as implicit_l,
  808. (1 | 0) & 0 as explicit_l,
  809. 1 | (0 & 0) as explicit_r
  810. ----
  811. 0 0 1
  812. query T multiline
  813. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT
  814. x1 & x2 | x3 as r1,
  815. y1 & y2 | y3 as r2,
  816. z1 & z2 | z3 as r3,
  817. x1 & y2 | z3 as r4
  818. FROM nums
  819. ----
  820. Explained Query:
  821. Project (#9..=#12) // { arity: 4 }
  822. Map (((#0{x1} & #1{x2}) | #2{x3}), ((#3{y1} & #4{y2}) | #5{y3}), ((#6{z1} & #7{z2}) | #8{z3}), (integer_to_bigint((smallint_to_integer(#0{x1}) & #4{y2})) | #8{z3})) // { arity: 13 }
  823. ReadStorage materialize.public.nums // { arity: 9 }
  824. Source materialize.public.nums
  825. Target cluster: quickstart
  826. EOF
  827. # precedence between '&' and '#'
  828. query III
  829. SELECT
  830. 0 & 0 # 1 as implicit_l,
  831. (0 & 0) # 1 as explicit_l,
  832. 0 & (0 # 1) as explicit_r
  833. ----
  834. 1 1 0
  835. query III
  836. SELECT
  837. 1 # 0 & 0 as implicit_l,
  838. (1 # 0) & 0 as explicit_l,
  839. 1 # (0 & 0) as explicit_r
  840. ----
  841. 0 0 1
  842. query T multiline
  843. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT
  844. x1 # x2 & x3 as r1,
  845. y1 # y2 & y3 as r2,
  846. z1 # z2 & z3 as r3,
  847. x1 # y2 & z3 as r4
  848. FROM nums
  849. ----
  850. Explained Query:
  851. Project (#9..=#12) // { arity: 4 }
  852. Map (((#0{x1} # #1{x2}) & #2{x3}), ((#3{y1} # #4{y2}) & #5{y3}), ((#6{z1} # #7{z2}) & #8{z3}), (integer_to_bigint((smallint_to_integer(#0{x1}) # #4{y2})) & #8{z3})) // { arity: 13 }
  853. ReadStorage materialize.public.nums // { arity: 9 }
  854. Source materialize.public.nums
  855. Target cluster: quickstart
  856. EOF
  857. # precedence between '|' and '#'
  858. query III
  859. SELECT
  860. 1 | 0 # 1 as implicit_l,
  861. (1 | 0) # 1 as explicit_l,
  862. 1 | (0 # 1) as explicit_r
  863. ----
  864. 0 0 1
  865. query III
  866. SELECT
  867. 1 # 0 | 1 as implicit_l,
  868. (1 # 0) | 1 as explicit_l,
  869. 1 # (0 | 1) as explicit_r
  870. ----
  871. 1 1 0
  872. query T multiline
  873. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT
  874. x1 # x2 | x3 as r1,
  875. y1 # y2 | y3 as r2,
  876. z1 # z2 | z3 as r3,
  877. x1 # y2 | z3 as r4
  878. FROM nums
  879. ----
  880. Explained Query:
  881. Project (#9..=#12) // { arity: 4 }
  882. Map (((#0{x1} # #1{x2}) | #2{x3}), ((#3{y1} # #4{y2}) | #5{y3}), ((#6{z1} # #7{z2}) | #8{z3}), (integer_to_bigint((smallint_to_integer(#0{x1}) # #4{y2})) | #8{z3})) // { arity: 13 }
  883. ReadStorage materialize.public.nums // { arity: 9 }
  884. Source materialize.public.nums
  885. Target cluster: quickstart
  886. EOF
  887. # precedence between '~' and ("|", "&")
  888. query IIIIII
  889. SELECT
  890. ~1 & 0 as def_and, ~(1 & 0) as l_prec_and, (~1) & 0 as h_prec_and,
  891. ~0 | 1 as def_or , ~(0 | 1) as l_prec_or , (~0) | 1 as h_prec_or
  892. ----
  893. 0 -1 0 -1 -2 -1
  894. # precedence between '~' and ('+', '-')
  895. query IIIIII
  896. SELECT
  897. ~1 + 1 as def_add, ~(1 + 1) as l_prec_add, (~1) + 1 as h_prec_add,
  898. ~1 - 2 as def_sub, ~(1 - 2) as l_prec_sub, (~1) - 2 as h_prec_sub
  899. ----
  900. -3 -3 -1 0 0 -4
  901. # overflow for negating minimum integers
  902. query error "-32768" smallint out of range
  903. SELECT - '-32768'::int2
  904. query error "-32768" smallint out of range
  905. SELECT ABS('-32768'::int2)
  906. query error "-2147483648" integer out of range
  907. SELECT - '-2147483648'::int4
  908. query error "-2147483648" integer out of range
  909. SELECT ABS('-2147483648'::int4)
  910. query error "-9223372036854775808" bigint out of range
  911. SELECT - '-9223372036854775808'::int8
  912. query error "-9223372036854775808" bigint out of range
  913. SELECT ABS('-9223372036854775808'::int8)
  914. query error "-32768 / -1" smallint out of range
  915. SELECT '-32768'::int2 / '-1'::int2
  916. query error "-2147483648 / -1" integer out of range
  917. SELECT '-2147483648'::int4 / '-1'::int4
  918. query error "-9223372036854775808 / -1" bigint out of range
  919. SELECT '-9223372036854775808'::int8 / '-1'::int8
  920. query I
  921. SELECT '-32768'::int2 % '-1'::int2
  922. ----
  923. 0
  924. query I
  925. SELECT '-2147483648'::int4 % '-1'::int4
  926. ----
  927. 0
  928. query I
  929. SELECT '-9223372036854775808'::int8 % '-1'::int8
  930. ----
  931. 0