Home | History | Annotate | Download | only in test
      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
    114