gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/boundary1.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  # $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}