Skip to content

Commit 1b23267

Browse files
wangyumdongjoon-hyun
authored andcommitted
[SPARK-28136][SQL][TEST] Port int8.sql
## What changes were proposed in this pull request? This PR is to port int8.sql from PostgreSQL regression tests. https://github.com/postgres/postgres/blob/REL_12_BETA2/src/test/regress/sql/int8.sql The expected results can be found in the link: https://github.com/postgres/postgres/blob/REL_12_BETA2/src/test/regress/expected/int8.out When porting the test cases, found two PostgreSQL specific features that do not exist in Spark SQL: [SPARK-28137](https://issues.apache.org/jira/browse/SPARK-28137): Missing Data Type Formatting Functions [SPARK-28027](https://issues.apache.org/jira/browse/SPARK-28027): Missing some mathematical operators Also, found three inconsistent behavior: [SPARK-26218](https://issues.apache.org/jira/browse/SPARK-28024): Throw exception on overflow for integers [SPARK-27923](https://issues.apache.org/jira/browse/SPARK-27923): Spark SQL insert bad inputs to NULL [SPARK-28028](https://issues.apache.org/jira/browse/SPARK-28028): Cast numeric to integral type need round [SPARK-2659](https://issues.apache.org/jira/browse/SPARK-2659): HiveQL: Division operator should always perform fractional division, for example: ```sql select 1/2; ``` ## How was this patch tested? N/A Closes apache#24933 from wangyum/SPARK-28136. Authored-by: Yuming Wang <[email protected]> Signed-off-by: Dongjoon Hyun <[email protected]>
1 parent a32c92c commit 1b23267

File tree

2 files changed

+1094
-0
lines changed

2 files changed

