]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Make it possible for block-sort to use the OP_SorterOpen sorter in addition
authordrh <drh@noemail.net>
Wed, 19 Mar 2014 17:41:36 +0000 (17:41 +0000)
committerdrh <drh@noemail.net>
Wed, 19 Mar 2014 17:41:36 +0000 (17:41 +0000)
to a generic OP_OpenEphemeral.

FossilOrigin-Name: 7ce2daafd39a117041bfdd0a7132e2764fe7a74b

manifest
manifest.uuid
src/select.c
src/vdbe.c
src/vdbeInt.h
src/vdbesort.c

index 2fa2da709832c35ee724c7f9b487da4c61b2792c..d2192d8683d863346edaed010fa7d04111d71427 100644 (file)
--- 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
index 9945baac145b7d60899d46706f4e18150c180f2a..88b98e78a667aaee33bd38b440193fba23cd11b5 100644 (file)
@@ -1 +1 @@
-62f3a22050e0f11c789374f8a3785df0a84c24cb
\ No newline at end of file
+7ce2daafd39a117041bfdd0a7132e2764fe7a74b
\ No newline at end of file
index ca54ae635f86c839a390fd9fc829f7ff2b8cc94f..6ea206d3f02a76e562d017eccb2f84b44bb7711c 100644 (file)
@@ -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);
index 9f02fa796cc932dfada199c3f2b5fb33ddcf62bc..7104c6d017721eb98bcaa31b3bfca35e30f86de1 100644 (file)
@@ -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->p1<p->nCursor );
   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;
 }
 
index dc40187833bd6edf7f9870b5e6adfaf68cb6cea1..b75247803589745693a46cc08a8c7f2893c0add3 100644 (file)
@@ -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 *);
index b9ed97e8b3a4ba75b38f16e0f047fea2553e4572..8b6ecc5e0c407dd0e0bd8c93436cdcb60f88bf7b 100644 (file)
@@ -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; i<pSorter->nTree; 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; i<pSorter->nTree; 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;