- C Add\san\sexperimental\smulti-threaded\scapability\sto\svdbesorter.c.
- D 2014-03-17T15:43:05.543
-C Detect\swhen\sa\sVdbeCursor\sis\sstill\spointing\sat\sa\svalid\srow\sbut\sthat\srow\shas\nmoved,\sand\sinvalidated\sthe\sreturn\sfrom\sprior\ssqlite3BtreeDataFetch()\sor\nsqlite3BtreeKeyFetch()\scalls.
-D 2014-03-25T11:00:21.320
++C Merge\sall\sfixes\sand\senhancements\sfrom\strunk.
++D 2014-03-25T13:17:41.050
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
-F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
+F Makefile.in ad0921c4b2780d01868cf69b419a4f102308d125
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
-F Makefile.msc fdacba6fb574868c71fde6db6b77789a383a4c19
+F Makefile.msc 153eb9b9725bc7b8e4dbe963219298e0c4a644b0
F Makefile.vxworks db21ed42a01d5740e656b16f92cb5d8d5e5dd315
F README.md 64f270c43c38c46de749e419c22f0ae2f4499fe8
- F VERSION c3b0d47c3c5cf25c5bd4ff9e6f3af2f9d7934ea6
+ F VERSION 9f823c026c6a32fc5f84d212a8aae0a221dba45c
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
F addopcodes.awk 9eb448a552d5c0185cf62c463f9c173cedae3811
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
F src/os.c 1b147e4cf7cc39e618115c14a086aed44bc91ace
F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f
F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
- F src/os_unix.c 18f7f95dc6bcb9cf4d4a238d8e2de96611bc2ae5
+ F src/os_unix.c ae4b5240af4619d711301d7992396e182585269f
-F src/os_win.c e71678ac927d0a0fb11d993db20a9748eabf808e
+F src/os_win.c 8245fe9184300e641d02e29a8ca95cefe0cb0fd0
F src/pager.c 97a8908bf4e6e7c3adea09d3597cfa48ae33ab4e
F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
- F src/parse.y 2613ca5d609c2f3d71dd297351f010bcec16e1e0
+ F src/parse.y 22d6a074e5f5a7258947a1dc55a9bf946b765dd0
F src/pcache.c d8eafac28290d4bb80332005435db44991d07fc2
F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
F src/pcache1.c 102e6f5a2fbc646154463eb856d1fd716867b64c
F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80
F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
- F src/sqliteInt.h 5b4df32250dd7bd94569ef36d2a667c1e91247d6
-F src/sqliteInt.h afbf39e96736ceb85e1d896b281ba2406dd70aa0
++F src/sqliteInt.h fb667a3d602d405be6abf0fb21246aac7bb23e76
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
F src/utf.c 6dc9ec9f1b3db43ae8ba0365377f11df1ee4c01c
F src/util.c c46c90459ef9bdc0c6c73803cf4c55425b4771cf
F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
- F src/vdbe.c 5f0fffa9bf49a90c05dc3d46d8217603fd0ee00e
+ F src/vdbe.c 74c7386e83eee56f921a17bb4a0396c9551f5bc7
F src/vdbe.h fb2c48c198300a7c632f09fc940011d2ad2fc2ae
- F src/vdbeInt.h e54fc4f289fce48e81b3371128446033d097733b
+ F src/vdbeInt.h 2b9a6849166d0014c843ae3fd83a062be4efa325
F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4
- F src/vdbeaux.c e45e3f9daf38c5be3fd39e9aacc1c9066af57a06
+ F src/vdbeaux.c 68dbdc77cdc008eeabc088b8b8a60aa743ba8d2a
F src/vdbeblob.c 15377abfb59251bccedd5a9c7d014a895f0c04aa
F src/vdbemem.c 6fc77594c60f6155404f3f8d71bf36d1fdeb4447
- F src/vdbesort.c 1d973fcd0e00c77836e9d505e7c45df02601ffc2
-F src/vdbesort.c 4abb7c0f8f19b7d7d82f4558d5da1a30fdf9ea38
++F src/vdbesort.c 0fbaf5b3ec3e779d81c4db4eb2f0ae5f44fbb02c
F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767
F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
F src/wal.c 76e7fc6de229bea8b30bb2539110f03a494dc3a8
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
- P d17231b63d48c1f9c4dee109c90cec112e2f0fd4
- R 3c79acd4eecb6926efd889b756a27898
- U dan
- Z 226b72b7faaae8e6d7b6586f32d5c5a0
-P 4d7551ce464c8038147e81667368924f2a7485a6
-R 8613a90c52863cb0b93f254b2d121d4b
++P ff0b5c851ba7d04d1836d7c6a3222713e7d8d357 e6798871ce94961135762669af418cd78540c121
++R 5887d7b59f581a1221f99e7d95aac2b8
+ U drh
-Z f61d5d3cf5132dbd8d9ed764bc0739f9
++Z 5e51466328d6bc63d3b26ee7aec599ce
}
/*
-** Reset a sorting cursor back to its original empty state.
+** Free all resources owned by the object indicated by argument pThread. All
+** fields of *pThread are zeroed before returning.
*/
-void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){
- if( pSorter->aIter ){
- int i;
- for(i=0; i<pSorter->nTree; i++){
- vdbeSorterIterZero(db, &pSorter->aIter[i]);
+static void vdbeSorterThreadCleanup(sqlite3 *db, SorterThread *pThread){
+ sqlite3DbFree(db, pThread->pUnpacked);
++ pThread->pUnpacked = 0;
+ vdbeSorterRecordFree(0, pThread->pList);
++ pThread->pList = 0;
+ if( pThread->pTemp1 ){
+ sqlite3OsCloseFree(pThread->pTemp1);
++ pThread->pTemp1 = 0;
+ }
- memset(pThread, 0, sizeof(SorterThread));
+}
+
+/*
+** Join all threads.
+*/
+static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){
+ int rc = rcin;
+ int i;
+ for(i=0; i<SQLITE_MAX_SORTER_THREAD; i++){
+ SorterThread *pThread = &pSorter->aThread[i];
+ if( pThread->pThread ){
+ void *pRet;
+ int rc2 = sqlite3ThreadJoin(pThread->pThread, &pRet);
+ pThread->pThread = 0;
+ pThread->bDone = 0;
+ if( rc==SQLITE_OK ) rc = rc2;
+ if( rc==SQLITE_OK ) rc = SQLITE_PTR_TO_INT(pRet);
+ }
+ }
+ return rc;
+}
+
+/*
+** Allocate a new SorterMerger object with space for nIter iterators.
+*/
+static SorterMerger *vdbeSorterMergerNew(int nIter){
+ int N = 2; /* Smallest power of two >= nIter */
+ int nByte; /* Total bytes of space to allocate */
+ SorterMerger *pNew; /* Pointer to allocated object to return */
+
+ assert( nIter<=SORTER_MAX_MERGE_COUNT );
+ while( N<nIter ) N += N;
+ nByte = sizeof(SorterMerger) + N * (sizeof(int) + sizeof(VdbeSorterIter));
+
+ pNew = (SorterMerger*)sqlite3MallocZero(nByte);
+ if( pNew ){
+ pNew->nTree = N;
+ pNew->aIter = (VdbeSorterIter*)&pNew[1];
+ pNew->aTree = (int*)&pNew->aIter[N];
+ }
-
+ return pNew;
+}
+
+/*
- ** Free the SorterMerger object passed as the only argument.
++** Reset a merger
+*/
- static void vdbeSorterMergerFree(SorterMerger *pMerger){
++static void vdbeSorterMergerReset(SorterMerger *pMerger){
++ int i;
+ if( pMerger ){
- int i;
+ for(i=0; i<pMerger->nTree; i++){
+ vdbeSorterIterZero(&pMerger->aIter[i]);
}
- sqlite3_free(pMerger);
- sqlite3DbFree(db, pSorter->aIter);
- pSorter->aIter = 0;
}
- if( pSorter->pTemp1 ){
- sqlite3OsCloseFree(pSorter->pTemp1);
- pSorter->pTemp1 = 0;
+}
+
++
++/*
++** Free the SorterMerger object passed as the only argument.
++*/
++static void vdbeSorterMergerFree(SorterMerger *pMerger){
++ vdbeSorterMergerReset(pMerger);
++ sqlite3_free(pMerger);
++}
++
++/*
++** Reset a sorting cursor back to its original empty state.
++*/
++void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){
++ int i;
++ vdbeSorterJoinAll(pSorter, SQLITE_OK);
++ for(i=0; i<SQLITE_MAX_SORTER_THREAD; i++){
++ SorterThread *pThread = &pSorter->aThread[i];
++ vdbeSorterThreadCleanup(db, pThread);
+ }
- vdbeSorterRecordFree(db, pSorter->pRecord);
++ vdbeSorterRecordFree(0, pSorter->pRecord);
++ vdbeSorterMergerReset(pSorter->pMerger);
+ pSorter->pRecord = 0;
- pSorter->iWriteOff = 0;
- pSorter->iReadOff = 0;
+ pSorter->nInMemory = 0;
- pSorter->nTree = 0;
- pSorter->nPMA = 0;
- pSorter->aTree = 0;
++ pSorter->bUsePMA = 0;
+ }
+
-
/*
** Free any cursor components allocated by sqlite3VdbeSorterXXX routines.
*/
void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){
VdbeSorter *pSorter = pCsr->pSorter;
if( pSorter ){
- int i;
- vdbeSorterJoinAll(pSorter, SQLITE_OK);
- for(i=0; i<SQLITE_MAX_SORTER_THREAD; i++){
- SorterThread *pThread = &pSorter->aThread[i];
- vdbeSorterThreadCleanup(db, pThread);
- }
-
- vdbeSorterRecordFree(0, pSorter->pRecord);
+ sqlite3VdbeSorterReset(db, pSorter);
- sqlite3DbFree(db, pSorter->pUnpacked);
+ vdbeSorterMergerFree(pSorter->pMerger);
sqlite3DbFree(db, pSorter);
pCsr->pSorter = 0;
}