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.1.1.1 2012/02/21 17:04:16 misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>