AryaWu/sqlite
0
1puts {# 2008 December 112#3# The author disclaims copyright to this source code. In place of4# 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.tcl20 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 numbers28#29foreach x {30 031 132 0x7f33 0x7fff34 0x7fffff35 0x7fffffff36 0x7fffffffff37 0x7fffffffffff38 0x7fffffffffffff39 0x7fffffffffffffff40} {41 set x [expr {wide($x)}]42 set boundarynum($x) 143 set boundarynum([expr {$x+1}]) 144 set boundarynum([expr {-($x+1)}]) 145 set boundarynum([expr {-($x+2)}]) 146 set boundarynum([expr {$x+$x+1}]) 147 set boundarynum([expr {$x+$x+2}]) 148}49set x [expr {wide(127)}]50for {set i 1} {$i<=9} {incr i} {51 set boundarynum($x) 152 set boundarynum([expr {$x+1}]) 153 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 $outlist69}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 $mn80 set mx $mn81 while {1} {82 set valid 083 foreach x $inlist {84 if {$x>$mx && (!$valid || $mn>$x)} {85 set mn $x86 set valid 187 }88 }89 if {!$valid} break90 lappend outlist $mn91 set mx $mn92 }93 return $outlist94}95 96# Reverse the order of a list97#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 $outlist105}106 107set nums1 [scramble [array names boundarynum]]108set nums2 [scramble [array names boundarynum]]109 110set tname boundary2111puts "do_test $tname-1.1 \173"112puts " db eval \173"113puts " CREATE TABLE t1(r INTEGER, a INTEGER, x TEXT);"114set a 0115foreach r $nums1 {116 incr a117 set t1ra($r) $a118 set t1ar($a) $r119 set x [format %08x%08x [expr {wide($r)>>32}] $r]120 set t1rx($r) $x121 set t1xr($x) $r122 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 $nums2137lappend nums3 9.22337303685477580800e+18138lappend nums3 -9.22337303685477580800e+18139 140set i 0141foreach r $nums3 {142 incr i143 144 if {abs($r)<9.22337203685477580800e+18} {145 set x $t1rx($r)146 set a $t1ra($r)147 set r5 $r.5148 set r0 $r.0149 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.1169 set rset {}170 set aset {}171 foreach rx $nums2 {172 if "\$rx $op \$r" {173 lappend rset $rx174 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.2184 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.3191 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.4202 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.5213 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.10229 if {abs($r)>9223372036854775808 || [string length $r5]>15} continue230 set rset {}231 set aset {}232 foreach rx $nums2 {233 if "\$rx $op \$r0" {234 lappend rset $rx235 }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.11247 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.12259 set rset {}260 set aset {}261 foreach rx $nums2 {262 if "\$rx $op \$r5" {263 lappend rset $rx264 }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.13276 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 0297foreach r $nums3 {298 incr i299 300 if {abs($r)<9.22337203685477580800e+18} {301 set x $t1rx($r)302 set a $t1ra($r)303 set r5 $r.5304 set r0 $r.0305 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.1325 set rset {}326 set aset {}327 foreach rx $nums2 {328 if "\$rx $op \$r" {329 lappend rset $rx330 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.2340 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.3347 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.4358 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.5369 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.10385 if {abs($r)>9223372036854775808 || [string length $r5]>15} continue386 set rset {}387 set aset {}388 foreach rx $nums2 {389 if "\$rx $op \$r0" {390 lappend rset $rx391 }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.11403 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.12415 set rset {}416 set aset {}417 foreach rx $nums2 {418 if "\$rx $op \$r5" {419 lappend rset $rx420 }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.13432 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 