]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the SQLITE_OMIT_MERGE_SORT pre-processor directive. To omit the code in vdbesort.c.
authordan <dan@noemail.net>
Fri, 12 Aug 2011 15:02:00 +0000 (15:02 +0000)
committerdan <dan@noemail.net>
Fri, 12 Aug 2011 15:02:00 +0000 (15:02 +0000)
FossilOrigin-Name: 4ced2394b10d0a4f86422ff893bcdf3cf32591e3

manifest
manifest.uuid
src/build.c
src/ctime.c
src/test_config.c
src/vdbe.c
src/vdbeInt.h
src/vdbesort.c
test/indexfault.test

index 19777c1814dd9b0b8d192ac01ef23407a8b05d34..ffac6017b8ec469f012007a9de3d734113e5da78 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\stests\sto\simprove\scoverage\sof\svdbesort.c.
-D 2011-08-12T11:59:57.541
+C Add\sthe\sSQLITE_OMIT_MERGE_SORT\spre-processor\sdirective.\sTo\somit\sthe\scode\sin\svdbesort.c.
+D 2011-08-12T15:02:00.509
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in c1d7a7f4fd8da6b1815032efca950e3d5125407e
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -127,10 +127,10 @@ F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
 F src/btree.c a30bdcc27eedc36a38a3a11e1ba83de9a6729f7e
 F src/btree.h f5d775cd6cfc7ac32a2535b70e8d2af48ef5f2ce
 F src/btreeInt.h 67978c014fa4f7cc874032dd3aacadd8db656bc3
-F src/build.c 8aca0539bac544caf3ecb2baac1e7bdc1bfc80e6
+F src/build.c ac39a62c06fbc3d6ef1d5f784e06d806bc821edc
 F src/callback.c 0425c6320730e6d3981acfb9202c1bed9016ad1a
 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
-F src/ctime.c 7deec4534f3b5a0c3b4a4cbadf809d321f64f9c4
+F src/ctime.c 7f283795650dd4122cc07bd02193c40193b32cc6
 F src/date.c a3c6842bad7ae632281811de112a8ba63ff08ab3
 F src/delete.c ff68e5ef23aee08c0ff528f699a19397ed8bbed8
 F src/expr.c 4bbdfaf66bc614be9254ce0c26a17429067a3e07
@@ -201,7 +201,7 @@ F src/test_async.c 0612a752896fad42d55c3999a5122af10dcf22ad
 F src/test_autoext.c 30e7bd98ab6d70a62bb9ba572e4c7df347fe645e
 F src/test_backup.c c129c91127e9b46e335715ae2e75756e25ba27de
 F src/test_btree.c 47cd771250f09cdc6e12dda5bc71bc0b3abc96e2
-F src/test_config.c b4648b103586d2ae863056080c657680f6fa4825
+F src/test_config.c 9bc44df77f22cd0648c651fcd459353b8a984d7b
 F src/test_demovfs.c 20a4975127993f4959890016ae9ce5535a880094
 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc
 F src/test_func.c cbdec5cededa0761daedde5baf06004a9bf416b5
@@ -238,14 +238,14 @@ F src/update.c 74a6cfb34e9732c1e2a86278b229913b4b51eeec
 F src/utf.c c53eb7404b3eb5c1cbb5655c6a7a0e0ce6bd50f0
 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70
 F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e
-F src/vdbe.c ec7b04557d0849d835c4b1b95b463c2c470b60f8
+F src/vdbe.c eed17aa60343d7d19dc5110e0d4855695b7be9bb
 F src/vdbe.h 5cf09e7ee8a3f7d93bc51f196a96550786afe7a1
-F src/vdbeInt.h de75338edfafb812f5bf7f1b3881cbc7256b3c17
+F src/vdbeInt.h 603b4ccc81ffd7e57f15e4bdecee6d593856eec7
 F src/vdbeapi.c 11dc47987abacb76ad016dcf5abc0dc422482a98
 F src/vdbeaux.c 8fb978eb73a97b34d352dd3ef3bff35b1b3fa7e9
 F src/vdbeblob.c f024f0bf420f36b070143c32b15cc7287341ffd3
 F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b
-F src/vdbesort.c 6498ab415733d0c534d86b86238e8263e19105fe
+F src/vdbesort.c b475ceede1837731f603f32ad28c3d59f07ec04e
 F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114
 F src/vtab.c 901791a47318c0562cd0c676a2c6ff1bc530e582
 F src/wal.c 0c70ad7b1cac6005fa5e2cbefd23ee05e391c290
