From 4bacd01df1f038eb4225c55370a20051d51b9655 Mon Sep 17 00:00:00 2001 From: "D. Richard Hipp" Date: Fri, 4 May 2018 00:39:43 +0000 Subject: [PATCH] Make a separate limb in the EXPLAIN QUERY PLAN output for the various lines associated with the OR-optimization. --- ext/expert/expert1.test | 5 +++-- src/wherecode.c | 2 ++ test/bestindex3.test | 15 +++++++++------ test/cost.test | 17 ++++++++++------- test/eqp.test | 10 ++++++---- test/join5.test | 5 +++-- test/where7.test | 5 +++-- test/where9.test | 15 +++++++++------ test/whereI.test | 10 ++++++---- 9 files changed, 51 insertions(+), 33 deletions(-) diff --git a/ext/expert/expert1.test b/ext/expert/expert1.test index 1eab80e070..6db6944083 100644 --- a/ext/expert/expert1.test +++ b/ext/expert/expert1.test @@ -242,8 +242,9 @@ do_setup_rec_test $tn.12.1 { } { CREATE INDEX t7_idx_00000062 ON t7(b); CREATE INDEX t7_idx_00000061 ON t7(a); - SEARCH TABLE t7 USING INDEX t7_idx_00000061 (a=?) - SEARCH TABLE t7 USING INDEX t7_idx_00000062 (b=?) + MULTI-INDEX OR + SEARCH TABLE t7 USING INDEX t7_idx_00000061 (a=?) + SEARCH TABLE t7 USING INDEX t7_idx_00000062 (b=?) } # rowid terms. diff --git a/src/wherecode.c b/src/wherecode.c index 7f9933fad8..df45bd73e5 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1934,6 +1934,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** sub-WHERE clause is to to invoke the main loop body as a subroutine. */ wctrlFlags = WHERE_OR_SUBCLAUSE | (pWInfo->wctrlFlags & WHERE_SEEK_TABLE); + ExplainQueryPlan((pParse, 1, "MULTI-INDEX OR")); for(ii=0; iinTerm; ii++){ WhereTerm *pOrTerm = &pOrWc->a[ii]; if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ @@ -2054,6 +2055,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( } } } + ExplainQueryPlanPop(pParse); pLevel->u.pCovidx = pCov; if( pCov ) pLevel->iIdxCur = iCovCur; if( pAndExpr ){ diff --git a/test/bestindex3.test b/test/bestindex3.test index 32734ef1a0..4b125d4df0 100644 --- a/test/bestindex3.test +++ b/test/bestindex3.test @@ -89,16 +89,18 @@ do_eqp_test 1.3 { SELECT * FROM t1 WHERE a = 'abc' OR b = 'def'; } { QUERY PLAN - |--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a EQ ? - `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ? + `--MULTI-INDEX OR + |--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a EQ ? + `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ? } do_eqp_test 1.4 { SELECT * FROM t1 WHERE a LIKE 'abc%' OR b = 'def'; } { QUERY PLAN - |--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a LIKE ? - `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ? + `--MULTI-INDEX OR + |--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a LIKE ? + `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ? } do_execsql_test 1.5 { @@ -147,8 +149,9 @@ ifcapable !icu { SELECT * FROM t2 WHERE x LIKE 'abc%' OR y = 'def' } [string map {"\n " \n} { QUERY PLAN - |--SEARCH TABLE t2 USING INDEX t2x (x>? AND x? AND x? AND b? AND b? AND b? AND b?) `--USE TEMP B-TREE FOR ORDER BY } diff --git a/test/where9.test b/test/where9.test index c04c17fa95..87f5c15615 100644 --- a/test/where9.test +++ b/test/where9.test @@ -363,8 +363,9 @@ ifcapable explain { } [string map {"\n " \n} { QUERY PLAN |--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) - |--SEARCH TABLE t2 USING INDEX t2d (d=?) - `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) + `--MULTI-INDEX OR + |--SEARCH TABLE t2 USING INDEX t2d (d=?) + `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) }] do_eqp_test where9-3.2 { SELECT coalesce(t2.a,9999) @@ -373,8 +374,9 @@ ifcapable explain { } [string map {"\n " \n} { QUERY PLAN |--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) - |--SEARCH TABLE t2 USING INDEX t2d (d=?) - `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) + `--MULTI-INDEX OR + |--SEARCH TABLE t2 USING INDEX t2d (d=?) + `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) }] } @@ -453,8 +455,9 @@ do_eqp_test where9-5.1 { SELECT a FROM t1 WHERE b>1000 AND (c=31031 OR d IS NULL) } { QUERY PLAN - |--SEARCH TABLE t1 USING INDEX t1c (c=?) - `--SEARCH TABLE t1 USING INDEX t1d (d=?) + `--MULTI-INDEX OR + |--SEARCH TABLE t1 USING INDEX t1c (c=?) + `--SEARCH TABLE t1 USING INDEX t1d (d=?) } # In contrast, b=1000 is preferred over any OR-clause. diff --git a/test/whereI.test b/test/whereI.test index 73dd9009aa..d08e62c376 100644 --- a/test/whereI.test +++ b/test/whereI.test @@ -30,8 +30,9 @@ do_eqp_test 1.1 { SELECT a FROM t1 WHERE b='b' OR c='x' } { QUERY PLAN - |--SEARCH TABLE t1 USING INDEX i1 (b=?) - `--SEARCH TABLE t1 USING INDEX i2 (c=?) + `--MULTI-INDEX OR + |--SEARCH TABLE t1 USING INDEX i1 (b=?) + `--SEARCH TABLE t1 USING INDEX i2 (c=?) } do_execsql_test 1.2 { @@ -59,8 +60,9 @@ do_eqp_test 2.1 { SELECT a FROM t2 WHERE b='b' OR c='x' } { QUERY PLAN - |--SEARCH TABLE t2 USING INDEX i3 (b=?) - `--SEARCH TABLE t2 USING INDEX i4 (c=?) + `--MULTI-INDEX OR + |--SEARCH TABLE t2 USING INDEX i3 (b=?) + `--SEARCH TABLE t2 USING INDEX i4 (c=?) } do_execsql_test 2.2 { -- 2.11.4.GIT