sl@0: # 2005 July 28 sl@0: # sl@0: # The author disclaims copyright to this source code. In place of sl@0: # a legal notice, here is a blessing: sl@0: # sl@0: # May you do good and not evil. sl@0: # May you find forgiveness for yourself and forgive others. sl@0: # May you share freely, never taking more than you give. sl@0: # sl@0: #*********************************************************************** sl@0: # This file implements regression tests for SQLite library. The sl@0: # focus of this file is testing the use of indices in WHERE clauses sl@0: # when the WHERE clause contains the BETWEEN operator. sl@0: # sl@0: # $Id: between.test,v 1.2 2006/01/17 09:35:02 danielk1977 Exp $ sl@0: sl@0: set testdir [file dirname $argv0] sl@0: source $testdir/tester.tcl sl@0: sl@0: # Build some test data sl@0: # sl@0: do_test between-1.0 { sl@0: execsql { sl@0: BEGIN; sl@0: CREATE TABLE t1(w int, x int, y int, z int); sl@0: } sl@0: for {set i 1} {$i<=100} {incr i} { sl@0: set w $i sl@0: set x [expr {int(log($i)/log(2))}] sl@0: set y [expr {$i*$i + 2*$i + 1}] sl@0: set z [expr {$x+$y}] sl@0: ifcapable tclvar { sl@0: # Random unplanned test of the $varname variable syntax. sl@0: execsql {INSERT INTO t1 VALUES($::w,$::x,$::y,$::z)} sl@0: } else { sl@0: # If the $varname syntax is not available, use the regular variable sl@0: # declaration syntax. sl@0: execsql {INSERT INTO t1 VALUES(:w,:x,:y,:z)} sl@0: } sl@0: } sl@0: execsql { sl@0: CREATE UNIQUE INDEX i1w ON t1(w); sl@0: CREATE INDEX i1xy ON t1(x,y); sl@0: CREATE INDEX i1zyx ON t1(z,y,x); sl@0: COMMIT; sl@0: } sl@0: } {} sl@0: sl@0: # This procedure executes the SQL. Then it appends to the result the sl@0: # "sort" or "nosort" keyword depending on whether or not any sorting sl@0: # is done. Then it appends the ::sqlite_query_plan variable. sl@0: # sl@0: proc queryplan {sql} { sl@0: set ::sqlite_sort_count 0 sl@0: set data [execsql $sql] sl@0: if {$::sqlite_sort_count} {set x sort} {set x nosort} sl@0: lappend data $x sl@0: return [concat $data $::sqlite_query_plan] sl@0: } sl@0: sl@0: do_test between-1.1.1 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE w BETWEEN 5 AND 6 ORDER BY +w sl@0: } sl@0: } {5 2 36 38 6 2 49 51 sort t1 i1w} sl@0: do_test between-1.1.2 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE +w BETWEEN 5 AND 6 ORDER BY +w sl@0: } sl@0: } {5 2 36 38 6 2 49 51 sort t1 {}} sl@0: do_test between-1.2.1 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE w BETWEEN 5 AND 65-y ORDER BY +w sl@0: } sl@0: } {5 2 36 38 6 2 49 51 sort t1 i1w} sl@0: do_test between-1.2.2 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE +w BETWEEN 5 AND 65-y ORDER BY +w sl@0: } sl@0: } {5 2 36 38 6 2 49 51 sort t1 {}} sl@0: do_test between-1.3.1 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE w BETWEEN 41-y AND 6 ORDER BY +w sl@0: } sl@0: } {5 2 36 38 6 2 49 51 sort t1 i1w} sl@0: do_test between-1.3.2 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE +w BETWEEN 41-y AND 6 ORDER BY +w sl@0: } sl@0: } {5 2 36 38 6 2 49 51 sort t1 {}} sl@0: do_test between-1.4 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE w BETWEEN 41-y AND 65-y ORDER BY +w sl@0: } sl@0: } {5 2 36 38 6 2 49 51 sort t1 {}} sl@0: do_test between-1.5.1 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE 26 BETWEEN y AND z ORDER BY +w sl@0: } sl@0: } {4 2 25 27 sort t1 i1zyx} sl@0: do_test between-1.5.2 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE 26 BETWEEN +y AND z ORDER BY +w sl@0: } sl@0: } {4 2 25 27 sort t1 i1zyx} sl@0: do_test between-1.5.3 { sl@0: queryplan { sl@0: SELECT * FROM t1 WHERE 26 BETWEEN y AND +z ORDER BY +w sl@0: } sl@0: } {4 2 25 27 sort t1 {}} sl@0: sl@0: sl@0: finish_test