0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4e 6f 76 65 6d /*.** 2008 Novem
0010: 62 65 72 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 ber 18.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 ing:.**.** Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 d not evil..**
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 ive others..**
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 0a 2a 2a 20 54 68 69 *****.** .** Thi
0180: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 s file contains
0190: 63 6f 64 65 20 75 73 65 64 20 66 6f 72 20 74 65 code used for te
01a0: 73 74 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 sting the SQLite
01b0: 20 73 79 73 74 65 6d 2e 0a 2a 2a 20 4e 6f 6e 65 system..** None
01c0: 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 20 of the code in
01d0: 74 68 69 73 20 66 69 6c 65 20 67 6f 65 73 20 69 this file goes i
01e0: 6e 74 6f 20 61 20 64 65 6c 69 76 65 72 61 62 6c nto a deliverabl
01f0: 65 20 62 75 69 6c 64 2e 0a 2a 2a 20 0a 2a 2a 20 e build..** .**
0200: 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 This file contai
0210: 6e 73 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f ns an applicatio
0220: 6e 2d 64 65 66 69 6e 65 64 20 70 61 67 65 72 20 n-defined pager
0230: 63 61 63 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 cache.** impleme
0240: 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 63 61 6e ntation that can
0250: 20 62 65 20 70 6c 75 67 67 65 64 20 69 6e 20 69 be plugged in i
0260: 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 2a n place of the.*
0270: 2a 20 64 65 66 61 75 6c 74 20 70 63 61 63 68 65 * default pcache
0280: 2e 20 20 54 68 69 73 20 61 6c 74 65 72 6e 61 74 . This alternat
0290: 69 76 65 20 70 61 67 65 72 20 63 61 63 68 65 20 ive pager cache
02a0: 77 69 6c 6c 20 74 68 72 6f 77 0a 2a 2a 20 73 6f will throw.** so
02b0: 6d 65 20 65 72 72 6f 72 73 20 74 68 61 74 20 74 me errors that t
02c0: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 he default cache
02d0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a does not..**.**
02e0: 20 54 68 69 73 20 70 61 67 65 63 61 63 68 65 20 This pagecache
02f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 implementation i
0300: 73 20 64 65 73 69 67 6e 65 64 20 66 6f 72 20 73 s designed for s
0310: 69 6d 70 6c 69 63 69 74 79 0a 2a 2a 20 6e 6f 74 implicity.** not
0320: 20 73 70 65 65 64 2e 20 20 0a 2a 2f 0a 23 69 6e speed. .*/.#in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 clude "sqlite3.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 ".#include <stri
0350: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c ng.h>.#include <
0360: 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a assert.h>../*.**
0370: 20 47 6c 6f 62 61 6c 20 64 61 74 61 20 75 73 65 Global data use
0380: 64 20 62 79 20 74 68 69 73 20 74 65 73 74 20 69 d by this test i
0390: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 mplementation.
03a0: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6d There is no.** m
03b0: 75 74 65 78 69 6e 67 2c 20 77 68 69 63 68 20 6d utexing, which m
03c0: 65 61 6e 73 20 74 68 69 73 20 70 61 67 65 20 63 eans this page c
03d0: 61 63 68 65 20 77 69 6c 6c 20 6e 6f 74 20 77 6f ache will not wo
03e0: 72 6b 20 69 6e 20 61 0a 2a 2a 20 6d 75 6c 74 69 rk in a.** multi
03f0: 2d 74 68 72 65 61 64 65 64 20 74 65 73 74 2e 0a -threaded test..
0400: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 */.typedef struc
0410: 74 20 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 t testpcacheGlob
0420: 61 6c 54 79 70 65 20 74 65 73 74 70 63 61 63 68 alType testpcach
0430: 65 47 6c 6f 62 61 6c 54 79 70 65 3b 0a 73 74 72 eGlobalType;.str
0440: 75 63 74 20 74 65 73 74 70 63 61 63 68 65 47 6c uct testpcacheGl
0450: 6f 62 61 6c 54 79 70 65 20 7b 0a 20 20 76 6f 69 obalType {. voi
0460: 64 20 2a 70 44 75 6d 6d 79 3b 20 20 20 20 20 20 d *pDummy;
0470: 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 /* Dummy
0480: 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 73 69 allocation to si
0490: 6d 75 6c 61 74 65 20 66 61 69 6c 75 72 65 73 20 mulate failures
04a0: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 73 74 61 6e */. int nInstan
04b0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f ce; /
04c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 * Number of curr
04d0: 65 6e 74 20 69 6e 73 74 61 6e 63 65 73 20 2a 2f ent instances */
04e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 64 69 73 63 . unsigned disc
04f0: 61 72 64 43 68 61 6e 63 65 3b 20 20 20 2f 2a 20 ardChance; /*
0500: 43 68 61 6e 63 65 20 6f 66 20 64 69 73 63 61 72 Chance of discar
0510: 64 69 6e 67 20 6f 6e 20 61 6e 20 75 6e 70 69 6e ding on an unpin
0520: 20 28 30 2d 31 30 30 29 20 2a 2f 0a 20 20 75 6e (0-100) */. un
0530: 73 69 67 6e 65 64 20 70 72 6e 67 53 65 65 64 3b signed prngSeed;
0540: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 64 20 /* Seed
0550: 66 6f 72 20 74 68 65 20 50 52 4e 47 20 2a 2f 0a for the PRNG */.
0560: 20 20 75 6e 73 69 67 6e 65 64 20 68 69 67 68 53 unsigned highS
0570: 74 72 65 73 73 3b 20 20 20 20 20 20 2f 2a 20 43 tress; /* C
0580: 61 6c 6c 20 78 53 74 72 65 73 73 20 61 67 72 65 all xStress agre
0590: 73 73 69 76 65 6c 79 20 2a 2f 0a 7d 3b 0a 73 74 ssively */.};.st
05a0: 61 74 69 63 20 74 65 73 74 70 63 61 63 68 65 47 atic testpcacheG
05b0: 6c 6f 62 61 6c 54 79 70 65 20 74 65 73 74 70 63 lobalType testpc
05c0: 61 63 68 65 47 6c 6f 62 61 6c 3b 0a 0a 2f 2a 0a acheGlobal;../*.
05d0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 72 2e 0a ** Initializer..
05e0: 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 **.** Verify tha
05f0: 74 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 65 t the initialize
0600: 72 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 r is only called
0610: 20 77 68 65 6e 20 74 68 65 20 73 79 73 74 65 6d when the system
0620: 20 69 73 0a 2a 2a 20 75 6e 69 6e 69 74 69 61 6c is.** uninitial
0630: 69 7a 65 64 2e 20 20 41 6c 6c 6f 63 61 74 65 20 ized. Allocate
0640: 73 6f 6d 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 some memory and
0650: 72 65 70 6f 72 74 20 53 51 4c 49 54 45 5f 4e 4f report SQLITE_NO
0660: 4d 45 4d 20 69 66 0a 2a 2a 20 74 68 65 20 61 6c MEM if.** the al
0670: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 location fails.
0680: 20 54 68 69 73 20 70 72 6f 76 69 64 65 73 20 61 This provides a
0690: 20 6d 65 61 6e 73 20 74 6f 20 74 65 73 74 20 74 means to test t
06a0: 68 65 20 72 65 63 6f 76 65 72 79 0a 2a 2a 20 66 he recovery.** f
06b0: 72 6f 6d 20 61 20 66 61 69 6c 65 64 20 69 6e 69 rom a failed ini
06c0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 74 74 65 tialization atte
06d0: 6d 70 74 2e 20 20 49 74 20 61 6c 73 6f 20 76 65 mpt. It also ve
06e0: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65 0a rifies that the.
06f0: 2a 2a 20 74 68 65 20 64 65 73 74 72 75 63 74 6f ** the destructo
0700: 72 20 61 6c 77 61 79 73 20 67 65 74 73 20 63 61 r always gets ca
0710: 6c 6c 20 2d 20 6f 74 68 65 72 77 69 73 65 20 74 ll - otherwise t
0720: 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 61 0a here would be a.
0730: 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 0a ** memory leak..
0740: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 */.static int te
0750: 73 74 70 63 61 63 68 65 49 6e 69 74 28 76 6f 69 stpcacheInit(voi
0760: 64 20 2a 70 41 72 67 29 7b 0a 20 20 61 73 73 65 d *pArg){. asse
0770: 72 74 28 20 70 41 72 67 3d 3d 28 76 6f 69 64 2a rt( pArg==(void*
0780: 29 26 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 )&testpcacheGlob
0790: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 al );. assert(
07a0: 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c testpcacheGlobal
07b0: 2e 70 44 75 6d 6d 79 3d 3d 30 20 29 3b 0a 20 20 .pDummy==0 );.
07c0: 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61 63 assert( testpcac
07d0: 68 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61 6e heGlobal.nInstan
07e0: 63 65 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 70 ce==0 );. testp
07f0: 63 61 63 68 65 47 6c 6f 62 61 6c 2e 70 44 75 6d cacheGlobal.pDum
0800: 6d 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c my = sqlite3_mal
0810: 6c 6f 63 28 31 30 29 3b 0a 20 20 72 65 74 75 72 loc(10);. retur
0820: 6e 20 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 n testpcacheGlob
0830: 61 6c 2e 70 44 75 6d 6d 79 3d 3d 30 20 3f 20 53 al.pDummy==0 ? S
0840: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 3a 20 53 51 QLITE_NOMEM : SQ
0850: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
0860: 2a 20 44 65 73 74 72 75 63 74 6f 72 0a 2a 2a 0a * Destructor.**.
0870: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 ** Verify that t
0880: 68 69 73 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c his is only call
0890: 65 64 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c ed after initial
08a0: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 46 72 65 65 ization..** Free
08b0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f the memory allo
08c0: 63 61 74 65 64 20 62 79 20 74 68 65 20 69 6e 69 cated by the ini
08d0: 74 69 61 6c 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61 tializer..*/.sta
08e0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 70 63 61 tic void testpca
08f0: 63 68 65 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 cheShutdown(void
0900: 20 2a 70 41 72 67 29 7b 0a 20 20 61 73 73 65 72 *pArg){. asser
0910: 74 28 20 70 41 72 67 3d 3d 28 76 6f 69 64 2a 29 t( pArg==(void*)
0920: 26 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 &testpcacheGloba
0930: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 l );. assert( t
0940: 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c 2e estpcacheGlobal.
0950: 70 44 75 6d 6d 79 21 3d 30 20 29 3b 0a 20 20 61 pDummy!=0 );. a
0960: 73 73 65 72 74 28 20 74 65 73 74 70 63 61 63 68 ssert( testpcach
0970: 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61 6e 63 eGlobal.nInstanc
0980: 65 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 e==0 );. sqlite
0990: 33 5f 66 72 65 65 28 20 74 65 73 74 70 63 61 63 3_free( testpcac
09a0: 68 65 47 6c 6f 62 61 6c 2e 70 44 75 6d 6d 79 20 heGlobal.pDummy
09b0: 29 3b 0a 20 20 74 65 73 74 70 63 61 63 68 65 47 );. testpcacheG
09c0: 6c 6f 62 61 6c 2e 70 44 75 6d 6d 79 20 3d 20 30 lobal.pDummy = 0
09d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 ;.}../*.** Numbe
09e0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 20 r of pages in a
09f0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 cache..**.** The
0a00: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 number of pages
0a10: 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72 is a hard upper
0a20: 20 62 6f 75 6e 64 20 69 6e 20 74 68 69 73 20 74 bound in this t
0a30: 65 73 74 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 20 49 est module..** I
0a40: 66 20 6d 6f 72 65 20 70 61 67 65 73 20 61 72 65 f more pages are
0a50: 20 72 65 71 75 65 73 74 65 64 2c 20 73 71 6c 69 requested, sqli
0a60: 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 te3PcacheFetch()
0a70: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a returns NULL..*
0a80: 2a 0a 2a 2a 20 49 66 20 74 65 73 74 69 6e 67 20 *.** If testing
0a90: 77 69 74 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 with in-memory t
0aa0: 65 6d 70 20 74 61 62 6c 65 73 2c 20 70 72 6f 76 emp tables, prov
0ab0: 69 64 65 20 61 20 6c 61 72 67 65 72 20 70 63 61 ide a larger pca
0ac0: 63 68 65 2e 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 che..** Some of
0ad0: 74 68 65 20 74 65 73 74 20 63 61 73 65 73 20 6e the test cases n
0ae0: 65 65 64 20 74 68 69 73 2e 0a 2a 2f 0a 23 69 66 eed this..*/.#if
0af0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
0b00: 54 45 4d 50 5f 53 54 4f 52 45 29 20 26 26 20 53 TEMP_STORE) && S
0b10: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 QLITE_TEMP_STORE
0b20: 3e 3d 32 0a 23 20 64 65 66 69 6e 65 20 54 45 53 >=2.# define TES
0b30: 54 50 43 41 43 48 45 5f 4e 50 41 47 45 20 20 20 TPCACHE_NPAGE
0b40: 20 34 39 39 0a 23 65 6c 73 65 0a 23 20 64 65 66 499.#else.# def
0b50: 69 6e 65 20 54 45 53 54 50 43 41 43 48 45 5f 4e ine TESTPCACHE_N
0b60: 50 41 47 45 20 20 20 20 32 31 37 0a 23 65 6e 64 PAGE 217.#end
0b70: 69 66 0a 23 64 65 66 69 6e 65 20 54 45 53 54 50 if.#define TESTP
0b80: 43 41 43 48 45 5f 52 45 53 45 52 56 45 20 20 20 CACHE_RESERVE
0b90: 31 37 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20 17../*.** Magic
0ba0: 6e 75 6d 62 65 72 73 20 75 73 65 64 20 74 6f 20 numbers used to
0bb0: 64 65 74 65 72 6d 69 6e 65 20 76 61 6c 69 64 69 determine validi
0bc0: 74 79 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 ty of the page c
0bd0: 61 63 68 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 ache..*/.#define
0be0: 20 54 45 53 54 50 43 41 43 48 45 5f 56 41 4c 49 TESTPCACHE_VALI
0bf0: 44 20 20 30 78 33 36 34 35 38 35 66 64 0a 23 64 D 0x364585fd.#d
0c00: 65 66 69 6e 65 20 54 45 53 54 50 43 41 43 48 45 efine TESTPCACHE
0c10: 5f 43 4c 45 41 52 20 20 30 78 64 34 32 36 37 30 _CLEAR 0xd42670
0c20: 64 34 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 76 61 74 d4../*.** Privat
0c30: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e e implementation
0c40: 20 6f 66 20 61 20 70 61 67 65 20 63 61 63 68 65 of a page cache
0c50: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 ..*/.typedef str
0c60: 75 63 74 20 74 65 73 74 70 63 61 63 68 65 20 74 uct testpcache t
0c70: 65 73 74 70 63 61 63 68 65 3b 0a 73 74 72 75 63 estpcache;.struc
0c80: 74 20 74 65 73 74 70 63 61 63 68 65 20 7b 0a 20 t testpcache {.
0c90: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 int szPage;
0ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
0cb0: 7a 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 2e ze of each page.
0cc0: 20 20 4d 75 6c 74 69 70 6c 65 20 6f 66 20 38 2e Multiple of 8.
0cd0: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 78 74 72 */. int szExtr
0ce0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 a;
0cf0: 2f 2a 20 53 69 7a 65 20 6f 66 20 65 78 74 72 61 /* Size of extra
0d00: 20 64 61 74 61 20 74 68 61 74 20 61 63 63 6f 6d data that accom
0d10: 70 61 6e 69 65 73 20 65 61 63 68 20 70 61 67 65 panies each page
0d20: 20 2a 2f 0a 20 20 69 6e 74 20 62 50 75 72 67 65 */. int bPurge
0d30: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 able;
0d40: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 70 /* True if the p
0d50: 61 67 65 20 63 61 63 68 65 20 69 73 20 70 75 72 age cache is pur
0d60: 67 65 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 geable */. int
0d70: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 nFree;
0d80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
0d90: 6f 66 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 of unused slots
0da0: 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 in a[] */. int
0db0: 6e 50 69 6e 6e 65 64 3b 20 20 20 20 20 20 20 20 nPinned;
0dc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
0dd0: 6f 66 20 70 69 6e 6e 65 64 20 73 6c 6f 74 73 20 of pinned slots
0de0: 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 in a[] */. unsi
0df0: 67 6e 65 64 20 69 52 61 6e 64 3b 20 20 20 20 20 gned iRand;
0e00: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20 6f /* State o
0e10: 66 20 74 68 65 20 50 52 4e 47 20 2a 2f 0a 20 20 f the PRNG */.
0e20: 75 6e 73 69 67 6e 65 64 20 69 4d 61 67 69 63 3b unsigned iMagic;
0e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 67 /* Mag
0e40: 69 63 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 61 ic number for sa
0e50: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f nity checking */
0e60: 0a 20 20 73 74 72 75 63 74 20 74 65 73 74 70 63 . struct testpc
0e70: 61 63 68 65 50 61 67 65 20 7b 0a 20 20 20 20 73 achePage {. s
0e80: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 qlite3_pcache_pa
0e90: 67 65 20 70 61 67 65 3b 20 20 2f 2a 20 42 61 73 ge page; /* Bas
0ea0: 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 75 e class */. u
0eb0: 6e 73 69 67 6e 65 64 20 6b 65 79 3b 20 20 20 20 nsigned key;
0ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
0ed0: 20 6b 65 79 20 66 6f 72 20 74 68 69 73 20 70 61 key for this pa
0ee0: 67 65 2e 20 30 20 6d 65 61 6e 73 20 75 6e 61 6c ge. 0 means unal
0ef0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 located */. i
0f00: 6e 74 20 69 73 50 69 6e 6e 65 64 3b 20 20 20 20 nt isPinned;
0f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 /* Tru
0f20: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 e if the page is
0f30: 20 70 69 6e 6e 65 64 20 2a 2f 0a 20 20 7d 20 61 pinned */. } a
0f40: 5b 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 47 [TESTPCACHE_NPAG
0f50: 45 5d 3b 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 E]; /* All pa
0f60: 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 ges in the cache
0f70: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 */.};../*.** Ge
0f80: 74 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 t a random numbe
0f90: 72 20 75 73 69 6e 67 20 74 68 65 20 50 52 4e 47 r using the PRNG
0fa0: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 in the given pa
0fb0: 67 65 20 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 ge cache..*/.sta
0fc0: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 74 65 73 tic unsigned tes
0fd0: 74 70 63 61 63 68 65 52 61 6e 64 6f 6d 28 74 65 tpcacheRandom(te
0fe0: 73 74 70 63 61 63 68 65 20 2a 70 29 7b 0a 20 20 stpcache *p){.
0ff0: 75 6e 73 69 67 6e 65 64 20 78 20 3d 20 30 3b 0a unsigned x = 0;.
1000: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 int i;. for(i
1010: 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 =0; i<4; i++){.
1020: 20 20 20 70 2d 3e 69 52 61 6e 64 20 3d 20 28 70 p->iRand = (p
1030: 2d 3e 69 52 61 6e 64 2a 36 39 30 36 39 20 2b 20 ->iRand*69069 +
1040: 35 29 3b 0a 20 20 20 20 78 20 3d 20 28 78 3c 3c 5);. x = (x<<
1050: 38 29 20 7c 20 28 28 70 2d 3e 69 52 61 6e 64 3e 8) | ((p->iRand>
1060: 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 7d 0a >16)&0xff);. }.
1070: 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 0a return x;.}...
1080: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 /*.** Allocate a
1090: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20 new page cache
10a0: 69 6e 73 74 61 6e 63 65 2e 0a 2a 2f 0a 73 74 61 instance..*/.sta
10b0: 74 69 63 20 73 71 6c 69 74 65 33 5f 70 63 61 63 tic sqlite3_pcac
10c0: 68 65 20 2a 74 65 73 74 70 63 61 63 68 65 43 72 he *testpcacheCr
10d0: 65 61 74 65 28 0a 20 20 69 6e 74 20 73 7a 50 61 eate(. int szPa
10e0: 67 65 2c 20 0a 20 20 69 6e 74 20 73 7a 45 78 74 ge, . int szExt
10f0: 72 61 2c 20 0a 20 20 69 6e 74 20 62 50 75 72 67 ra, . int bPurg
1100: 65 61 62 6c 65 0a 29 7b 0a 20 20 69 6e 74 20 6e eable.){. int n
1110: 4d 65 6d 3b 0a 20 20 63 68 61 72 20 2a 78 3b 0a Mem;. char *x;.
1120: 20 20 74 65 73 74 70 63 61 63 68 65 20 2a 70 3b testpcache *p;
1130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 . int i;. asse
1140: 72 74 28 20 74 65 73 74 70 63 61 63 68 65 47 6c rt( testpcacheGl
1150: 6f 62 61 6c 2e 70 44 75 6d 6d 79 21 3d 30 20 29 obal.pDummy!=0 )
1160: 3b 0a 20 20 73 7a 50 61 67 65 20 3d 20 28 73 7a ;. szPage = (sz
1170: 50 61 67 65 2b 37 29 26 7e 37 3b 0a 20 20 6e 4d Page+7)&~7;. nM
1180: 65 6d 20 3d 20 73 69 7a 65 6f 66 28 74 65 73 74 em = sizeof(test
1190: 70 63 61 63 68 65 29 20 2b 20 54 45 53 54 50 43 pcache) + TESTPC
11a0: 41 43 48 45 5f 4e 50 41 47 45 2a 28 73 7a 50 61 ACHE_NPAGE*(szPa
11b0: 67 65 2b 73 7a 45 78 74 72 61 29 3b 0a 20 20 70 ge+szExtra);. p
11c0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f = sqlite3_mallo
11d0: 63 28 20 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 c( nMem );. if(
11e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 p==0 ) return 0
11f0: 3b 0a 20 20 78 20 3d 20 28 63 68 61 72 2a 29 26 ;. x = (char*)&
1200: 70 5b 31 5d 3b 0a 20 20 70 2d 3e 73 7a 50 61 67 p[1];. p->szPag
1210: 65 20 3d 20 73 7a 50 61 67 65 3b 0a 20 20 70 2d e = szPage;. p-
1220: 3e 73 7a 45 78 74 72 61 20 3d 20 73 7a 45 78 74 >szExtra = szExt
1230: 72 61 3b 0a 20 20 70 2d 3e 6e 46 72 65 65 20 3d ra;. p->nFree =
1240: 20 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 47 TESTPCACHE_NPAG
1250: 45 3b 0a 20 20 70 2d 3e 6e 50 69 6e 6e 65 64 20 E;. p->nPinned
1260: 3d 20 30 3b 0a 20 20 70 2d 3e 69 52 61 6e 64 20 = 0;. p->iRand
1270: 3d 20 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 = testpcacheGlob
1280: 61 6c 2e 70 72 6e 67 53 65 65 64 3b 0a 20 20 70 al.prngSeed;. p
1290: 2d 3e 62 50 75 72 67 65 61 62 6c 65 20 3d 20 62 ->bPurgeable = b
12a0: 50 75 72 67 65 61 62 6c 65 3b 0a 20 20 70 2d 3e Purgeable;. p->
12b0: 69 4d 61 67 69 63 20 3d 20 54 45 53 54 50 43 41 iMagic = TESTPCA
12c0: 43 48 45 5f 56 41 4c 49 44 3b 0a 20 20 66 6f 72 CHE_VALID;. for
12d0: 28 69 3d 30 3b 20 69 3c 54 45 53 54 50 43 41 43 (i=0; i<TESTPCAC
12e0: 48 45 5f 4e 50 41 47 45 3b 20 69 2b 2b 2c 20 78 HE_NPAGE; i++, x
12f0: 20 2b 3d 20 28 73 7a 50 61 67 65 2b 73 7a 45 78 += (szPage+szEx
1300: 74 72 61 29 29 7b 0a 20 20 20 20 70 2d 3e 61 5b tra)){. p->a[
1310: 69 5d 2e 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 i].key = 0;.
1320: 70 2d 3e 61 5b 69 5d 2e 69 73 50 69 6e 6e 65 64 p->a[i].isPinned
1330: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 5b 69 = 0;. p->a[i
1340: 5d 2e 70 61 67 65 2e 70 42 75 66 20 3d 20 28 76 ].page.pBuf = (v
1350: 6f 69 64 2a 29 78 3b 0a 20 20 20 20 70 2d 3e 61 oid*)x;. p->a
1360: 5b 69 5d 2e 70 61 67 65 2e 70 45 78 74 72 61 20 [i].page.pExtra
1370: 3d 20 28 76 6f 69 64 2a 29 26 78 5b 73 7a 50 61 = (void*)&x[szPa
1380: 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74 70 ge];. }. testp
1390: 63 61 63 68 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 cacheGlobal.nIns
13a0: 74 61 6e 63 65 2b 2b 3b 0a 20 20 72 65 74 75 72 tance++;. retur
13b0: 6e 20 28 73 71 6c 69 74 65 33 5f 70 63 61 63 68 n (sqlite3_pcach
13c0: 65 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 e*)p;.}../*.** S
13d0: 65 74 20 74 68 65 20 63 61 63 68 65 20 73 69 7a et the cache siz
13e0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 e.*/.static void
13f0: 20 74 65 73 74 70 63 61 63 68 65 43 61 63 68 65 testpcacheCache
1400: 73 69 7a 65 28 73 71 6c 69 74 65 33 5f 70 63 61 size(sqlite3_pca
1410: 63 68 65 20 2a 70 43 61 63 68 65 2c 20 69 6e 74 che *pCache, int
1420: 20 6e 65 77 53 69 7a 65 29 7b 0a 20 20 74 65 73 newSize){. tes
1430: 74 70 63 61 63 68 65 20 2a 70 20 3d 20 28 74 65 tpcache *p = (te
1440: 73 74 70 63 61 63 68 65 2a 29 70 43 61 63 68 65 stpcache*)pCache
1450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 ;. assert( p->i
1460: 4d 61 67 69 63 3d 3d 54 45 53 54 50 43 41 43 48 Magic==TESTPCACH
1470: 45 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 E_VALID );. ass
1480: 65 72 74 28 20 74 65 73 74 70 63 61 63 68 65 47 ert( testpcacheG
1490: 6c 6f 62 61 6c 2e 70 44 75 6d 6d 79 21 3d 30 20 lobal.pDummy!=0
14a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 73 );. assert( tes
14b0: 74 70 63 61 63 68 65 47 6c 6f 62 61 6c 2e 6e 49 tpcacheGlobal.nI
14c0: 6e 73 74 61 6e 63 65 3e 30 20 29 3b 0a 7d 0a 0a nstance>0 );.}..
14d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 /*.** Return the
14e0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 number of pages
14f0: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 in the cache th
1500: 61 74 20 61 72 65 20 62 65 69 6e 67 20 75 73 65 at are being use
1510: 64 2e 0a 2a 2a 20 54 68 69 73 20 69 6e 63 6c 75 d..** This inclu
1520: 64 65 73 20 62 6f 74 68 20 70 69 6e 6e 65 64 20 des both pinned
1530: 61 6e 64 20 75 6e 70 69 6e 6e 65 64 20 70 61 67 and unpinned pag
1540: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e es..*/.static in
1550: 74 20 74 65 73 74 70 63 61 63 68 65 50 61 67 65 t testpcachePage
1560: 63 6f 75 6e 74 28 73 71 6c 69 74 65 33 5f 70 63 count(sqlite3_pc
1570: 61 63 68 65 20 2a 70 43 61 63 68 65 29 7b 0a 20 ache *pCache){.
1580: 20 74 65 73 74 70 63 61 63 68 65 20 2a 70 20 3d testpcache *p =
1590: 20 28 74 65 73 74 70 63 61 63 68 65 2a 29 70 43 (testpcache*)pC
15a0: 61 63 68 65 3b 0a 20 20 61 73 73 65 72 74 28 20 ache;. assert(
15b0: 70 2d 3e 69 4d 61 67 69 63 3d 3d 54 45 53 54 50 p->iMagic==TESTP
15c0: 43 41 43 48 45 5f 56 41 4c 49 44 20 29 3b 0a 20 CACHE_VALID );.
15d0: 20 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61 assert( testpca
15e0: 63 68 65 47 6c 6f 62 61 6c 2e 70 44 75 6d 6d 79 cheGlobal.pDummy
15f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 !=0 );. assert(
1600: 20 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 testpcacheGloba
1610: 6c 2e 6e 49 6e 73 74 61 6e 63 65 3e 30 20 29 3b l.nInstance>0 );
1620: 0a 20 20 72 65 74 75 72 6e 20 54 45 53 54 50 43 . return TESTPC
1630: 41 43 48 45 5f 4e 50 41 47 45 20 2d 20 70 2d 3e ACHE_NPAGE - p->
1640: 6e 46 72 65 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 nFree;.}../*.**
1650: 46 65 74 63 68 20 61 20 70 61 67 65 2e 0a 2a 2f Fetch a page..*/
1660: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f .static sqlite3_
1670: 70 63 61 63 68 65 5f 70 61 67 65 20 2a 74 65 73 pcache_page *tes
1680: 74 70 63 61 63 68 65 46 65 74 63 68 28 0a 20 20 tpcacheFetch(.
1690: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a sqlite3_pcache *
16a0: 70 43 61 63 68 65 2c 0a 20 20 75 6e 73 69 67 6e pCache,. unsign
16b0: 65 64 20 6b 65 79 2c 0a 20 20 69 6e 74 20 63 72 ed key,. int cr
16c0: 65 61 74 65 46 6c 61 67 0a 29 7b 0a 20 20 74 65 eateFlag.){. te
16d0: 73 74 70 63 61 63 68 65 20 2a 70 20 3d 20 28 74 stpcache *p = (t
16e0: 65 73 74 70 63 61 63 68 65 2a 29 70 43 61 63 68 estpcache*)pCach
16f0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 e;. int i, j;.
1700: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4d 61 67 assert( p->iMag
1710: 69 63 3d 3d 54 45 53 54 50 43 41 43 48 45 5f 56 ic==TESTPCACHE_V
1720: 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 ALID );. assert
1730: 28 20 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 ( testpcacheGlob
1740: 61 6c 2e 70 44 75 6d 6d 79 21 3d 30 20 29 3b 0a al.pDummy!=0 );.
1750: 20 20 61 73 73 65 72 74 28 20 74 65 73 74 70 63 assert( testpc
1760: 61 63 68 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 74 acheGlobal.nInst
1770: 61 6e 63 65 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 ance>0 );.. /*
1780: 53 65 65 20 69 66 20 74 68 65 20 70 61 67 65 20 See if the page
1790: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 is already in ca
17a0: 63 68 65 2e 20 20 52 65 74 75 72 6e 20 69 6d 6d che. Return imm
17b0: 65 64 69 61 74 65 6c 79 20 69 66 20 69 74 20 69 ediately if it i
17c0: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 s */. for(i=0;
17d0: 69 3c 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 i<TESTPCACHE_NPA
17e0: 47 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 GE; i++){. if
17f0: 28 20 70 2d 3e 61 5b 69 5d 2e 6b 65 79 3d 3d 6b ( p->a[i].key==k
1800: 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 ey ){. if(
1810: 21 70 2d 3e 61 5b 69 5d 2e 69 73 50 69 6e 6e 65 !p->a[i].isPinne
1820: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e d ){. p->
1830: 6e 50 69 6e 6e 65 64 2b 2b 3b 0a 20 20 20 20 20 nPinned++;.
1840: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50 assert( p->nP
1850: 69 6e 6e 65 64 20 3c 3d 20 54 45 53 54 50 43 41 inned <= TESTPCA
1860: 43 48 45 5f 4e 50 41 47 45 20 2d 20 70 2d 3e 6e CHE_NPAGE - p->n
1870: 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 20 20 Free );.
1880: 70 2d 3e 61 5b 69 5d 2e 69 73 50 69 6e 6e 65 64 p->a[i].isPinned
1890: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = 1;. }.
18a0: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 return &p->a
18b0: 5b 69 5d 2e 70 61 67 65 3b 0a 20 20 20 20 7d 0a [i].page;. }.
18c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 }.. /* If cre
18d0: 61 74 65 46 6c 61 67 20 69 73 20 30 2c 20 6e 65 ateFlag is 0, ne
18e0: 76 65 72 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e ver allocate a n
18f0: 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 ew page */. if(
1900: 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 29 createFlag==0 )
1910: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
1920: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 }.. /* If no
1930: 70 61 67 65 73 20 61 72 65 20 61 76 61 69 6c 61 pages are availa
1940: 62 6c 65 2c 20 61 6c 77 61 79 73 20 66 61 69 6c ble, always fail
1950: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 69 */. if( p->nPi
1960: 6e 6e 65 64 3d 3d 54 45 53 54 50 43 41 43 48 45 nned==TESTPCACHE
1970: 5f 4e 50 41 47 45 20 29 7b 0a 20 20 20 20 72 65 _NPAGE ){. re
1980: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f turn 0;. }.. /
1990: 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 * Do not allocat
19a0: 65 20 74 68 65 20 6c 61 73 74 20 54 45 53 54 50 e the last TESTP
19b0: 43 41 43 48 45 5f 52 45 53 45 52 56 45 20 70 61 CACHE_RESERVE pa
19c0: 67 65 73 20 75 6e 6c 65 73 73 20 63 72 65 61 74 ges unless creat
19d0: 65 46 6c 61 67 20 69 73 20 32 20 2a 2f 0a 20 20 eFlag is 2 */.
19e0: 69 66 28 20 70 2d 3e 6e 50 69 6e 6e 65 64 3e 3d if( p->nPinned>=
19f0: 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 47 45 TESTPCACHE_NPAGE
1a00: 2d 54 45 53 54 50 43 41 43 48 45 5f 52 45 53 45 -TESTPCACHE_RESE
1a10: 52 56 45 20 26 26 20 63 72 65 61 74 65 46 6c 61 RVE && createFla
1a20: 67 3c 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 g<2 ){. retur
1a30: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 n 0;. }.. /* D
1a40: 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 69 o not allocate i
1a50: 66 20 68 69 67 68 53 74 72 65 73 73 20 69 73 20 f highStress is
1a60: 65 6e 61 62 6c 65 64 20 61 6e 64 20 63 72 65 61 enabled and crea
1a70: 74 65 46 6c 61 67 20 69 73 20 6e 6f 74 20 32 2e teFlag is not 2.
1a80: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 . **. ** The
1a90: 20 68 69 67 68 53 74 72 65 73 73 20 73 65 74 74 highStress sett
1aa0: 69 6e 67 20 63 61 75 73 65 73 20 70 61 67 65 72 ing causes pager
1ab0: 53 74 72 65 73 73 28 29 20 74 6f 20 62 65 20 63 Stress() to be c
1ac0: 61 6c 6c 65 64 20 6d 75 63 68 20 6d 6f 72 65 0a alled much more.
1ad0: 20 20 2a 2a 20 6f 66 74 65 6e 2c 20 77 68 69 63 ** often, whic
1ae0: 68 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 h exercises the
1af0: 70 61 67 65 72 20 6c 6f 67 69 63 20 6d 6f 72 65 pager logic more
1b00: 20 69 6e 74 65 6e 73 65 6c 79 2e 0a 20 20 2a 2f intensely.. */
1b10: 0a 20 20 69 66 28 20 74 65 73 74 70 63 61 63 68 . if( testpcach
1b20: 65 47 6c 6f 62 61 6c 2e 68 69 67 68 53 74 72 65 eGlobal.highStre
1b30: 73 73 20 26 26 20 63 72 65 61 74 65 46 6c 61 67 ss && createFlag
1b40: 3c 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e <2 ){. return
1b50: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 0;. }.. /* Fi
1b60: 6e 64 20 61 20 66 72 65 65 20 70 61 67 65 20 74 nd a free page t
1b70: 6f 20 61 6c 6c 6f 63 61 74 65 20 69 66 20 74 68 o allocate if th
1b80: 65 72 65 20 61 72 65 20 61 6e 79 20 66 72 65 65 ere are any free
1b90: 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 57 69 74 pages.. ** Wit
1ba0: 68 68 6f 6c 64 20 54 45 53 54 50 43 41 43 48 45 hhold TESTPCACHE
1bb0: 5f 52 45 53 45 52 56 45 20 66 72 65 65 20 70 61 _RESERVE free pa
1bc0: 67 65 73 20 75 6e 74 69 6c 20 63 72 65 61 74 65 ges until create
1bd0: 46 6c 61 67 20 69 73 20 32 2e 0a 20 20 2a 2f 0a Flag is 2.. */.
1be0: 20 20 69 66 28 20 70 2d 3e 6e 46 72 65 65 3e 54 if( p->nFree>T
1bf0: 45 53 54 50 43 41 43 48 45 5f 52 45 53 45 52 56 ESTPCACHE_RESERV
1c00: 45 20 7c 7c 20 28 63 72 65 61 74 65 46 6c 61 67 E || (createFlag
1c10: 3d 3d 32 20 26 26 20 70 2d 3e 6e 46 72 65 65 3e ==2 && p->nFree>
1c20: 30 29 20 29 7b 0a 20 20 20 20 6a 20 3d 20 74 65 0) ){. j = te
1c30: 73 74 70 63 61 63 68 65 52 61 6e 64 6f 6d 28 70 stpcacheRandom(p
1c40: 29 20 25 20 54 45 53 54 50 43 41 43 48 45 5f 4e ) % TESTPCACHE_N
1c50: 50 41 47 45 3b 0a 20 20 20 20 66 6f 72 28 69 3d PAGE;. for(i=
1c60: 30 3b 20 69 3c 54 45 53 54 50 43 41 43 48 45 5f 0; i<TESTPCACHE_
1c70: 4e 50 41 47 45 3b 20 69 2b 2b 2c 20 6a 20 3d 20 NPAGE; i++, j =
1c80: 28 6a 2b 31 29 25 54 45 53 54 50 43 41 43 48 45 (j+1)%TESTPCACHE
1c90: 5f 4e 50 41 47 45 29 7b 0a 20 20 20 20 20 20 69 _NPAGE){. i
1ca0: 66 28 20 70 2d 3e 61 5b 6a 5d 2e 6b 65 79 3d 3d f( p->a[j].key==
1cb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 0 ){. p->
1cc0: 61 5b 6a 5d 2e 6b 65 79 20 3d 20 6b 65 79 3b 0a a[j].key = key;.
1cd0: 20 20 20 20 20 20 20 20 70 2d 3e 61 5b 6a 5d 2e p->a[j].
1ce0: 69 73 50 69 6e 6e 65 64 20 3d 20 31 3b 0a 20 20 isPinned = 1;.
1cf0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e memset(p->
1d00: 61 5b 6a 5d 2e 70 61 67 65 2e 70 42 75 66 2c 20 a[j].page.pBuf,
1d10: 30 2c 20 70 2d 3e 73 7a 50 61 67 65 29 3b 0a 20 0, p->szPage);.
1d20: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d memset(p-
1d30: 3e 61 5b 6a 5d 2e 70 61 67 65 2e 70 45 78 74 72 >a[j].page.pExtr
1d40: 61 2c 20 30 2c 20 70 2d 3e 73 7a 45 78 74 72 61 a, 0, p->szExtra
1d50: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 );. p->nP
1d60: 69 6e 6e 65 64 2b 2b 3b 0a 20 20 20 20 20 20 20 inned++;.
1d70: 20 70 2d 3e 6e 46 72 65 65 2d 2d 3b 0a 20 20 20 p->nFree--;.
1d80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e assert( p->
1d90: 6e 50 69 6e 6e 65 64 20 3c 3d 20 54 45 53 54 50 nPinned <= TESTP
1da0: 43 41 43 48 45 5f 4e 50 41 47 45 20 2d 20 70 2d CACHE_NPAGE - p-
1db0: 3e 6e 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 >nFree );.
1dc0: 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 6a return &p->a[j
1dd0: 5d 2e 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a ].page;. }.
1de0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 }.. /* Th
1df0: 65 20 70 72 69 6f 72 20 6c 6f 6f 70 20 61 6c 77 e prior loop alw
1e00: 61 79 73 20 66 69 6e 64 73 20 61 20 66 72 65 65 ays finds a free
1e10: 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 page to allocate
1e20: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 */. assert(
1e30: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 0 );. }.. /* I
1e40: 66 20 74 68 69 73 20 63 61 63 68 65 20 69 73 20 f this cache is
1e50: 6e 6f 74 20 70 75 72 67 65 61 62 6c 65 20 74 68 not purgeable th
1e60: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 en we have to fa
1e70: 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 il.. */. if( p
1e80: 2d 3e 62 50 75 72 67 65 61 62 6c 65 3d 3d 30 20 ->bPurgeable==0
1e90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b ){. return 0;
1ea0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 . }.. /* If th
1eb0: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 20 ere are no free
1ec0: 70 61 67 65 73 2c 20 72 65 63 79 63 6c 65 20 61 pages, recycle a
1ed0: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 page. The page
1ee0: 20 74 6f 0a 20 20 2a 2a 20 72 65 63 79 63 6c 65 to. ** recycle
1ef0: 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 74 20 is selected at
1f00: 72 61 6e 64 6f 6d 20 66 72 6f 6d 20 61 6c 6c 20 random from all
1f10: 75 6e 70 69 6e 6e 65 64 20 70 61 67 65 73 2e 0a unpinned pages..
1f20: 20 20 2a 2f 0a 20 20 6a 20 3d 20 74 65 73 74 70 */. j = testp
1f30: 63 61 63 68 65 52 61 6e 64 6f 6d 28 70 29 20 25 cacheRandom(p) %
1f40: 20 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 47 TESTPCACHE_NPAG
1f50: 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c E;. for(i=0; i<
1f60: 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 47 45 TESTPCACHE_NPAGE
1f70: 3b 20 69 2b 2b 2c 20 6a 20 3d 20 28 6a 2b 31 29 ; i++, j = (j+1)
1f80: 25 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 47 %TESTPCACHE_NPAG
1f90: 45 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 E){. if( p->a
1fa0: 5b 6a 5d 2e 6b 65 79 3e 30 20 26 26 20 70 2d 3e [j].key>0 && p->
1fb0: 61 5b 6a 5d 2e 69 73 50 69 6e 6e 65 64 3d 3d 30 a[j].isPinned==0
1fc0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 6a ){. p->a[j
1fd0: 5d 2e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 20 ].key = key;.
1fe0: 20 20 20 70 2d 3e 61 5b 6a 5d 2e 69 73 50 69 6e p->a[j].isPin
1ff0: 6e 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d ned = 1;. m
2000: 65 6d 73 65 74 28 70 2d 3e 61 5b 6a 5d 2e 70 61 emset(p->a[j].pa
2010: 67 65 2e 70 42 75 66 2c 20 30 2c 20 70 2d 3e 73 ge.pBuf, 0, p->s
2020: 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6d 65 zPage);. me
2030: 6d 73 65 74 28 70 2d 3e 61 5b 6a 5d 2e 70 61 67 mset(p->a[j].pag
2040: 65 2e 70 45 78 74 72 61 2c 20 30 2c 20 70 2d 3e e.pExtra, 0, p->
2050: 73 7a 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 szExtra);.
2060: 70 2d 3e 6e 50 69 6e 6e 65 64 2b 2b 3b 0a 20 20 p->nPinned++;.
2070: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e assert( p->n
2080: 50 69 6e 6e 65 64 20 3c 3d 20 54 45 53 54 50 43 Pinned <= TESTPC
2090: 41 43 48 45 5f 4e 50 41 47 45 20 2d 20 70 2d 3e ACHE_NPAGE - p->
20a0: 6e 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 72 nFree );. r
20b0: 65 74 75 72 6e 20 26 70 2d 3e 61 5b 6a 5d 2e 70 eturn &p->a[j].p
20c0: 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a age;. }. }..
20d0: 20 20 2f 2a 20 54 68 65 20 70 72 65 76 69 6f 75 /* The previou
20e0: 73 20 6c 6f 6f 70 20 61 6c 77 61 79 73 20 66 69 s loop always fi
20f0: 6e 64 73 20 61 20 70 61 67 65 20 74 6f 20 72 65 nds a page to re
2100: 63 79 63 6c 65 2e 20 2a 2f 0a 20 20 61 73 73 65 cycle. */. asse
2110: 72 74 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 rt(0);. return
2120: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 70 69 0;.}../*.** Unpi
2130: 6e 20 61 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 n a page..*/.sta
2140: 74 69 63 20 76 6f 69 64 20 74 65 73 74 70 63 61 tic void testpca
2150: 63 68 65 55 6e 70 69 6e 28 0a 20 20 73 71 6c 69 cheUnpin(. sqli
2160: 74 65 33 5f 70 63 61 63 68 65 20 2a 70 43 61 63 te3_pcache *pCac
2170: 68 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 he,. sqlite3_pc
2180: 61 63 68 65 5f 70 61 67 65 20 2a 70 4f 6c 64 50 ache_page *pOldP
2190: 61 67 65 2c 0a 20 20 69 6e 74 20 64 69 73 63 61 age,. int disca
21a0: 72 64 0a 29 7b 0a 20 20 74 65 73 74 70 63 61 63 rd.){. testpcac
21b0: 68 65 20 2a 70 20 3d 20 28 74 65 73 74 70 63 61 he *p = (testpca
21c0: 63 68 65 2a 29 70 43 61 63 68 65 3b 0a 20 20 69 che*)pCache;. i
21d0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 nt i;. assert(
21e0: 70 2d 3e 69 4d 61 67 69 63 3d 3d 54 45 53 54 50 p->iMagic==TESTP
21f0: 43 41 43 48 45 5f 56 41 4c 49 44 20 29 3b 0a 20 CACHE_VALID );.
2200: 20 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61 assert( testpca
2210: 63 68 65 47 6c 6f 62 61 6c 2e 70 44 75 6d 6d 79 cheGlobal.pDummy
2220: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 !=0 );. assert(
2230: 20 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 testpcacheGloba
2240: 6c 2e 6e 49 6e 73 74 61 6e 63 65 3e 30 20 29 3b l.nInstance>0 );
2250: 0a 0a 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 .. /* Randomly
2260: 64 69 73 63 61 72 64 20 70 61 67 65 73 20 61 73 discard pages as
2270: 20 74 68 65 79 20 61 72 65 20 75 6e 70 69 6e 6e they are unpinn
2280: 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 ed according to
2290: 74 68 65 0a 20 20 2a 2a 20 64 69 73 63 61 72 64 the. ** discard
22a0: 43 68 61 6e 63 65 20 73 65 74 74 69 6e 67 2e 20 Chance setting.
22b0: 20 49 66 20 64 69 73 63 61 72 64 43 68 61 6e 63 If discardChanc
22c0: 65 20 69 73 20 30 2c 20 74 68 65 20 72 61 6e 64 e is 0, the rand
22d0: 6f 6d 20 64 69 73 63 61 72 64 0a 20 20 2a 2a 20 om discard. **
22e0: 6e 65 76 65 72 20 68 61 70 70 65 6e 73 2e 20 20 never happens.
22f0: 49 66 20 64 69 73 63 61 72 64 43 68 61 6e 63 65 If discardChance
2300: 20 69 73 20 31 30 30 2c 20 69 74 20 61 6c 77 61 is 100, it alwa
2310: 79 73 20 68 61 70 70 65 6e 73 2e 0a 20 20 2a 2f ys happens.. */
2320: 0a 20 20 69 66 28 20 70 2d 3e 62 50 75 72 67 65 . if( p->bPurge
2330: 61 62 6c 65 0a 20 20 26 26 20 28 31 30 30 2d 74 able. && (100-t
2340: 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c 2e estpcacheGlobal.
2350: 64 69 73 63 61 72 64 43 68 61 6e 63 65 29 20 3c discardChance) <
2360: 3d 20 28 74 65 73 74 70 63 61 63 68 65 52 61 6e = (testpcacheRan
2370: 64 6f 6d 28 70 29 25 31 30 30 29 0a 20 20 29 7b dom(p)%100). ){
2380: 0a 20 20 20 20 64 69 73 63 61 72 64 20 3d 20 31 . discard = 1
2390: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 ;. }.. for(i=0
23a0: 3b 20 69 3c 54 45 53 54 50 43 41 43 48 45 5f 4e ; i<TESTPCACHE_N
23b0: 50 41 47 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 PAGE; i++){.
23c0: 69 66 28 20 26 70 2d 3e 61 5b 69 5d 2e 70 61 67 if( &p->a[i].pag
23d0: 65 3d 3d 70 4f 6c 64 50 61 67 65 20 29 7b 0a 20 e==pOldPage ){.
23e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4f 6c 64 /* The pOld
23f0: 50 61 67 65 20 70 6f 69 6e 74 65 72 20 61 6c 77 Page pointer alw
2400: 61 79 73 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 ays points to a
2410: 70 69 6e 6e 65 64 20 70 61 67 65 20 2a 2f 0a 20 pinned page */.
2420: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e assert( p->
2430: 61 5b 69 5d 2e 69 73 50 69 6e 6e 65 64 20 29 3b a[i].isPinned );
2440: 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 69 . p->a[i].i
2450: 73 50 69 6e 6e 65 64 20 3d 20 30 3b 0a 20 20 20 sPinned = 0;.
2460: 20 20 20 70 2d 3e 6e 50 69 6e 6e 65 64 2d 2d 3b p->nPinned--;
2470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
2480: 2d 3e 6e 50 69 6e 6e 65 64 3e 3d 30 20 29 3b 0a ->nPinned>=0 );.
2490: 20 20 20 20 20 20 69 66 28 20 64 69 73 63 61 72 if( discar
24a0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e d ){. p->
24b0: 61 5b 69 5d 2e 6b 65 79 20 3d 20 30 3b 0a 20 20 a[i].key = 0;.
24c0: 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 2b 2b p->nFree++
24d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 ;. assert
24e0: 28 20 70 2d 3e 6e 46 72 65 65 3c 3d 54 45 53 54 ( p->nFree<=TEST
24f0: 50 43 41 43 48 45 5f 4e 50 41 47 45 20 29 3b 0a PCACHE_NPAGE );.
2500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 }. re
2510: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a turn;. }. }.
2520: 0a 20 20 2f 2a 20 54 68 65 20 70 4f 6c 64 50 61 . /* The pOldPa
2530: 67 65 20 70 6f 69 6e 74 65 72 20 61 6c 77 61 79 ge pointer alway
2540: 73 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 s points to a va
2550: 6c 69 64 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 lid page */. as
2560: 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a 0a 0a 2f sert( 0 );.}.../
2570: 2a 0a 2a 2a 20 52 65 6b 65 79 20 61 20 73 69 6e *.** Rekey a sin
2580: 67 6c 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 gle page..*/.sta
2590: 74 69 63 20 76 6f 69 64 20 74 65 73 74 70 63 61 tic void testpca
25a0: 63 68 65 52 65 6b 65 79 28 0a 20 20 73 71 6c 69 cheRekey(. sqli
25b0: 74 65 33 5f 70 63 61 63 68 65 20 2a 70 43 61 63 te3_pcache *pCac
25c0: 68 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 he,. sqlite3_pc
25d0: 61 63 68 65 5f 70 61 67 65 20 2a 70 4f 6c 64 50 ache_page *pOldP
25e0: 61 67 65 2c 0a 20 20 75 6e 73 69 67 6e 65 64 20 age,. unsigned
25f0: 6f 6c 64 4b 65 79 2c 0a 20 20 75 6e 73 69 67 6e oldKey,. unsign
2600: 65 64 20 6e 65 77 4b 65 79 0a 29 7b 0a 20 20 74 ed newKey.){. t
2610: 65 73 74 70 63 61 63 68 65 20 2a 70 20 3d 20 28 estpcache *p = (
2620: 74 65 73 74 70 63 61 63 68 65 2a 29 70 43 61 63 testpcache*)pCac
2630: 68 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 he;. int i;. a
2640: 73 73 65 72 74 28 20 70 2d 3e 69 4d 61 67 69 63 ssert( p->iMagic
2650: 3d 3d 54 45 53 54 50 43 41 43 48 45 5f 56 41 4c ==TESTPCACHE_VAL
2660: 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 ID );. assert(
2670: 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c testpcacheGlobal
2680: 2e 70 44 75 6d 6d 79 21 3d 30 20 29 3b 0a 20 20 .pDummy!=0 );.
2690: 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61 63 assert( testpcac
26a0: 68 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61 6e heGlobal.nInstan
26b0: 63 65 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 ce>0 );.. /* If
26c0: 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 there already e
26d0: 78 69 73 74 73 20 61 6e 6f 74 68 65 72 20 70 61 xists another pa
26e0: 67 65 20 61 74 20 6e 65 77 4b 65 79 2c 20 76 65 ge at newKey, ve
26f0: 72 69 66 79 20 74 68 61 74 0a 20 20 2a 2a 20 74 rify that. ** t
2700: 68 65 20 6f 74 68 65 72 20 70 61 67 65 20 69 73 he other page is
2710: 20 75 6e 70 69 6e 6e 65 64 20 61 6e 64 20 64 69 unpinned and di
2720: 73 63 61 72 64 20 69 74 2e 0a 20 20 2a 2f 0a 20 scard it.. */.
2730: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53 54 for(i=0; i<TEST
2740: 50 43 41 43 48 45 5f 4e 50 41 47 45 3b 20 69 2b PCACHE_NPAGE; i+
2750: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 +){. if( p->a
2760: 5b 69 5d 2e 6b 65 79 3d 3d 6e 65 77 4b 65 79 20 [i].key==newKey
2770: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 ){. /* The
2780: 6e 65 77 20 6b 65 79 20 69 73 20 6e 65 76 65 72 new key is never
2790: 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 a page that is
27a0: 61 6c 72 65 61 64 79 20 70 69 6e 6e 65 64 20 2a already pinned *
27b0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 /. assert(
27c0: 70 2d 3e 61 5b 69 5d 2e 69 73 50 69 6e 6e 65 64 p->a[i].isPinned
27d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e ==0 );. p->
27e0: 61 5b 69 5d 2e 6b 65 79 20 3d 20 30 3b 0a 20 20 a[i].key = 0;.
27f0: 20 20 20 20 70 2d 3e 6e 46 72 65 65 2b 2b 3b 0a p->nFree++;.
2800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d assert( p-
2810: 3e 6e 46 72 65 65 3c 3d 54 45 53 54 50 43 41 43 >nFree<=TESTPCAC
2820: 48 45 5f 4e 50 41 47 45 20 29 3b 0a 20 20 20 20 HE_NPAGE );.
2830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
2840: 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 }.. /* Find th
2850: 65 20 70 61 67 65 20 74 6f 20 62 65 20 72 65 6b e page to be rek
2860: 65 79 65 64 20 61 6e 64 20 72 65 6b 65 79 20 69 eyed and rekey i
2870: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d t.. */. for(i=
2880: 30 3b 20 69 3c 54 45 53 54 50 43 41 43 48 45 5f 0; i<TESTPCACHE_
2890: 4e 50 41 47 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 NPAGE; i++){.
28a0: 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 6b 65 79 if( p->a[i].key
28b0: 3d 3d 6f 6c 64 4b 65 79 20 29 7b 0a 20 20 20 20 ==oldKey ){.
28c0: 20 20 2f 2a 20 54 68 65 20 6f 6c 64 4b 65 79 20 /* The oldKey
28d0: 61 6e 64 20 70 4f 6c 64 50 61 67 65 20 70 61 72 and pOldPage par
28e0: 61 6d 65 74 65 72 73 20 6d 61 74 63 68 20 2a 2f ameters match */
28f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 26 . assert( &
2900: 70 2d 3e 61 5b 69 5d 2e 70 61 67 65 3d 3d 70 4f p->a[i].page==pO
2910: 6c 64 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 ldPage );.
2920: 2f 2a 20 50 61 67 65 20 74 6f 20 62 65 20 72 65 /* Page to be re
2930: 6b 65 79 65 64 20 6d 75 73 74 20 62 65 20 70 69 keyed must be pi
2940: 6e 6e 65 64 20 2a 2f 0a 20 20 20 20 20 20 61 73 nned */. as
2950: 73 65 72 74 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 sert( p->a[i].is
2960: 50 69 6e 6e 65 64 20 29 3b 0a 20 20 20 20 20 20 Pinned );.
2970: 70 2d 3e 61 5b 69 5d 2e 6b 65 79 20 3d 20 6e 65 p->a[i].key = ne
2980: 77 4b 65 79 3b 0a 20 20 20 20 20 20 72 65 74 75 wKey;. retu
2990: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 rn;. }. }..
29a0: 20 2f 2a 20 52 65 6b 65 79 20 69 73 20 61 6c 77 /* Rekey is alw
29b0: 61 79 73 20 67 69 76 65 6e 20 61 20 76 61 6c 69 ays given a vali
29c0: 64 20 70 61 67 65 20 74 6f 20 77 6f 72 6b 20 77 d page to work w
29d0: 69 74 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 ith */. assert(
29e0: 20 30 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 0 );.}.../*.**
29f0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 70 61 67 Truncate the pag
2a00: 65 20 63 61 63 68 65 2e 20 20 45 76 65 72 79 20 e cache. Every
2a10: 70 61 67 65 20 77 69 74 68 20 61 20 6b 65 79 20 page with a key
2a20: 6f 66 20 69 4c 69 6d 69 74 20 6f 72 20 6c 61 72 of iLimit or lar
2a30: 67 65 72 0a 2a 2a 20 69 73 20 64 69 73 63 61 72 ger.** is discar
2a40: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ded..*/.static v
2a50: 6f 69 64 20 74 65 73 74 70 63 61 63 68 65 54 72 oid testpcacheTr
2a60: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 70 uncate(sqlite3_p
2a70: 63 61 63 68 65 20 2a 70 43 61 63 68 65 2c 20 75 cache *pCache, u
2a80: 6e 73 69 67 6e 65 64 20 69 4c 69 6d 69 74 29 7b nsigned iLimit){
2a90: 0a 20 20 74 65 73 74 70 63 61 63 68 65 20 2a 70 . testpcache *p
2aa0: 20 3d 20 28 74 65 73 74 70 63 61 63 68 65 2a 29 = (testpcache*)
2ab0: 70 43 61 63 68 65 3b 0a 20 20 75 6e 73 69 67 6e pCache;. unsign
2ac0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 ed int i;. asse
2ad0: 72 74 28 20 70 2d 3e 69 4d 61 67 69 63 3d 3d 54 rt( p->iMagic==T
2ae0: 45 53 54 50 43 41 43 48 45 5f 56 41 4c 49 44 20 ESTPCACHE_VALID
2af0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 73 );. assert( tes
2b00: 74 70 63 61 63 68 65 47 6c 6f 62 61 6c 2e 70 44 tpcacheGlobal.pD
2b10: 75 6d 6d 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 ummy!=0 );. ass
2b20: 65 72 74 28 20 74 65 73 74 70 63 61 63 68 65 47 ert( testpcacheG
2b30: 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61 6e 63 65 3e lobal.nInstance>
2b40: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 0 );. for(i=0;
2b50: 69 3c 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 i<TESTPCACHE_NPA
2b60: 47 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 GE; i++){. if
2b70: 28 20 70 2d 3e 61 5b 69 5d 2e 6b 65 79 3e 3d 69 ( p->a[i].key>=i
2b80: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 Limit ){. p
2b90: 2d 3e 61 5b 69 5d 2e 6b 65 79 20 3d 20 30 3b 0a ->a[i].key = 0;.
2ba0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69 if( p->a[i
2bb0: 5d 2e 69 73 50 69 6e 6e 65 64 20 29 7b 0a 20 20 ].isPinned ){.
2bc0: 20 20 20 20 20 20 70 2d 3e 6e 50 69 6e 6e 65 64 p->nPinned
2bd0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 --;. asse
2be0: 72 74 28 20 70 2d 3e 6e 50 69 6e 6e 65 64 3e 3d rt( p->nPinned>=
2bf0: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0 );. }.
2c00: 20 20 20 70 2d 3e 6e 46 72 65 65 2b 2b 3b 0a 20 p->nFree++;.
2c10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e assert( p->
2c20: 6e 46 72 65 65 3c 3d 54 45 53 54 50 43 41 43 48 nFree<=TESTPCACH
2c30: 45 5f 4e 50 41 47 45 20 29 3b 0a 20 20 20 20 7d E_NPAGE );. }
2c40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 . }.}../*.** De
2c50: 73 74 72 6f 79 20 61 20 70 61 67 65 20 63 61 63 stroy a page cac
2c60: 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f he..*/.static vo
2c70: 69 64 20 74 65 73 74 70 63 61 63 68 65 44 65 73 id testpcacheDes
2c80: 74 72 6f 79 28 73 71 6c 69 74 65 33 5f 70 63 61 troy(sqlite3_pca
2c90: 63 68 65 20 2a 70 43 61 63 68 65 29 7b 0a 20 20 che *pCache){.
2ca0: 74 65 73 74 70 63 61 63 68 65 20 2a 70 20 3d 20 testpcache *p =
2cb0: 28 74 65 73 74 70 63 61 63 68 65 2a 29 70 43 61 (testpcache*)pCa
2cc0: 63 68 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 che;. assert( p
2cd0: 2d 3e 69 4d 61 67 69 63 3d 3d 54 45 53 54 50 43 ->iMagic==TESTPC
2ce0: 41 43 48 45 5f 56 41 4c 49 44 20 29 3b 0a 20 20 ACHE_VALID );.
2cf0: 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61 63 assert( testpcac
2d00: 68 65 47 6c 6f 62 61 6c 2e 70 44 75 6d 6d 79 21 heGlobal.pDummy!
2d10: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
2d20: 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c testpcacheGlobal
2d30: 2e 6e 49 6e 73 74 61 6e 63 65 3e 30 20 29 3b 0a .nInstance>0 );.
2d40: 20 20 70 2d 3e 69 4d 61 67 69 63 20 3d 20 54 45 p->iMagic = TE
2d50: 53 54 50 43 41 43 48 45 5f 43 4c 45 41 52 3b 0a STPCACHE_CLEAR;.
2d60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 sqlite3_free(p
2d70: 29 3b 0a 20 20 74 65 73 74 70 63 61 63 68 65 47 );. testpcacheG
2d80: 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61 6e 63 65 2d lobal.nInstance-
2d90: 2d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 -;.}.../*.** Inv
2da0: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 oke this routine
2db0: 20 74 6f 20 72 65 67 69 73 74 65 72 20 6f 72 20 to register or
2dc0: 75 6e 72 65 67 69 73 74 65 72 20 74 68 65 20 74 unregister the t
2dd0: 65 73 74 69 6e 67 20 70 61 67 65 72 20 63 61 63 esting pager cac
2de0: 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 he.** implemente
2df0: 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2e 0a d by this file..
2e00: 2a 2a 0a 2a 2a 20 49 6e 73 74 61 6c 6c 20 74 68 **.** Install th
2e10: 65 20 74 65 73 74 20 70 61 67 65 72 20 63 61 63 e test pager cac
2e20: 68 65 20 69 66 20 69 6e 73 74 61 6c 6c 46 6c 61 he if installFla
2e30: 67 20 69 73 20 31 20 61 6e 64 20 75 6e 69 6e 73 g is 1 and unins
2e40: 74 61 6c 6c 20 69 74 20 69 66 0a 2a 2a 20 69 6e tall it if.** in
2e50: 73 74 61 6c 6c 46 6c 61 67 20 69 73 20 30 2e 0a stallFlag is 0..
2e60: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 73 74 61 **.** When insta
2e70: 6c 6c 69 6e 67 2c 20 64 69 73 63 61 72 64 43 68 lling, discardCh
2e80: 61 6e 63 65 20 69 73 20 61 20 6e 75 6d 62 65 72 ance is a number
2e90: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 between 0 and 1
2ea0: 30 30 20 74 68 61 74 0a 2a 2a 20 69 6e 64 69 63 00 that.** indic
2eb0: 61 74 65 73 20 74 68 65 20 70 72 6f 62 61 62 69 ates the probabi
2ec0: 6c 69 74 79 20 6f 66 20 64 69 73 63 61 72 64 69 lity of discardi
2ed0: 6e 67 20 61 20 70 61 67 65 20 77 68 65 6e 20 75 ng a page when u
2ee0: 6e 70 69 6e 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 npinning the.**
2ef0: 70 61 67 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e page. 0 means n
2f00: 65 76 65 72 20 64 69 73 63 61 72 64 20 28 75 6e ever discard (un
2f10: 6c 65 73 73 20 74 68 65 20 64 69 73 63 61 72 64 less the discard
2f20: 20 66 6c 61 67 20 69 73 20 73 65 74 29 2e 0a 2a flag is set)..*
2f30: 2a 20 31 30 30 20 6d 65 61 6e 73 20 61 6c 77 61 * 100 means alwa
2f40: 79 73 20 64 69 73 63 61 72 64 2e 0a 2a 2f 0a 76 ys discard..*/.v
2f50: 6f 69 64 20 69 6e 73 74 61 6c 6c 54 65 73 74 50 oid installTestP
2f60: 43 61 63 68 65 28 0a 20 20 69 6e 74 20 69 6e 73 Cache(. int ins
2f70: 74 61 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 tallFlag,
2f80: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 /* True to
2f90: 69 6e 73 74 61 6c 6c 2e 20 20 46 61 6c 73 65 20 install. False
2fa0: 74 6f 20 75 6e 69 6e 73 74 61 6c 6c 2e 20 2a 2f to uninstall. */
2fb0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 64 69 73 63 . unsigned disc
2fc0: 61 72 64 43 68 61 6e 63 65 2c 20 20 20 20 20 2f ardChance, /
2fd0: 2a 20 30 2d 31 30 30 2e 20 20 43 68 61 6e 63 65 * 0-100. Chance
2fe0: 20 74 6f 20 64 69 73 63 61 72 64 20 6f 6e 20 75 to discard on u
2ff0: 6e 70 69 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e npin */. unsign
3000: 65 64 20 70 72 6e 67 53 65 65 64 2c 20 20 20 20 ed prngSeed,
3010: 20 20 20 20 20 20 2f 2a 20 53 65 65 64 20 66 6f /* Seed fo
3020: 72 20 74 68 65 20 50 52 4e 47 20 2a 2f 0a 20 20 r the PRNG */.
3030: 75 6e 73 69 67 6e 65 64 20 68 69 67 68 53 74 72 unsigned highStr
3040: 65 73 73 20 20 20 20 20 20 20 20 20 2f 2a 20 43 ess /* C
3050: 61 6c 6c 20 78 53 74 72 65 73 73 20 61 67 72 65 all xStress agre
3060: 73 73 69 76 65 6c 79 20 2a 2f 0a 29 7b 0a 20 20 ssively */.){.
3070: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c static const sql
3080: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 ite3_pcache_meth
3090: 6f 64 73 32 20 74 65 73 74 50 63 61 63 68 65 20 ods2 testPcache
30a0: 3d 20 7b 0a 20 20 20 20 31 2c 0a 20 20 20 20 28 = {. 1,. (
30b0: 76 6f 69 64 2a 29 26 74 65 73 74 70 63 61 63 68 void*)&testpcach
30c0: 65 47 6c 6f 62 61 6c 2c 0a 20 20 20 20 74 65 73 eGlobal,. tes
30d0: 74 70 63 61 63 68 65 49 6e 69 74 2c 0a 20 20 20 tpcacheInit,.
30e0: 20 74 65 73 74 70 63 61 63 68 65 53 68 75 74 64 testpcacheShutd
30f0: 6f 77 6e 2c 0a 20 20 20 20 74 65 73 74 70 63 61 own,. testpca
3100: 63 68 65 43 72 65 61 74 65 2c 0a 20 20 20 20 74 cheCreate,. t
3110: 65 73 74 70 63 61 63 68 65 43 61 63 68 65 73 69 estpcacheCachesi
3120: 7a 65 2c 0a 20 20 20 20 74 65 73 74 70 63 61 63 ze,. testpcac
3130: 68 65 50 61 67 65 63 6f 75 6e 74 2c 0a 20 20 20 hePagecount,.
3140: 20 74 65 73 74 70 63 61 63 68 65 46 65 74 63 68 testpcacheFetch
3150: 2c 0a 20 20 20 20 74 65 73 74 70 63 61 63 68 65 ,. testpcache
3160: 55 6e 70 69 6e 2c 0a 20 20 20 20 74 65 73 74 70 Unpin,. testp
3170: 63 61 63 68 65 52 65 6b 65 79 2c 0a 20 20 20 20 cacheRekey,.
3180: 74 65 73 74 70 63 61 63 68 65 54 72 75 6e 63 61 testpcacheTrunca
3190: 74 65 2c 0a 20 20 20 20 74 65 73 74 70 63 61 63 te,. testpcac
31a0: 68 65 44 65 73 74 72 6f 79 2c 0a 20 20 7d 3b 0a heDestroy,. };.
31b0: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 static sqlite3
31c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 _pcache_methods2
31d0: 20 64 65 66 61 75 6c 74 50 63 61 63 68 65 3b 0a defaultPcache;.
31e0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 49 static int isI
31f0: 6e 73 74 61 6c 6c 65 64 20 3d 20 30 3b 0a 0a 20 nstalled = 0;..
3200: 20 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61 assert( testpca
3210: 63 68 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61 cheGlobal.nInsta
3220: 6e 63 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 nce==0 );. asse
3230: 72 74 28 20 74 65 73 74 70 63 61 63 68 65 47 6c rt( testpcacheGl
3240: 6f 62 61 6c 2e 70 44 75 6d 6d 79 3d 3d 30 20 29 obal.pDummy==0 )
3250: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 69 73 63 ;. assert( disc
3260: 61 72 64 43 68 61 6e 63 65 3c 3d 31 30 30 20 29 ardChance<=100 )
3270: 3b 0a 20 20 74 65 73 74 70 63 61 63 68 65 47 6c ;. testpcacheGl
3280: 6f 62 61 6c 2e 64 69 73 63 61 72 64 43 68 61 6e obal.discardChan
3290: 63 65 20 3d 20 64 69 73 63 61 72 64 43 68 61 6e ce = discardChan
32a0: 63 65 3b 0a 20 20 74 65 73 74 70 63 61 63 68 65 ce;. testpcache
32b0: 47 6c 6f 62 61 6c 2e 70 72 6e 67 53 65 65 64 20 Global.prngSeed
32c0: 3d 20 70 72 6e 67 53 65 65 64 20 5e 20 28 70 72 = prngSeed ^ (pr
32d0: 6e 67 53 65 65 64 3c 3c 31 36 29 3b 0a 20 20 74 ngSeed<<16);. t
32e0: 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c 2e estpcacheGlobal.
32f0: 68 69 67 68 53 74 72 65 73 73 20 3d 20 68 69 67 highStress = hig
3300: 68 53 74 72 65 73 73 3b 0a 20 20 69 66 28 20 69 hStress;. if( i
3310: 6e 73 74 61 6c 6c 46 6c 61 67 21 3d 69 73 49 6e nstallFlag!=isIn
3320: 73 74 61 6c 6c 65 64 20 29 7b 0a 20 20 20 20 69 stalled ){. i
3330: 66 28 20 69 6e 73 74 61 6c 6c 46 6c 61 67 20 29 f( installFlag )
3340: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
3350: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f config(SQLITE_CO
3360: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 2c NFIG_GETPCACHE2,
3370: 20 26 64 65 66 61 75 6c 74 50 63 61 63 68 65 29 &defaultPcache)
3380: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 ;. assert(
3390: 64 65 66 61 75 6c 74 50 63 61 63 68 65 2e 78 43 defaultPcache.xC
33a0: 72 65 61 74 65 21 3d 74 65 73 74 70 63 61 63 68 reate!=testpcach
33b0: 65 43 72 65 61 74 65 20 29 3b 0a 20 20 20 20 20 eCreate );.
33c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 sqlite3_config(
33d0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 SQLITE_CONFIG_PC
33e0: 41 43 48 45 32 2c 20 26 74 65 73 74 50 63 61 63 ACHE2, &testPcac
33f0: 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a he);. }else{.
3400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 assert( de
3410: 66 61 75 6c 74 50 63 61 63 68 65 2e 78 43 72 65 faultPcache.xCre
3420: 61 74 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 ate!=0 );.
3430: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 sqlite3_config(S
3440: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 QLITE_CONFIG_PCA
3450: 43 48 45 32 2c 20 26 64 65 66 61 75 6c 74 50 63 CHE2, &defaultPc
3460: 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 ache);. }.
3470: 20 69 73 49 6e 73 74 61 6c 6c 65 64 20 3d 20 69 isInstalled = i
3480: 6e 73 74 61 6c 6c 46 6c 61 67 3b 0a 20 20 7d 0a nstallFlag;. }.
3490: 7d 0a }.