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: boundary1.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 boundary1111puts "do_test $tname-1.1 \173"112puts " db eval \173"113puts " CREATE TABLE t1(a,x);"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(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 $nums2136lappend nums3 9.22337303685477580800e+18137lappend nums3 -9.22337303685477580800e+18138 139set i 0140foreach r $nums3 {141 incr i142 143 if {abs($r)<9.22337203685477580800e+18} {144 set x $t1rx($r)145 set a $t1ra($r)146 set r5 $r.5147 set r0 $r.0148 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.1168 set rset {}169 set aset {}170 foreach rx $nums2 {171 if "\$rx $op \$r" {172 lappend rset $rx173 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.2183 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.3190 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.4201 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.5212 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.10228 if {abs($r)>9223372036854775808 || [string length $r5]>15} continue229 set rset {}230 set aset {}231 foreach rx $nums2 {232 if "\$rx $op \$r0" {233 lappend rset $rx234 }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.11246 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.12258 set rset {}259 set aset {}260 foreach rx $nums2 {261 if "\$rx $op \$r5" {262 lappend rset $rx263 }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.13275 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 