From 6b7ff748a1c20ee882a3ac6f3146e21be469983a Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 Jun 2014 09:00:54 +0000 Subject: [PATCH] Allow an automatic index on a WHERE constraint where the RHS is does not reference another table as long as the RHS is not a constant. FossilOrigin-Name: 58acc2a8b38c5f13175c191697b4d2b663db1872 --- ext/rtree/rtree6.test | 10 ++++++++-- manifest | 19 ++++++++----------- manifest.uuid | 2 +- src/where.c | 5 ++++- test/tpch01.test | 7 ++++++- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/ext/rtree/rtree6.test b/ext/rtree/rtree6.test index c5a78bb3e3..9e51993bd8 100644 --- a/ext/rtree/rtree6.test +++ b/ext/rtree/rtree6.test @@ -92,12 +92,18 @@ do_eqp_test rtree6.2.3 { 0 1 1 {SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?)} } -do_eqp_test rtree6.2.4 { - SELECT * FROM t1,t2 WHERE v=10 and x1<10 and x2>10 +do_eqp_test rtree6.2.4.1 { + SELECT * FROM t1,t2 WHERE v=+ii and x1<10 and x2>10 } { 0 0 0 {SCAN TABLE t1 VIRTUAL TABLE INDEX 2:C0E1} 0 1 1 {SEARCH TABLE t2 USING AUTOMATIC COVERING INDEX (v=?)} } +do_eqp_test rtree6.2.4.2 { + SELECT * FROM t1,t2 WHERE v=10 and x1<10 and x2>10 +} { + 0 0 0 {SCAN TABLE t1 VIRTUAL TABLE INDEX 2:C0E1} + 0 1 1 {SCAN TABLE t2} +} do_eqp_test rtree6.2.5 { SELECT * FROM t1,t2 WHERE k=ii AND x1a + pWC->nTerm; for(pTerm=pWC->a; rc==SQLITE_OK && pTermprereqRight & pNew->maskSelf ) continue; - if( pTerm->prereqRight==0 ) continue; + if( pTerm->prereqRight==0 + && sqlite3ExprIsConstant(pTerm->pExpr->pRight) ){ + continue; + } if( termCanDriveIndex(pTerm, pSrc, 0) ){ pNew->u.btree.nEq = 1; pNew->u.btree.nSkip = 0; diff --git a/test/tpch01.test b/test/tpch01.test index 2d099d63fb..ce48f8ec23 100644 --- a/test/tpch01.test +++ b/test/tpch01.test @@ -168,7 +168,10 @@ do_test tpch01-1.1 { } {/0 0 0 {SEARCH TABLE part USING INDEX bootleg_pti .P_TYPE=..} 0 1 2 {SEARCH TABLE lineitem USING INDEX lpki2 .L_PARTKEY=..}.*/} do_test tpch01-1.1b { set ::eqpres -} {/.* customer .* nation AS n1 .* nation AS n2 .*/} +} {/.* customer .* nation AS n1 .*/} +do_test tpch01-1.1c { + set ::eqpres +} {/.* supplier .* nation AS n2 .*/} do_eqp_test tpch01-1.2 { select @@ -185,3 +188,5 @@ group by order by revenue desc; } {0 0 1 {SEARCH TABLE orders USING INDEX odi (O_ORDERDATE>? AND O_ORDERDATE