diff options
author | drh <drh@noemail.net> | 2019-08-23 16:12:20 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2019-08-23 16:12:20 +0000 |
commit | 0086e078656bbdfebffdbea67f3f0131aa677b08 (patch) | |
tree | b4de186c28806254372777fba77c5f1a516d5ade /src/wherecode.c | |
parent | ec3dda5b11f527c69f1007fa60ba2765e0a5628b (diff) | |
download | sqlite-0086e078656bbdfebffdbea67f3f0131aa677b08.tar.gz sqlite-0086e078656bbdfebffdbea67f3f0131aa677b08.zip |
Simplification of the WHERE loop code generator for NULLS LAST saves a
few CPU cycles and about a hundred bytes of code space.
FossilOrigin-Name: e3ed2f496f51234a8f81d90d47ba603b06dbed38b8bd8f1934294379cde74d3a
Diffstat (limited to 'src/wherecode.c')
-rw-r--r-- | src/wherecode.c | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/src/wherecode.c b/src/wherecode.c index 2aff70554..c1304c8af 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1671,10 +1671,10 @@ Bitmask sqlite3WhereCodeOneLoopStart( } bSeekPastNull = 0; }else if( bSeekPastNull ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); - nConstraint++; startEq = 0; + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); start_constraints = 1; + nConstraint++; }else if( regBignull ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); start_constraints = 1; @@ -1705,30 +1705,20 @@ Bitmask sqlite3WhereCodeOneLoopStart( VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); + assert( bSeekPastNull==0 || bStopAtNull==0 ); if( regBignull ){ + assert( bSeekPastNull==1 || bStopAtNull==1 ); + assert( bStopAtNull==startEq ); sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); - if( bStopAtNull ){ - start_constraints = (nConstraint>1); - op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint-1); - VdbeCoverage(v); - VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); - VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); - VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); - VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); - VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); - VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); - }else{ - op = aStartOp[(start_constraints<<2) + ((!startEq)<<1) + bRev]; - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); - VdbeCoverage(v); - VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); - VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); - VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); - VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); - VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); - VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); - } + op = aStartOp[(nConstraint>1)*4 + 2 + bRev]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + nConstraint-startEq); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + assert( op==OP_Rewind || op==OP_Last || op==OP_SeekGE || op==OP_SeekLE); } } |