1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Remove the sequence values from sorter records used by ORDER BY as well.

FossilOrigin-Name: c3ae3697832a00d4d5758988a8766bdbb691e6b8
This commit is contained in:
dan
2014-03-25 15:04:07 +00:00
parent dd23c6bfb4
commit 78d5843245
4 changed files with 53 additions and 21 deletions

View File

@@ -1,5 +1,5 @@
C Omit\sthe\ssequence\svalue\sfrom\ssorter\srecords\sused\sby\sGROUP\sBY\squeries\sthat\scannot\suse\san\sindex. C Remove\sthe\ssequence\svalues\sfrom\ssorter\srecords\sused\sby\sORDER\sBY\sas\swell.
D 2014-03-24T20:19:07.793 D 2014-03-25T15:04:07.777
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -217,7 +217,7 @@ F src/printf.c e5a0005f8b3de21f85da6a709d2fbee76775bf4b
F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece
F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66 F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66
F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
F src/select.c 2b8722c9888be5e2b358dcd1369a652b38d7ccc4 F src/select.c 20055cf917222e660c4222fea306bd13a0623caa
F src/shell.c cee9f46f2688a261601b1fd3d7f4b3cddf9b5cdf F src/shell.c cee9f46f2688a261601b1fd3d7f4b3cddf9b5cdf
F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80 F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80
F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
@@ -278,7 +278,7 @@ F src/update.c 5b3e74a03b3811e586b4f2b4cbd7c49f01c93115
F src/utf.c 6dc9ec9f1b3db43ae8ba0365377f11df1ee4c01c F src/utf.c 6dc9ec9f1b3db43ae8ba0365377f11df1ee4c01c
F src/util.c c46c90459ef9bdc0c6c73803cf4c55425b4771cf F src/util.c c46c90459ef9bdc0c6c73803cf4c55425b4771cf
F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
F src/vdbe.c 5c0feeb6c9e6a0e0cc2a9715aa6045830643809d F src/vdbe.c 42177064bd02fc55984aabc3a241368fda01e8b4
F src/vdbe.h fb2c48c198300a7c632f09fc940011d2ad2fc2ae F src/vdbe.h fb2c48c198300a7c632f09fc940011d2ad2fc2ae
F src/vdbeInt.h 2b9a6849166d0014c843ae3fd83a062be4efa325 F src/vdbeInt.h 2b9a6849166d0014c843ae3fd83a062be4efa325
F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4 F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4
@@ -1157,7 +1157,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
P 4f472accf072d9cb64f209923924b26f21b13d27 P 3f90abddc31ac20739778c235a834c33f7057997
R e1309a603202b4d83715c783fe89f3da R 743d88a284437e5e0babc8e33ec37e61
U dan U dan
Z 8e3a9a2ddbbe8575a70cbc6b0dba434a Z 5024d9c780855d9abccbd4c6c23f3054

View File

@@ -1 +1 @@
3f90abddc31ac20739778c235a834c33f7057997 c3ae3697832a00d4d5758988a8766bdbb691e6b8

View File

