Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add an extra fault-injection test to sortfault.test. Remove an unreachable branch from vdbesort.c. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | threads |
Files: | files | file ages | folders |
SHA1: |
a33a366ba8a0da81ddd895d552a34844 |
User & Date: | dan 2014-05-03 20:43:13.986 |
Context
2014-05-05
| ||
09:08 | Add tests so that the "coverage-sorter" test permutation covers all branches in vdbesort.c. Fix a few minor problems in the same file. (check-in: bde28b702d user: dan tags: threads) | |
2014-05-03
| ||
20:43 | Add an extra fault-injection test to sortfault.test. Remove an unreachable branch from vdbesort.c. (check-in: a33a366ba8 user: dan tags: threads) | |
19:33 | Fix a race condition in the sorter. (check-in: 32ccf3ae18 user: dan tags: threads) | |
Changes
Changes to src/vdbesort.c.
︙ | ︙ | |||
1803 1804 1805 1806 1807 1808 1809 | return rc; } #if SQLITE_MAX_WORKER_THREADS>0 /* ** Set the "use-threads" flag on object pIncr. */ | | < | | < | 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 | return rc; } #if SQLITE_MAX_WORKER_THREADS>0 /* ** Set the "use-threads" flag on object pIncr. */ static void vdbeIncrSetThreads(IncrMerger *pIncr){ pIncr->bUseThread = 1; pIncr->pTask->file2.iEof -= pIncr->mxSz; } #endif /* SQLITE_MAX_WORKER_THREADS>0 */ #define INCRINIT_NORMAL 0 #define INCRINIT_TASK 1 #define INCRINIT_ROOT 2 static int vdbePmaReaderIncrInit(PmaReader *pIter, int eMode); |
︙ | ︙ | |||
2189 2190 2191 2192 2193 2194 2195 | pIter = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader)); pSorter->pReader = pIter; if( pIter==0 ) rc = SQLITE_NOMEM; } if( rc==SQLITE_OK ){ rc = vdbeIncrNew(pLast, pMain, &pIter->pIncr); if( rc==SQLITE_OK ){ | | | | 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 | pIter = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader)); pSorter->pReader = pIter; if( pIter==0 ) rc = SQLITE_NOMEM; } if( rc==SQLITE_OK ){ rc = vdbeIncrNew(pLast, pMain, &pIter->pIncr); if( rc==SQLITE_OK ){ vdbeIncrSetThreads(pIter->pIncr); for(iTask=0; iTask<(pSorter->nTask-1); iTask++){ IncrMerger *pIncr; if( (pIncr = pMain->aIter[iTask].pIncr) ){ vdbeIncrSetThreads(pIncr); assert( pIncr->pTask!=pLast ); } } if( pSorter->nTask>1 ){ for(iTask=0; rc==SQLITE_OK && iTask<pSorter->nTask; iTask++){ PmaReader *p = &pMain->aIter[iTask]; assert( p->pIncr==0 || p->pIncr->pTask==&pSorter->aTask[iTask] ); |
︙ | ︙ |
Changes to test/sortfault.test.
︙ | ︙ | |||
22 23 24 25 26 27 28 29 30 31 32 33 34 35 | do_execsql_test 1.0 { PRAGMA cache_size = 5; } foreach {tn mmap_limit nWorker tmpstore threadsmode fakeheap} { 1 0 0 file multithread false 2 100000 0 file multithread false } { catch { db close } sqlite3_shutdown sqlite3_config_worker_threads $nWorker sqlite3_config $threadsmode sqlite3_initialize sorter_test_fakeheap $fakeheap | > | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | do_execsql_test 1.0 { PRAGMA cache_size = 5; } foreach {tn mmap_limit nWorker tmpstore threadsmode fakeheap} { 1 0 0 file multithread false 2 100000 0 file multithread false 3 100000 1 file multithread false } { catch { db close } sqlite3_shutdown sqlite3_config_worker_threads $nWorker sqlite3_config $threadsmode sqlite3_initialize sorter_test_fakeheap $fakeheap |
︙ | ︙ | |||
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | LIMIT 200 ) SELECT count(x), length(y) FROM r GROUP BY (x%5) } } -test { faultsim_test_result {0 {40 1000 40 1000 40 1000 40 1000 40 1000}} } } catch { db close } sqlite3_shutdown sqlite3_config_worker_threads 0 set t(0) singlethread set t(1) multithread set t(2) serialized sqlite3_config $t($sqlite_options(threadsafe)) sqlite3_initialize finish_test | > > > > > > > > > > > > > > > > > > > > > | 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | LIMIT 200 ) SELECT count(x), length(y) FROM r GROUP BY (x%5) } } -test { faultsim_test_result {0 {40 1000 40 1000 40 1000 40 1000 40 1000}} } do_faultsim_test 2.$tn -prep { sqlite3 db test.db sqlite3_test_control SQLITE_TESTCTRL_SORTER_MMAP db $::mmap_limit add_test_utf16bin_collate db execsql { PRAGMA cache_size = 5 } } -body { execsql { WITH r(x,y) AS ( SELECT 100, $::str UNION ALL SELECT x-1, $::str FROM r LIMIT 100 ) SELECT count(x), length(y) FROM r GROUP BY y COLLATE utf16bin, (x%5) } } -test { faultsim_test_result {0 {20 1000 20 1000 20 1000 20 1000 20 1000}} } } catch { db close } sqlite3_shutdown sqlite3_config_worker_threads 0 set t(0) singlethread set t(1) multithread set t(2) serialized sqlite3_config $t($sqlite_options(threadsafe)) sqlite3_initialize finish_test |