1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-12 13:01:09 +03:00

Fix an issue with the OmitNoopJoin optimization and add test cases that

are specifically for that optimization.

FossilOrigin-Name: 5480d124b74c9adaacc4fa9cb81560865b44f3e1
This commit is contained in:
drh
2013-06-28 13:43:33 +00:00
parent 1713afb025
commit 9d5a579c35
5 changed files with 76 additions and 19 deletions

View File

@@ -1,5 +1,5 @@
C Refactor\sthe\sVdbe.noIO\sfield\sas\sVdbe.bIsReader.\sThe\smeaning\sis\sinverted. C Fix\san\sissue\swith\sthe\sOmitNoopJoin\soptimization\sand\sadd\stest\scases\sthat\nare\sspecifically\sfor\sthat\soptimization.
D 2013-06-28T01:24:57.868 D 2013-06-28T13:43:33.738
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -226,7 +226,7 @@ F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c bedc37ec1a6bb9399944024d63f4c769971955a9 F src/status.c bedc37ec1a6bb9399944024d63f4c769971955a9
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
F src/tclsqlite.c b8835978e853a89bf58de88acc943a5ca94d752e F src/tclsqlite.c b8835978e853a89bf58de88acc943a5ca94d752e
F src/test1.c 06bd01f7795bbef4aaf59d3b9fe5b3131a6ef642 F src/test1.c 340156a7e65537ab0c22e14bccdf243b898f7e54
F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35 F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35
F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c
F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df
@@ -290,7 +290,7 @@ F src/vtab.c b05e5f1f4902461ba9f5fc49bb7eb7c3a0741a83
F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73 F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73
F src/where.c 9bcfcb4ec6a14dd0111bf287bee02be88d5709f9 F src/where.c 69c39db2381017959e89a492a71535caefc662ca
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6
@@ -1034,7 +1034,7 @@ F test/walslow.test e7be6d9888f83aa5d3d3c7c08aa9b5c28b93609a
F test/walthread.test de8dbaf6d9e41481c460ba31ca61e163d7348f8e F test/walthread.test de8dbaf6d9e41481c460ba31ca61e163d7348f8e
F test/where.test da54153a4c1571ea1b95659e5bec8119edf786aa F test/where.test da54153a4c1571ea1b95659e5bec8119edf786aa
F test/where2.test dcf0ffafe0de55051c1373835a5a57aee6b50094 F test/where2.test dcf0ffafe0de55051c1373835a5a57aee6b50094
F test/where3.test 157071521ceabc06bfd4d37106e4270a8956364d F test/where3.test a0682ba3dc8c8f46ffcc95a3d9f58c4327fc129f
F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2 F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2
F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2
F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b
@@ -1098,7 +1098,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae
F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
P 14f796963474350e7aee8d3757acd3315fe78e4f P 59f98c5c241e5a61cd5b6d0e69b55a6b44c5cafc
R fe26d24ee74e8945b518975ca34639ae R 368bf30a2a407b15b250050c0cce7dc4
U drh U drh
Z 103752d0a887c9636df5a0b29ea996df Z 98db0c7caabc51789d3df033fefb950b

View File

@@ -1 +1 @@
59f98c5c241e5a61cd5b6d0e69b55a6b44c5cafc 5480d124b74c9adaacc4fa9cb81560865b44f3e1

View File

