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:
14
manifest
14
manifest
@@ -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
|
||||||
|
@@ -1 +1 @@
|
|||||||
3f90abddc31ac20739778c235a834c33f7057997
|
c3ae3697832a00d4d5758988a8766bdbb691e6b8
|
36
src/select.c
36
src/select.c
@@ -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);
|
||||||
|
if( bSeq ){
|
||||||
sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr);
|
sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr);
|
||||||
if( nPrefixReg==0 ){
|
|
||||||
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));
|
||||||
}
|
}
|
||||||
|
18
src/vdbe.c
18
src/vdbe.c
@@ -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]
|
||||||
**
|
**
|
||||||
|
Reference in New Issue
Block a user