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