@@ -513,7 +513,7 @@ F test/index2.test ee83c6b5e3173a3d7137140d945d9a5d4fdfb9d6
 F test/index3.test 423a25c789fc8cc51aaf2a4370bbdde2d9e9eed7
 F test/index4.test c82a59c9ae2ac01804bdb100162dca057318f40f
 F test/indexedby.test be501e381b82b2f8ab406309ba7aac46e221f4ad
-F test/indexfault.test 20a9eb550fd72b7ade902b7046c819b42b849685
+F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d
 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7
 F test/insert.test aef273dd1cee84cc92407469e6bd1b3cdcb76908
 F test/insert2.test 4f3a04d168c728ed5ec2c88842e772606c7ce435
@@ -955,7 +955,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5
 F tool/tostr.awk 11760e1b94a5d3dcd42378f3cc18544c06cfa576
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings.sh 2ebae31e1eb352696f3c2f7706a34c084b28c262
-P eec8c0df075d3a54ad71a2854b170f3ed307d068
-R bafb9457f8118a5d4035b8ba0984f092
+P 87a15917d7d88285054e2a319506dd4a0cac9722
+R 8547f4d65e2fdae700fb2b829b9d1918
 U dan
-Z b426ea64e3d3bc7483e8f669138ad278
+Z 981ae6d6ebf67ae66ca60cea9244ff02
index 0c6e95d1a6ad321162ad884e3ee52e54e169f3c4..5e836f533fa82b3cd69d3f4bc79ff27978d8d109 100644 (file)
@@ -1 +1 @@
-87a15917d7d88285054e2a319506dd4a0cac9722
\ No newline at end of file
+4ced2394b10d0a4f86422ff893bcdf3cf32591e3
\ No newline at end of file
index 7152ab8eb49f14e3507a3eb0cc2281055179cfde..91fe039c09c209431b1558b03e83924346e40ad4 100644 (file)
@@ -2308,7 +2308,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
   Table *pTab = pIndex->pTable;  /* The table that is indexed */
   int iTab = pParse->nTab++;     /* Btree cursor used for pTab */
   int iIdx = pParse->nTab++;     /* Btree cursor used for pIndex */
-  int iSorter = pParse->nTab++;  /* Btree cursor used for sorting */
+  int iSorter = iTab;            /* Cursor opened by OpenSorter (if in use) */
   int addr1;                     /* Address of top of loop */
   int tnum;                      /* Root page of index */
   Vdbe *v;                       /* Generate code into this virtual machine */
@@ -2318,6 +2318,15 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
   sqlite3 *db = pParse->db;      /* The database connection */
   int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
 
+  /* Set bUseSorter to use OP_OpenSorter, or clear it to insert directly 
+  ** into the index. The sorter is used unless either OMIT_MERGE_SORT is
+  ** defined or the system is configured to store temp files in-memory. */
+#ifdef SQLITE_OMIT_MERGE_SORT
+  static const int bUseSorter = 0;
+#else
+  const int bUseSorter = !sqlite3TempInMemory(pParse->db);
+#endif
+
 #ifndef SQLITE_OMIT_AUTHORIZATION
   if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0,
       db->aDb[iDb].zName ) ){
@@ -2343,8 +2352,11 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
     sqlite3VdbeChangeP5(v, 1);
   }
 
-  /* Open the sorter cursor. */
-  sqlite3VdbeAddOp4(v, OP_OpenSorter, iSorter, 0, 0, (char*)pKey, P4_KEYINFO);
+  /* Open the sorter cursor if we are to use one. */
+  if( bUseSorter ){
+    iSorter = pParse->nTab++;
+    sqlite3VdbeAddOp4(v, OP_OpenSorter, iSorter, 0, 0, (char*)pKey, P4_KEYINFO);
+  }
 
   /* Open the table. Loop through all rows of the table, inserting index
   ** records into the sorter. */
@@ -2352,13 +2364,14 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
   addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0);
   regRecord = sqlite3GetTempReg(pParse);
   regIdxKey = sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
-  sqlite3VdbeAddOp2(v, OP_IdxInsert, iSorter, regRecord);
-  sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1);
-  sqlite3VdbeJumpHere(v, addr1);
 
