1# 2008 Sep 1 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# 12# 13 14if {![info exists testdir]} { 15 set testdir [file join [file dirname [info script]] .. .. test] 16} 17source $testdir/tester.tcl 18 19ifcapable {!rtree || rtree_int_only} { 20 finish_test 21 return 22} 23 24# Operator Byte Value 25# ---------------------- 26# = 0x41 ('A') 27# <= 0x42 ('B') 28# < 0x43 ('C') 29# >= 0x44 ('D') 30# > 0x45 ('E') 31# ---------------------- 32 33proc rtree_strategy {sql} { 34 set ret [list] 35 db eval "explain $sql" a { 36 if {$a(opcode) eq "VFilter"} { 37 lappend ret $a(p4) 38 } 39 } 40 set ret 41} 42 43proc query_plan {sql} { 44 set ret [list] 45 db eval "explain query plan $sql" a { 46 lappend ret $a(detail) 47 } 48 set ret 49} 50 51do_test rtree6-1.1 { 52 execsql { 53 CREATE TABLE t2(k INTEGER PRIMARY KEY, v); 54 CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2); 55 } 56} {} 57 58do_test rtree6-1.2 { 59 rtree_strategy {SELECT * FROM t1 WHERE x1>10} 60} {E0} 61do_test rtree6-1.2.1 { 62 rtree_strategy {SELECT * FROM t1 WHERE x1>10 AND x2 LIKE '%x%'} 63} {E0} 64 65do_test rtree6-1.3 { 66 rtree_strategy {SELECT * FROM t1 WHERE x1<10} 67} {C0} 68 69do_test rtree6-1.4 { 70 rtree_strategy {SELECT * FROM t1,t2 WHERE k=ii AND x1<10} 71} {C0} 72 73do_test rtree6-1.5 { 74 rtree_strategy {SELECT * FROM t1,t2 WHERE k=+ii AND x1<10} 75} {C0} 76 77do_eqp_test rtree6.2.1 { 78 SELECT * FROM t1,t2 WHERE k=+ii AND x1<10 79} { 80 QUERY PLAN 81 |--SCAN TABLE t1 VIRTUAL TABLE INDEX 2:C0 82 `--SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?) 83} 84 85do_eqp_test rtree6.2.2 { 86 SELECT * FROM t1,t2 WHERE k=ii AND x1<10 87} { 88 QUERY PLAN 89 |--SCAN TABLE t1 VIRTUAL TABLE INDEX 2:C0 90 `--SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?) 91} 92 93do_eqp_test rtree6.2.3 { 94 SELECT * FROM t1,t2 WHERE k=ii 95} { 96 QUERY PLAN 97 |--SCAN TABLE t1 VIRTUAL TABLE INDEX 2: 98 `--SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?) 99} 100 101do_eqp_test rtree6.2.4.1 { 102 SELECT * FROM t1,t2 WHERE v=+ii and x1<10 and x2>10 103} { 104 QUERY PLAN 105 |--SCAN TABLE t1 VIRTUAL TABLE INDEX 2:C0E1 106 `--SEARCH TABLE t2 USING AUTOMATIC COVERING INDEX (v=?) 107} 108do_eqp_test rtree6.2.4.2 { 109 SELECT * FROM t1,t2 WHERE v=10 and x1<10 and x2>10 110} { 111 QUERY PLAN 112 |--SCAN TABLE t1 VIRTUAL TABLE INDEX 2:C0E1 113 `--SEARCH TABLE t2 USING AUTOMATIC PARTIAL COVERING INDEX (v=?) 114} 115 116do_eqp_test rtree6.2.5 { 117 SELECT * FROM t1,t2 WHERE k=ii AND x1<v 118} { 119 QUERY PLAN 120 |--SCAN TABLE t1 VIRTUAL TABLE INDEX 2: 121 `--SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?) 122} 123 124do_execsql_test rtree6-3.1 { 125 CREATE VIRTUAL TABLE t3 USING rtree(id, x1, x2, y1, y2); 126 INSERT INTO t3 VALUES(NULL, 1, 1, 2, 2); 127 SELECT * FROM t3 WHERE 128 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 129 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 130 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 131 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 132 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 133 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5; 134} {1 1.0 1.0 2.0 2.0} 135 136do_test rtree6.3.2 { 137 rtree_strategy { 138 SELECT * FROM t3 WHERE 139 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 140 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 141 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 142 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 143 } 144} {E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0} 145do_test rtree6.3.3 { 146 rtree_strategy { 147 SELECT * FROM t3 WHERE 148 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 149 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 150 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 151 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 152 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 153 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 154 } 155} {E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0} 156 157do_execsql_test rtree6-3.4 { 158 SELECT * FROM t3 WHERE x1>0.5 AND x1>0.8 AND x1>1.1 159} {} 160do_execsql_test rtree6-3.5 { 161 SELECT * FROM t3 WHERE 162 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 163 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 164 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 165 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 166 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 167 x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>1.1 168} {} 169 170expand_all_sql db 171finish_test 172