File: table_overflow.test

package info (click to toggle)
duckdb 1.5.1-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 299,196 kB
  • sloc: cpp: 865,414; ansic: 57,292; python: 18,871; sql: 12,663; lisp: 11,751; yacc: 7,412; lex: 1,682; sh: 747; makefile: 558
file content (202 lines) | stat: -rw-r--r-- 4,040 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# name: test/sql/overflow/table_overflow.test
# description: Test handling of integer overflows in table
# group: [overflow]

# statement ok
# PRAGMA enable_verification

# tinyint
statement ok
CREATE TABLE tinyints(i TINYINT);

statement ok
INSERT INTO tinyints VALUES (1), (10);

# addition
query I
SELECT i+100::TINYINT FROM tinyints ORDER BY 1;
----
101
110

# overflow in addition
statement error
SELECT i+120::TINYINT FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow

# no overflow if we filter the offending element
query I
SELECT i+120::TINYINT FROM tinyints WHERE i=1 ORDER BY 1;
----
121

# subtraction
query I
SELECT -100::TINYINT-i FROM tinyints ORDER BY 1;
----
-110
-101

statement error
SELECT -120::TINYINT-i FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow

# no overflow if we filter the offending element
query I
SELECT -120::TINYINT-i FROM tinyints WHERE i=1 ORDER BY 1;
----
-121

# addition with negation
statement error
SELECT -120::TINYINT + (-i) FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow

# multiple negations
statement error
SELECT -120::TINYINT + (-(-(-i))) FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow

# multiplication
query I
SELECT i*10::TINYINT FROM tinyints ORDER BY 1;
----
10
100

statement error
SELECT i*15::TINYINT FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow

statement error
SELECT (i*10::TINYINT)*10::TINYINT FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow

# no overflow if we filter the offending element
query I
SELECT (i*10::TINYINT)*10::TINYINT FROM tinyints WHERE i=1 ORDER BY 1;
----
100

# what if we have a subquery?
statement error
SELECT (i*10::TINYINT)*10::TINYINT FROM (SELECT * FROM tinyints) tbl(i) ORDER BY 1;
----
Out of Range Error: Overflow

query I
SELECT (i*10::TINYINT)*10::TINYINT FROM (SELECT * FROM tinyints) tbl(i) WHERE i=1 ORDER BY 1;
----
100

# what if we have a UNION in the subquery
statement error
SELECT (i*10::TINYINT)*10::TINYINT FROM (SELECT * FROM tinyints WHERE i=1 UNION ALL SELECT * FROM tinyints WHERE i=10) tbl(i) ORDER BY 1;
----
Out of Range Error: Overflow

# smallints
statement ok
CREATE TABLE smallints(i SMALLINT);

statement ok
INSERT INTO smallints VALUES (1), (10);

# overflow in various smallint ops
statement error
SELECT i+32765::SMALLINT FROM smallints
----
Out of Range Error: Overflow

query I
SELECT i+32765::SMALLINT FROM smallints WHERE i=1
----
32766

statement error
SELECT -32765::SMALLINT-i FROM smallints
----
Out of Range Error: Overflow

query I
SELECT -32765::SMALLINT-i FROM smallints WHERE i=1
----
-32766

statement error
SELECT i*10000::SMALLINT FROM smallints
----
Out of Range Error: Overflow

query I
SELECT i*10000::SMALLINT FROM smallints WHERE i=1
----
10000

# including a cast to tinyint
statement error
SELECT i::TINYINT+120::TINYINT FROM smallints
----
Out of Range Error: Overflow

query I
SELECT i::TINYINT+120::TINYINT FROM smallints WHERE i=1
----
121

# what if the smallint doesn't fit?
statement ok
INSERT INTO smallints VALUES (1000)

statement error
SELECT i::TINYINT FROM smallints
----
Conversion Error

query I
SELECT i::TINYINT+120::TINYINT FROM smallints WHERE i=1
----
121

# include multiple projections...
# include joins (specifically left joins! they add nulls)

# What about adding column types that end up overflowing?
statement ok
INSERT INTO smallints VALUES (30000);


statement error
SELECT integers1.i::SMALLINT + integers2.i::SMALLINT from smallints integers1, smallints integers2 where integers1.i = integers2.i;
----
Out of Range Error: Overflow

statement ok
CREATE TABLE smallints2 (j SMALLINT);

statement ok
INSERT INTO smallints2 VALUES (1), (10);

# no overflow, just some null values
query I rowsort
SELECT i + j from smallints si_left LEFT JOIN smallints2 si_right ON (i = j);
----
2
20
NULL
NULL

# insert 30000 into smallints 2
statement ok
INSERT INTO smallints2 VALUES (30000);

statement error
SELECT i + j from smallints LEFT JOIN smallints2  ON (i = j);
----
Out of Range Error: Overflow