Index: src/btree.c ================================================================== --- src/btree.c +++ src/btree.c @@ -627,15 +627,49 @@ sqlite3_free(pMap->aSvpt); sqlite3_free(pMap); pBt->pMap = 0; } } + +static void btreeCheckPtrmap(BtShared *p, int nPage, const char *zLog){ + BtreePtrmap *pMap = p->pMap; + if( pMap ){ + int n = MIN(1 + nPage - (int)pMap->iFirst, 5); + int i; + for(i=0; iaPtr[i].eType; + if( (eType==PTRMAP_OVERFLOW1 || + eType==PTRMAP_OVERFLOW2 || + eType==PTRMAP_BTREE) && pMap->aPtr[i].parent==0 + ){ + sqlite3_log(SQLITE_ERROR, + "Bitvec: error at (%s) - (%d/%d %d/%d %d/%d %d/%d %d/%d)", + zLog, + (int)pMap->aPtr[0].eType, (int)pMap->aPtr[0].parent, + (n>1 ? (int)pMap->aPtr[1].eType : -1), + (n>1 ? (int)pMap->aPtr[1].parent : -1), + + (n>2 ? (int)pMap->aPtr[2].eType : -1), + (n>2 ? (int)pMap->aPtr[2].parent : -1), + + (n>3 ? (int)pMap->aPtr[3].eType : -1), + (n>3 ? (int)pMap->aPtr[3].parent : -1), + + (n>4 ? (int)pMap->aPtr[4].eType : -1), + (n>4 ? (int)pMap->aPtr[4].parent : -1) + ); + break; + } + } + } +} #else /* SQLITE_OMIT_CONCURRENT */ # define btreePtrmapAllocate(x) SQLITE_OK # define btreePtrmapDelete(x) # define btreePtrmapBegin(x,y) SQLITE_OK # define btreePtrmapEnd(x,y,z) +# define btreeCheckPtrmap(a,b,c) #endif /* SQLITE_OMIT_CONCURRENT */ static void releasePage(MemPage *pPage); /* Forward reference */ /* @@ -4085,10 +4119,12 @@ ** required. Otherwise, if page 1 is dirty, proceed. */ BtreePtrmap *pMap = pBt->pMap; Pgno iTrunk = get4byte(&p1[32]); Pgno nPage = btreePagecount(pBt); u32 nFree = get4byte(&p1[36]); + + btreeCheckPtrmap(pBt, nPage, "btreeFixUnlocked(1)"); assert( pBt->pMap ); rc = sqlite3PagerUpgradeSnapshot(pPager, pPage1->pDbPage); assert( p1==pPage1->aData ); @@ -8672,10 +8708,11 @@ } } assert( pCur->apPage[pCur->iPage]->nOverflow==0 ); end_insert: + btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeInsert()"); return rc; } /* ** Delete the entry that the cursor is pointing to. @@ -8843,10 +8880,11 @@ if( bPreserve ){ pCur->eState = CURSOR_REQUIRESEEK; } } } + btreeCheckPtrmap(pBt, pBt->nPage, "sqlite3BtreeInsert()"); return rc; } /* ** Create a new BTree table. Write into *piTable the page Index: test/concurrent3.test ================================================================== --- test/concurrent3.test +++ test/concurrent3.test @@ -24,12 +24,12 @@ return } db close sqlite3_shutdown -#test_sqlite3_log xLog -#proc xLog {error_code msg} { puts "$error_code: $msg" } +test_sqlite3_log xLog +proc xLog {error_code msg} { puts "$error_code: $msg" } reset_db proc create_schema {} { db eval { PRAGMA journal_mode = wal;