@@ -5960,6 +5960,7 @@ static int optimization_control(
int mask; int mask;
} aOpt[] = { } aOpt[] = {
{ "all", SQLITE_AllOpts }, { "all", SQLITE_AllOpts },
{ "none", 0 },
{ "query-flattener", SQLITE_QueryFlattener }, { "query-flattener", SQLITE_QueryFlattener },
{ "column-cache", SQLITE_ColumnCache }, { "column-cache", SQLITE_ColumnCache },
{ "groupby-order", SQLITE_GroupByOrder }, { "groupby-order", SQLITE_GroupByOrder },
@@ -5967,7 +5968,10 @@ static int optimization_control(
{ "real-as-int", SQLITE_IdxRealAsInt }, { "real-as-int", SQLITE_IdxRealAsInt },
{ "distinct-opt", SQLITE_DistinctOpt }, { "distinct-opt", SQLITE_DistinctOpt },
{ "cover-idx-scan", SQLITE_CoverIdxScan }, { "cover-idx-scan", SQLITE_CoverIdxScan },
{ "order-by-idx-join",SQLITE_OrderByIdxJoin }, { "order-by-idx-join", SQLITE_OrderByIdxJoin },
{ "transitive", SQLITE_Transitive },
{ "subquery-coroutine", SQLITE_SubqCoroutine },
{ "omit-noop-join", SQLITE_OmitNoopJoin },
}; };
if( objc!=4 ){ if( objc!=4 ){
@@ -5988,7 +5992,7 @@ static int optimization_control(
Tcl_AppendResult(interp, "unknown optimization - should be one of:", Tcl_AppendResult(interp, "unknown optimization - should be one of:",
(char*)0); (char*)0);
for(i=0; i<sizeof(aOpt)/sizeof(aOpt[0]); i++){ for(i=0; i<sizeof(aOpt)/sizeof(aOpt[0]); i++){
Tcl_AppendResult(interp, " ", aOpt[i].zOptName); Tcl_AppendResult(interp, " ", aOpt[i].zOptName, (char*)0);
} }
return TCL_ERROR; return TCL_ERROR;
} }

View File

@@ -5796,6 +5796,7 @@ WhereInfo *sqlite3WhereBegin(
Bitmask tabUsed = exprListTableUsage(pMaskSet, pResultSet); Bitmask tabUsed = exprListTableUsage(pMaskSet, pResultSet);
if( pOrderBy ) tabUsed |= exprListTableUsage(pMaskSet, pOrderBy); if( pOrderBy ) tabUsed |= exprListTableUsage(pMaskSet, pOrderBy);
while( pWInfo->nLevel>=2 ){ while( pWInfo->nLevel>=2 ){
WhereTerm *pTerm, *pEnd;
pLoop = pWInfo->a[pWInfo->nLevel-1].pWLoop; pLoop = pWInfo->a[pWInfo->nLevel-1].pWLoop;
if( (pWInfo->pTabList->a[pLoop->iTab].jointype & JT_LEFT)==0 ) break; if( (pWInfo->pTabList->a[pLoop->iTab].jointype & JT_LEFT)==0 ) break;
if( (wctrlFlags & WHERE_WANT_DISTINCT)==0 if( (wctrlFlags & WHERE_WANT_DISTINCT)==0
@@ -5804,6 +5805,15 @@ WhereInfo *sqlite3WhereBegin(
break; break;
} }
if( (tabUsed & pLoop->maskSelf)!=0 ) break; if( (tabUsed & pLoop->maskSelf)!=0 ) break;
pEnd = sWLB.pWC->a + sWLB.pWC->nTerm;
for(pTerm=sWLB.pWC->a; pTerm<pEnd; pTerm++){
if( (pTerm->prereqAll & pLoop->maskSelf)!=0
&& !ExprHasProperty(pTerm->pExpr, EP_FromJoin)
){
break;
}
}
if( pTerm<pEnd ) break;
WHERETRACE(0xffff, ("-> drop loop %c not used\n", pLoop->cId)); WHERETRACE(0xffff, ("-> drop loop %c not used\n", pLoop->cId));
pWInfo->nLevel--; pWInfo->nLevel--;
nTabList--; nTabList--;

View File

@@ -436,5 +436,48 @@ foreach predicate {
} {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine} } {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine}
} }
do_execsql_test where3-7-setup {
CREATE TABLE t71(x1 INTEGER PRIMARY KEY, y1);
CREATE TABLE t72(x2 INTEGER PRIMARY KEY, y2);
CREATE TABLE t73(x3, y3);
CREATE TABLE t74(x4, y4);
INSERT INTO t71 VALUES(123,234);
INSERT INTO t72 VALUES(234,345);
INSERT INTO t73 VALUES(123,234);
INSERT INTO t74 VALUES(234,345);
INSERT INTO t74 VALUES(234,678);
} {}
foreach disabled_opt {none omit-noop-join all} {
optimization_control db all 1
optimization_control db $disabled_opt 0
do_execsql_test where3-7.$disabled_opt.1 {
SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1;
} {123}
do_execsql_test where3-7.$disabled_opt.2 {
SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1 WHERE y2 IS NULL;
} {}
do_execsql_test where3-7.$disabled_opt.3 {
SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1 WHERE y2 IS NOT NULL;
} {123}
do_execsql_test where3-7.$disabled_opt.4 {
SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1 AND y2 IS NULL;
} {123}
do_execsql_test where3-7.$disabled_opt.5 {
SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1 AND y2 IS NOT NULL;
} {123}
do_execsql_test where3-7.$disabled_opt.6 {
SELECT x3 FROM t73 LEFT JOIN t72 ON x2=y3;
} {123}
do_execsql_test where3-7.$disabled_opt.7 {
SELECT DISTINCT x3 FROM t73 LEFT JOIN t72 ON x2=y3;
} {123}
do_execsql_test where3-7.$disabled_opt.8 {
SELECT x3 FROM t73 LEFT JOIN t74 ON x4=y3;
} {123 123}
do_execsql_test where3-7.$disabled_opt.9 {
SELECT DISTINCT x3 FROM t73 LEFT JOIN t74 ON x4=y3;
} {123}
}
finish_test finish_test