persistentstorage/sqlite3api/TEST/TclScript/between.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 # 2005 July 28
       
     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.  The
       
    12 # focus of this file is testing the use of indices in WHERE clauses
       
    13 # when the WHERE clause contains the BETWEEN operator.
       
    14 #
       
    15 # $Id: between.test,v 1.2 2006/01/17 09:35:02 danielk1977 Exp $
       
    16 
       
    17 set testdir [file dirname $argv0]
       
    18 source $testdir/tester.tcl
       
    19 
       
    20 # Build some test data
       
    21 #
       
    22 do_test between-1.0 {
       
    23   execsql {
       
    24     BEGIN;
       
    25     CREATE TABLE t1(w int, x int, y int, z int);
       
    26   }
       
    27   for {set i 1} {$i<=100} {incr i} {
       
    28     set w $i
       
    29     set x [expr {int(log($i)/log(2))}]
       
    30     set y [expr {$i*$i + 2*$i + 1}]
       
    31     set z [expr {$x+$y}]
       
    32     ifcapable tclvar {
       
    33       # Random unplanned test of the $varname variable syntax.
       
    34       execsql {INSERT INTO t1 VALUES($::w,$::x,$::y,$::z)}
       
    35     } else {
       
    36       # If the $varname syntax is not available, use the regular variable
       
    37       # declaration syntax.
       
    38       execsql {INSERT INTO t1 VALUES(:w,:x,:y,:z)}
       
    39     }
       
    40   }
       
    41   execsql {
       
    42     CREATE UNIQUE INDEX i1w ON t1(w);
       
    43     CREATE INDEX i1xy ON t1(x,y);
       
    44     CREATE INDEX i1zyx ON t1(z,y,x);
       
    45     COMMIT;
       
    46   }
       
    47 } {}
       
    48 
       
    49 # This procedure executes the SQL.  Then it appends to the result the
       
    50 # "sort" or "nosort" keyword depending on whether or not any sorting
       
    51 # is done.  Then it appends the ::sqlite_query_plan variable.
       
    52 #
       
    53 proc queryplan {sql} {
       
    54   set ::sqlite_sort_count 0
       
    55   set data [execsql $sql]
       
    56   if {$::sqlite_sort_count} {set x sort} {set x nosort}
       
    57   lappend data $x
       
    58   return [concat $data $::sqlite_query_plan]
       
    59 }
       
    60 
       
    61 do_test between-1.1.1 {
       
    62   queryplan {
       
    63     SELECT * FROM t1 WHERE w BETWEEN 5 AND 6 ORDER BY +w
       
    64   }
       
    65 } {5 2 36 38 6 2 49 51 sort t1 i1w}
       
    66 do_test between-1.1.2 {
       
    67   queryplan {
       
    68     SELECT * FROM t1 WHERE +w BETWEEN 5 AND 6 ORDER BY +w
       
    69   }
       
    70 } {5 2 36 38 6 2 49 51 sort t1 {}}
       
    71 do_test between-1.2.1 {
       
    72   queryplan {
       
    73     SELECT * FROM t1 WHERE w BETWEEN 5 AND 65-y ORDER BY +w
       
    74   }
       
    75 } {5 2 36 38 6 2 49 51 sort t1 i1w}
       
    76 do_test between-1.2.2 {
       
    77   queryplan {
       
    78     SELECT * FROM t1 WHERE +w BETWEEN 5 AND 65-y ORDER BY +w
       
    79   }
       
    80 } {5 2 36 38 6 2 49 51 sort t1 {}}
       
    81 do_test between-1.3.1 {
       
    82   queryplan {
       
    83     SELECT * FROM t1 WHERE w BETWEEN 41-y AND 6 ORDER BY +w
       
    84   }
       
    85 } {5 2 36 38 6 2 49 51 sort t1 i1w}
       
    86 do_test between-1.3.2 {
       
    87   queryplan {
       
    88     SELECT * FROM t1 WHERE +w BETWEEN 41-y AND 6 ORDER BY +w
       
    89   }
       
    90 } {5 2 36 38 6 2 49 51 sort t1 {}}
       
    91 do_test between-1.4 {
       
    92   queryplan {
       
    93     SELECT * FROM t1 WHERE w BETWEEN 41-y AND 65-y ORDER BY +w
       
    94   }
       
    95 } {5 2 36 38 6 2 49 51 sort t1 {}}
       
    96 do_test between-1.5.1 {
       
    97   queryplan {
       
    98     SELECT * FROM t1 WHERE 26 BETWEEN y AND z ORDER BY +w
       
    99   }
       
   100 } {4 2 25 27 sort t1 i1zyx}
       
   101 do_test between-1.5.2 {
       
   102   queryplan {
       
   103     SELECT * FROM t1 WHERE 26 BETWEEN +y AND z ORDER BY +w
       
   104   }
       
   105 } {4 2 25 27 sort t1 i1zyx}
       
   106 do_test between-1.5.3 {
       
   107   queryplan {
       
   108     SELECT * FROM t1 WHERE 26 BETWEEN y AND +z ORDER BY +w
       
   109   }
       
   110 } {4 2 25 27 sort t1 {}}
       
   111 
       
   112 
       
   113 finish_test