1puts {# 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.3 2009/01/02 15:45:48 shane Exp $
17
18set testdir [file dirname $argv0]
19source $testdir/tester.tcl
20
21# Many of the boundary tests depend on a working 64-bit implementation.
22if {![working_64bit_int]} { finish_test; return }
23}
24
25expr srand(0)
26
27# Generate interesting boundary numbers
28#
29foreach 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}
49set x [expr {wide(127)}]
50for {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#
58proc 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#
73proc 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#
98proc 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
107set nums1 [scramble [array names boundarynum]]
108set nums2 [scramble [array names boundarynum]]
109
110set tname boundary2
111puts "do_test $tname-1.1 \173"
112puts "  db eval \173"
113puts "    CREATE TABLE t1(r INTEGER, a INTEGER, x TEXT);"
114set a 0
115foreach 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}
124puts "    CREATE INDEX t1i1 ON t1(r);"
125puts "    CREATE INDEX t1i2 ON t1(a);"
126puts "    CREATE INDEX t1i3 ON t1(x);"
127puts "  \175"
128puts "\175 {}"
129
130puts "do_test $tname-1.2 \173"
131puts "  db eval \173"
132puts "    SELECT count(*) FROM t1"
133puts "  \175"
134puts "\175 {64}"
135
136set nums3 $nums2
137lappend nums3 9.22337303685477580800e+18
138lappend nums3 -9.22337303685477580800e+18
139
140set i 0
141foreach 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
288puts "do_test $tname-3.1 \173"
289puts "  db eval \173"
290puts "    DROP INDEX t1i1;"
291puts "    DROP INDEX t1i2;"
292puts "    DROP INDEX t1i3;"
293puts "  \175"
294puts "\175 {}"
295
296set i 0
297foreach 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
445puts {finish_test}
446