@@ -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
@@ -58243,6 +58244,15 @@ int libsql_pager_has_codec(struct Pager *_p) {
5824358244#endif
5824458245}
5824558246
58247+ /*
58248+ ** Update the cached codec status.
58249+ ** This should be called after encryption is added, removed, or changed
58250+ ** via sqlite3_rekey_v2() to ensure the cached hasCodec value is correct.
58251+ */
58252+ void libsql_pager_update_codec_cache(struct Pager *pPager) {
58253+ pPager->hasCodec = libsql_pager_has_codec(pPager);
58254+ }
58255+
5824658256int libsql_pager_codec(libsql_pghdr *hdr, void **ret) {
5824758257 if (!ret) {
5824858258 return SQLITE_MISUSE_BKPT;
@@ -58380,7 +58390,7 @@ static const unsigned char aJournalMagic[] = {
5838058390SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){
5838158391 if( pPager->fd->pMethods==0 ) return 0;
5838258392 if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0;
58383- if( libsql_pager_has_codec( pPager) != 0 ) return 0;
58393+ if( pPager->hasCodec ) return 0;
5838458394#ifndef SQLITE_OMIT_WAL
5838558395 if( pagerUseWal(pPager) ){
5838658396 u32 iRead = 0;
@@ -58603,7 +58613,7 @@ static void setGetterMethod(Pager *pPager){
5860358613 if( pPager->errCode ){
5860458614 pPager->xGet = getPageError;
5860558615#if SQLITE_MAX_MMAP_SIZE>0
58606- }else if( USEFETCH(pPager) && libsql_pager_has_codec( pPager) == 0 ){
58616+ }else if( USEFETCH(pPager) && ! pPager->hasCodec ){
5860758617 pPager->xGet = getPageMMap;
5860858618#endif /* SQLITE_MAX_MMAP_SIZE>0 */
5860958619 }else{
@@ -62625,6 +62635,8 @@ SQLITE_PRIVATE int sqlite3PagerOpen(
6262562635 /* pPager->xBusyHandler = 0; */
6262662636 /* pPager->pBusyHandlerArg = 0; */
6262762637 pPager->xReiniter = xReinit;
62638+ /* Cache the codec check result to avoid expensive VFS stack traversal on every page read */
62639+ pPager->hasCodec = libsql_pager_has_codec(pPager);
6262862640 setGetterMethod(pPager);
6262962641 /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
6263062642 /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */
0 commit comments