1 puts {# 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: boundary3.tcl,v 1.3 2009/01/02 15:45:48 shane Exp $ 17 18 set testdir [file dirname $argv0] 19 source $testdir/tester.tcl 20 21 # Many of the boundary tests depend on a working 64-bit implementation. 22 if {![working_64bit_int]} { finish_test; return } 23 } 24 25 expr srand(0) 26 27 # Generate interesting boundary numbers 28 # 29 foreach 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 } 49 set x [expr {wide(127)}] 50 for {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 # 58 proc 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 # 73 proc 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 # 98 proc 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 107 set nums1 [scramble [array names boundarynum]] 108 set nums2 [scramble [array names boundarynum]] 109 110 set tname boundary3 111 puts "do_test $tname-1.1 \173" 112 puts " db eval \173" 113 puts " CREATE TABLE t1(a,x);" 114 set a 0 115 foreach 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 } 124 puts " CREATE INDEX t1i1 ON t1(a);" 125 puts " CREATE INDEX t1i2 ON t1(x);" 126 puts " \175" 127 puts "\175 {}" 128 129 puts "do_test $tname-1.2 \173" 130 puts " db eval \173" 131 puts " SELECT count(*) FROM t1" 132 puts " \175" 133 puts "\175 {64}" 134 135 puts "do_test $tname-1.3 \173" 136 puts " db eval \173" 137 puts " CREATE TABLE t2(r,a);" 138 puts " INSERT INTO t2 SELECT rowid, a FROM t1;" 139 puts " CREATE INDEX t2i1 ON t2(r);" 140 puts " CREATE INDEX t2i2 ON t2(a);" 141 puts " INSERT INTO t2 VALUES(9.22337303685477580800e+18,65);" 142 set t1ra(9.22337303685477580800e+18) 65 143 set t1ar(65) 9.22337303685477580800e+18) 144 puts " INSERT INTO t2 VALUES(-9.22337303685477580800e+18,66);" 145 set t1ra(-9.22337303685477580800e+18) 66 146 set t1ar(66) -9.22337303685477580800e+18) 147 puts " SELECT count(*) FROM t2;" 148 puts " \175" 149 puts "\175 {66}" 150 151 set nums3 $nums2 152 lappend nums3 9.22337303685477580800e+18 153 lappend nums3 -9.22337303685477580800e+18 154 155 set i 0 156 foreach r $nums3 { 157 incr i 158 159 set r5 $r.5 160 set r0 $r.0 161 if {abs($r)<9.22337203685477580800e+18} { 162 set x $t1rx($r) 163 set a $t1ra($r) 164 puts "do_test $tname-2.$i.1 \173" 165 puts " db eval \173" 166 puts " SELECT t1.* FROM t1, t2 WHERE t1.rowid=$r AND t2.a=t1.a" 167 puts " \175" 168 puts "\175 {$a $x}" 169 puts "do_test $tname-2.$i.2 \173" 170 puts " db eval \173" 171 puts " SELECT t2.* FROM t1 JOIN t2 USING(a) WHERE x='$x'" 172 puts " \175" 173 puts "\175 {$r $a}" 174 puts "do_test $tname-2.$i.3 \173" 175 puts " db eval \173" 176 puts " SELECT t1.rowid, x FROM t1 JOIN t2 ON t2.r=t1.rowid WHERE t2.a=$a" 177 puts " \175" 178 puts "\175 {$r $x}" 179 } 180 181 foreach op {> >= < <=} subno {gt ge lt le} { 182 183 ################################################################ 2.x.y.1 184 set rset {} 185 set aset {} 186 foreach rx $nums2 { 187 if "\$rx $op \$r" { 188 lappend rset $rx 189 lappend aset $t1ra($rx) 190 } 191 } 192 puts "do_test $tname-2.$i.$subno.1 \173" 193 puts " db eval \173" 194 puts " SELECT t2.a FROM t1 JOIN t2 USING(a)" 195 puts " WHERE t1.rowid $op $r ORDER BY t2.a" 196 puts " \175" 197 puts "\175 {[sort $aset]}" 198 199 ################################################################ 2.x.y.2 200 puts "do_test $tname-2.$i.$subno.2 \173" 201 puts " db eval \173" 202 puts " SELECT t2.a FROM t2 NATURAL JOIN t1" 203 puts " WHERE t1.rowid $op $r ORDER BY t1.a DESC" 204 puts " \175" 205 puts "\175 {[reverse [sort $aset]]}" 206 207 208 ################################################################ 2.x.y.3 209 set ax $t1ra($r) 210 set aset {} 211 foreach rx [sort $rset] { 212 lappend aset $t1ra($rx) 213 } 214 puts "do_test $tname-2.$i.$subno.3 \173" 215 puts " db eval \173" 216 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r" 217 puts " WHERE t2.a=$ax" 218 puts " ORDER BY t1.rowid" 219 puts " \175" 220 puts "\175 {$aset}" 221 222 ################################################################ 2.x.y.4 223 set aset {} 224 foreach rx [reverse [sort $rset]] { 225 lappend aset $t1ra($rx) 226 } 227 puts "do_test $tname-2.$i.$subno.4 \173" 228 puts " db eval \173" 229 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r" 230 puts " WHERE t2.a=$ax" 231 puts " ORDER BY t1.rowid DESC" 232 puts " \175" 233 puts "\175 {$aset}" 234 235 ################################################################ 2.x.y.5 236 set aset {} 237 set xset {} 238 foreach rx $rset { 239 lappend xset $t1rx($rx) 240 } 241 foreach x [sort $xset] { 242 set rx $t1xr($x) 243 lappend aset $t1ra($rx) 244 } 245 puts "do_test $tname-2.$i.$subno.5 \173" 246 puts " db eval \173" 247 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r" 248 puts " WHERE t2.a=$ax" 249 puts " ORDER BY x" 250 puts " \175" 251 puts "\175 {$aset}" 252 253 ################################################################ 2.x.y.10 254 if {[string length $r5]>15} continue 255 set rset {} 256 set aset {} 257 foreach rx $nums2 { 258 if "\$rx $op \$r0" { 259 lappend rset $rx 260 } 261 } 262 foreach rx [sort $rset] { 263 lappend aset $t1ra($rx) 264 } 265 puts "do_test $tname-2.$i.$subno.10 \173" 266 puts " db eval \173" 267 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op CAST(t2.r AS real)" 268 puts " WHERE t2.a=$ax" 269 puts " ORDER BY t1.rowid" 270 puts " \175" 271 puts "\175 {$aset}" 272 273 ################################################################ 2.x.y.11 274 set aset {} 275 foreach rx [reverse [sort $rset]] { 276 lappend aset $t1ra($rx) 277 } 278 puts "do_test $tname-2.$i.$subno.11 \173" 279 puts " db eval \173" 280 puts " SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op CAST(t2.r AS real)" 281 puts " WHERE t2.a=$ax" 282 puts " ORDER BY t1.rowid DESC" 283 puts " \175" 284 puts "\175 {$aset}" 285 } 286 287 } 288 289 290 puts {finish_test} 291