From: drh Date: Wed, 28 Jun 2017 18:25:03 +0000 (+0000) Subject: Make the query planners use of partial indexes based on bound variables X-Git-Tag: version-3.20.0~167^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3e380a4485fdb37f1024976e0300209b8517a290;p=thirdparty%2Fsqlite.git Make the query planners use of partial indexes based on bound variables responsive to the SQLITE_DBCONFIG_ENABLE_QPSG setting. FossilOrigin-Name: a934dd14ac55177ac541423f4a077484bb3b461b60c9c2e88d067cca922fa2bc --- diff --git a/manifest b/manifest index 58683ef5d7..c71f873790 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\sin\sthe\slatest\senhancements\sfrom\strunk. -D 2017-06-28T18:07:29.453 +C Make\sthe\squery\splanners\suse\sof\spartial\sindexes\sbased\son\sbound\svariables\nresponsive\sto\sthe\sSQLITE_DBCONFIG_ENABLE_QPSG\ssetting. +D 2017-06-28T18:25:03.706 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -487,7 +487,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 40c543f0a2195d1b0dc88ef12142bea690009344 F src/wal.h 06b2a0b599cc0f53ea97f497cf8c6b758c999f71 F src/walker.c d46044e7a5842560dfe7122d93ff5145dd4a96f4d0bf5ba5910a7731b8c01e79 -F src/where.c 563cd034b1d09e6b64a88cafc47a6f37de708d07d03c68b1d4185d8b7f3618bf +F src/where.c 715b84912bf85d833ff558d6de51c0d0427483c1f5efe1bb6818d4e683f4869e F src/whereInt.h 2a4b634d63ce488b46d4b0da8f2eaa8f9aeab202bc25ef76f007de5e3fba1f20 F src/wherecode.c f17f5d51e372168db51af637e265aa5e80f99fcc81bfead96b66e71a7732bc62 F src/whereexpr.c fa51927cc6830b9d3155cafa4e589452ec023fe313a56550d2079dca6c52fbd8 @@ -886,7 +886,7 @@ F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test b4fc812290067a578b98bb2667b676db89e202a7 F test/index7.test 7feababe16f2091b229c22aff2bcc1d4d6b9d2bb F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 -F test/index9.test 896b05eff9587ff251453c647e4f0e6a9a136a801c535842d0afde6d659a6d0b +F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test 9c4cd331224e57f79fbf411ae245e6272d415985 F test/indexexpr1.test 038b3befa74e5a75126b6e9dd2ae5df61c1c7cf7 F test/indexexpr2.test 68ee9dbe83fcf85e50f4d0bd1f742a082496f2ee5153f4be2a1861db84462bf7 @@ -1585,7 +1585,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7b59c353b805c64689b4ae9df347705acbb5f116346ad77af8ce087da7893747 f02a54599de7620438aecd3753199fc52ce8919d7503bb8b2f5592b0e51dbf8c -R 6145771861a818bdd35ee8936bd678fa +P 8f63c5863231eba7f853f9587b58a81102c31708402fa9962a6e91aa622fad13 +R c0bca5815e0b14a60d8900b0ad5f06a7 U drh -Z 027c22f2095cba4a04a80b38d45bc197 +Z afcf7a655c64b8f5d4a7cb72e9e49496 diff --git a/manifest.uuid b/manifest.uuid index d6c36f7800..59255b606a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8f63c5863231eba7f853f9587b58a81102c31708402fa9962a6e91aa622fad13 \ No newline at end of file +a934dd14ac55177ac541423f4a077484bb3b461b60c9c2e88d067cca922fa2bc \ No newline at end of file diff --git a/src/where.c b/src/where.c index cc09bbbf81..ad90ebf742 100644 --- a/src/where.c +++ b/src/where.c @@ -2687,14 +2687,16 @@ static Bitmask columnsInIndex(Index *pIdx){ static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){ int i; WhereTerm *pTerm; + Parse *pParse = pWC->pWInfo->pParse; while( pWhere->op==TK_AND ){ if( !whereUsablePartialIndex(iTab,pWC,pWhere->pLeft) ) return 0; pWhere = pWhere->pRight; } + if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ Expr *pExpr = pTerm->pExpr; - if( sqlite3ExprImpliesExpr(pWC->pWInfo->pParse, pExpr, pWhere, iTab) - && (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) + if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) + && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) ){ return 1; } diff --git a/test/index9.test b/test/index9.test index fe117887fd..2d4d94111c 100644 --- a/test/index9.test +++ b/test/index9.test @@ -65,18 +65,31 @@ set y [expr 9223372036854775808] do_sqluses_test 3.2 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1} set y [expr 9223372036854775806] do_sqluses_test 3.3 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1} +db cache flush +sqlite3_db_config db QPSG 1 +set y [expr 9223372036854775807] +do_sqluses_test 3.4 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1} +set y [expr 9223372036854775808] +do_sqluses_test 3.5 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1} +sqlite3_db_config db QPSG 0 +db cache flush -do_execsql_test 3.0 { + +do_execsql_test 4.0 { CREATE INDEX t1x4 ON t1(x) WHERE y=-9223372036854775808 } set y [expr -9223372036854775808] -do_sqluses_test 3.1 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1 t1x4} +do_sqluses_test 4.1 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1 t1x4} set y [expr -9223372036854775807] -do_sqluses_test 3.2 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1} +do_sqluses_test 4.2 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1} set y [expr -9223372036854775809] -do_sqluses_test 3.3 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1} +do_sqluses_test 4.3 { SELECT * FROM t1 WHERE y=$y ORDER BY x } {t1} set y [expr -9223372036854775808] -do_sqluses_test 3.4 { SELECT * FROM t1 WHERE $y=y ORDER BY x } {t1 t1x4} +do_sqluses_test 4.4 { SELECT * FROM t1 WHERE $y=y ORDER BY x } {t1 t1x4} +db cache flush +sqlite3_db_config db QPSG 1 +do_sqluses_test 4.5 { SELECT * FROM t1 WHERE $y=y ORDER BY x } {t1} +sqlite3_db_config db QPSG 0 +db cache flush finish_test -