Home | History | Annotate | Download | only in test
      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: boundary1.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 boundary1
    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 set nums3 $nums2
    136 lappend nums3 9.22337303685477580800e+18
    137 lappend nums3 -9.22337303685477580800e+18
    138 
    139 set i 0
    140 foreach r $nums3 {
    141   incr i
    142 
    143   if {abs($r)<9.22337203685477580800e+18} {
    144     set x $t1rx($r)
    145     set a $t1ra($r)
    146     set r5 $r.5
    147     set r0 $r.0
    148     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.1
    168     set rset {}
    169     set aset {}
    170     foreach rx $nums2 {
    171       if "\$rx $op \$r" {
    172         lappend rset $rx
    173         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.2
    183     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.3
    190     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.4
    201     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.5
    212     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.10
    228     if {abs($r)>9223372036854775808 || [string length $r5]>15} continue
    229     set rset {}
    230     set aset {}
    231     foreach rx $nums2 {
    232       if "\$rx $op \$r0" {
    233         lappend rset $rx
    234       }
    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.11
    246     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.12
    258     set rset {}
    259     set aset {}
    260     foreach rx $nums2 {
    261       if "\$rx $op \$r5" {
    262         lappend rset $rx
    263       }
    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.13
    275     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 
    289 puts {finish_test}
    290