OLD | NEW |
| (Empty) |
1 puts {# 2008 December 11 | |
2 # | |
3 # The author disclaims copyright to this source code. In place of | |
4 # a legal notice, here is a blessing: | |
5 # | |
6 # May you do good and not evil. | |
7 # May you find forgiveness for yourself and forgive others. | |
8 # May you share freely, never taking more than you give. | |
9 # | |
10 #*********************************************************************** | |
11 # This file implements regression tests for SQLite library. | |
12 # | |
13 # This file is automatically generated from a separate TCL script. | |
14 # This file seeks to exercise integer boundary values. | |
15 # | |
16 | |
17 set testdir [file dirname $argv0] | |
18 source $testdir/tester.tcl | |
19 | |
20 # Many of the boundary tests depend on a working 64-bit implementation. | |
21 if {![working_64bit_int]} { finish_test; return } | |
22 } | |
23 | |
24 expr srand(0) | |
25 | |
26 # Generate interesting boundary numbers | |
27 # | |
28 foreach x { | |
29 0 | |
30 1 | |
31 0x7f | |
32 0x7fff | |
33 0x7fffff | |
34 0x7fffffff | |
35 0x7fffffffff | |
36 0x7fffffffffff | |
37 0x7fffffffffffff | |
38 0x7fffffffffffffff | |
39 } { | |
40 set x [expr {wide($x)}] | |
41 set boundarynum($x) 1 | |
42 set boundarynum([expr {wide($x+1)}]) 1 | |
43 set boundarynum([expr {wide(-($x+1))}]) 1 | |
44 set boundarynum([expr {wide(-($x+2))}]) 1 | |
45 set boundarynum([expr {wide($x+$x+1)}]) 1 | |
46 set boundarynum([expr {wide($x+$x+2)}]) 1 | |
47 } | |
48 set x [expr {wide(127)}] | |
49 for {set i 1} {$i<=9} {incr i} { | |
50 set boundarynum($x) 1 | |
51 set boundarynum([expr {wide($x+1)}]) 1 | |
52 set x [expr {wide($x*128 + 127)}] | |
53 } | |
54 | |
55 # Scramble the $inlist into a random order. | |
56 # | |
57 proc scramble {inlist} { | |
58 set y {} | |
59 foreach x $inlist { | |
60 lappend y [list [expr {rand()}] $x] | |
61 } | |
62 set y [lsort $y] | |
63 set outlist {} | |
64 foreach x $y { | |
65 lappend outlist [lindex $x 1] | |
66 } | |
67 return $outlist | |
68 } | |
69 | |
70 # A simple selection sort. Not trying to be efficient. | |
71 # | |
72 proc sort {inlist} { | |
73 set outlist {} | |
74 set mn [lindex $inlist 0] | |
75 foreach x $inlist { | |
76 if {$x<$mn} {set mn $x} | |
77 } | |
78 set outlist $mn | |
79 set mx $mn | |
80 while {1} { | |
81 set valid 0 | |
82 foreach x $inlist { | |
83 if {$x>$mx && (!$valid || $mn>$x)} { | |
84 set mn $x | |
85 set valid 1 | |
86 } | |
87 } | |
88 if {!$valid} break | |
89 lappend outlist $mn | |
90 set mx $mn | |
91 } | |
92 return $outlist | |
93 } | |
94 | |
95 # Reverse the order of a list | |
96 # | |
97 proc reverse {inlist} { | |
98 set i [llength $inlist] | |
99 set outlist {} | |
100 for {incr i -1} {$i>=0} {incr i -1} { | |
101 lappend outlist [lindex $inlist $i] | |
102 } | |
103 return $outlist | |
104 } | |
105 | |
106 set nums1 [scramble [array names boundarynum]] | |
107 set nums2 [scramble [array names boundarynum]] | |
108 | |
109 set tname boundary3 | |
110 puts "do_test $tname-1.1 \173" | |
111 puts " db eval \173" | |
112 puts " CREATE TABLE t1(a,x);" | |
113 set a 0 | |
114 foreach r $nums1 { | |
115 incr a | |
116 set t1ra($r) $a | |
117 set t1ar($a) $r | |
118 set x [format %016x [expr {wide($r)}]] | |
119 set t1rx($r) $x | |
120 set t1xr($x) $r | |
121 puts " INSERT INTO t1(oid,a,x) VALUES($r,$a,'$x');" | |
122 } | |
123 puts " CREATE INDEX t1i1 ON t1(a);" | |
124 puts " CREATE INDEX t1i2 ON t1(x);" | |
125 puts " \175" | |
126 puts "\175 {}" | |
127 | |
128 puts "do_test $tname-1.2 \173" | |
129 puts " db eval \173" | |
130 puts " SELECT count(*) FROM t1" | |
131 puts " \175" | |
132 puts "\175 {64}" | |
133 | |
134 puts "do_test $tname-1.3 \173" | |
135 puts " db eval \173" | |
136 puts " CREATE TABLE t2(r,a);" | |
137 puts " INSERT INTO t2 SELECT rowid, a FROM t1;" | |
138 puts " CREATE INDEX t2i1 ON t2(r);" | |
139 puts " CREATE INDEX t2i2 ON t2(a);" | |
140 puts " INSERT INTO t2 VALUES(9.22337303685477580800e+18,65);" | |
141 set t1ra(9.22337303685477580800e+18) 65 | |
142 set t1ar(65) 9.22337303685477580800e+18) | |
143 puts " INSERT INTO t2 VALUES(-9.22337303685477580800e+18,66);" | |
144 set t1ra(-9.22337303685477580800e+18) 66 | |
145 set t1ar(66) -9.22337303685477580800e+18) | |
146 puts " SELECT count(*) FROM t2;" | |
147 puts " \175" | |
148 puts "\175 {66}" | |
149 | |
150 set nums3 $nums2 | |
151 lappend nums3 9.22337303685477580800e+18 | |
152 lappend nums3 -9.22337303685477580800e+18 | |
153 | |
154 set i 0 | |
155 foreach r $nums3 { | |
156 incr i | |
157 | |
158 set r5 $r.5 | |
159 set r0 $r.0 | |
160 if {abs($r)<0x7FFFFFFFFFFFFFFF || $r==-9223372036854775808} { | |
161 set x $t1rx($r) | |
162 set a $t1ra($r) | |
163 puts "do_test $tname-2.$i.1 \173" | |
164 puts " db eval \173" | |
165 puts " SELECT t1.* FROM t1, t2 WHERE t1.rowid=$r AND t2.a=t1.a" | |
166 puts " \175" | |
167 puts "\175 {$a $x}" | |
168 puts "do_test $tname-2.$i.2 \173" | |
169 puts " db eval \173" | |
170 puts " SELECT t2.* FROM t1 JOIN t2 USING(a) WHERE x='$x'" | |
171 puts " \175" | |
172 puts "\175 {$r $a}" | |
173 puts "do_test $tname-2.$i.3 \173" | |
174 puts " db eval \173" | |
175 puts " SELECT t1.rowid, x FROM t1 JOIN t2 ON t2.r=t1.rowid WHERE t2.a=$a" | |
176 puts " \175" | |
177 puts "\175 {$r $x}" | |
178 } | |
179 | |
180 foreach op {> >= < <=} subno {gt ge lt le} { | |
181 | |
182 ################################################################ 2.x.y.1 | |
183 set rset {} | |
184 set aset {} | |
185 foreach rx $nums2 { | |
186 if "\$rx $op \$r" { | |
187 lappend rset $rx | |
188 lappend aset $t1ra($rx) | |
189 } | |
190 } | |
191 puts "do_test $tname-2.$i.$subno.1 \173" | |
192 puts " db eval \173" | |
193 puts " SELECT t2.a FROM t1 JOIN t2 USING(a)" | |
194 puts " WHERE t1.rowid $op $r ORDER BY t2.a" | |
195 puts " \175" | |
196 puts "\175 {[sort $aset]}" | |
197 | |
198 ################################################################ 2.x.y.2 | |
199 puts "do_test $tname-2.$i.$subno.2 \173" | |
200 puts " db eval \173" | |
201 puts " SELECT t2.a FROM t2 NATURAL JOIN t1" | |
202 puts " WHERE t1.rowid $op $r ORDER BY t1.a DESC" | |
203 puts " \175" | |
204 puts "\175 {[reverse [sort $aset]]}" | |
205 | |
206 | |
207 ################################################################ 2.x.y.3 | |
208 set ax $t1ra($r) | |
209 set aset {} | |
210 foreach rx [sort $rset] { | |
211 lappend aset $t1ra($rx) | |
212 } | |
213 puts "do_test $tname-2.$i.$subno.3 \173" | |
214 puts " db eval \173" | |
215 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r" | |
216 puts " WHERE t2.a=$ax" | |
217 puts " ORDER BY t1.rowid" | |
218 puts " \175" | |
219 puts "\175 {$aset}" | |
220 | |
221 ################################################################ 2.x.y.4 | |
222 set aset {} | |
223 foreach rx [reverse [sort $rset]] { | |
224 lappend aset $t1ra($rx) | |
225 } | |
226 puts "do_test $tname-2.$i.$subno.4 \173" | |
227 puts " db eval \173" | |
228 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r" | |
229 puts " WHERE t2.a=$ax" | |
230 puts " ORDER BY t1.rowid DESC" | |
231 puts " \175" | |
232 puts "\175 {$aset}" | |
233 | |
234 ################################################################ 2.x.y.5 | |
235 set aset {} | |
236 set xset {} | |
237 foreach rx $rset { | |
238 lappend xset $t1rx($rx) | |
239 } | |
240 foreach x [sort $xset] { | |
241 set rx $t1xr($x) | |
242 lappend aset $t1ra($rx) | |
243 } | |
244 puts "do_test $tname-2.$i.$subno.5 \173" | |
245 puts " db eval \173" | |
246 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r" | |
247 puts " WHERE t2.a=$ax" | |
248 puts " ORDER BY x" | |
249 puts " \175" | |
250 puts "\175 {$aset}" | |
251 | |
252 ################################################################ 2.x.y.10 | |
253 if {[string length $r5]>15} continue | |
254 set rset {} | |
255 set aset {} | |
256 foreach rx $nums2 { | |
257 if "\$rx $op \$r0" { | |
258 lappend rset $rx | |
259 } | |
260 } | |
261 foreach rx [sort $rset] { | |
262 lappend aset $t1ra($rx) | |
263 } | |
264 puts "do_test $tname-2.$i.$subno.10 \173" | |
265 puts " db eval \173" | |
266 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op CAST(t2.r AS real)" | |
267 puts " WHERE t2.a=$ax" | |
268 puts " ORDER BY t1.rowid" | |
269 puts " \175" | |
270 puts "\175 {$aset}" | |
271 | |
272 ################################################################ 2.x.y.11 | |
273 set aset {} | |
274 foreach rx [reverse [sort $rset]] { | |
275 lappend aset $t1ra($rx) | |
276 } | |
277 puts "do_test $tname-2.$i.$subno.11 \173" | |
278 puts " db eval \173" | |
279 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op CAST(t2.r AS real)" | |
280 puts " WHERE t2.a=$ax" | |
281 puts " ORDER BY t1.rowid DESC" | |
282 puts " \175" | |
283 puts "\175 {$aset}" | |
284 } | |
285 | |
286 } | |
287 | |
288 | |
289 puts {finish_test} | |
OLD | NEW |