]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Have the rtree module set the estimatedCost output variable. Ticket #3312. (CVS 5649)
authordanielk1977 <danielk1977@noemail.net>
Mon, 1 Sep 2008 12:46:59 +0000 (12:46 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Mon, 1 Sep 2008 12:46:59 +0000 (12:46 +0000)
FossilOrigin-Name: 483932c4e08901a11b7ab671073fd0a048b10d66

ext/rtree/rtree.c
ext/rtree/rtree6.test [new file with mode: 0644]
manifest
manifest.uuid

index 39116ceb4b328a11d0ca45613799b7839f7fd6fb..f306113fcb5278ee5569eca22a9cf9c77d6846c9 100644 (file)
@@ -12,7 +12,7 @@
 ** This file contains code for implementations of the r-tree and r*-tree
 ** algorithms packaged as an SQLite virtual table module.
 **
-** $Id: rtree.c,v 1.7 2008/07/16 14:43:35 drh Exp $
+** $Id: rtree.c,v 1.8 2008/09/01 12:47:00 danielk1977 Exp $
 */
 
 #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE)
@@ -1116,6 +1116,13 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
       pIdxInfo->idxNum = 1;
       pIdxInfo->aConstraintUsage[ii].argvIndex = 1;
       pIdxInfo->aConstraintUsage[jj].omit = 1;
+
+      /* This strategy involves a two rowid lookups on an B-Tree structures
+      ** and then a linear search of an R-Tree node. This should be 
+      ** considered almost as quick as a direct rowid lookup (for which 
+      ** sqlite uses an internal cost of 0.0).
+      */ 
+      pIdxInfo->estimatedCost = 10.0;
       return SQLITE_OK;
     }
 
@@ -1169,6 +1176,8 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
   if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){
     return SQLITE_NOMEM;
   }
+  assert( iIdx>=0 );
+  pIdxInfo->estimatedCost = (2000000.0 / (double)(iIdx + 1));
   return rc;
 }
 
diff --git a/ext/rtree/rtree6.test b/ext/rtree/rtree6.test
new file mode 100644 (file)
index 0000000..d26137b
--- /dev/null
@@ -0,0 +1,111 @@
+# 2008 Sep 1
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# $Id: rtree6.test,v 1.1 2008/09/01 12:47:00 danielk1977 Exp $
+#
+
+if {![info exists testdir]} {
+  set testdir [file join [file dirname $argv0] .. .. test]
+} 
+source $testdir/tester.tcl
+
+ifcapable !rtree {
+  finish_test
+  return
+}
+
+#   Operator    Byte Value
+#   ----------------------
+#      =        0x41 ('A')
+#     <=        0x42 ('B')
+#      <        0x43 ('C')
+#     >=        0x44 ('D')
+#      >        0x45 ('E')
+#   ----------------------
+
+proc rtree_strategy {sql} {
+  set ret [list]
+  db eval "explain $sql" a {
+    if {$a(opcode) eq "VFilter"} {
+      lappend ret $a(p4)
+    }
+  }
+  set ret
+}
+
+proc query_plan {sql} {
+  set ret [list]
+  db eval "explain query plan $sql" a {
+    lappend ret $a(detail)
+  }
+  set ret
+}
+
+do_test rtree6-1.1 {
+  execsql {
+    CREATE TABLE t2(k INTEGER PRIMARY KEY, v);
+    CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2);
+  }
+} {}
+
+do_test rtree6-1.2 {
+  rtree_strategy {SELECT * FROM t1 WHERE x1>10}
+} {Ea}
+
+do_test rtree6-1.3 {
+  rtree_strategy {SELECT * FROM t1 WHERE x1<10}
+} {Ca}
+
+do_test rtree6-1.4 {
+  rtree_strategy {SELECT * FROM t1,t2 WHERE k=ii AND x1<10}
+} {Ca}
+
+do_test rtree6-1.5 {
+  rtree_strategy {SELECT * FROM t1,t2 WHERE k=+ii AND x1<10}
+} {Ca}
+
+do_test rtree6.2.1 {
+  query_plan {SELECT * FROM t1,t2 WHERE k=+ii AND x1<10}
+} [list \
+  {TABLE t1 VIRTUAL TABLE INDEX 2:Ca} \
+  {TABLE t2 USING PRIMARY KEY}        \
+]
+
+do_test rtree6.2.2 {
+  query_plan {SELECT * FROM t1,t2 WHERE k=ii AND x1<10}
+} [list \
+  {TABLE t1 VIRTUAL TABLE INDEX 2:Ca} \
+  {TABLE t2 USING PRIMARY KEY}        \
+]
+
+do_test rtree6.2.3 {
+  query_plan {SELECT * FROM t1,t2 WHERE k=ii}
+} [list \
+  {TABLE t2}                          \
+  {TABLE t1 VIRTUAL TABLE INDEX 1:}   \
+]
+
+do_test rtree6.2.4 {
+  query_plan {SELECT * FROM t1,t2 WHERE v=10 and x1<10 and x2>10}
+} [list \
+  {TABLE t2}                              \
+  {TABLE t1 VIRTUAL TABLE INDEX 2:CaEb}   \
+]
+
+do_test rtree6.2.5 {
+  query_plan {SELECT * FROM t1,t2 WHERE k=ii AND x1<v}
+} [list \
+  {TABLE t2}                              \
+  {TABLE t1 VIRTUAL TABLE INDEX 1:}   \
+]
+
+finish_test
+
index ce2f27f534550b0aa5b686ee086c21181d3a58d8..089b8dfd8183b3f0e4b547a9a5710cd11835f962 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Changed\sto\sused\ssqlite3_snprintf\sinstead\sof\ssnprintf\s(test\scode\sonly).\s(CVS\s5648)
-D 2008-08-31T00:29:08
+C Have\sthe\srtree\smodule\sset\sthe\sestimatedCost\soutput\svariable.\sTicket\s#3312.\s(CVS\s5649)
+D 2008-09-01T12:47:00
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 689e14735f862a5553bceef206d8c13e29504e44
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -64,13 +64,14 @@ F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100
 F ext/icu/README.txt 3b130aa66e7a681136f6add198b076a2f90d1e33
 F ext/icu/icu.c 12e763d288d23b5a49de37caa30737b971a2f1e2
 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
