gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/boundary3.tcl (about)

     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  
    17  set testdir [file dirname $argv0]
    18  source $testdir/tester.tcl
    19  
    20  # Many of the boundary tests depend on a working 64-bit implementation.
    21  if {![working_64bit_int]} { finish_test; return }
    22  }
    23  
    24  expr srand(0)
    25  
    26  # Generate interesting boundary numbers
    27  #
    28  foreach x {
    29    0
    30    1
    31    0x7f
    32    0x7fff
    33    0x7fffff
    34    0x7fffffff
    35    0x7fffffffff
    36    0x7fffffffffff
    37    0x7fffffffffffff
    38    0x7fffffffffffffff
    39  } {
    40    set x [expr {wide($x)}]
    41    set boundarynum($x) 1
    42    set boundarynum([expr {wide($x+1)}]) 1
    43    set boundarynum([expr {wide(-($x+1))}]) 1
    44    set boundarynum([expr {wide(-($x+2))}]) 1
    45    set boundarynum([expr {wide($x+$x+1)}]) 1
    46    set boundarynum([expr {wide($x+$x+2)}]) 1
    47  }
    48  set x [expr {wide(127)}]
    49  for {set i 1} {$i<=9} {incr i} {
    50    set boundarynum($x) 1
    51    set boundarynum([expr {wide($x+1)}]) 1
    52    set x [expr {wide($x*128 + 127)}]
    53  }
    54  
    55  # Scramble the $inlist into a random order.
    56  #
    57  proc 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 $outlist
    68  }
    69  
    70  # A simple selection sort.  Not trying to be efficient.
    71  #
    72  proc 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 $mn
    79    set mx $mn
    80    while {1} {
    81      set valid 0
    82      foreach x $inlist {
    83        if {$x>$mx && (!$valid || $mn>$x)} {
    84          set mn $x
    85          set valid 1
    86        }
    87      }
    88      if {!$valid} break
    89      lappend outlist $mn
    90      set mx $mn
    91    }
    92    return $outlist
    93  }
    94  
    95  # Reverse the order of a list
    96  #
    97  proc 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 $outlist
   104  }
   105  
   106  set nums1 [scramble [array names boundarynum]]
   107  set nums2 [scramble [array names boundarynum]]
   108  
   109  set tname boundary3
   110  puts "do_test $tname-1.1 \173"
   111  puts "  db eval \173"
   112  puts "    CREATE TABLE t1(a,x);"
   113  set a 0
   114  foreach r $nums1 {
   115    incr a
   116    set t1ra($r) $a
   117    set t1ar($a) $r
   118    set x [format %016x [expr {wide($r)}]]
   119    set t1rx($r) $x
   120    set t1xr($x) $r
   121    puts "    INSERT INTO t1(oid,a,x) VALUES($r,$a,'$x');"
   122  }
   123  puts "    CREATE INDEX t1i1 ON t1(a);"
   124  puts "    CREATE INDEX t1i2 ON t1(x);"
   125  puts "  \175"
   126  puts "\175 {}"
   127  
   128  puts "do_test $tname-1.2 \173"
   129  puts "  db eval \173"
   130  puts "    SELECT count(*) FROM t1"
   131  puts "  \175"
   132  puts "\175 {64}"
   133  
   134  puts "do_test $tname-1.3 \173"
   135  puts "  db eval \173"
   136  puts "    CREATE TABLE t2(r,a);"
   137  puts "    INSERT INTO t2 SELECT rowid, a FROM t1;"
   138  puts "    CREATE INDEX t2i1 ON t2(r);"
   139  puts "    CREATE INDEX t2i2 ON t2(a);"
   140  puts "    INSERT INTO t2 VALUES(9.22337303685477580800e+18,65);"
   141  set t1ra(9.22337303685477580800e+18) 65
   142  set t1ar(65) 9.22337303685477580800e+18)
   143  puts "    INSERT INTO t2 VALUES(-9.22337303685477580800e+18,66);"
   144  set t1ra(-9.22337303685477580800e+18) 66
   145  set t1ar(66) -9.22337303685477580800e+18)
   146  puts "    SELECT count(*) FROM t2;"
   147  puts "  \175"
   148  puts "\175 {66}"
   149  
   150  set nums3 $nums2
   151  lappend nums3 9.22337303685477580800e+18
   152  lappend nums3 -9.22337303685477580800e+18
   153  
   154  set i 0
   155  foreach r $nums3 {
   156    incr i
   157  
   158    set r5 $r.5
   159    set r0 $r.0
   160     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.1
   183      set rset {}
   184      set aset {}
   185      foreach rx $nums2 {
   186        if "\$rx $op \$r" {
   187          lappend rset $rx
   188          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.2
   199      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.3
   208      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.4
   222      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.5
   235      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.10
   253      if {[string length $r5]>15} continue
   254      set rset {}
   255      set aset {}
   256      foreach rx $nums2 {
   257        if "\$rx $op \$r0" {
   258          lappend rset $rx
   259        }
   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.11
   273      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  
   289  puts {finish_test}