@@ -630,6 +630,7 @@ struct Pager {
630630 u8 readOnly ; /* True for a read-only database */
631631 u8 memDb ; /* True to inhibit all file I/O */
632632 u8 memVfs ; /* VFS-implemented memory database */
633+ u8 hasCodec ; /* True if pager has encryption codec */
633634
634635 /**************************************************************************
635636 ** The following block contains those class members that change during
@@ -858,7 +859,7 @@ static const unsigned char aJournalMagic[] = {
858859int sqlite3PagerDirectReadOk (Pager * pPager , Pgno pgno ){
859860 if ( pPager -> fd -> pMethods == 0 ) return 0 ;
860861 if ( sqlite3PCacheIsDirty (pPager -> pPCache ) ) return 0 ;
861- if ( libsql_pager_has_codec ( pPager ) != 0 ) return 0 ;
862+ if ( pPager -> hasCodec ) return 0 ;
862863#ifndef SQLITE_OMIT_WAL
863864 if ( pagerUseWal (pPager ) ){
864865 u32 iRead = 0 ;
@@ -1081,7 +1082,7 @@ static void setGetterMethod(Pager *pPager){
10811082 if ( pPager -> errCode ){
10821083 pPager -> xGet = getPageError ;
10831084#if SQLITE_MAX_MMAP_SIZE > 0
1084- }else if ( USEFETCH (pPager ) && libsql_pager_has_codec ( pPager ) == 0 ){
1085+ }else if ( USEFETCH (pPager ) && ! pPager -> hasCodec ){
10851086 pPager -> xGet = getPageMMap ;
10861087#endif /* SQLITE_MAX_MMAP_SIZE>0 */
10871088 }else {
@@ -5103,6 +5104,8 @@ int sqlite3PagerOpen(
51035104 /* pPager->xBusyHandler = 0; */
51045105 /* pPager->pBusyHandlerArg = 0; */
51055106 pPager -> xReiniter = xReinit ;
5107+ /* Cache the codec check result to avoid expensive VFS stack traversal on every page read */
5108+ pPager -> hasCodec = libsql_pager_has_codec (pPager );
51065109 setGetterMethod (pPager );
51075110 /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
51085111 /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */
0 commit comments