From: drh Date: Wed, 19 Mar 2014 17:41:36 +0000 (+0000) Subject: Make it possible for block-sort to use the OP_SorterOpen sorter in addition X-Git-Tag: version-3.8.5~109^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=65ea12cb4aef6f33970e74d4de705c5a7628f622;p=thirdparty%2Fsqlite.git Make it possible for block-sort to use the OP_SorterOpen sorter in addition to a generic OP_OpenEphemeral. FossilOrigin-Name: 7ce2daafd39a117041bfdd0a7132e2764fe7a74b --- diff --git a/manifest b/manifest index 2fa2da7098..d2192d8683 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sthe\sblock-sort\slogic\sthat\scan\sarise\sif\sthe\sVDBE\sopcode\narray\sis\sresized\swhile\sthe\sblock-sort\slogic\sis\sbeing\scoded.\s\s"make\stest"\nnow\sruns\sto\scompletion,\sthough\sthere\sare\sstill\s17\sfailures. -D 2014-03-19T16:56:58.204 +C Make\sit\spossible\sfor\sblock-sort\sto\suse\sthe\sOP_SorterOpen\ssorter\sin\saddition\nto\sa\sgeneric\sOP_OpenEphemeral. +D 2014-03-19T17:41:36.148 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -217,7 +217,7 @@ F src/printf.c e5a0005f8b3de21f85da6a709d2fbee76775bf4b F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 -F src/select.c 0c5df3eb627983064207c543db7d46fc960ca3a4 +F src/select.c f481ab847cfb3ad2b2dce671a4dcbfdb50f8e666 F src/shell.c bab4de12b441369491812ecc93212ff4deda68fa F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e @@ -278,14 +278,14 @@ F src/update.c 5b3e74a03b3811e586b4f2b4cbd7c49f01c93115 F src/utf.c 6dc9ec9f1b3db43ae8ba0365377f11df1ee4c01c F src/util.c c46c90459ef9bdc0c6c73803cf4c55425b4771cf F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c e0fe939465f101a6f30f1864813698edc57f610e +F src/vdbe.c 37cfae03a0c40515304fb0a8a1a97ac3aa965e87 F src/vdbe.h fb2c48c198300a7c632f09fc940011d2ad2fc2ae -F src/vdbeInt.h aa7ea20696609966c71a4b58c6a4fdb974c5e877 +F src/vdbeInt.h 2b9a6849166d0014c843ae3fd83a062be4efa325 F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4 F src/vdbeaux.c 5078ca7de4fd5ba4535bd17fe44d5b56c2d3294c F src/vdbeblob.c 15377abfb59251bccedd5a9c7d014a895f0c04aa F src/vdbemem.c 6fc77594c60f6155404f3f8d71bf36d1fdeb4447 -F src/vdbesort.c 46801acb342e5e4c07ba1777fe58880c143abb59 +F src/vdbesort.c 553537f632e8925bb8a2563692d0ee6e2175018c F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767 F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd F src/wal.c 76e7fc6de229bea8b30bb2539110f03a494dc3a8 @@ -1156,7 +1156,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 463d921b519b08648a715e987c430f06b06bae84 -R 0046fa449ec804e57106e3417f064519 +P 62f3a22050e0f11c789374f8a3785df0a84c24cb +R 83d570cd19fdb25aa0d409b1a1586b4b U drh -Z 208b34a8fc9197aeefd7f546d5d68bb0 +Z 5d298c6da64eb9d6d4284253fdadfab0 diff --git a/manifest.uuid b/manifest.uuid index 9945baac14..88b98e78a6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -62f3a22050e0f11c789374f8a3785df0a84c24cb \ No newline at end of file +7ce2daafd39a117041bfdd0a7132e2764fe7a74b \ No newline at end of file diff --git a/src/select.c b/src/select.c index ca54ae635f..6ea206d3f0 100644 --- a/src/select.c +++ b/src/select.c @@ -488,8 +488,6 @@ static void pushOntoSorter( addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat); pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); - pOp->opcode = OP_OpenEphemeral; - pSort->sortFlags &= ~SORTFLAG_UseSorter; pOp->p2 = nKey + 1; sqlite3VdbeChangeP4(v, -1, (char*)pOp->p4.pKeyInfo, P4_KEYINFO); pOp->p4.pKeyInfo = keyInfoFromExprList(pParse, pSort->pOrderBy, nOBSat, 1); @@ -498,7 +496,7 @@ static void pushOntoSorter( pSort->labelBkOut = sqlite3VdbeMakeLabel(v); pSort->regReturn = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); - sqlite3VdbeAddOp1(v, OP_ClearEphem, pSort->iECursor); + sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor); sqlite3VdbeJumpHere(v, addrFirst); sqlite3VdbeAddOp3(v, OP_Move, regBase, regPrevKey, pSort->nOBSat); sqlite3VdbeJumpHere(v, addrJmp); diff --git a/src/vdbe.c b/src/vdbe.c index 9f02fa796c..7104c6d017 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4872,20 +4872,26 @@ case OP_Clear: { break; } -/* Opcode: ClearEphem P1 * * * * +/* Opcode: ResetSorter P1 * * * * ** -** Delete all contents from the ephemeral table that is open on cursor P1. +** Delete all contents from the ephemeral table or sorter +** that is open on cursor P1. ** -** See also: Clear, Destroy +** This opcode only works for cursors used for sorting and +** opened with OP_OpenEphemeral or OP_SorterOpen. */ -case OP_ClearEphem: { +case OP_ResetSorter: { VdbeCursor *pC; assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - assert( pC->isEphemeral ); - rc = sqlite3BtreeClearTableOfCursor(pC->pCursor); + if( pC->pSorter ){ + sqlite3VdbeSorterReset(db, pC->pSorter); + }else{ + assert( pC->isEphemeral ); + rc = sqlite3BtreeClearTableOfCursor(pC->pCursor); + } break; } diff --git a/src/vdbeInt.h b/src/vdbeInt.h index dc40187833..b752478035 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -438,6 +438,7 @@ int sqlite3VdbeFrameRestore(VdbeFrame *); int sqlite3VdbeTransferError(Vdbe *p); int sqlite3VdbeSorterInit(sqlite3 *, VdbeCursor *); +void sqlite3VdbeSorterReset(sqlite3 *, VdbeSorter *); void sqlite3VdbeSorterClose(sqlite3 *, VdbeCursor *); int sqlite3VdbeSorterRowkey(const VdbeCursor *, Mem *); int sqlite3VdbeSorterNext(sqlite3 *, const VdbeCursor *, int *); diff --git a/src/vdbesort.c b/src/vdbesort.c index b9ed97e8b3..8b6ecc5e0c 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -504,23 +504,40 @@ static void vdbeSorterRecordFree(sqlite3 *db, SorterRecord *pRecord){ } } +/* +** Reset a sorting cursor back to its original empty state. +*/ +void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ + if( pSorter->aIter ){ + int i; + for(i=0; inTree; i++){ + vdbeSorterIterZero(db, &pSorter->aIter[i]); + } + sqlite3DbFree(db, pSorter->aIter); + pSorter->aIter = 0; + } + if( pSorter->pTemp1 ){ + sqlite3OsCloseFree(pSorter->pTemp1); + pSorter->pTemp1 = 0; + } + vdbeSorterRecordFree(db, pSorter->pRecord); + pSorter->pRecord = 0; + pSorter->iWriteOff = 0; + pSorter->iReadOff = 0; + pSorter->nInMemory = 0; + pSorter->nTree = 0; + pSorter->nPMA = 0; + pSorter->aTree = 0; +} + + /* ** Free any cursor components allocated by sqlite3VdbeSorterXXX routines. */ void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){ VdbeSorter *pSorter = pCsr->pSorter; if( pSorter ){ - if( pSorter->aIter ){ - int i; - for(i=0; inTree; i++){ - vdbeSorterIterZero(db, &pSorter->aIter[i]); - } - sqlite3DbFree(db, pSorter->aIter); - } - if( pSorter->pTemp1 ){ - sqlite3OsCloseFree(pSorter->pTemp1); - } - vdbeSorterRecordFree(db, pSorter->pRecord); + sqlite3VdbeSorterReset(db, pSorter); sqlite3DbFree(db, pSorter->pUnpacked); sqlite3DbFree(db, pSorter); pCsr->pSorter = 0;