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: 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