-  /* Rewind the sorter. Loop through index records in sorted order. */
-  addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSorter, 0);
-  sqlite3VdbeAddOp2(v, OP_RowKey, iSorter, regRecord);
+  if( bUseSorter ){
+    sqlite3VdbeAddOp2(v, OP_IdxInsert, iSorter, regRecord);
+    sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1);
+    sqlite3VdbeJumpHere(v, addr1);
+    addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSorter, 0);
+    sqlite3VdbeAddOp2(v, OP_RowKey, iSorter, regRecord);
+  }
 
   if( pIndex->onError!=OE_None ){
     const int regRowid = regIdxKey + pIndex->nColumn;
@@ -2378,15 +2391,15 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
     sqlite3HaltConstraint(
         pParse, OE_Abort, "indexed columns are not unique", P4_STATIC);
   }
-  sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 1);
+  sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, bUseSorter);
   sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
   sqlite3ReleaseTempReg(pParse, regRecord);
   sqlite3VdbeAddOp2(v, OP_Next, iSorter, addr1+1);
   sqlite3VdbeJumpHere(v, addr1);
 
   sqlite3VdbeAddOp1(v, OP_Close, iTab);
-  sqlite3VdbeAddOp1(v, OP_Close, iSorter);
   sqlite3VdbeAddOp1(v, OP_Close, iIdx);
+  sqlite3VdbeAddOp1(v, OP_Close, iSorter);
 }
 
 /*
index a128f61a696603896f4df0b85915d3b7f8bc9c95..9d31596bba246fc8a45d7fb833580dba9e9dcbc6 100644 (file)
@@ -257,6 +257,9 @@ static const char * const azCompileOpt[] = {
 #ifdef SQLITE_OMIT_MEMORYDB
   "OMIT_MEMORYDB",
 #endif
+#ifdef SQLITE_OMIT_MERGE_SORT
+  "OMIT_MERGE_SORT",
+#endif
 #ifdef SQLITE_OMIT_OR_OPTIMIZATION
   "OMIT_OR_OPTIMIZATION",
 #endif
index e8d6f88f62cebd64c83f6c205f91ab23ec2b1a90..5b0ffaa697d65884500b2f262d5f2564d7e1e38e 100644 (file)
@@ -363,6 +363,12 @@ Tcl_SetVar2(interp, "sqlite_options", "long_double",
   Tcl_SetVar2(interp, "sqlite_options", "memorymanage", "0", TCL_GLOBAL_ONLY);
 #endif
 
+#ifdef SQLITE_OMIT_MERGE_SORT
+  Tcl_SetVar2(interp, "sqlite_options", "mergesort", "0", TCL_GLOBAL_ONLY);
+#else
+  Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY);
+#endif
+
 #ifdef SQLITE_OMIT_OR_OPTIMIZATION
   Tcl_SetVar2(interp, "sqlite_options", "or_opt", "0", TCL_GLOBAL_ONLY);
 #else
index 97edf90f05940c227de6033d017f6a1baa139bb4..857881413c3a5c111f7c1cae3ba854e611be14bf 100644 (file)
@@ -157,6 +157,13 @@ int sqlite3_found_count = 0;
 */
 #define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0)
 
+/* Return true if the cursor was opened using the OP_OpenSorter opcode. */
+#ifdef SQLITE_OMIT_MERGE_SORT
+# define isSorter(x) 0
+#else
+# define isSorter(x) ((x)->pSorter!=0)
+#endif
+
 /*
 ** Argument pMem points at a register that will be passed to a
 ** user-defined function or returned to the user as the result of a query.
@@ -3155,13 +3162,12 @@ case OP_OpenEphemeral: {
       SQLITE_OPEN_DELETEONCLOSE |
       SQLITE_OPEN_TRANSIENT_DB;
 
-  int btflags = BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5;
-
   assert( pOp->p1>=0 );
   pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1);
   if( pCx==0 ) goto no_mem;
   pCx->nullRow = 1;
-  rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBt, btflags, vfsFlags);
+  rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBt, 
+                        BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags);
   if( rc==SQLITE_OK ){
     rc = sqlite3BtreeBeginTrans(pCx->pBt, 1);
   }
@@ -3180,7 +3186,7 @@ case OP_OpenEphemeral: {
         rc = sqlite3BtreeCursor(pCx->pBt, pgno, 1, 
                                 (KeyInfo*)pOp->p4.z, pCx->pCursor);
         pCx->pKeyInfo = pOp->p4.pKeyInfo;
-        pCx->pKeyInfo->enc = ENC(db);
+        pCx->pKeyInfo->enc = ENC(p->db);
       }
       pCx->isTable = 0;
     }else{
@@ -3190,9 +3196,11 @@ case OP_OpenEphemeral: {
   }
   pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED);
   pCx->isIndex = !pCx->isTable;
+#ifndef SQLITE_OMIT_MERGE_SORT
   if( rc==SQLITE_OK && pOp->opcode==OP_OpenSorter ){
     rc = sqlite3VdbeSorterInit(db, pCx);
   }
+#endif
   break;
 }
 
@@ -4083,7 +4091,8 @@ case OP_RowData: {
   assert( pC->nullRow==0 );
   assert( pC->pseudoTableReg==0 );
 
-  if( pC->pSorter ){
+  if( isSorter(pC) ){
+    assert( pOp->opcode==OP_RowKey );
     rc = sqlite3VdbeSorterRowkey(db, pC, pOut);
     break;
   }
@@ -4268,7 +4277,7 @@ case OP_Rewind: {        /* jump */
   pC = p->apCsr[pOp->p1];
   assert( pC!=0 );
   res = 1;
