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: # $Id: boundary2.tcl,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
17:
18: set testdir [file dirname $argv0]
19: source $testdir/tester.tcl
20:
21: # Many of the boundary tests depend on a working 64-bit implementation.
22: if {![working_64bit_int]} { finish_test; return }
23: }
24:
25: expr srand(0)
26:
27: # Generate interesting boundary numbers
28: #
29: foreach x {
30: 0
31: 1
32: 0x7f
33: 0x7fff
34: 0x7fffff
35: 0x7fffffff
36: 0x7fffffffff
37: 0x7fffffffffff
38: 0x7fffffffffffff
39: 0x7fffffffffffffff
40: } {
41: set x [expr {wide($x)}]
42: set boundarynum($x) 1
43: set boundarynum([expr {$x+1}]) 1
44: set boundarynum([expr {-($x+1)}]) 1
45: set boundarynum([expr {-($x+2)}]) 1
46: set boundarynum([expr {$x+$x+1}]) 1
47: set boundarynum([expr {$x+$x+2}]) 1
48: }
49: set x [expr {wide(127)}]
50: for {set i 1} {$i<=9} {incr i} {
51: set boundarynum($x) 1
52: set boundarynum([expr {$x+1}]) 1
53: set x [expr {wide($x*128 + 127)}]
54: }
55:
56: # Scramble the $inlist into a random order.
57: #
58: proc scramble {inlist} {
59: set y {}
60: foreach x $inlist {
61: lappend y [list [expr {rand()}] $x]
62: }
63: set y [lsort $y]
64: set outlist {}
65: foreach x $y {
66: lappend outlist [lindex $x 1]
67: }
68: return $outlist
69: }
70:
71: # A simple selection sort. Not trying to be efficient.
72: #
73: proc sort {inlist} {
74: set outlist {}
75: set mn [lindex $inlist 0]
76: foreach x $inlist {
77: if {$x<$mn} {set mn $x}
78: }
79: set outlist $mn
80: set mx $mn
81: while {1} {
82: set valid 0
83: foreach x $inlist {
84: if {$x>$mx && (!$valid || $mn>$x)} {
85: set mn $x
86: set valid 1
87: }
88: }
89: if {!$valid} break
90: lappend outlist $mn
91: set mx $mn
92: }
93: return $outlist
94: }
95:
96: # Reverse the order of a list
97: #
98: proc reverse {inlist} {
99: set i [llength $inlist]
100: set outlist {}
101: for {incr i -1} {$i>=0} {incr i -1} {
102: lappend outlist [lindex $inlist $i]
103: }
104: return $outlist
105: }
106:
107: set nums1 [scramble [array names boundarynum]]
108: set nums2 [scramble [array names boundarynum]]
109:
110: set tname boundary2
111: puts "do_test $tname-1.1 \173"
112: puts " db eval \173"
113: puts " CREATE TABLE t1(r INTEGER, a INTEGER, x TEXT);"
114: set a 0
115: foreach r $nums1 {
116: incr a
117: set t1ra($r) $a
118: set t1ar($a) $r
119: set x [format %08x%08x [expr {wide($r)>>32}] $r]
120: set t1rx($r) $x
121: set t1xr($x) $r
122: puts " INSERT INTO t1 VALUES($r,$a,'$x');"
123: }
124: puts " CREATE INDEX t1i1 ON t1(r);"
125: puts " CREATE INDEX t1i2 ON t1(a);"
126: puts " CREATE INDEX t1i3 ON t1(x);"
127: puts " \175"
128: puts "\175 {}"
129:
130: puts "do_test $tname-1.2 \173"
131: puts " db eval \173"
132: puts " SELECT count(*) FROM t1"
133: puts " \175"
134: puts "\175 {64}"
135:
136: set nums3 $nums2
137: lappend nums3 9.22337303685477580800e+18
138: lappend nums3 -9.22337303685477580800e+18
139:
140: set i 0
141: foreach r $nums3 {
142: incr i
143:
144: if {abs($r)<9.22337203685477580800e+18} {
145: set x $t1rx($r)
146: set a $t1ra($r)
147: set r5 $r.5
148: set r0 $r.0
149: puts "do_test $tname-2.$i.1 \173"
150: puts " db eval \173"
151: puts " SELECT * FROM t1 WHERE r=$r"
152: puts " \175"
153: puts "\175 {$r $a $x}"
154: puts "do_test $tname-2.$i.2 \173"
155: puts " db eval \173"
156: puts " SELECT r, a FROM t1 WHERE x='$x'"
157: puts " \175"
158: puts "\175 {$r $a}"
159: puts "do_test $tname-2.$i.3 \173"
160: puts " db eval \173"
161: puts " SELECT r, x FROM t1 WHERE a=$a"
162: puts " \175"
163: puts "\175 {$r $x}"
164: }
165:
166: foreach op {> >= < <=} subno {gt ge lt le} {
167:
168: ################################################################ 2.x.y.1
169: set rset {}
170: set aset {}
171: foreach rx $nums2 {
172: if "\$rx $op \$r" {
173: lappend rset $rx
174: lappend aset $t1ra($rx)
175: }
176: }
177: puts "do_test $tname-2.$i.$subno.1 \173"
178: puts " db eval \173"
179: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY a"
180: puts " \175"
181: puts "\175 {[sort $aset]}"
182:
183: ################################################################ 2.x.y.2
184: puts "do_test $tname-2.$i.$subno.2 \173"
185: puts " db eval \173"
186: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY a DESC"
187: puts " \175"
188: puts "\175 {[reverse [sort $aset]]}"
189:
190: ################################################################ 2.x.y.3
191: set aset {}
192: foreach rx [sort $rset] {
193: lappend aset $t1ra($rx)
194: }
195: puts "do_test $tname-2.$i.$subno.3 \173"
196: puts " db eval \173"
197: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY r"
198: puts " \175"
199: puts "\175 {$aset}"
200:
201: ################################################################ 2.x.y.4
202: set aset {}
203: foreach rx [reverse [sort $rset]] {
204: lappend aset $t1ra($rx)
205: }
206: puts "do_test $tname-2.$i.$subno.4 \173"
207: puts " db eval \173"
208: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY r DESC"
209: puts " \175"
210: puts "\175 {$aset}"
211:
212: ################################################################ 2.x.y.5
213: set aset {}
214: set xset {}
215: foreach rx $rset {
216: lappend xset $t1rx($rx)
217: }
218: foreach x [sort $xset] {
219: set rx $t1xr($x)
220: lappend aset $t1ra($rx)
221: }
222: puts "do_test $tname-2.$i.$subno.5 \173"
223: puts " db eval \173"
224: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY x"
225: puts " \175"
226: puts "\175 {$aset}"
227:
228: ################################################################ 2.x.y.10
229: if {abs($r)>9223372036854775808 || [string length $r5]>15} continue
230: set rset {}
231: set aset {}
232: foreach rx $nums2 {
233: if "\$rx $op \$r0" {
234: lappend rset $rx
235: }
236: }
237: foreach rx [sort $rset] {
238: lappend aset $t1ra($rx)
239: }
240: puts "do_test $tname-2.$i.$subno.10 \173"
241: puts " db eval \173"
242: puts " SELECT a FROM t1 WHERE r $op $r0 ORDER BY r"
243: puts " \175"
244: puts "\175 {$aset}"
245:
246: ################################################################ 2.x.y.11
247: set aset {}
248: foreach rx [reverse [sort $rset]] {
249: lappend aset $t1ra($rx)
250: }
251: puts "do_test $tname-2.$i.$subno.11 \173"
252: puts " db eval \173"
253: puts " SELECT a FROM t1 WHERE r $op $r0 ORDER BY r DESC"
254: puts " \175"
255: puts "\175 {$aset}"
256:
257:
258: ################################################################ 2.x.y.12
259: set rset {}
260: set aset {}
261: foreach rx $nums2 {
262: if "\$rx $op \$r5" {
263: lappend rset $rx
264: }
265: }
266: foreach rx [sort $rset] {
267: lappend aset $t1ra($rx)
268: }
269: puts "do_test $tname-2.$i.$subno.12 \173"
270: puts " db eval \173"
271: puts " SELECT a FROM t1 WHERE r $op $r5 ORDER BY r"
272: puts " \175"
273: puts "\175 {$aset}"
274:
275: ################################################################ 2.x.y.13
276: set aset {}
277: foreach rx [reverse [sort $rset]] {
278: lappend aset $t1ra($rx)
279: }
280: puts "do_test $tname-2.$i.$subno.13 \173"
281: puts " db eval \173"
282: puts " SELECT a FROM t1 WHERE r $op $r5 ORDER BY r DESC"
283: puts " \175"
284: puts "\175 {$aset}"
285: }
286: }
287:
288: puts "do_test $tname-3.1 \173"
289: puts " db eval \173"
290: puts " DROP INDEX t1i1;"
291: puts " DROP INDEX t1i2;"
292: puts " DROP INDEX t1i3;"
293: puts " \175"
294: puts "\175 {}"
295:
296: set i 0
297: foreach r $nums3 {
298: incr i
299:
300: if {abs($r)<9.22337203685477580800e+18} {
301: set x $t1rx($r)
302: set a $t1ra($r)
303: set r5 $r.5
304: set r0 $r.0
305: puts "do_test $tname-4.$i.1 \173"
306: puts " db eval \173"
307: puts " SELECT * FROM t1 WHERE r=$r"
308: puts " \175"
309: puts "\175 {$r $a $x}"
310: puts "do_test $tname-4.$i.2 \173"
311: puts " db eval \173"
312: puts " SELECT r, a FROM t1 WHERE x='$x'"
313: puts " \175"
314: puts "\175 {$r $a}"
315: puts "do_test $tname-4.$i.3 \173"
316: puts " db eval \173"
317: puts " SELECT r, x FROM t1 WHERE a=$a"
318: puts " \175"
319: puts "\175 {$r $x}"
320: }
321:
322: foreach op {> >= < <=} subno {gt ge lt le} {
323:
324: ################################################################ 2.x.y.1
325: set rset {}
326: set aset {}
327: foreach rx $nums2 {
328: if "\$rx $op \$r" {
329: lappend rset $rx
330: lappend aset $t1ra($rx)
331: }
332: }
333: puts "do_test $tname-4.$i.$subno.1 \173"
334: puts " db eval \173"
335: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY a"
336: puts " \175"
337: puts "\175 {[sort $aset]}"
338:
339: ################################################################ 2.x.y.2
340: puts "do_test $tname-4.$i.$subno.2 \173"
341: puts " db eval \173"
342: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY a DESC"
343: puts " \175"
344: puts "\175 {[reverse [sort $aset]]}"
345:
346: ################################################################ 2.x.y.3
347: set aset {}
348: foreach rx [sort $rset] {
349: lappend aset $t1ra($rx)
350: }
351: puts "do_test $tname-4.$i.$subno.3 \173"
352: puts " db eval \173"
353: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY r"
354: puts " \175"
355: puts "\175 {$aset}"
356:
357: ################################################################ 2.x.y.4
358: set aset {}
359: foreach rx [reverse [sort $rset]] {
360: lappend aset $t1ra($rx)
361: }
362: puts "do_test $tname-4.$i.$subno.4 \173"
363: puts " db eval \173"
364: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY r DESC"
365: puts " \175"
366: puts "\175 {$aset}"
367:
368: ################################################################ 2.x.y.5
369: set aset {}
370: set xset {}
371: foreach rx $rset {
372: lappend xset $t1rx($rx)
373: }
374: foreach x [sort $xset] {
375: set rx $t1xr($x)
376: lappend aset $t1ra($rx)
377: }
378: puts "do_test $tname-4.$i.$subno.5 \173"
379: puts " db eval \173"
380: puts " SELECT a FROM t1 WHERE r $op $r ORDER BY x"
381: puts " \175"
382: puts "\175 {$aset}"
383:
384: ################################################################ 2.x.y.10
385: if {abs($r)>9223372036854775808 || [string length $r5]>15} continue
386: set rset {}
387: set aset {}
388: foreach rx $nums2 {
389: if "\$rx $op \$r0" {
390: lappend rset $rx
391: }
392: }
393: foreach rx [sort $rset] {
394: lappend aset $t1ra($rx)
395: }
396: puts "do_test $tname-4.$i.$subno.10 \173"
397: puts " db eval \173"
398: puts " SELECT a FROM t1 WHERE r $op $r0 ORDER BY r"
399: puts " \175"
400: puts "\175 {$aset}"
401:
402: ################################################################ 2.x.y.11
403: set aset {}
404: foreach rx [reverse [sort $rset]] {
405: lappend aset $t1ra($rx)
406: }
407: puts "do_test $tname-4.$i.$subno.11 \173"
408: puts " db eval \173"
409: puts " SELECT a FROM t1 WHERE r $op $r0 ORDER BY r DESC"
410: puts " \175"
411: puts "\175 {$aset}"
412:
413:
414: ################################################################ 2.x.y.12
415: set rset {}
416: set aset {}
417: foreach rx $nums2 {
418: if "\$rx $op \$r5" {
419: lappend rset $rx
420: }
421: }
422: foreach rx [sort $rset] {
423: lappend aset $t1ra($rx)
424: }
425: puts "do_test $tname-4.$i.$subno.12 \173"
426: puts " db eval \173"
427: puts " SELECT a FROM t1 WHERE r $op $r5 ORDER BY r"
428: puts " \175"
429: puts "\175 {$aset}"
430:
431: ################################################################ 2.x.y.13
432: set aset {}
433: foreach rx [reverse [sort $rset]] {
434: lappend aset $t1ra($rx)
435: }
436: puts "do_test $tname-4.$i.$subno.13 \173"
437: puts " db eval \173"
438: puts " SELECT a FROM t1 WHERE r $op $r5 ORDER BY r DESC"
439: puts " \175"
440: puts "\175 {$aset}"
441: }
442: }
443:
444:
445: puts {finish_test}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>