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