1865d4d42Sdanielk1977# 2008 Sep 1 2865d4d42Sdanielk1977# 3865d4d42Sdanielk1977# The author disclaims copyright to this source code. In place of 4865d4d42Sdanielk1977# a legal notice, here is a blessing: 5865d4d42Sdanielk1977# 6865d4d42Sdanielk1977# May you do good and not evil. 7865d4d42Sdanielk1977# May you find forgiveness for yourself and forgive others. 8865d4d42Sdanielk1977# May you share freely, never taking more than you give. 9865d4d42Sdanielk1977# 10865d4d42Sdanielk1977#*********************************************************************** 11865d4d42Sdanielk1977# 12865d4d42Sdanielk1977# 13865d4d42Sdanielk1977 14865d4d42Sdanielk1977if {![info exists testdir]} { 15897230ebSdan set testdir [file join [file dirname [info script]] .. .. test] 16865d4d42Sdanielk1977} 17865d4d42Sdanielk1977source $testdir/tester.tcl 1858ed3743Sdanset testprefix rtree6 19865d4d42Sdanielk1977 202aad3da6Sdrhifcapable {!rtree || rtree_int_only} { 21865d4d42Sdanielk1977 finish_test 22865d4d42Sdanielk1977 return 23865d4d42Sdanielk1977} 24865d4d42Sdanielk1977 25865d4d42Sdanielk1977# Operator Byte Value 26865d4d42Sdanielk1977# ---------------------- 27865d4d42Sdanielk1977# = 0x41 ('A') 28865d4d42Sdanielk1977# <= 0x42 ('B') 29865d4d42Sdanielk1977# < 0x43 ('C') 30865d4d42Sdanielk1977# >= 0x44 ('D') 31865d4d42Sdanielk1977# > 0x45 ('E') 32865d4d42Sdanielk1977# ---------------------- 33865d4d42Sdanielk1977 34865d4d42Sdanielk1977proc rtree_strategy {sql} { 35865d4d42Sdanielk1977 set ret [list] 36865d4d42Sdanielk1977 db eval "explain $sql" a { 37865d4d42Sdanielk1977 if {$a(opcode) eq "VFilter"} { 38865d4d42Sdanielk1977 lappend ret $a(p4) 39865d4d42Sdanielk1977 } 40865d4d42Sdanielk1977 } 41865d4d42Sdanielk1977 set ret 42865d4d42Sdanielk1977} 43865d4d42Sdanielk1977 44865d4d42Sdanielk1977proc query_plan {sql} { 45865d4d42Sdanielk1977 set ret [list] 46865d4d42Sdanielk1977 db eval "explain query plan $sql" a { 47865d4d42Sdanielk1977 lappend ret $a(detail) 48865d4d42Sdanielk1977 } 49865d4d42Sdanielk1977 set ret 50865d4d42Sdanielk1977} 51865d4d42Sdanielk1977 52865d4d42Sdanielk1977do_test rtree6-1.1 { 53865d4d42Sdanielk1977 execsql { 54865d4d42Sdanielk1977 CREATE TABLE t2(k INTEGER PRIMARY KEY, v); 55865d4d42Sdanielk1977 CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2); 56865d4d42Sdanielk1977 } 57865d4d42Sdanielk1977} {} 58865d4d42Sdanielk1977 59865d4d42Sdanielk1977do_test rtree6-1.2 { 60865d4d42Sdanielk1977 rtree_strategy {SELECT * FROM t1 WHERE x1>10} 6165e6b0ddSdrh} {E0} 621429eca9Sdrhdo_test rtree6-1.2.1 { 631429eca9Sdrh rtree_strategy {SELECT * FROM t1 WHERE x1>10 AND x2 LIKE '%x%'} 641429eca9Sdrh} {E0} 65865d4d42Sdanielk1977 66865d4d42Sdanielk1977do_test rtree6-1.3 { 67865d4d42Sdanielk1977 rtree_strategy {SELECT * FROM t1 WHERE x1<10} 6865e6b0ddSdrh} {C0} 69865d4d42Sdanielk1977 70865d4d42Sdanielk1977do_test rtree6-1.4 { 71865d4d42Sdanielk1977 rtree_strategy {SELECT * FROM t1,t2 WHERE k=ii AND x1<10} 7265e6b0ddSdrh} {C0} 73865d4d42Sdanielk1977 74865d4d42Sdanielk1977do_test rtree6-1.5 { 75865d4d42Sdanielk1977 rtree_strategy {SELECT * FROM t1,t2 WHERE k=+ii AND x1<10} 7665e6b0ddSdrh} {C0} 77865d4d42Sdanielk1977 783985479bSdando_eqp_test rtree6.2.1 { 793985479bSdan SELECT * FROM t1,t2 WHERE k=+ii AND x1<10 803985479bSdan} { 81cdf88760Sdrh QUERY PLAN 82*8210233cSdrh |--SCAN t1 VIRTUAL TABLE INDEX 2:C0 83*8210233cSdrh `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?) 843985479bSdan} 85865d4d42Sdanielk1977 863985479bSdando_eqp_test rtree6.2.2 { 873985479bSdan SELECT * FROM t1,t2 WHERE k=ii AND x1<10 883985479bSdan} { 89cdf88760Sdrh QUERY PLAN 90*8210233cSdrh |--SCAN t1 VIRTUAL TABLE INDEX 2:C0 91*8210233cSdrh `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?) 923985479bSdan} 93865d4d42Sdanielk1977 943985479bSdando_eqp_test rtree6.2.3 { 953985479bSdan SELECT * FROM t1,t2 WHERE k=ii 963985479bSdan} { 97cdf88760Sdrh QUERY PLAN 98*8210233cSdrh |--SCAN t1 VIRTUAL TABLE INDEX 2: 99*8210233cSdrh `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?) 1003985479bSdan} 101865d4d42Sdanielk1977 1026b7ff748Sdrhdo_eqp_test rtree6.2.4.1 { 1036b7ff748Sdrh SELECT * FROM t1,t2 WHERE v=+ii and x1<10 and x2>10 1043985479bSdan} { 105cdf88760Sdrh QUERY PLAN 106*8210233cSdrh |--SCAN t1 VIRTUAL TABLE INDEX 2:C0E1 107*8210233cSdrh `--SEARCH t2 USING AUTOMATIC COVERING INDEX (v=?) 1083985479bSdan} 1096b7ff748Sdrhdo_eqp_test rtree6.2.4.2 { 1106b7ff748Sdrh SELECT * FROM t1,t2 WHERE v=10 and x1<10 and x2>10 1116b7ff748Sdrh} { 112cdf88760Sdrh QUERY PLAN 113*8210233cSdrh |--SCAN t1 VIRTUAL TABLE INDEX 2:C0E1 114*8210233cSdrh `--SEARCH t2 USING AUTOMATIC PARTIAL COVERING INDEX (v=?) 1156b7ff748Sdrh} 116865d4d42Sdanielk1977 1173985479bSdando_eqp_test rtree6.2.5 { 1183985479bSdan SELECT * FROM t1,t2 WHERE k=ii AND x1<v 1193985479bSdan} { 120cdf88760Sdrh QUERY PLAN 121*8210233cSdrh |--SCAN t1 VIRTUAL TABLE INDEX 2: 122*8210233cSdrh `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?) 1233985479bSdan} 124865d4d42Sdanielk1977 1258ad5c949Sdando_execsql_test rtree6-3.1 { 1268ad5c949Sdan CREATE VIRTUAL TABLE t3 USING rtree(id, x1, x2, y1, y2); 1278ad5c949Sdan INSERT INTO t3 VALUES(NULL, 1, 1, 2, 2); 1288ad5c949Sdan SELECT * FROM t3 WHERE 1298ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1308ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1318ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1328ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1338ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1348ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5; 1358ad5c949Sdan} {1 1.0 1.0 2.0 2.0} 1368ad5c949Sdan 1378ad5c949Sdando_test rtree6.3.2 { 1388ad5c949Sdan rtree_strategy { 1398ad5c949Sdan SELECT * FROM t3 WHERE 1408ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1418ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1428ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1438ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 1448ad5c949Sdan } 14565e6b0ddSdrh} {E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0} 146fb1f98a1Sdando_test rtree6.3.3 { 1478ad5c949Sdan rtree_strategy { 1488ad5c949Sdan SELECT * FROM t3 WHERE 1498ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1508ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1518ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1528ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1538ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 1548ad5c949Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 1558ad5c949Sdan } 15665e6b0ddSdrh} {E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0} 1578ad5c949Sdan 158fb1f98a1Sdando_execsql_test rtree6-3.4 { 159fb1f98a1Sdan SELECT * FROM t3 WHERE x1>0.5 AND x1>0.8 AND x1>1.1 160fb1f98a1Sdan} {} 161fb1f98a1Sdando_execsql_test rtree6-3.5 { 162fb1f98a1Sdan SELECT * FROM t3 WHERE 163fb1f98a1Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 164fb1f98a1Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 165fb1f98a1Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 166fb1f98a1Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 167fb1f98a1Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND 168fb1f98a1Sdan x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>1.1 169fb1f98a1Sdan} {} 170fb1f98a1Sdan 17158ed3743Sdan#------------------------------------------------------------------------- 17258ed3743Sdanreset_db 17358ed3743Sdando_execsql_test 4.0 { 17458ed3743Sdan CREATE VIRTUAL TABLE t1 USING rtree(id,x0,x1,y0,y1); 17558ed3743Sdan} 17658ed3743Sdando_execsql_test 4.1 { 17758ed3743Sdan DELETE FROM t1 WHERE x0>1 AND x1<2 OR y0<92; 17858ed3743Sdan} 17958ed3743Sdan 180eab0e103Sdanexpand_all_sql db 181865d4d42Sdanielk1977finish_test 182