Do not use the flattening optimization for a sub-query on the RHS of a LEFT

JOIN if that subquery reads data from a virtual table. Because it prevents the
planner from creating an automatic index on the results of the sub-query, the
flattening optimization sometimes slows things down in this case.

FossilOrigin-Name: 9dbae1df75219e2accd8993015ce0ffc21966d7e69d04178b1a2cc46207fe260
This commit is contained in:
dan 2017-07-18 17:34:41 +00:00
parent bbccd52143
commit 46133d98a6
4 changed files with 32 additions and 11 deletions

View File

@ -1,5 +1,5 @@
C Avoid\screating\san\sautomatic\sindex\son\sthe\sRHS\sof\sa\sLEFT\sJOIN\sto\soptimize\san\sIS\nterm.\sFix\sfor\s[ce68383b].
D 2017-07-18T17:13:41.139
C Do\snot\suse\sthe\sflattening\soptimization\sfor\sa\ssub-query\son\sthe\sRHS\sof\sa\sLEFT\nJOIN\sif\sthat\ssubquery\sreads\sdata\sfrom\sa\svirtual\stable.\sBecause\sit\sprevents\sthe\nplanner\sfrom\screating\san\sautomatic\sindex\son\sthe\sresults\sof\sthe\ssub-query,\sthe\nflattening\soptimization\ssometimes\sslows\sthings\sdown\sin\sthis\scase.
D 2017-07-18T17:34:41.909
F Makefile.in eda8bedf08c4c93e2137ef1218b3d3302488c68c2774918de0335a1133aab157
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 20850e3e8d4d4791e0531955852d768eb06f24138214870d543abb1a47346fba
@ -451,7 +451,7 @@ F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
F src/select.c 95659b7990e390f9bd8dc30b8975c675fcd1d46e569bc4f5a14e22a8d03e3d14
F src/select.c c6bf96a7f9d7d68f929de84738c599a30d0a725ab0b54420e70545743cd5ee7b
F src/shell.c dd4494287b22ac5ab0654fdd5acb1f2172d2fe621f673a39229ddc31bd8d598f
F src/shell.c.in dae43a6a43988d955014f070341f296561ea4a43ca2685166a32495b0667ef59
F src/sqlite.h.in dad804d4e1979a2ddec33cc8da6aa50c04e6ba0dcb4058e7b3609588d010e041
@ -844,7 +844,7 @@ F test/fts3expr5.test f9abfffbf5e53d48a33e12a1e8f8ba2c551c9b49
F test/fts3fault.test 9fb7d6266a38806de841f7244bac1b0fe3a1477184bbb10b172d19d2ca6ad692
F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0
F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641
F test/fts3join.test a758accc808cebaef8d622aac07994a2eae15c40eebc40888dcbbabc6f6bafb6
F test/fts3join.test 69aeb460d0ea17527a2b1b8d24ce18f29c7f207a7261867a2618f639c8020459
F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6
F test/fts3matchinfo.test ce864e0bd92429df8008f31cf557269ba172482a
F test/fts3misc.test 66e7b59576ce2c795f0baff6d47f7f6f57e6f41101cf85fad05989e43bb060dd
@ -1633,7 +1633,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 0b69aa7e37495f15c3fcc36969b650262b5aa5500fb40800de9a5c56a03f309d
R cc5a175944c475afde62e55250d19da5
P d2f0b2e859a8a413ee4e4bd7040e450ccd604069e4ea8dbc9ff924718c2b14d7
R 3c4759ced4ce8b0061743bb6c4533a26
U dan
Z 2b933914fdd0e790eddd1d56954850dd
Z 85b03bc1ee316c41d181881cd7406dfe

View File

@ -1 +1 @@
d2f0b2e859a8a413ee4e4bd7040e450ccd604069e4ea8dbc9ff924718c2b14d7
9dbae1df75219e2accd8993015ce0ffc21966d7e69d04178b1a2cc46207fe260

View File

@ -3339,8 +3339,9 @@ static void substSelect(
** due to ticket [2f7170d73bf9abf80] from 2015-02-09.)
**
** (3) The subquery is not the right operand of a LEFT JOIN
** or the subquery is not itself a join and the outer query is not
** an aggregate.
** or (a) the subquery is not itself a join and (b) the FROM clause
** of the subquery does not contain a virtual table and (c) the
** outer query is not an aggregate.
**
** (4) The subquery is not DISTINCT.
**
@ -3545,7 +3546,7 @@ static int flattenSubquery(
*/
if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){
isLeftJoin = 1;
if( pSubSrc->nSrc>1 || isAgg ){
if( pSubSrc->nSrc>1 || isAgg || IsVirtual(pSubSrc->a[0].pTab) ){
return 0; /* Restriction (3) */
}
}

View File

@ -80,5 +80,25 @@ do_execsql_test 3.2 {
SELECT * FROM tt LEFT JOIN vt ON (vt MATCH 'abc')
} {1 abc 2 abc}
#-------------------------------------------------------------------------
# Test that queries of the form found in test case 4.2 use an automatic
# index to avoid running multiple fts queries.
#
do_execsql_test 4.1 {
CREATE VIRTUAL TABLE ft4 USING fts3(x);
CREATE TABLE t4(y, z);
CREATE INDEX t4y ON t1(y);
}
do_eqp_test 4.2 {
SELECT * FROM t4 LEFT JOIN (
SELECT docid, * FROM ft4 WHERE ft4 MATCH ?
) AS rr ON t4.rowid=rr.docid
WHERE t4.y = ?;
} {
1 0 0 {SCAN TABLE ft4 VIRTUAL TABLE INDEX 3:}
0 0 0 {SCAN TABLE t4}
0 1 1 {SEARCH SUBQUERY 1 AS rr USING AUTOMATIC COVERING INDEX (docid=?)}
}
finish_test