-  if( pC->pSorter ){
+  if( isSorter(pC) ){
     rc = sqlite3VdbeSorterRewind(db, pC, &res);
   }else if( (pCrsr = pC->pCursor)!=0 ){
     rc = sqlite3BtreeFirst(pCrsr, &res);
@@ -4324,7 +4333,7 @@ case OP_Next: {        /* jump */
   if( pC==0 ){
     break;  /* See ticket #2273 */
   }
-  if( pC->pSorter ){
+  if( isSorter(pC) ){
     assert( pOp->opcode==OP_Next );
     rc = sqlite3VdbeSorterNext(db, pC, &res);
   }else{
@@ -4340,7 +4349,6 @@ case OP_Next: {        /* jump */
   }
   pC->nullRow = (u8)res;
   pC->cacheStatus = CACHE_STALE;
-
   if( res==0 ){
     pc = pOp->p2 - 1;
     if( pOp->p5 ) p->aCounter[pOp->p5-1]++;
index b2f5ef661f7679be27e6603815e542778d1db699..1574f1d57a22d6ce17c5e4a2c0e6deda5c8aa3ce 100644 (file)
@@ -392,13 +392,21 @@ void sqlite3VdbeFrameDelete(VdbeFrame*);
 int sqlite3VdbeFrameRestore(VdbeFrame *);
 void sqlite3VdbeMemStoreType(Mem *pMem);
 
+#ifdef SQLITE_OMIT_MERGE_SORT
+# define sqlite3VdbeSorterInit(Y,Z)      SQLITE_OK
+# define sqlite3VdbeSorterWrite(X,Y,Z)   SQLITE_OK
+# define sqlite3VdbeSorterClose(Y,Z)
+# define sqlite3VdbeSorterRowkey(X,Y,Z)  SQLITE_OK
+# define sqlite3VdbeSorterRewind(X,Y,Z)  SQLITE_OK
+# define sqlite3VdbeSorterNext(X,Y,Z)    SQLITE_OK
+#else
 int sqlite3VdbeSorterInit(sqlite3 *, VdbeCursor *);
 int sqlite3VdbeSorterWrite(sqlite3 *, VdbeCursor *, int);
 void sqlite3VdbeSorterClose(sqlite3 *, VdbeCursor *);
-
 int sqlite3VdbeSorterRowkey(sqlite3 *, VdbeCursor *, Mem *);
 int sqlite3VdbeSorterRewind(sqlite3 *, VdbeCursor *, int *);
 int sqlite3VdbeSorterNext(sqlite3 *, VdbeCursor *, int *);
+#endif
 
 #if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0
   void sqlite3VdbeEnter(Vdbe*);
index e7cb3aae0f65c3f52850f1bca94505add4864b32..0292ea93351df6fe69d7eabac555a8e462d9bbf4 100644 (file)
@@ -18,6 +18,8 @@
 #include "sqliteInt.h"
 #include "vdbeInt.h"
 
+#ifndef SQLITE_OMIT_MERGE_SORT
+
 typedef struct VdbeSorterIter VdbeSorterIter;
 
 /*
@@ -684,3 +686,4 @@ int sqlite3VdbeSorterRowkey(sqlite3 *db, VdbeCursor *pCsr, Mem *pOut){
   return SQLITE_OK;
 }
 
+#endif /* #ifndef SQLITE_OMIT_MERGE_SORT */
index 6f254adc9f78677babac2df06679128f04ad56bd..efe493219edc907f8ef895842db7abbb8d2dea5a 100644 (file)
@@ -15,6 +15,11 @@ source $testdir/tester.tcl
 source $testdir/lock_common.tcl
 source $testdir/malloc_common.tcl
 
+ifcapable !mergesort {
+  finish_test
+  return
+}
+
 set testprefix indexfault
 
 # Set up the custom fault-injector. This is further configured by using