@@ -58152,6 +58152,7 @@ struct Pager {
5815258152 u8 readOnly; /* True for a read-only database */
5815358153 u8 memDb; /* True to inhibit all file I/O */
5815458154 u8 memVfs; /* VFS-implemented memory database */
58155+ u8 hasCodec; /* True if pager has encryption codec */
5815558156
5815658157 /**************************************************************************
5815758158 ** The following block contains those class members that change during
@@ -58380,7 +58381,7 @@ static const unsigned char aJournalMagic[] = {
5838058381SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){
5838158382 if( pPager->fd->pMethods==0 ) return 0;
5838258383 if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0;
58383- if( libsql_pager_has_codec( pPager) != 0 ) return 0;
58384+ if( pPager->hasCodec ) return 0;
5838458385#ifndef SQLITE_OMIT_WAL
5838558386 if( pagerUseWal(pPager) ){
5838658387 u32 iRead = 0;
@@ -58603,7 +58604,7 @@ static void setGetterMethod(Pager *pPager){
5860358604 if( pPager->errCode ){
5860458605 pPager->xGet = getPageError;
5860558606#if SQLITE_MAX_MMAP_SIZE>0
58606- }else if( USEFETCH(pPager) && libsql_pager_has_codec( pPager) == 0 ){
58607+ }else if( USEFETCH(pPager) && ! pPager->hasCodec ){
5860758608 pPager->xGet = getPageMMap;
5860858609#endif /* SQLITE_MAX_MMAP_SIZE>0 */
5860958610 }else{
@@ -62625,6 +62626,8 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
6262562626 /* pPager->xBusyHandler = 0; */
6262662627 /* pPager->pBusyHandlerArg = 0; */
6262762628 pPager->xReiniter = xReinit;
62629+ /* Cache the codec check result to avoid expensive VFS stack traversal on every page read */
62630+ pPager->hasCodec = libsql_pager_has_codec(pPager);
6262862631 setGetterMethod(pPager);
6262962632 /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
6263062633 /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */
0 commit comments