From: drh Date: Tue, 25 Mar 2014 13:17:41 +0000 (+0000) Subject: Merge all fixes and enhancements from trunk. X-Git-Tag: version-3.8.7~132^2~98 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c2b314222808501808a466968efb0080565b021;p=thirdparty%2Fsqlite.git Merge all fixes and enhancements from trunk. FossilOrigin-Name: b415dfb6cb0df0c69992ca2bb700c15664f158e6 --- 5c2b314222808501808a466968efb0080565b021 diff --cc manifest index 2de90048c0,e6372d6699..7ccdd5b9a5 --- a/manifest +++ b/manifest @@@ -1,12 -1,12 +1,12 @@@ - 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 @@@ -203,11 -203,11 +203,11 @@@ F src/notify.c 976dd0f6171d4588e89e874f 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 @@@ -222,7 -222,7 +222,7 @@@ F src/shell.c cee9f46f2688a261601b1fd3d 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 @@@ -279,14 -278,14 +279,14 @@@ F src/update.c 5b3e74a03b3811e586b4f2b4 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 @@@ -1157,7 -1159,7 +1160,7 @@@ F tool/vdbe_profile.tcl 67746953071a9f8 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 diff --cc manifest.uuid index bf397f3d56,b106017e83..628a8f1b85 --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - ff0b5c851ba7d04d1836d7c6a3222713e7d8d357 -e6798871ce94961135762669af418cd78540c121 ++b415dfb6cb0df0c69992ca2bb700c15664f158e6 diff --cc src/vdbesort.c index e84a33fccc,d1b726b727..3c8e91d987 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@@ -592,88 -505,40 +592,107 @@@ static void vdbeSorterRecordFree(sqlite } /* -** 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; inTree; 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; iaThread[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( NnTree = 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; inTree; 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; iaThread[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; iaThread[i]; - vdbeSorterThreadCleanup(db, pThread); - } - - vdbeSorterRecordFree(0, pSorter->pRecord); + sqlite3VdbeSorterReset(db, pSorter); - sqlite3DbFree(db, pSorter->pUnpacked); + vdbeSorterMergerFree(pSorter->pMerger); sqlite3DbFree(db, pSorter); pCsr->pSorter = 0; }