| Index: third_party/sqlite/src/src/test_pcache.c | 
| diff --git a/third_party/sqlite/src/src/test_pcache.c b/third_party/sqlite/src/src/test_pcache.c | 
| index 98aa1367aa19aa756ca315c449c4d598512f2b90..8fcfe7e26e3ff17496b840f5d63c75783aff8162 100644 | 
| --- a/third_party/sqlite/src/src/test_pcache.c | 
| +++ b/third_party/sqlite/src/src/test_pcache.c | 
| @@ -100,15 +100,16 @@ static void testpcacheShutdown(void *pArg){ | 
| typedef struct testpcache testpcache; | 
| struct testpcache { | 
| int szPage;               /* Size of each page.  Multiple of 8. */ | 
| +  int szExtra;              /* Size of extra data that accompanies each page */ | 
| int bPurgeable;           /* True if the page cache is purgeable */ | 
| int nFree;                /* Number of unused slots in a[] */ | 
| int nPinned;              /* Number of pinned slots in a[] */ | 
| unsigned iRand;           /* State of the PRNG */ | 
| unsigned iMagic;          /* Magic number for sanity checking */ | 
| struct testpcachePage { | 
| +    sqlite3_pcache_page page;  /* Base class */ | 
| unsigned key;              /* The key for this page. 0 means unallocated */ | 
| int isPinned;              /* True if the page is pinned */ | 
| -    void *pData;               /* Data for this page */ | 
| } a[TESTPCACHE_NPAGE];    /* All pages in the cache */ | 
| }; | 
|  | 
| @@ -129,27 +130,33 @@ static unsigned testpcacheRandom(testpcache *p){ | 
| /* | 
| ** Allocate a new page cache instance. | 
| */ | 
| -static sqlite3_pcache *testpcacheCreate(int szPage, int bPurgeable){ | 
| +static sqlite3_pcache *testpcacheCreate( | 
| +  int szPage, | 
| +  int szExtra, | 
| +  int bPurgeable | 
| +){ | 
| int nMem; | 
| char *x; | 
| testpcache *p; | 
| int i; | 
| assert( testpcacheGlobal.pDummy!=0 ); | 
| szPage = (szPage+7)&~7; | 
| -  nMem = sizeof(testpcache) + TESTPCACHE_NPAGE*szPage; | 
| +  nMem = sizeof(testpcache) + TESTPCACHE_NPAGE*(szPage+szExtra); | 
| p = sqlite3_malloc( nMem ); | 
| if( p==0 ) return 0; | 
| x = (char*)&p[1]; | 
| p->szPage = szPage; | 
| +  p->szExtra = szExtra; | 
| p->nFree = TESTPCACHE_NPAGE; | 
| p->nPinned = 0; | 
| p->iRand = testpcacheGlobal.prngSeed; | 
| p->bPurgeable = bPurgeable; | 
| p->iMagic = TESTPCACHE_VALID; | 
| -  for(i=0; i<TESTPCACHE_NPAGE; i++, x += szPage){ | 
| +  for(i=0; i<TESTPCACHE_NPAGE; i++, x += (szPage+szExtra)){ | 
| p->a[i].key = 0; | 
| p->a[i].isPinned = 0; | 
| -    p->a[i].pData = (void*)x; | 
| +    p->a[i].page.pBuf = (void*)x; | 
| +    p->a[i].page.pExtra = (void*)&x[szPage]; | 
| } | 
| testpcacheGlobal.nInstance++; | 
| return (sqlite3_pcache*)p; | 
| @@ -161,7 +168,6 @@ static sqlite3_pcache *testpcacheCreate(int szPage, int bPurgeable){ | 
| static void testpcacheCachesize(sqlite3_pcache *pCache, int newSize){ | 
| testpcache *p = (testpcache*)pCache; | 
| assert( p->iMagic==TESTPCACHE_VALID ); | 
| -  assert( newSize>=1 ); | 
| assert( testpcacheGlobal.pDummy!=0 ); | 
| assert( testpcacheGlobal.nInstance>0 ); | 
| } | 
| @@ -181,7 +187,7 @@ static int testpcachePagecount(sqlite3_pcache *pCache){ | 
| /* | 
| ** Fetch a page. | 
| */ | 
| -static void *testpcacheFetch( | 
| +static sqlite3_pcache_page *testpcacheFetch( | 
| sqlite3_pcache *pCache, | 
| unsigned key, | 
| int createFlag | 
| @@ -200,7 +206,7 @@ static void *testpcacheFetch( | 
| assert( p->nPinned <= TESTPCACHE_NPAGE - p->nFree ); | 
| p->a[i].isPinned = 1; | 
| } | 
| -      return p->a[i].pData; | 
| +      return &p->a[i].page; | 
| } | 
| } | 
|  | 
| @@ -237,11 +243,12 @@ static void *testpcacheFetch( | 
| if( p->a[j].key==0 ){ | 
| p->a[j].key = key; | 
| p->a[j].isPinned = 1; | 
| -        memset(p->a[j].pData, 0, p->szPage); | 
| +        memset(p->a[j].page.pBuf, 0, p->szPage); | 
| +        memset(p->a[j].page.pExtra, 0, p->szExtra); | 
| p->nPinned++; | 
| p->nFree--; | 
| assert( p->nPinned <= TESTPCACHE_NPAGE - p->nFree ); | 
| -        return p->a[j].pData; | 
| +        return &p->a[j].page; | 
| } | 
| } | 
|  | 
| @@ -263,10 +270,11 @@ static void *testpcacheFetch( | 
| if( p->a[j].key>0 && p->a[j].isPinned==0 ){ | 
| p->a[j].key = key; | 
| p->a[j].isPinned = 1; | 
| -      memset(p->a[j].pData, 0, p->szPage); | 
| +      memset(p->a[j].page.pBuf, 0, p->szPage); | 
| +      memset(p->a[j].page.pExtra, 0, p->szExtra); | 
| p->nPinned++; | 
| assert( p->nPinned <= TESTPCACHE_NPAGE - p->nFree ); | 
| -      return p->a[j].pData; | 
| +      return &p->a[j].page; | 
| } | 
| } | 
|  | 
| @@ -280,7 +288,7 @@ static void *testpcacheFetch( | 
| */ | 
| static void testpcacheUnpin( | 
| sqlite3_pcache *pCache, | 
| -  void *pOldPage, | 
| +  sqlite3_pcache_page *pOldPage, | 
| int discard | 
| ){ | 
| testpcache *p = (testpcache*)pCache; | 
| @@ -300,7 +308,7 @@ static void testpcacheUnpin( | 
| } | 
|  | 
| for(i=0; i<TESTPCACHE_NPAGE; i++){ | 
| -    if( p->a[i].pData==pOldPage ){ | 
| +    if( &p->a[i].page==pOldPage ){ | 
| /* The pOldPage pointer always points to a pinned page */ | 
| assert( p->a[i].isPinned ); | 
| p->a[i].isPinned = 0; | 
| @@ -325,7 +333,7 @@ static void testpcacheUnpin( | 
| */ | 
| static void testpcacheRekey( | 
| sqlite3_pcache *pCache, | 
| -  void *pOldPage, | 
| +  sqlite3_pcache_page *pOldPage, | 
| unsigned oldKey, | 
| unsigned newKey | 
| ){ | 
| @@ -354,7 +362,7 @@ static void testpcacheRekey( | 
| for(i=0; i<TESTPCACHE_NPAGE; i++){ | 
| if( p->a[i].key==oldKey ){ | 
| /* The oldKey and pOldPage parameters match */ | 
| -      assert( p->a[i].pData==pOldPage ); | 
| +      assert( &p->a[i].page==pOldPage ); | 
| /* Page to be rekeyed must be pinned */ | 
| assert( p->a[i].isPinned ); | 
| p->a[i].key = newKey; | 
| @@ -422,7 +430,8 @@ void installTestPCache( | 
| unsigned prngSeed,          /* Seed for the PRNG */ | 
| unsigned highStress         /* Call xStress agressively */ | 
| ){ | 
| -  static const sqlite3_pcache_methods testPcache = { | 
| +  static const sqlite3_pcache_methods2 testPcache = { | 
| +    1, | 
| (void*)&testpcacheGlobal, | 
| testpcacheInit, | 
| testpcacheShutdown, | 
| @@ -435,7 +444,7 @@ void installTestPCache( | 
| testpcacheTruncate, | 
| testpcacheDestroy, | 
| }; | 
| -  static sqlite3_pcache_methods defaultPcache; | 
| +  static sqlite3_pcache_methods2 defaultPcache; | 
| static int isInstalled = 0; | 
|  | 
| assert( testpcacheGlobal.nInstance==0 ); | 
| @@ -446,12 +455,12 @@ void installTestPCache( | 
| testpcacheGlobal.highStress = highStress; | 
| if( installFlag!=isInstalled ){ | 
| if( installFlag ){ | 
| -      sqlite3_config(SQLITE_CONFIG_GETPCACHE, &defaultPcache); | 
| +      sqlite3_config(SQLITE_CONFIG_GETPCACHE2, &defaultPcache); | 
| assert( defaultPcache.xCreate!=testpcacheCreate ); | 
| -      sqlite3_config(SQLITE_CONFIG_PCACHE, &testPcache); | 
| +      sqlite3_config(SQLITE_CONFIG_PCACHE2, &testPcache); | 
| }else{ | 
| assert( defaultPcache.xCreate!=0 ); | 
| -      sqlite3_config(SQLITE_CONFIG_PCACHE, &defaultPcache); | 
| +      sqlite3_config(SQLITE_CONFIG_PCACHE2, &defaultPcache); | 
| } | 
| isInstalled = installFlag; | 
| } | 
|  |