diff options
author | drh <drh@noemail.net> | 2009-11-12 04:26:39 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2009-11-12 04:26:39 +0000 |
commit | 35451c6acdd9127bb7ab1d20862ad77e492fc1ed (patch) | |
tree | 1df4fe4eaea2a7c99ef30762adb2a9ecb4caacf9 /src | |
parent | 6a51741d4657e1621db3cc8352b3c706be00a1d4 (diff) | |
download | sqlite-35451c6acdd9127bb7ab1d20862ad77e492fc1ed.tar.gz sqlite-35451c6acdd9127bb7ab1d20862ad77e492fc1ed.zip |
Suppress unnecessary OP_Noop instructions on when the right table of a
LEFT JOIN uses the index-only optimization.
FossilOrigin-Name: e8aec08bee1c8d593474561898037aed571e64ce
Diffstat (limited to 'src')
-rw-r--r-- | src/where.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/where.c b/src/where.c index 56f0ace60..135ff8002 100644 --- a/src/where.c +++ b/src/where.c @@ -3944,7 +3944,11 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ if( pLevel->iLeftJoin ){ int addr; addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); - sqlite3VdbeAddOp1(v, OP_NullRow, pTabList->a[i].iCursor); + assert( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0 + || (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 ); + if( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_NullRow, pTabList->a[i].iCursor); + } if( pLevel->iIdxCur>=0 ){ sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur); } @@ -3995,7 +3999,6 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ int k, j, last; VdbeOp *pOp; Index *pIdx = pLevel->plan.u.pIdx; - int useIndexOnly = pLevel->plan.wsFlags & WHERE_IDX_ONLY; assert( pIdx!=0 ); pOp = sqlite3VdbeGetOp(v, pWInfo->iTop); @@ -4010,12 +4013,11 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ break; } } - assert(!useIndexOnly || j<pIdx->nColumn); + assert( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0 + || j<pIdx->nColumn ); }else if( pOp->opcode==OP_Rowid ){ pOp->p1 = pLevel->iIdxCur; pOp->opcode = OP_IdxRowid; - }else if( pOp->opcode==OP_NullRow && useIndexOnly ){ - pOp->opcode = OP_Noop; } } } |