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: boundary1.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 boundary1
111puts "do_test $tname-1.1 \173"
112puts "  db eval \173"
113puts "    CREATE TABLE t1(a,x);"
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(oid,a,x) VALUES($r,$a,'$x');"
123}
124puts "    CREATE INDEX t1i1 ON t1(a);"
125puts "    CREATE INDEX t1i2 ON t1(x);"
126puts "  \175"
127puts "\175 {}"
128
129puts "do_test $tname-1.2 \173"
130puts "  db eval \173"
131puts "    SELECT count(*) FROM t1"
132puts "  \175"
133puts "\175 {64}"
134
135set nums3 $nums2
136lappend nums3 9.22337303685477580800e+18
137lappend nums3 -9.22337303685477580800e+18
138
139set i 0
140foreach r $nums3 {
141  incr i
142
143  if {abs($r)<9.22337203685477580800e+18} {
144    set x $t1rx($r)
145    set a $t1ra($r)
146    set r5 $r.5
147    set r0 $r.0
148    puts "do_test $tname-2.$i.1 \173"
149    puts "  db eval \173"
150    puts "    SELECT * FROM t1 WHERE rowid=$r"
151    puts "  \175"
152    puts "\175 {$a $x}"
153    puts "do_test $tname-2.$i.2 \173"
154    puts "  db eval \173"
155    puts "    SELECT rowid, a FROM t1 WHERE x='$x'"
156    puts "  \175"
157    puts "\175 {$r $a}"
158    puts "do_test $tname-2.$i.3 \173"
159    puts "  db eval \173"
160    puts "    SELECT rowid, x FROM t1 WHERE a=$a"
161    puts "  \175"
162    puts "\175 {$r $x}"
163  }
164
165  foreach op {> >= < <=} subno {gt ge lt le} {
166
167    ################################################################ 2.x.y.1
168    set rset {}
169    set aset {}
170    foreach rx $nums2 {
171      if "\$rx $op \$r" {
172        lappend rset $rx
173        lappend aset $t1ra($rx)
174      }
175    }
176    puts "do_test $tname-2.$i.$subno.1 \173"
177    puts "  db eval \173"
178    puts "    SELECT a FROM t1 WHERE rowid $op $r ORDER BY a"
179    puts "  \175"
180    puts "\175 {[sort $aset]}"
181
182    ################################################################ 2.x.y.2
183    puts "do_test $tname-2.$i.$subno.2 \173"
184    puts "  db eval \173"
185    puts "    SELECT a FROM t1 WHERE rowid $op $r ORDER BY a DESC"
186    puts "  \175"
187    puts "\175 {[reverse [sort $aset]]}"
188
189    ################################################################ 2.x.y.3
190    set aset {}
191    foreach rx [sort $rset] {
192      lappend aset $t1ra($rx)
193    }
194    puts "do_test $tname-2.$i.$subno.3 \173"
195    puts "  db eval \173"
196    puts "    SELECT a FROM t1 WHERE rowid $op $r ORDER BY rowid"
197    puts "  \175"
198    puts "\175 {$aset}"
199
200    ################################################################ 2.x.y.4
201    set aset {}
202    foreach rx [reverse [sort $rset]] {
203      lappend aset $t1ra($rx)
204    }
205    puts "do_test $tname-2.$i.$subno.4 \173"
206    puts "  db eval \173"
207    puts "    SELECT a FROM t1 WHERE rowid $op $r ORDER BY rowid DESC"
208    puts "  \175"
209    puts "\175 {$aset}"
210
211    ################################################################ 2.x.y.5
212    set aset {}
213    set xset {}
214    foreach rx $rset {
215      lappend xset $t1rx($rx)
216    }
217    foreach x [sort $xset] {
218      set rx $t1xr($x)
219      lappend aset $t1ra($rx)
220    }
221    puts "do_test $tname-2.$i.$subno.5 \173"
222    puts "  db eval \173"
223    puts "    SELECT a FROM t1 WHERE rowid $op $r ORDER BY x"
224    puts "  \175"
225    puts "\175 {$aset}"
226
227    ################################################################ 2.x.y.10
228    if {abs($r)>9223372036854775808 || [string length $r5]>15} continue
229    set rset {}
230    set aset {}
231    foreach rx $nums2 {
232      if "\$rx $op \$r0" {
233        lappend rset $rx
234      }
235    }
236    foreach rx [sort $rset] {
237      lappend aset $t1ra($rx)
238    }
239    puts "do_test $tname-2.$i.$subno.10 \173"
240    puts "  db eval \173"
241    puts "    SELECT a FROM t1 WHERE rowid $op $r0 ORDER BY rowid"
242    puts "  \175"
243    puts "\175 {$aset}"
244
245    ################################################################ 2.x.y.11
246    set aset {}
247    foreach rx [reverse [sort $rset]] {
248      lappend aset $t1ra($rx)
249    }
250    puts "do_test $tname-2.$i.$subno.11 \173"
251    puts "  db eval \173"
252    puts "    SELECT a FROM t1 WHERE rowid $op $r0 ORDER BY rowid DESC"
253    puts "  \175"
254    puts "\175 {$aset}"
255
256
257    ################################################################ 2.x.y.12
258    set rset {}
259    set aset {}
260    foreach rx $nums2 {
261      if "\$rx $op \$r5" {
262        lappend rset $rx
263      }
264    }
265    foreach rx [sort $rset] {
266      lappend aset $t1ra($rx)
267    }
268    puts "do_test $tname-2.$i.$subno.12 \173"
269    puts "  db eval \173"
270    puts "    SELECT a FROM t1 WHERE rowid $op $r5 ORDER BY rowid"
271    puts "  \175"
272    puts "\175 {$aset}"
273
274    ################################################################ 2.x.y.13
275    set aset {}
276    foreach rx [reverse [sort $rset]] {
277      lappend aset $t1ra($rx)
278    }
279    puts "do_test $tname-2.$i.$subno.13 \173"
280    puts "  db eval \173"
281    puts "    SELECT a FROM t1 WHERE rowid $op $r5 ORDER BY rowid DESC"
282    puts "  \175"
283    puts "\175 {$aset}"
284  }
285
286}
287
288
289puts {finish_test}
290