-F ext/rtree/rtree.c d60b28f466cdf4267b237160d75f44365412f3c6
+F ext/rtree/rtree.c 5e372fdbe572ae8e4e3b4917f048e842dcb57915
 F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e
 F ext/rtree/rtree1.test 620223886bf1a319317e63235aac20790375c544
 F ext/rtree/rtree2.test 9ac9d28fa948779df66916c67a5dcf9704c3cb74
 F ext/rtree/rtree3.test 877a09c1a0c2b87af0f94f3a286e7dd3b65adf22
 F ext/rtree/rtree4.test 11724f766a74f48710998cdd7552cec140c55bf9
 F ext/rtree/rtree5.test 7d0643482829038f0263881ddf7e2d51bff1d60f
+F ext/rtree/rtree6.test fdfaf62bf026f1312c6eca658979800f3c0bc93f
 F ext/rtree/rtree_perf.tcl 0fabb6d5c48cb8024e042ce5d4bb88998b6ec1cb
 F ext/rtree/rtree_util.tcl ee0a0311eb12175319d78bfb37302320496cee6e
 F ext/rtree/viewrtree.tcl 09526398dae87a5a87c5aac2b3854dbaf8376869
@@ -627,7 +628,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P 88c51b9f1579707a8ec394eba61539fabd725e2a
-R 6475b6bc34459c3a14e2d3b7fca18d08
-U shane
-Z cb37c60a6ecfe6b85c8d7118af0df8f4
+P d68791e35d13f5ae4befeb0bb5f8ccaf14fd3763
+R cf8a1d32d459a4e4e9a02a25baa421e1
+U danielk1977
+Z d770b724d467b2bb63feddfe02dfb4bf
index 1a7101c4b6c6dc28e9f40343ca020ab36c1e208a..6a60fbfb2ec437b920926e50abdd027818bbccac 100644 (file)
@@ -1 +1 @@
-d68791e35d13f5ae4befeb0bb5f8ccaf14fd3763
\ No newline at end of file
+483932c4e08901a11b7ab671073fd0a048b10d66
\ No newline at end of file