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 17set testdir [file dirname $argv0]18source $testdir/tester.tcl19 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 numbers27#28foreach x {29 030 131 0x7f32 0x7fff33 0x7fffff34 0x7fffffff35 0x7fffffffff36 0x7fffffffffff37 0x7fffffffffffff38 0x7fffffffffffffff39} {40 set x [expr {wide($x)}]41 set boundarynum($x) 142 set boundarynum([expr {wide($x+1)}]) 143 set boundarynum([expr {wide(-($x+1))}]) 144 set boundarynum([expr {wide(-($x+2))}]) 145 set boundarynum([expr {wide($x+$x+1)}]) 146 set boundarynum([expr {wide($x+$x+2)}]) 147}48set x [expr {wide(127)}]49for {set i 1} {$i<=9} {incr i} {50 set boundarynum($x) 151 set boundarynum([expr {wide($x+1)}]) 152 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 $outlist68}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 $mn79 set mx $mn80 while {1} {81 set valid 082 foreach x $inlist {83 if {$x>$mx && (!$valid || $mn>$x)} {84 set mn $x85 set valid 186 }87 }88 if {!$valid} break89 lappend outlist $mn90 set mx $mn91 }92 return $outlist93}94 95# Reverse the order of a list96#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 $outlist104}105 106set nums1 [scramble [array names boundarynum]]107set nums2 [scramble [array names boundarynum]]108 109set tname boundary3110puts "do_test $tname-1.1 \173"111puts " db eval \173"112puts " CREATE TABLE t1(a,x);"113set a 0114foreach r $nums1 {115 incr a116 set t1ra($r) $a117 set t1ar($a) $r118 set x [format %016x [expr {wide($r)}]]119 set t1rx($r) $x120 set t1xr($x) $r121 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) 65142set t1ar(65) 9.22337303685477580800e+18)143puts " INSERT INTO t2 VALUES(-9.22337303685477580800e+18,66);"144set t1ra(-9.22337303685477580800e+18) 66145set t1ar(66) -9.22337303685477580800e+18)146puts " SELECT count(*) FROM t2;"147puts " \175"148puts "\175 {66}"149 150set nums3 $nums2151lappend nums3 9.22337303685477580800e+18152lappend nums3 -9.22337303685477580800e+18153 154set i 0155foreach r $nums3 {156 incr i157 158 set r5 $r.5159 set r0 $r.0160 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.1183 set rset {}184 set aset {}185 foreach rx $nums2 {186 if "\$rx $op \$r" {187 lappend rset $rx188 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.2199 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.3208 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.4222 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.5235 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.10253 if {[string length $r5]>15} continue254 set rset {}255 set aset {}256 foreach rx $nums2 {257 if "\$rx $op \$r0" {258 lappend rset $rx259 }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.11273 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 