Add new testcase() macros and fix a bug that was revealed when trying to
[sqlite.git] / test / boundary1.tcl
blob3896b50463844ecf2bdb2110990e40fe0aa60e14
1 puts {# 2008 December 11
3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
13 # This file is automatically generated from a separate TCL script.
14 # This file seeks to exercise integer boundary values.
16 # $Id: boundary1.tcl,v 1.3 2009/01/02 15:45:48 shane Exp $
18 set testdir [file dirname $argv0]
19 source $testdir/tester.tcl
21 # Many of the boundary tests depend on a working 64-bit implementation.
22 if {![working_64bit_int]} { finish_test; return }
25 expr srand(0)
27 # Generate interesting boundary numbers
29 foreach x {
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
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)}]
56 # Scramble the $inlist into a random order.
58 proc scramble {inlist} {
59 set y {}
60 foreach x $inlist {
61 lappend y [list [expr {rand()}] $x]
63 set y [lsort $y]
64 set outlist {}
65 foreach x $y {
66 lappend outlist [lindex $x 1]
68 return $outlist
71 # A simple selection sort. Not trying to be efficient.
73 proc sort {inlist} {
74 set outlist {}
75 set mn [lindex $inlist 0]
76 foreach x $inlist {
77 if {$x<$mn} {set mn $x}
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
89 if {!$valid} break
90 lappend outlist $mn
91 set mx $mn
93 return $outlist
96 # Reverse the order of a list
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]
104 return $outlist
107 set nums1 [scramble [array names boundarynum]]
108 set nums2 [scramble [array names boundarynum]]
110 set tname boundary1
111 puts "do_test $tname-1.1 \173"
112 puts " db eval \173"
113 puts " CREATE TABLE t1(a,x);"
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(oid,a,x) VALUES($r,$a,'$x');"
124 puts " CREATE INDEX t1i1 ON t1(a);"
125 puts " CREATE INDEX t1i2 ON t1(x);"
126 puts " \175"
127 puts "\175 {}"
129 puts "do_test $tname-1.2 \173"
130 puts " db eval \173"
131 puts " SELECT count(*) FROM t1"
132 puts " \175"
133 puts "\175 {64}"
135 set nums3 $nums2
136 lappend nums3 9.22337303685477580800e+18
137 lappend nums3 -9.22337303685477580800e+18
139 set i 0
140 foreach r $nums3 {
141 incr i
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}"
165 foreach op {> >= < <=} subno {gt ge lt le} {
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)
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]}"
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]]}"
189 ################################################################ 2.x.y.3
190 set aset {}
191 foreach rx [sort $rset] {
192 lappend aset $t1ra($rx)
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}"
200 ################################################################ 2.x.y.4
201 set aset {}
202 foreach rx [reverse [sort $rset]] {
203 lappend aset $t1ra($rx)
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}"
211 ################################################################ 2.x.y.5
212 set aset {}
213 set xset {}
214 foreach rx $rset {
215 lappend xset $t1rx($rx)
217 foreach x [sort $xset] {
218 set rx $t1xr($x)
219 lappend aset $t1ra($rx)
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}"
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
236 foreach rx [sort $rset] {
237 lappend aset $t1ra($rx)
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}"
245 ################################################################ 2.x.y.11
246 set aset {}
247 foreach rx [reverse [sort $rset]] {
248 lappend aset $t1ra($rx)
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}"
257 ################################################################ 2.x.y.12
258 set rset {}
259 set aset {}
260 foreach rx $nums2 {
261 if "\$rx $op \$r5" {
262 lappend rset $rx
265 foreach rx [sort $rset] {
266 lappend aset $t1ra($rx)
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}"
274 ################################################################ 2.x.y.13
275 set aset {}
276 foreach rx [reverse [sort $rset]] {
277 lappend aset $t1ra($rx)
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}"
289 puts {finish_test}