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 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20# Many of the boundary tests depend on a working 64-bit implementation. 21if {![working_64bit_int]} { finish_test; return } 22} 23 24expr srand(0) 25 26# Generate interesting boundary numbers 27# 28foreach x { 29 0 30 1 31 0x7f 32 0x7fff 33 0x7fffff 34 0x7fffffff 35 0x7fffffffff 36 0x7fffffffffff 37 0x7fffffffffffff 38 0x7fffffffffffffff 39} { 40 set x [expr {wide($x)}] 41 set boundarynum($x) 1 42 set boundarynum([expr {wide($x+1)}]) 1 43 set boundarynum([expr {wide(-($x+1))}]) 1 44 set boundarynum([expr {wide(-($x+2))}]) 1 45 set boundarynum([expr {wide($x+$x+1)}]) 1 46 set boundarynum([expr {wide($x+$x+2)}]) 1 47} 48set x [expr {wide(127)}] 49for {set i 1} {$i<=9} {incr i} { 50 set boundarynum($x) 1 51 set boundarynum([expr {wide($x+1)}]) 1 52 set x [expr {wide($x*128 + 127)}] 53} 54 55# Scramble the $inlist into a random order. 56# 57proc scramble {inlist} { 58 set y {} 59 foreach x $inlist { 60 lappend y [list [expr {rand()}] $x] 61 } 62 set y [lsort $y] 63 set outlist {} 64 foreach x $y { 65 lappend outlist [lindex $x 1] 66 } 67 return $outlist 68} 69 70# A simple selection sort. Not trying to be efficient. 71# 72proc sort {inlist} { 73 set outlist {} 74 set mn [lindex $inlist 0] 75 foreach x $inlist { 76 if {$x<$mn} {set mn $x} 77 } 78 set outlist $mn 79 set mx $mn 80 while {1} { 81 set valid 0 82 foreach x $inlist { 83 if {$x>$mx && (!$valid || $mn>$x)} { 84 set mn $x 85 set valid 1 86 } 87 } 88 if {!$valid} break 89 lappend outlist $mn 90 set mx $mn 91 } 92 return $outlist 93} 94 95# Reverse the order of a list 96# 97proc reverse {inlist} { 98 set i [llength $inlist] 99 set outlist {} 100 for {incr i -1} {$i>=0} {incr i -1} { 101 lappend outlist [lindex $inlist $i] 102 } 103 return $outlist 104} 105 106set nums1 [scramble [array names boundarynum]] 107set nums2 [scramble [array names boundarynum]] 108 109set tname boundary3 110puts "do_test $tname-1.1 \173" 111puts " db eval \173" 112puts " CREATE TABLE t1(a,x);" 113set a 0 114foreach r $nums1 { 115 incr a 116 set t1ra($r) $a 117 set t1ar($a) $r 118 set x [format %016x [expr {wide($r)}]] 119 set t1rx($r) $x 120 set t1xr($x) $r 121 puts " INSERT INTO t1(oid,a,x) VALUES($r,$a,'$x');" 122} 123puts " CREATE INDEX t1i1 ON t1(a);" 124puts " CREATE INDEX t1i2 ON t1(x);" 125puts " \175" 126puts "\175 {}" 127 128puts "do_test $tname-1.2 \173" 129puts " db eval \173" 130puts " SELECT count(*) FROM t1" 131puts " \175" 132puts "\175 {64}" 133 134puts "do_test $tname-1.3 \173" 135puts " db eval \173" 136puts " CREATE TABLE t2(r,a);" 137puts " INSERT INTO t2 SELECT rowid, a FROM t1;" 138puts " CREATE INDEX t2i1 ON t2(r);" 139puts " CREATE INDEX t2i2 ON t2(a);" 140puts " INSERT INTO t2 VALUES(9.22337303685477580800e+18,65);" 141set t1ra(9.22337303685477580800e+18) 65 142set t1ar(65) 9.22337303685477580800e+18) 143puts " INSERT INTO t2 VALUES(-9.22337303685477580800e+18,66);" 144set t1ra(-9.22337303685477580800e+18) 66 145set t1ar(66) -9.22337303685477580800e+18) 146puts " SELECT count(*) FROM t2;" 147puts " \175" 148puts "\175 {66}" 149 150set nums3 $nums2 151lappend nums3 9.22337303685477580800e+18 152lappend nums3 -9.22337303685477580800e+18 153 154set i 0 155foreach r $nums3 { 156 incr i 157 158 set r5 $r.5 159 set r0 $r.0 160 if {abs($r)<0x7FFFFFFFFFFFFFFF || $r==-9223372036854775808} { 161 set x $t1rx($r) 162 set a $t1ra($r) 163 puts "do_test $tname-2.$i.1 \173" 164 puts " db eval \173" 165 puts " SELECT t1.* FROM t1, t2 WHERE t1.rowid=$r AND t2.a=t1.a" 166 puts " \175" 167 puts "\175 {$a $x}" 168 puts "do_test $tname-2.$i.2 \173" 169 puts " db eval \173" 170 puts " SELECT t2.* FROM t1 JOIN t2 USING(a) WHERE x='$x'" 171 puts " \175" 172 puts "\175 {$r $a}" 173 puts "do_test $tname-2.$i.3 \173" 174 puts " db eval \173" 175 puts " SELECT t1.rowid, x FROM t1 JOIN t2 ON t2.r=t1.rowid WHERE t2.a=$a" 176 puts " \175" 177 puts "\175 {$r $x}" 178 } 179 180 foreach op {> >= < <=} subno {gt ge lt le} { 181 182 ################################################################ 2.x.y.1 183 set rset {} 184 set aset {} 185 foreach rx $nums2 { 186 if "\$rx $op \$r" { 187 lappend rset $rx 188 lappend aset $t1ra($rx) 189 } 190 } 191 puts "do_test $tname-2.$i.$subno.1 \173" 192 puts " db eval \173" 193 puts " SELECT t2.a FROM t1 JOIN t2 USING(a)" 194 puts " WHERE t1.rowid $op $r ORDER BY t2.a" 195 puts " \175" 196 puts "\175 {[sort $aset]}" 197 198 ################################################################ 2.x.y.2 199 puts "do_test $tname-2.$i.$subno.2 \173" 200 puts " db eval \173" 201 puts " SELECT t2.a FROM t2 NATURAL JOIN t1" 202 puts " WHERE t1.rowid $op $r ORDER BY t1.a DESC" 203 puts " \175" 204 puts "\175 {[reverse [sort $aset]]}" 205 206 207 ################################################################ 2.x.y.3 208 set ax $t1ra($r) 209 set aset {} 210 foreach rx [sort $rset] { 211 lappend aset $t1ra($rx) 212 } 213 puts "do_test $tname-2.$i.$subno.3 \173" 214 puts " db eval \173" 215 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r" 216 puts " WHERE t2.a=$ax" 217 puts " ORDER BY t1.rowid" 218 puts " \175" 219 puts "\175 {$aset}" 220 221 ################################################################ 2.x.y.4 222 set aset {} 223 foreach rx [reverse [sort $rset]] { 224 lappend aset $t1ra($rx) 225 } 226 puts "do_test $tname-2.$i.$subno.4 \173" 227 puts " db eval \173" 228 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r" 229 puts " WHERE t2.a=$ax" 230 puts " ORDER BY t1.rowid DESC" 231 puts " \175" 232 puts "\175 {$aset}" 233 234 ################################################################ 2.x.y.5 235 set aset {} 236 set xset {} 237 foreach rx $rset { 238 lappend xset $t1rx($rx) 239 } 240 foreach x [sort $xset] { 241 set rx $t1xr($x) 242 lappend aset $t1ra($rx) 243 } 244 puts "do_test $tname-2.$i.$subno.5 \173" 245 puts " db eval \173" 246 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r" 247 puts " WHERE t2.a=$ax" 248 puts " ORDER BY x" 249 puts " \175" 250 puts "\175 {$aset}" 251 252 ################################################################ 2.x.y.10 253 if {[string length $r5]>15} continue 254 set rset {} 255 set aset {} 256 foreach rx $nums2 { 257 if "\$rx $op \$r0" { 258 lappend rset $rx 259 } 260 } 261 foreach rx [sort $rset] { 262 lappend aset $t1ra($rx) 263 } 264 puts "do_test $tname-2.$i.$subno.10 \173" 265 puts " db eval \173" 266 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op CAST(t2.r AS real)" 267 puts " WHERE t2.a=$ax" 268 puts " ORDER BY t1.rowid" 269 puts " \175" 270 puts "\175 {$aset}" 271 272 ################################################################ 2.x.y.11 273 set aset {} 274 foreach rx [reverse [sort $rset]] { 275 lappend aset $t1ra($rx) 276 } 277 puts "do_test $tname-2.$i.$subno.11 \173" 278 puts " db eval \173" 279 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op CAST(t2.r AS real)" 280 puts " WHERE t2.a=$ax" 281 puts " ORDER BY t1.rowid DESC" 282 puts " \175" 283 puts "\175 {$aset}" 284 } 285 286} 287 288 289puts {finish_test} 290