+1094
-0
lines changed
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
--
2+
-- Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
3+
--
4+
--
5+
-- INT8
6+
-- Test int8 64-bit integers.
7+
-- https://github.com/postgres/postgres/blob/REL_12_BETA2/src/test/regress/sql/int8.sql
8+
--
9+
CREATE TABLE INT8_TBL(q1 bigint, q2 bigint) USING parquet;
10+
11+
INSERT INTO INT8_TBL VALUES(trim(' 123 '),trim(' 456'));
12+
INSERT INTO INT8_TBL VALUES(trim('123 '),'4567890123456789');
13+
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
14+
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
15+
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
16+
17+
-- [SPARK-27923] Spark SQL insert there bad inputs to NULL
18+
-- bad inputs
19+
-- INSERT INTO INT8_TBL(q1) VALUES (' ');
20+
-- INSERT INTO INT8_TBL(q1) VALUES ('xxx');
21+
-- INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485');
22+
-- INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934');
23+
-- INSERT INTO INT8_TBL(q1) VALUES ('- 123');
24+
-- INSERT INTO INT8_TBL(q1) VALUES (' 345 5');
25+
-- INSERT INTO INT8_TBL(q1) VALUES ('');
26+
27+
SELECT * FROM INT8_TBL;
28+
29+
-- int8/int8 cmp
30+
SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
31+
SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
32+
SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
33+
SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
34+
SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
35+
SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
36+
37+
-- int8/int4 cmp
38+
SELECT * FROM INT8_TBL WHERE q2 = 456;
39+
SELECT * FROM INT8_TBL WHERE q2 <> 456;
40+
SELECT * FROM INT8_TBL WHERE q2 < 456;
41+
SELECT * FROM INT8_TBL WHERE q2 > 456;
42+
SELECT * FROM INT8_TBL WHERE q2 <= 456;
43+
SELECT * FROM INT8_TBL WHERE q2 >= 456;
44+
45+
-- int4/int8 cmp
46+
SELECT * FROM INT8_TBL WHERE 123 = q1;
47+
SELECT * FROM INT8_TBL WHERE 123 <> q1;
48+
SELECT * FROM INT8_TBL WHERE 123 < q1;
49+
SELECT * FROM INT8_TBL WHERE 123 > q1;
50+
SELECT * FROM INT8_TBL WHERE 123 <= q1;
51+
SELECT * FROM INT8_TBL WHERE 123 >= q1;
52+
53+
-- int8/int2 cmp
54+
SELECT * FROM INT8_TBL WHERE q2 = smallint('456');
55+
SELECT * FROM INT8_TBL WHERE q2 <> smallint('456');
56+
SELECT * FROM INT8_TBL WHERE q2 < smallint('456');
57+
SELECT * FROM INT8_TBL WHERE q2 > smallint('456');
58+
SELECT * FROM INT8_TBL WHERE q2 <= smallint('456');
59+
SELECT * FROM INT8_TBL WHERE q2 >= smallint('456');
60+
61+
-- int2/int8 cmp
62+
SELECT * FROM INT8_TBL WHERE smallint('123') = q1;
63+
SELECT * FROM INT8_TBL WHERE smallint('123') <> q1;
64+
SELECT * FROM INT8_TBL WHERE smallint('123') < q1;
65+
SELECT * FROM INT8_TBL WHERE smallint('123') > q1;
66+
SELECT * FROM INT8_TBL WHERE smallint('123') <= q1;
67+
SELECT * FROM INT8_TBL WHERE smallint('123') >= q1;
68+
69+
70+
SELECT '' AS five, q1 AS plus, -q1 AS minus FROM INT8_TBL;
71+
72+
SELECT '' AS five, q1, q2, q1 + q2 AS plus FROM INT8_TBL;
73+
SELECT '' AS five, q1, q2, q1 - q2 AS minus FROM INT8_TBL;
74+
SELECT '' AS three, q1, q2, q1 * q2 AS multiply FROM INT8_TBL;
75+
SELECT '' AS three, q1, q2, q1 * q2 AS multiply FROM INT8_TBL
76+
WHERE q1 < 1000 or (q2 > 0 and q2 < 1000);
77+
SELECT '' AS five, q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
78+
79+
SELECT '' AS five, q1, double(q1) FROM INT8_TBL;
80+
SELECT '' AS five, q2, double(q2) FROM INT8_TBL;
81+
82+
SELECT 37 + q1 AS plus4 FROM INT8_TBL;
83+
SELECT 37 - q1 AS minus4 FROM INT8_TBL;
84+
SELECT '' AS five, 2 * q1 AS `twice int4` FROM INT8_TBL;
85+
SELECT '' AS five, q1 * 2 AS `twice int4` FROM INT8_TBL;
86+
87+
-- [SPARK-2659] HiveQL: Division operator should always perform fractional division
88+
-- int8 op int4
89+
SELECT q1 + int(42) AS `8plus4`, q1 - int(42) AS `8minus4`, q1 * int(42) AS `8mul4`, q1 / int(42) AS `8div4` FROM INT8_TBL;
90+
-- int4 op int8
91+
SELECT int(246) + q1 AS `4plus8`, int(246) - q1 AS `4minus8`, int(246) * q1 AS `4mul8`, int(246) / q1 AS `4div8` FROM INT8_TBL;
92+
93+
-- int8 op int2
94+
SELECT q1 + smallint(42) AS `8plus2`, q1 - smallint(42) AS `8minus2`, q1 * smallint(42) AS `8mul2`, q1 / smallint(42) AS `8div2` FROM INT8_TBL;
95+
-- int2 op int8
96+
SELECT smallint(246) + q1 AS `2plus8`, smallint(246) - q1 AS `2minus8`, smallint(246) * q1 AS `2mul8`, smallint(246) / q1 AS `2div8` FROM INT8_TBL;
97+
98+
SELECT q2, abs(q2) FROM INT8_TBL;
99+
SELECT min(q1), min(q2) FROM INT8_TBL;
100+
SELECT max(q1), max(q2) FROM INT8_TBL;
101+
102+
-- [SPARK-28137] Missing Data Type Formatting Functions
103+
-- TO_CHAR()
104+
--
105+
-- SELECT '' AS to_char_1, to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999')
106+
-- FROM INT8_TBL;
107+
108+
-- SELECT '' AS to_char_2, to_char(q1, '9G999G999G999G999G999D999G999'), to_char(q2, '9,999,999,999,999,999.999,999')
109+
-- FROM INT8_TBL;
110+
111+
-- SELECT '' AS to_char_3, to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR')
112+
-- FROM INT8_TBL;
113+
114+
-- SELECT '' AS to_char_4, to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999')
115+
-- FROM INT8_TBL;
116+
117+
-- SELECT '' AS to_char_5, to_char(q2, 'MI9999999999999999') FROM INT8_TBL;
118+
-- SELECT '' AS to_char_6, to_char(q2, 'FMS9999999999999999') FROM INT8_TBL;
119+
-- SELECT '' AS to_char_7, to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL;
120+
-- SELECT '' AS to_char_8, to_char(q2, 'SG9999999999999999th') FROM INT8_TBL;
121+
-- SELECT '' AS to_char_9, to_char(q2, '0999999999999999') FROM INT8_TBL;
122+
-- SELECT '' AS to_char_10, to_char(q2, 'S0999999999999999') FROM INT8_TBL;
123+
-- SELECT '' AS to_char_11, to_char(q2, 'FM0999999999999999') FROM INT8_TBL;
124+
-- SELECT '' AS to_char_12, to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL;
125+
-- SELECT '' AS to_char_13, to_char(q2, 'L9999999999999999.000') FROM INT8_TBL;
126+
-- SELECT '' AS to_char_14, to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL;
127+
-- 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') FROM INT8_TBL;
128+
-- SELECT '' AS to_char_16, to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL;
129+
-- SELECT '' AS to_char_17, to_char(q2, '999999SG9999999999') FROM INT8_TBL;
130+
131+
-- [SPARK-26218] Throw exception on overflow for integers
132+
-- check min/max values and overflow behavior
133+
134+
-- select bigint('-9223372036854775808');
135+
-- select bigint('-9223372036854775809');
136+
-- select bigint('9223372036854775807');
137+
-- select bigint('9223372036854775808');
138+
139+
-- select bigint('9223372036854775808');
140+
141+
-- select -(bigint('-9223372036854775807'));
142+
-- select -(bigint('-9223372036854775808'));
143+
144+
-- select bigint('9223372036854775800') + bigint('9223372036854775800');
145+
-- select bigint('-9223372036854775800') + bigint('-9223372036854775800');
146+
147+
-- select bigint('9223372036854775800') - bigint('-9223372036854775800');
148+
-- select bigint('-9223372036854775800') - bigint('9223372036854775800');
149+
150+
-- select bigint('9223372036854775800') * bigint('9223372036854775800');
151+
152+
select bigint('9223372036854775800') / bigint('0');
153+
-- select bigint('9223372036854775800') % bigint('0');
154+
155+
-- select abs(bigint('-9223372036854775808'));
156+
157+
-- select bigint('9223372036854775800') + int('100');
158+
-- select bigint('-9223372036854775800') - int('100');
159+
-- select bigint('9223372036854775800') * int('100');
160+
161+
-- select int('100') + bigint('9223372036854775800');
162+
-- select int('-100') - bigint('9223372036854775800');
163+
-- select int('100') * bigint('9223372036854775800');
164+
165+
-- select bigint('9223372036854775800') + smallint('100');
166+
-- select bigint('-9223372036854775800') - smallint('100');
167+
-- select bigint('9223372036854775800') * smallint('100');
168+
select bigint('-9223372036854775808') / smallint('0');
169+
170+
-- select smallint('100') + bigint('9223372036854775800');
171+
-- select smallint('-100') - bigint('9223372036854775800');
172+
-- select smallint('100') * bigint('9223372036854775800');
173+
select smallint('100') / bigint('0');
174+
175+
SELECT CAST(q1 AS int) FROM int8_tbl WHERE q2 = 456;
176+
SELECT CAST(q1 AS int) FROM int8_tbl WHERE q2 <> 456;
177+
178+
SELECT CAST(q1 AS smallint) FROM int8_tbl WHERE q2 = 456;
179+
SELECT CAST(q1 AS smallint) FROM int8_tbl WHERE q2 <> 456;
180+
181+
SELECT CAST(smallint('42') AS bigint), CAST(smallint('-37') AS bigint);
182+
183+
SELECT CAST(q1 AS float), CAST(q2 AS double) FROM INT8_TBL;
184+
SELECT CAST(float('36854775807.0') AS bigint);
185+
SELECT CAST(double('922337203685477580700.0') AS bigint);
186+
187+
188+
-- [SPARK-28027] Missing some mathematical operators
189+
-- bit operations
190+
191+
-- SELECT q1, q2, q1 & q2 AS `and`, q1 | q2 AS `or`, q1 # q2 AS `xor`, ~q1 AS `not` FROM INT8_TBL;
192+
SELECT q1, q2, q1 & q2 AS `and`, q1 | q2 AS `or`, ~q1 AS `not` FROM INT8_TBL;
193+
-- SELECT q1, q1 << 2 AS `shl`, q1 >> 3 AS `shr` FROM INT8_TBL;
194+
195+
196+
-- generate_series
197+
198+
SELECT * FROM range(bigint('+4567890123456789'), bigint('+4567890123456799'));
199+
SELECT * FROM range(bigint('+4567890123456789'), bigint('+4567890123456799'), 0);
200+
SELECT * FROM range(bigint('+4567890123456789'), bigint('+4567890123456799'), 2);
201+
202+
-- corner case
203+
SELECT string(shiftleft(bigint(-1), 63));
204+
SELECT string(int(shiftleft(bigint(-1), 63))+1);
205+
206+
-- [SPARK-26218] Throw exception on overflow for integers
207+
-- check sane handling of INT64_MIN overflow cases
208+
SELECT bigint((-9223372036854775808)) * bigint((-1));
209+
SELECT bigint((-9223372036854775808)) / bigint((-1));
210+
SELECT bigint((-9223372036854775808)) % bigint((-1));
211+
SELECT bigint((-9223372036854775808)) * int((-1));
212+
SELECT bigint((-9223372036854775808)) / int((-1));
213+
SELECT bigint((-9223372036854775808)) % int((-1));
214+
SELECT bigint((-9223372036854775808)) * smallint((-1));
215+
SELECT bigint((-9223372036854775808)) / smallint((-1));
216+
SELECT bigint((-9223372036854775808)) % smallint((-1));
217+
218+
-- [SPARK-28028] Cast numeric to integral type need round
219+
-- check rounding when casting from float
220+
SELECT x, bigint(x) AS int8_value
221+
FROM (VALUES (double(-2.5)),
222+
(double(-1.5)),
223+
(double(-0.5)),
224+
(double(0.0)),
225+
(double(0.5)),
226+
(double(1.5)),
227+
(double(2.5))) t(x);
228+
229+
-- check rounding when casting from numeric
230+
SELECT x, bigint(x) AS int8_value
231+
FROM (VALUES cast(-2.5 as decimal(38, 18)),
232+
cast(-1.5 as decimal(38, 18)),
233+
cast(-0.5 as decimal(38, 18)),
234+
cast(-0.0 as decimal(38, 18)),
235+
cast(0.5 as decimal(38, 18)),
236+
cast(1.5 as decimal(38, 18)),
237+
cast(2.5 as decimal(38, 18))) t(x);
238+
239+
DROP TABLE INT8_TBL;

0 commit comments

Comments
 (0)