Improvements to EXPLAIN QUERY PLAN formatting. The MULTI-INDEX OR now shows

a separate "INDEX" subtree for each index.  SCALAR SUBQUERY entries provide
a subquery number that is related back to the .selecttrace output.

FossilOrigin-Name: 7153552bac51295c56a1c42ca79d57195851e232509f9e9610375692f48c7e86
This commit is contained in:
drh
2018-12-24 20:21:06 +00:00
parent a599e150ca
commit bd462bcc10
17 changed files with 146 additions and 78 deletions
+1 -1
View File
@@ -280,7 +280,7 @@ do_eqp_test autoindex1-600a {
|--MATERIALIZE xxxxxx
| |--SCAN TABLE sheep AS s
| |--SEARCH TABLE flock_owner AS prev USING INDEX sqlite_autoindex_flock_owner_1 (flock_no=? AND owner_change_date<?)
| `--CORRELATED SCALAR SUBQUERY
| `--CORRELATED SCALAR SUBQUERY xxxxxx
| `--SEARCH TABLE flock_owner AS later USING COVERING INDEX sqlite_autoindex_flock_owner_1 (flock_no=? AND owner_change_date>? AND owner_change_date<?)
|--SCAN TABLE sheep AS x USING INDEX sheep_reg_flock_index
`--SEARCH SUBQUERY xxxxxx AS y USING AUTOMATIC COVERING INDEX (sheep_no=?)
+12 -6
View File
@@ -90,8 +90,10 @@ do_eqp_test 1.3 {
} {
QUERY PLAN
`--MULTI-INDEX OR
|--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a EQ ?
`--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ?
|--INDEX 1
| `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a EQ ?
`--INDEX 2
`--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ?
}
do_eqp_test 1.4 {
@@ -99,8 +101,10 @@ do_eqp_test 1.4 {
} {
QUERY PLAN
`--MULTI-INDEX OR
|--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a LIKE ?
`--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ?
|--INDEX 1
| `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a LIKE ?
`--INDEX 2
`--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ?
}
do_execsql_test 1.5 {
@@ -150,8 +154,10 @@ ifcapable !icu {
} [string map {"\n " \n} {
QUERY PLAN
`--MULTI-INDEX OR
|--SEARCH TABLE t2 USING INDEX t2x (x>? AND x<?)
`--SEARCH TABLE t2 USING INDEX t2y (y=?)
|--INDEX 1
| `--SEARCH TABLE t2 USING INDEX t2x (x>? AND x<?)
`--INDEX 2
`--SEARCH TABLE t2 USING INDEX t2y (y=?)
}]
}
+14 -7
View File
@@ -58,9 +58,12 @@ do_eqp_test 3.2 {
} {
QUERY PLAN
|--MULTI-INDEX OR
| |--SEARCH TABLE t5 USING INDEX t5b (b=?)
| |--SEARCH TABLE t5 USING INDEX t5c (c=?)
| `--SEARCH TABLE t5 USING INDEX t5d (d=?)
| |--INDEX 1
| | `--SEARCH TABLE t5 USING INDEX t5b (b=?)
| |--INDEX 2
| | `--SEARCH TABLE t5 USING INDEX t5c (c=?)
| `--INDEX 3
| `--SEARCH TABLE t5 USING INDEX t5d (d=?)
`--USE TEMP B-TREE FOR ORDER BY
}
@@ -124,8 +127,10 @@ do_eqp_test 6.2 {
} {
QUERY PLAN
|--MULTI-INDEX OR
| |--SEARCH TABLE t3 USING INDEX t3i1 (b>? AND b<?)
| `--SEARCH TABLE t3 USING INDEX t3i2 (c=?)
| |--INDEX 1
| | `--SEARCH TABLE t3 USING INDEX t3i1 (b>? AND b<?)
| `--INDEX 2
| `--SEARCH TABLE t3 USING INDEX t3i2 (c=?)
`--USE TEMP B-TREE FOR ORDER BY
}
@@ -149,8 +154,10 @@ do_eqp_test 7.2 {
} {
QUERY PLAN
|--MULTI-INDEX OR
| |--SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?)
| `--SEARCH TABLE t1 USING INDEX t1b (b=?)
| |--INDEX 1
| | `--SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?)
| `--INDEX 2
| `--SEARCH TABLE t1 USING INDEX t1b (b=?)
`--USE TEMP B-TREE FOR ORDER BY
}
+14 -10
View File
@@ -45,8 +45,10 @@ do_eqp_test 1.2 {
} {
QUERY PLAN
|--MULTI-INDEX OR
| |--SEARCH TABLE t1 USING INDEX i1 (a=?)
| `--SEARCH TABLE t1 USING INDEX i2 (b=?)
| |--INDEX 1
| | `--SEARCH TABLE t1 USING INDEX i1 (a=?)
| `--INDEX 2
| `--SEARCH TABLE t1 USING INDEX i2 (b=?)
`--SCAN TABLE t2
}
do_eqp_test 1.3 {
@@ -55,8 +57,10 @@ do_eqp_test 1.3 {
QUERY PLAN
|--SCAN TABLE t2
`--MULTI-INDEX OR
|--SEARCH TABLE t1 USING INDEX i1 (a=?)
`--SEARCH TABLE t1 USING INDEX i2 (b=?)
|--INDEX 1
| `--SEARCH TABLE t1 USING INDEX i1 (a=?)
`--INDEX 2
`--SEARCH TABLE t1 USING INDEX i2 (b=?)
}
do_eqp_test 1.3 {
SELECT a FROM t1 ORDER BY a
@@ -225,7 +229,7 @@ do_eqp_test 3.1.1 {
} {
QUERY PLAN
|--SCAN TABLE t1
`--SCALAR SUBQUERY
`--SCALAR SUBQUERY xxxxxx
`--SCAN TABLE t1 AS sub
}
do_eqp_test 3.1.2 {
@@ -233,7 +237,7 @@ do_eqp_test 3.1.2 {
} {
QUERY PLAN
|--SCAN TABLE t1
`--SCALAR SUBQUERY
`--SCALAR SUBQUERY xxxxxx
`--SCAN TABLE t1 AS sub
}
do_eqp_test 3.1.3 {
@@ -241,7 +245,7 @@ do_eqp_test 3.1.3 {
} {
QUERY PLAN
|--SCAN TABLE t1
`--SCALAR SUBQUERY
`--SCALAR SUBQUERY xxxxxx
|--SCAN TABLE t1 AS sub
`--USE TEMP B-TREE FOR ORDER BY
}
@@ -250,7 +254,7 @@ do_eqp_test 3.1.4 {
} {
QUERY PLAN
|--SCAN TABLE t1
`--SCALAR SUBQUERY
`--SCALAR SUBQUERY xxxxxx
`--SCAN TABLE t2 USING COVERING INDEX t2i1
}
@@ -302,7 +306,7 @@ det 3.3.3 {
} {
QUERY PLAN
|--SCAN TABLE t1
`--CORRELATED SCALAR SUBQUERY
`--CORRELATED SCALAR SUBQUERY xxxxxx
`--SCAN TABLE t2
}
@@ -813,7 +817,7 @@ do_eqp_test 9.1 {
|--MATERIALIZE xxxxxx
| |--SCAN TABLE forumpost AS x USING INDEX forumthread
| |--USING ROWID SEARCH ON TABLE private FOR IN-OPERATOR
| |--CORRELATED SCALAR SUBQUERY
| |--CORRELATED SCALAR SUBQUERY xxxxxx
| | |--SEARCH TABLE forumpost USING COVERING INDEX forumthread (froot=?)
| | `--USING ROWID SEARCH ON TABLE private FOR IN-OPERATOR
| `--USE TEMP B-TREE FOR ORDER BY
+4 -2
View File
@@ -267,8 +267,10 @@ do_eqp_test 7.2 {
QUERY PLAN
|--SCAN TABLE t1
`--MULTI-INDEX OR
|--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?)
`--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?)
|--INDEX 1
| `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?)
`--INDEX 2
`--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?)
}
do_execsql_test 7.3 {
+2
View File
@@ -110,6 +110,8 @@ do_test tkt-80ba2-200 {
} {300 object_change 2048}
do_test tkt-80ba2-201 {
db eval {
PRAGMA vdbe_debug=on;
PRAGMA vdbe_addoptrace=on;
CREATE INDEX timeline_entry_id_idx on timeline(entry_id);
SELECT entry_type,
entry_types.name,
+4 -2
View File
@@ -23353,8 +23353,10 @@ do_eqp_test where7-3.2 {
} {
QUERY PLAN
|--MULTI-INDEX OR
| |--SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?)
| `--SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?)
| |--INDEX 1
| | `--SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?)
| `--INDEX 2
| `--SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?)
|--SEARCH TABLE t302 USING INDEX t302_c8_c3 (c8=? AND c3>?)
`--USE TEMP B-TREE FOR ORDER BY
}
+12 -6
View File
@@ -364,8 +364,10 @@ ifcapable explain {
QUERY PLAN
|--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?)
`--MULTI-INDEX OR
|--SEARCH TABLE t2 USING INDEX t2d (d=?)
`--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)
|--INDEX 1
| `--SEARCH TABLE t2 USING INDEX t2d (d=?)
`--INDEX 3
`--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)
}]
do_eqp_test where9-3.2 {
SELECT coalesce(t2.a,9999)
@@ -375,8 +377,10 @@ ifcapable explain {
QUERY PLAN
|--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?)
`--MULTI-INDEX OR
|--SEARCH TABLE t2 USING INDEX t2d (d=?)
`--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)
|--INDEX 1
| `--SEARCH TABLE t2 USING INDEX t2d (d=?)
`--INDEX 2
`--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)
}]
}
@@ -456,8 +460,10 @@ do_eqp_test where9-5.1 {
} {
QUERY PLAN
`--MULTI-INDEX OR
|--SEARCH TABLE t1 USING INDEX t1c (c=?)
`--SEARCH TABLE t1 USING INDEX t1d (d=?)
|--INDEX 1
| `--SEARCH TABLE t1 USING INDEX t1c (c=?)
`--INDEX 2
`--SEARCH TABLE t1 USING INDEX t1d (d=?)
}
# In contrast, b=1000 is preferred over any OR-clause.
+8 -4
View File
@@ -31,8 +31,10 @@ do_eqp_test 1.1 {
} {
QUERY PLAN
`--MULTI-INDEX OR
|--SEARCH TABLE t1 USING INDEX i1 (b=?)
`--SEARCH TABLE t1 USING INDEX i2 (c=?)
|--INDEX 1
| `--SEARCH TABLE t1 USING INDEX i1 (b=?)
`--INDEX 2
`--SEARCH TABLE t1 USING INDEX i2 (c=?)
}
do_execsql_test 1.2 {
@@ -61,8 +63,10 @@ do_eqp_test 2.1 {
} {
QUERY PLAN
`--MULTI-INDEX OR
|--SEARCH TABLE t2 USING INDEX i3 (b=?)
`--SEARCH TABLE t2 USING INDEX i4 (c=?)
|--INDEX 1
| `--SEARCH TABLE t2 USING INDEX i3 (b=?)
`--INDEX 2
`--SEARCH TABLE t2 USING INDEX i4 (c=?)
}
do_execsql_test 2.2 {
+1 -1
View File
@@ -120,7 +120,7 @@ do_eqp_test 3.2.2 {
|--MATERIALIZE xxxxxx
| |--SETUP
| | |--SCAN CONSTANT ROW
| | `--SCALAR SUBQUERY
| | `--SCALAR SUBQUERY xxxxxx
| | `--SCAN TABLE w2
| `--RECURSIVE STEP
| |--SCAN TABLE w1