@@ -467,24 +467,29 @@ static void pushOntoSorter(
int nPrefixReg /* No. of reg prior to regData available for use */ int nPrefixReg /* No. of reg prior to regData available for use */
){ ){
Vdbe *v = pParse->pVdbe; /* Stmt under construction */ Vdbe *v = pParse->pVdbe; /* Stmt under construction */
int bSeq = ((pSort->sortFlags & SORTFLAG_UseSorter)==0);
int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */ int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */
int nBase = nExpr + 1 + nData; /* Fields in sorter record */ int nBase = nExpr + bSeq + nData; /* Fields in sorter record */
int regBase; /* Regs for sorter record */ int regBase; /* Regs for sorter record */
int regRecord = sqlite3GetTempReg(pParse); /* Assemblied sorter record */ int regRecord = sqlite3GetTempReg(pParse); /* Assembled sorter record */
int nOBSat = pSort->nOBSat; /* No. ORDER BY terms to skip */ int nOBSat = pSort->nOBSat; /* ORDER BY terms to skip */
int op; /* Opcode to add sorter record to sorter */ int op; /* Opcode to add sorter record to sorter */
assert( bSeq==0 || bSeq==1 );
if( nPrefixReg ){ if( nPrefixReg ){
assert( nPrefixReg==nExpr+1 ); assert( nPrefixReg==nExpr+bSeq );
regBase = regData - nExpr - 1; regBase = regData - nExpr - bSeq;
}else{ }else{
regBase = sqlite3GetTempRange(pParse, nBase); regBase = sqlite3GetTempRange(pParse, nBase);
} }
sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, SQLITE_ECEL_DUP); sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, SQLITE_ECEL_DUP);
sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr); if( bSeq ){
if( nPrefixReg==0 ){ sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr);
sqlite3VdbeAddOp3(v, OP_Move, regData, regBase+nExpr+1, nData);
} }
if( nPrefixReg==0 ){
sqlite3VdbeAddOp3(v, OP_Move, regData, regBase+nExpr+bSeq, nData);
}
sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regRecord); sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regRecord);
if( nOBSat>0 ){ if( nOBSat>0 ){
int regPrevKey; /* The first nOBSat columns of the previous row */ int regPrevKey; /* The first nOBSat columns of the previous row */
@@ -496,8 +501,13 @@ static void pushOntoSorter(
regPrevKey = pParse->nMem+1; regPrevKey = pParse->nMem+1;
pParse->nMem += pSort->nOBSat; pParse->nMem += pSort->nOBSat;
nKey = nExpr - pSort->nOBSat + 1; nKey = nExpr - pSort->nOBSat + bSeq;
addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); VdbeCoverage(v); if( bSeq ){
addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr);
}else{
addrFirst = sqlite3VdbeAddOp1(v, OP_SequenceTest, pSort->iECursor);
}
VdbeCoverage(v);
sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat); sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat);
pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex);
if( pParse->db->mallocFailed ) return; if( pParse->db->mallocFailed ) return;
@@ -659,7 +669,8 @@ static void selectInnerLoop(
if( pDest->iSdst==0 ){ if( pDest->iSdst==0 ){
if( pSort ){ if( pSort ){
nPrefixReg = pSort->pOrderBy->nExpr + 1; nPrefixReg = pSort->pOrderBy->nExpr;
if( !(pSort->sortFlags & SORTFLAG_UseSorter) ) nPrefixReg++;
pParse->nMem += nPrefixReg; pParse->nMem += nPrefixReg;
} }
pDest->iSdst = pParse->nMem+1; pDest->iSdst = pParse->nMem+1;
@@ -1152,6 +1163,7 @@ static void generateSortTail(
int nSortData; /* Trailing values to read from sorter */ int nSortData; /* Trailing values to read from sorter */
u8 p5; /* p5 parameter for 1st OP_Column */ u8 p5; /* p5 parameter for 1st OP_Column */
int i; int i;
int bSeq; /* True if sorter record includes seq. no. */
#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS
struct ExprList_item *aOutEx = p->pEList->a; struct ExprList_item *aOutEx = p->pEList->a;
#endif #endif
@@ -1185,14 +1197,16 @@ static void generateSortTail(
codeOffset(v, p->iOffset, addrContinue); codeOffset(v, p->iOffset, addrContinue);
sqlite3VdbeAddOp2(v, OP_SorterData, iTab, regSortOut); sqlite3VdbeAddOp2(v, OP_SorterData, iTab, regSortOut);
p5 = OPFLAG_CLEARCACHE; p5 = OPFLAG_CLEARCACHE;
bSeq = 0;
}else{ }else{
addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); VdbeCoverage(v); addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); VdbeCoverage(v);
codeOffset(v, p->iOffset, addrContinue); codeOffset(v, p->iOffset, addrContinue);
iSortTab = iTab; iSortTab = iTab;
p5 = 0; p5 = 0;
bSeq = 1;
} }
for(i=0; i<nSortData; i++){ for(i=0; i<nSortData; i++){
sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+1+i, regRow+i); sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq+i, regRow+i);
if( i==0 ) sqlite3VdbeChangeP5(v, p5); if( i==0 ) sqlite3VdbeChangeP5(v, p5);
VdbeComment((v, "%s", aOutEx[i].zName ? aOutEx[i].zName : aOutEx[i].zSpan)); VdbeComment((v, "%s", aOutEx[i].zName ? aOutEx[i].zName : aOutEx[i].zSpan));
} }

View File

@@ -3385,6 +3385,24 @@ case OP_SorterOpen: {
break; break;
} }
/* Opcode: SequenceTest P1 P2 * * *
** Synopsis: if( cursor[P1].ctr++ ) pc = P2
**
** P1 is a sorter cursor. If the sequence counter is currently zero, jump
** to P2. Regardless of whether or not the jump is taken, increment the
** the sequence value.
*/
case OP_SequenceTest: {
VdbeCursor *pC;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1];
assert( pC->pSorter );
if( (pC->seqCount++)==0 ){
pc = pOp->p2 - 1;
}
break;
}
/* Opcode: OpenPseudo P1 P2 P3 * * /* Opcode: OpenPseudo P1 P2 P3 * *
** Synopsis: P3 columns in r[P2] ** Synopsis: P3 columns in r[P2]
** **