Dear SQLite developers: I used my fuzz-testing tool, connzer, to detect data race in SQLite. Here is a data race found by connzer. I wish you can help me check whether it is a real race, thanks!! The following is the race report. ## Race report ## Race object: `pShmNode->pShmMutex` **Thread 1:** **Access:** `pShmNode->pShmMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);` **Line number:** `sqlite3.c, 37258` **Call stack:** 1. `unixOpenSharedMemory()` 2. `unixShmMap()` 3. `sqlite3OsShmMap()` 4. `walIndexPageRealloc()` 5. `walIndexPage()` 6. `walIndexReadHdr()` 7. `walTryBeginRead()` 8. `sqlite3WalBeginReadTransaction()` 9. `pagerBeginReadTransaction()` 10. `sqlite3PagerSharedLock()` 11. `lockBtree()` 12. `sqlite3BtreeBeginTrans()` 13. `sqlite3VdbeExec()` 14. `sqlite3Step()` 15. `sqlite3_step()` 16. `sqlite3_exec()` 17. `sql_script_x()` 18. `walthread2_thread()` 19. `launch_thread_main()` **Lock:** 1. `unixEnterMutex()` **Thread 2:** **Access:** `sqlite3_mutex_leave(pShmNode->pShmMutex);` **Line number:** `sqlite3.c; 37308` **Call stack:** 0. `unixOpenSharedMemory()` 1. `unixShmMap()` 2. `sqlite3OsShmMap()` 3. `walIndexPageRealloc()` 4. `walIndexPage()` 5. `walIndexReadHdr()` 6. `walTryBeginRead()` 7. `sqlite3WalBeginReadTransaction()` 8. `pagerBeginReadTransaction()` 9. `sqlite3PagerSharedLock()` 10. `lockBtree()` 11. `sqlite3BtreeBeginTrans()` 12. `sqlite3BtreeSetVersion()` 13. `sqlite3VdbeExec()` 14. `sqlite3Step()` 15. `sqlite3_step()` 16. `sqlite3_exec()` 17. `sql_script_x()` 18. `walthread2_thread()` 19. `launch_thread_main()` **Lock:** 1. `sqlite3_mutex_enter(pShmNode->pShmMutex)` My fuzzer finds that these 2 accesses can be executed concurrently, and they are protected by different locks, so my fuzzer report this race.