/ Hex Artifact Content
Login

Artifact 96f5ba93a34d844de596bebdfe1c09bab438a8bd:


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 6e 65 77 53 69 7a 65 3e 3d 31 20  ert( newSize>=1 
1490: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 73  );.  assert( tes
14a0: 74 70 63 61 63 68 65 47 6c 6f 62 61 6c 2e 70 44  tpcacheGlobal.pD
14b0: 75 6d 6d 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  ummy!=0 );.  ass
14c0: 65 72 74 28 20 74 65 73 74 70 63 61 63 68 65 47  ert( testpcacheG
14d0: 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61 6e 63 65 3e  lobal.nInstance>
14e0: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0 );.}../*.** Re
14f0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1500: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1510: 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20 62  cache that are b
1520: 65 69 6e 67 20 75 73 65 64 2e 0a 2a 2a 20 54 68  eing used..** Th
1530: 69 73 20 69 6e 63 6c 75 64 65 73 20 62 6f 74 68  is includes both
1540: 20 70 69 6e 6e 65 64 20 61 6e 64 20 75 6e 70 69   pinned and unpi
1550: 6e 6e 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 73  nned pages..*/.s
1560: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 70 63  tatic int testpc
1570: 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 73 71  achePagecount(sq
1580: 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70 43  lite3_pcache *pC
1590: 61 63 68 65 29 7b 0a 20 20 74 65 73 74 70 63 61  ache){.  testpca
15a0: 63 68 65 20 2a 70 20 3d 20 28 74 65 73 74 70 63  che *p = (testpc
15b0: 61 63 68 65 2a 29 70 43 61 63 68 65 3b 0a 20 20  ache*)pCache;.  
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 69 4d 61 67 69  assert( p->iMagi
15d0: 63 3d 3d 54 45 53 54 50 43 41 43 48 45 5f 56 41  c==TESTPCACHE_VA
15e0: 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
15f0: 20 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61   testpcacheGloba
1600: 6c 2e 70 44 75 6d 6d 79 21 3d 30 20 29 3b 0a 20  l.pDummy!=0 );. 
1610: 20 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61   assert( testpca
1620: 63 68 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61  cheGlobal.nInsta
1630: 6e 63 65 3e 30 20 29 3b 0a 20 20 72 65 74 75 72  nce>0 );.  retur
1640: 6e 20 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41  n TESTPCACHE_NPA
1650: 47 45 20 2d 20 70 2d 3e 6e 46 72 65 65 3b 0a 7d  GE - p->nFree;.}
1660: 0a 0a 2f 2a 0a 2a 2a 20 46 65 74 63 68 20 61 20  ../*.** Fetch a 
1670: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
1680: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
1690: 61 67 65 20 2a 74 65 73 74 70 63 61 63 68 65 46  age *testpcacheF
16a0: 65 74 63 68 28 0a 20 20 73 71 6c 69 74 65 33 5f  etch(.  sqlite3_
16b0: 70 63 61 63 68 65 20 2a 70 43 61 63 68 65 2c 0a  pcache *pCache,.
16c0: 20 20 75 6e 73 69 67 6e 65 64 20 6b 65 79 2c 0a    unsigned key,.
16d0: 20 20 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67    int createFlag
16e0: 0a 29 7b 0a 20 20 74 65 73 74 70 63 61 63 68 65  .){.  testpcache
16f0: 20 2a 70 20 3d 20 28 74 65 73 74 70 63 61 63 68   *p = (testpcach
1700: 65 2a 29 70 43 61 63 68 65 3b 0a 20 20 69 6e 74  e*)pCache;.  int
1710: 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28   i, j;.  assert(
1720: 20 70 2d 3e 69 4d 61 67 69 63 3d 3d 54 45 53 54   p->iMagic==TEST
1730: 50 43 41 43 48 45 5f 56 41 4c 49 44 20 29 3b 0a  PCACHE_VALID );.
1740: 20 20 61 73 73 65 72 74 28 20 74 65 73 74 70 63    assert( testpc
1750: 61 63 68 65 47 6c 6f 62 61 6c 2e 70 44 75 6d 6d  acheGlobal.pDumm
1760: 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
1770: 28 20 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62  ( testpcacheGlob
1780: 61 6c 2e 6e 49 6e 73 74 61 6e 63 65 3e 30 20 29  al.nInstance>0 )
1790: 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  ;..  /* See if t
17a0: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
17b0: 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 52 65  dy in cache.  Re
17c0: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
17d0: 20 69 66 20 69 74 20 69 73 20 2a 2f 0a 20 20 66   if it is */.  f
17e0: 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53 54 50 43  or(i=0; i<TESTPC
17f0: 41 43 48 45 5f 4e 50 41 47 45 3b 20 69 2b 2b 29  ACHE_NPAGE; i++)
1800: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69  {.    if( p->a[i
1810: 5d 2e 6b 65 79 3d 3d 6b 65 79 20 29 7b 0a 20 20  ].key==key ){.  
1820: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 5b 69 5d      if( !p->a[i]
1830: 2e 69 73 50 69 6e 6e 65 64 20 29 7b 0a 20 20 20  .isPinned ){.   
1840: 20 20 20 20 20 70 2d 3e 6e 50 69 6e 6e 65 64 2b       p->nPinned+
1850: 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
1860: 74 28 20 70 2d 3e 6e 50 69 6e 6e 65 64 20 3c 3d  t( p->nPinned <=
1870: 20 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 47   TESTPCACHE_NPAG
1880: 45 20 2d 20 70 2d 3e 6e 46 72 65 65 20 29 3b 0a  E - p->nFree );.
1890: 20 20 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e          p->a[i].
18a0: 69 73 50 69 6e 6e 65 64 20 3d 20 31 3b 0a 20 20  isPinned = 1;.  
18b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
18c0: 72 6e 20 26 70 2d 3e 61 5b 69 5d 2e 70 61 67 65  rn &p->a[i].page
18d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18e0: 2a 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20  * If createFlag 
18f0: 69 73 20 30 2c 20 6e 65 76 65 72 20 61 6c 6c 6f  is 0, never allo
1900: 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
1910: 2a 2f 0a 20 20 69 66 28 20 63 72 65 61 74 65 46  */.  if( createF
1920: 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  lag==0 ){.    re
1930: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1940: 2a 20 49 66 20 6e 6f 20 70 61 67 65 73 20 61 72  * If no pages ar
1950: 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 6c 77  e available, alw
1960: 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66  ays fail */.  if
1970: 28 20 70 2d 3e 6e 50 69 6e 6e 65 64 3d 3d 54 45  ( p->nPinned==TE
1980: 53 54 50 43 41 43 48 45 5f 4e 50 41 47 45 20 29  STPCACHE_NPAGE )
1990: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
19a0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74    }..  /* Do not
19b0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 6c 61   allocate the la
19c0: 73 74 20 54 45 53 54 50 43 41 43 48 45 5f 52 45  st TESTPCACHE_RE
19d0: 53 45 52 56 45 20 70 61 67 65 73 20 75 6e 6c 65  SERVE pages unle
19e0: 73 73 20 63 72 65 61 74 65 46 6c 61 67 20 69 73  ss createFlag is
19f0: 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e   2 */.  if( p->n
1a00: 50 69 6e 6e 65 64 3e 3d 54 45 53 54 50 43 41 43  Pinned>=TESTPCAC
1a10: 48 45 5f 4e 50 41 47 45 2d 54 45 53 54 50 43 41  HE_NPAGE-TESTPCA
1a20: 43 48 45 5f 52 45 53 45 52 56 45 20 26 26 20 63  CHE_RESERVE && c
1a30: 72 65 61 74 65 46 6c 61 67 3c 32 20 29 7b 0a 20  reateFlag<2 ){. 
1a40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1a50: 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ..  /* Do not al
1a60: 6c 6f 63 61 74 65 20 69 66 20 68 69 67 68 53 74  locate if highSt
1a70: 72 65 73 73 20 69 73 20 65 6e 61 62 6c 65 64 20  ress is enabled 
1a80: 61 6e 64 20 63 72 65 61 74 65 46 6c 61 67 20 69  and createFlag i
1a90: 73 20 6e 6f 74 20 32 2e 20 20 0a 20 20 2a 2a 0a  s not 2.  .  **.
1aa0: 20 20 2a 2a 20 54 68 65 20 68 69 67 68 53 74 72    ** The highStr
1ab0: 65 73 73 20 73 65 74 74 69 6e 67 20 63 61 75 73  ess setting caus
1ac0: 65 73 20 70 61 67 65 72 53 74 72 65 73 73 28 29  es pagerStress()
1ad0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 6d 75   to be called mu
1ae0: 63 68 20 6d 6f 72 65 0a 20 20 2a 2a 20 6f 66 74  ch more.  ** oft
1af0: 65 6e 2c 20 77 68 69 63 68 20 65 78 65 72 63 69  en, which exerci
1b00: 73 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 6f  ses the pager lo
1b10: 67 69 63 20 6d 6f 72 65 20 69 6e 74 65 6e 73 65  gic more intense
1b20: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74  ly..  */.  if( t
1b30: 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c 2e  estpcacheGlobal.
1b40: 68 69 67 68 53 74 72 65 73 73 20 26 26 20 63 72  highStress && cr
1b50: 65 61 74 65 46 6c 61 67 3c 32 20 29 7b 0a 20 20  eateFlag<2 ){.  
1b60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1b70: 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 66 72 65  .  /* Find a fre
1b80: 65 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61  e page to alloca
1b90: 74 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  te if there are 
1ba0: 61 6e 79 20 66 72 65 65 20 70 61 67 65 73 2e 0a  any free pages..
1bb0: 20 20 2a 2a 20 57 69 74 68 68 6f 6c 64 20 54 45    ** Withhold TE
1bc0: 53 54 50 43 41 43 48 45 5f 52 45 53 45 52 56 45  STPCACHE_RESERVE
1bd0: 20 66 72 65 65 20 70 61 67 65 73 20 75 6e 74 69   free pages unti
1be0: 6c 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  l createFlag is 
1bf0: 32 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  2..  */.  if( p-
1c00: 3e 6e 46 72 65 65 3e 54 45 53 54 50 43 41 43 48  >nFree>TESTPCACH
1c10: 45 5f 52 45 53 45 52 56 45 20 7c 7c 20 28 63 72  E_RESERVE || (cr
1c20: 65 61 74 65 46 6c 61 67 3d 3d 32 20 26 26 20 70  eateFlag==2 && p
1c30: 2d 3e 6e 46 72 65 65 3e 30 29 20 29 7b 0a 20 20  ->nFree>0) ){.  
1c40: 20 20 6a 20 3d 20 74 65 73 74 70 63 61 63 68 65    j = testpcache
1c50: 52 61 6e 64 6f 6d 28 70 29 20 25 20 54 45 53 54  Random(p) % TEST
1c60: 50 43 41 43 48 45 5f 4e 50 41 47 45 3b 0a 20 20  PCACHE_NPAGE;.  
1c70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53    for(i=0; i<TES
1c80: 54 50 43 41 43 48 45 5f 4e 50 41 47 45 3b 20 69  TPCACHE_NPAGE; i
1c90: 2b 2b 2c 20 6a 20 3d 20 28 6a 2b 31 29 25 54 45  ++, j = (j+1)%TE
1ca0: 53 54 50 43 41 43 48 45 5f 4e 50 41 47 45 29 7b  STPCACHE_NPAGE){
1cb0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 5b  .      if( p->a[
1cc0: 6a 5d 2e 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  j].key==0 ){.   
1cd0: 20 20 20 20 20 70 2d 3e 61 5b 6a 5d 2e 6b 65 79       p->a[j].key
1ce0: 20 3d 20 6b 65 79 3b 0a 20 20 20 20 20 20 20 20   = key;.        
1cf0: 70 2d 3e 61 5b 6a 5d 2e 69 73 50 69 6e 6e 65 64  p->a[j].isPinned
1d00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6d 65   = 1;.        me
1d10: 6d 73 65 74 28 70 2d 3e 61 5b 6a 5d 2e 70 61 67  mset(p->a[j].pag
1d20: 65 2e 70 42 75 66 2c 20 30 2c 20 70 2d 3e 73 7a  e.pBuf, 0, p->sz
1d30: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6d  Page);.        m
1d40: 65 6d 73 65 74 28 70 2d 3e 61 5b 6a 5d 2e 70 61  emset(p->a[j].pa
1d50: 67 65 2e 70 45 78 74 72 61 2c 20 30 2c 20 70 2d  ge.pExtra, 0, p-
1d60: 3e 73 7a 45 78 74 72 61 29 3b 0a 20 20 20 20 20  >szExtra);.     
1d70: 20 20 20 70 2d 3e 6e 50 69 6e 6e 65 64 2b 2b 3b     p->nPinned++;
1d80: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 46 72 65  .        p->nFre
1d90: 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  e--;.        ass
1da0: 65 72 74 28 20 70 2d 3e 6e 50 69 6e 6e 65 64 20  ert( p->nPinned 
1db0: 3c 3d 20 54 45 53 54 50 43 41 43 48 45 5f 4e 50  <= TESTPCACHE_NP
1dc0: 41 47 45 20 2d 20 70 2d 3e 6e 46 72 65 65 20 29  AGE - p->nFree )
1dd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1de0: 20 26 70 2d 3e 61 5b 6a 5d 2e 70 61 67 65 3b 0a   &p->a[j].page;.
1df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e00: 20 20 20 2f 2a 20 54 68 65 20 70 72 69 6f 72 20     /* The prior 
1e10: 6c 6f 6f 70 20 61 6c 77 61 79 73 20 66 69 6e 64  loop always find
1e20: 73 20 61 20 66 72 65 65 70 61 67 65 20 74 6f 20  s a freepage to 
1e30: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20  allocate */.    
1e40: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
1e50: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63  ..  /* If this c
1e60: 61 63 68 65 20 69 73 20 6e 6f 74 20 70 75 72 67  ache is not purg
1e70: 65 61 62 6c 65 20 74 68 65 6e 20 77 65 20 68 61  eable then we ha
1e80: 76 65 20 74 6f 20 66 61 69 6c 2e 0a 20 20 2a 2f  ve to fail..  */
1e90: 0a 20 20 69 66 28 20 70 2d 3e 62 50 75 72 67 65  .  if( p->bPurge
1ea0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  able==0 ){.    r
1eb0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1ec0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1ed0: 6e 6f 20 66 72 65 65 20 70 61 67 65 73 2c 20 72  no free pages, r
1ee0: 65 63 79 63 6c 65 20 61 20 70 61 67 65 2e 20 20  ecycle a page.  
1ef0: 54 68 65 20 70 61 67 65 20 74 6f 0a 20 20 2a 2a  The page to.  **
1f00: 20 72 65 63 79 63 6c 65 20 69 73 20 73 65 6c 65   recycle is sele
1f10: 63 74 65 64 20 61 74 20 72 61 6e 64 6f 6d 20 66  cted at random f
1f20: 72 6f 6d 20 61 6c 6c 20 75 6e 70 69 6e 6e 65 64  rom all unpinned
1f30: 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 6a   pages..  */.  j
1f40: 20 3d 20 74 65 73 74 70 63 61 63 68 65 52 61 6e   = testpcacheRan
1f50: 64 6f 6d 28 70 29 20 25 20 54 45 53 54 50 43 41  dom(p) % TESTPCA
1f60: 43 48 45 5f 4e 50 41 47 45 3b 0a 20 20 66 6f 72  CHE_NPAGE;.  for
1f70: 28 69 3d 30 3b 20 69 3c 54 45 53 54 50 43 41 43  (i=0; i<TESTPCAC
1f80: 48 45 5f 4e 50 41 47 45 3b 20 69 2b 2b 2c 20 6a  HE_NPAGE; i++, j
1f90: 20 3d 20 28 6a 2b 31 29 25 54 45 53 54 50 43 41   = (j+1)%TESTPCA
1fa0: 43 48 45 5f 4e 50 41 47 45 29 7b 0a 20 20 20 20  CHE_NPAGE){.    
1fb0: 69 66 28 20 70 2d 3e 61 5b 6a 5d 2e 6b 65 79 3e  if( p->a[j].key>
1fc0: 30 20 26 26 20 70 2d 3e 61 5b 6a 5d 2e 69 73 50  0 && p->a[j].isP
1fd0: 69 6e 6e 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  inned==0 ){.    
1fe0: 20 20 70 2d 3e 61 5b 6a 5d 2e 6b 65 79 20 3d 20    p->a[j].key = 
1ff0: 6b 65 79 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  key;.      p->a[
2000: 6a 5d 2e 69 73 50 69 6e 6e 65 64 20 3d 20 31 3b  j].isPinned = 1;
2010: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  .      memset(p-
2020: 3e 61 5b 6a 5d 2e 70 61 67 65 2e 70 42 75 66 2c  >a[j].page.pBuf,
2030: 20 30 2c 20 70 2d 3e 73 7a 50 61 67 65 29 3b 0a   0, p->szPage);.
2040: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e        memset(p->
2050: 61 5b 6a 5d 2e 70 61 67 65 2e 70 45 78 74 72 61  a[j].page.pExtra
2060: 2c 20 30 2c 20 70 2d 3e 73 7a 45 78 74 72 61 29  , 0, p->szExtra)
2070: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 69 6e 6e  ;.      p->nPinn
2080: 65 64 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ed++;.      asse
2090: 72 74 28 20 70 2d 3e 6e 50 69 6e 6e 65 64 20 3c  rt( p->nPinned <
20a0: 3d 20 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41  = TESTPCACHE_NPA
20b0: 47 45 20 2d 20 70 2d 3e 6e 46 72 65 65 20 29 3b  GE - p->nFree );
20c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
20d0: 2d 3e 61 5b 6a 5d 2e 70 61 67 65 3b 0a 20 20 20  ->a[j].page;.   
20e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
20f0: 20 70 72 65 76 69 6f 75 73 20 6c 6f 6f 70 20 61   previous loop a
2100: 6c 77 61 79 73 20 66 69 6e 64 73 20 61 20 70 61  lways finds a pa
2110: 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 2a  ge to recycle. *
2120: 2f 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20  /.  assert(0);. 
2130: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2140: 0a 2a 2a 20 55 6e 70 69 6e 20 61 20 70 61 67 65  .** Unpin a page
2150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2160: 20 74 65 73 74 70 63 61 63 68 65 55 6e 70 69 6e   testpcacheUnpin
2170: 28 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  (.  sqlite3_pcac
2180: 68 65 20 2a 70 43 61 63 68 65 2c 0a 20 20 73 71  he *pCache,.  sq
2190: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
21a0: 65 20 2a 70 4f 6c 64 50 61 67 65 2c 0a 20 20 69  e *pOldPage,.  i
21b0: 6e 74 20 64 69 73 63 61 72 64 0a 29 7b 0a 20 20  nt discard.){.  
21c0: 74 65 73 74 70 63 61 63 68 65 20 2a 70 20 3d 20  testpcache *p = 
21d0: 28 74 65 73 74 70 63 61 63 68 65 2a 29 70 43 61  (testpcache*)pCa
21e0: 63 68 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  che;.  int i;.  
21f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 4d 61 67 69  assert( p->iMagi
2200: 63 3d 3d 54 45 53 54 50 43 41 43 48 45 5f 56 41  c==TESTPCACHE_VA
2210: 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2220: 20 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61   testpcacheGloba
2230: 6c 2e 70 44 75 6d 6d 79 21 3d 30 20 29 3b 0a 20  l.pDummy!=0 );. 
2240: 20 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61   assert( testpca
2250: 63 68 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61  cheGlobal.nInsta
2260: 6e 63 65 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 52  nce>0 );..  /* R
2270: 61 6e 64 6f 6d 6c 79 20 64 69 73 63 61 72 64 20  andomly discard 
2280: 70 61 67 65 73 20 61 73 20 74 68 65 79 20 61 72  pages as they ar
2290: 65 20 75 6e 70 69 6e 6e 65 64 20 61 63 63 6f 72  e unpinned accor
22a0: 64 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ding to the.  **
22b0: 20 64 69 73 63 61 72 64 43 68 61 6e 63 65 20 73   discardChance s
22c0: 65 74 74 69 6e 67 2e 20 20 49 66 20 64 69 73 63  etting.  If disc
22d0: 61 72 64 43 68 61 6e 63 65 20 69 73 20 30 2c 20  ardChance is 0, 
22e0: 74 68 65 20 72 61 6e 64 6f 6d 20 64 69 73 63 61  the random disca
22f0: 72 64 0a 20 20 2a 2a 20 6e 65 76 65 72 20 68 61  rd.  ** never ha
2300: 70 70 65 6e 73 2e 20 20 49 66 20 64 69 73 63 61  ppens.  If disca
2310: 72 64 43 68 61 6e 63 65 20 69 73 20 31 30 30 2c  rdChance is 100,
2320: 20 69 74 20 61 6c 77 61 79 73 20 68 61 70 70 65   it always happe
2330: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
2340: 2d 3e 62 50 75 72 67 65 61 62 6c 65 0a 20 20 26  ->bPurgeable.  &
2350: 26 20 28 31 30 30 2d 74 65 73 74 70 63 61 63 68  & (100-testpcach
2360: 65 47 6c 6f 62 61 6c 2e 64 69 73 63 61 72 64 43  eGlobal.discardC
2370: 68 61 6e 63 65 29 20 3c 3d 20 28 74 65 73 74 70  hance) <= (testp
2380: 63 61 63 68 65 52 61 6e 64 6f 6d 28 70 29 25 31  cacheRandom(p)%1
2390: 30 30 29 0a 20 20 29 7b 0a 20 20 20 20 64 69 73  00).  ){.    dis
23a0: 63 61 72 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  card = 1;.  }.. 
23b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53 54   for(i=0; i<TEST
23c0: 50 43 41 43 48 45 5f 4e 50 41 47 45 3b 20 69 2b  PCACHE_NPAGE; i+
23d0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 26 70 2d 3e  +){.    if( &p->
23e0: 61 5b 69 5d 2e 70 61 67 65 3d 3d 70 4f 6c 64 50  a[i].page==pOldP
23f0: 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  age ){.      /* 
2400: 54 68 65 20 70 4f 6c 64 50 61 67 65 20 70 6f 69  The pOldPage poi
2410: 6e 74 65 72 20 61 6c 77 61 79 73 20 70 6f 69 6e  nter always poin
2420: 74 73 20 74 6f 20 61 20 70 69 6e 6e 65 64 20 70  ts to a pinned p
2430: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  age */.      ass
2440: 65 72 74 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50  ert( p->a[i].isP
2450: 69 6e 6e 65 64 20 29 3b 0a 20 20 20 20 20 20 70  inned );.      p
2460: 2d 3e 61 5b 69 5d 2e 69 73 50 69 6e 6e 65 64 20  ->a[i].isPinned 
2470: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 50  = 0;.      p->nP
2480: 69 6e 6e 65 64 2d 2d 3b 0a 20 20 20 20 20 20 61  inned--;.      a
2490: 73 73 65 72 74 28 20 70 2d 3e 6e 50 69 6e 6e 65  ssert( p->nPinne
24a0: 64 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  d>=0 );.      if
24b0: 28 20 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20  ( discard ){.   
24c0: 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6b 65 79       p->a[i].key
24d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
24e0: 3e 6e 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20  >nFree++;.      
24f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72    assert( p->nFr
2500: 65 65 3c 3d 54 45 53 54 50 43 41 43 48 45 5f 4e  ee<=TESTPCACHE_N
2510: 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a  PAGE );.      }.
2520: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2530: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
2540: 65 20 70 4f 6c 64 50 61 67 65 20 70 6f 69 6e 74  e pOldPage point
2550: 65 72 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 73  er always points
2560: 20 74 6f 20 61 20 76 61 6c 69 64 20 70 61 67 65   to a valid page
2570: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20   */.  assert( 0 
2580: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6b  );.}.../*.** Rek
2590: 65 79 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ey a single page
25a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25b0: 20 74 65 73 74 70 63 61 63 68 65 52 65 6b 65 79   testpcacheRekey
25c0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  (.  sqlite3_pcac
25d0: 68 65 20 2a 70 43 61 63 68 65 2c 0a 20 20 73 71  he *pCache,.  sq
25e0: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
25f0: 65 20 2a 70 4f 6c 64 50 61 67 65 2c 0a 20 20 75  e *pOldPage,.  u
2600: 6e 73 69 67 6e 65 64 20 6f 6c 64 4b 65 79 2c 0a  nsigned oldKey,.
2610: 20 20 75 6e 73 69 67 6e 65 64 20 6e 65 77 4b 65    unsigned newKe
2620: 79 0a 29 7b 0a 20 20 74 65 73 74 70 63 61 63 68  y.){.  testpcach
2630: 65 20 2a 70 20 3d 20 28 74 65 73 74 70 63 61 63  e *p = (testpcac
2640: 68 65 2a 29 70 43 61 63 68 65 3b 0a 20 20 69 6e  he*)pCache;.  in
2650: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
2660: 2d 3e 69 4d 61 67 69 63 3d 3d 54 45 53 54 50 43  ->iMagic==TESTPC
2670: 41 43 48 45 5f 56 41 4c 49 44 20 29 3b 0a 20 20  ACHE_VALID );.  
2680: 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61 63  assert( testpcac
2690: 68 65 47 6c 6f 62 61 6c 2e 70 44 75 6d 6d 79 21  heGlobal.pDummy!
26a0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26b0: 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c  testpcacheGlobal
26c0: 2e 6e 49 6e 73 74 61 6e 63 65 3e 30 20 29 3b 0a  .nInstance>0 );.
26d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
26e0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e  lready exists an
26f0: 6f 74 68 65 72 20 70 61 67 65 20 61 74 20 6e 65  other page at ne
2700: 77 4b 65 79 2c 20 76 65 72 69 66 79 20 74 68 61  wKey, verify tha
2710: 74 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  t.  ** the other
2720: 20 70 61 67 65 20 69 73 20 75 6e 70 69 6e 6e 65   page is unpinne
2730: 64 20 61 6e 64 20 64 69 73 63 61 72 64 20 69 74  d and discard it
2740: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2750: 3b 20 69 3c 54 45 53 54 50 43 41 43 48 45 5f 4e  ; i<TESTPCACHE_N
2760: 50 41 47 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  PAGE; i++){.    
2770: 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 6b 65 79 3d  if( p->a[i].key=
2780: 3d 6e 65 77 4b 65 79 20 29 7b 0a 20 20 20 20 20  =newKey ){.     
2790: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6b 65 79 20   /* The new key 
27a0: 69 73 20 6e 65 76 65 72 20 61 20 70 61 67 65 20  is never a page 
27b0: 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
27c0: 70 69 6e 6e 65 64 20 2a 2f 0a 20 20 20 20 20 20  pinned */.      
27d0: 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 69 5d 2e  assert( p->a[i].
27e0: 69 73 50 69 6e 6e 65 64 3d 3d 30 20 29 3b 0a 20  isPinned==0 );. 
27f0: 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6b 65 79       p->a[i].key
2800: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6e   = 0;.      p->n
2810: 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73  Free++;.      as
2820: 73 65 72 74 28 20 70 2d 3e 6e 46 72 65 65 3c 3d  sert( p->nFree<=
2830: 54 45 53 54 50 43 41 43 48 45 5f 4e 50 41 47 45  TESTPCACHE_NPAGE
2840: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
2850: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2860: 20 46 69 6e 64 20 74 68 65 20 70 61 67 65 20 74   Find the page t
2870: 6f 20 62 65 20 72 65 6b 65 79 65 64 20 61 6e 64  o be rekeyed and
2880: 20 72 65 6b 65 79 20 69 74 2e 0a 20 20 2a 2f 0a   rekey it..  */.
2890: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53    for(i=0; i<TES
28a0: 54 50 43 41 43 48 45 5f 4e 50 41 47 45 3b 20 69  TPCACHE_NPAGE; i
28b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
28c0: 61 5b 69 5d 2e 6b 65 79 3d 3d 6f 6c 64 4b 65 79  a[i].key==oldKey
28d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
28e0: 20 6f 6c 64 4b 65 79 20 61 6e 64 20 70 4f 6c 64   oldKey and pOld
28f0: 50 61 67 65 20 70 61 72 61 6d 65 74 65 72 73 20  Page parameters 
2900: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 61  match */.      a
2910: 73 73 65 72 74 28 20 26 70 2d 3e 61 5b 69 5d 2e  ssert( &p->a[i].
2920: 70 61 67 65 3d 3d 70 4f 6c 64 50 61 67 65 20 29  page==pOldPage )
2930: 3b 0a 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;.      /* Page 
2940: 74 6f 20 62 65 20 72 65 6b 65 79 65 64 20 6d 75  to be rekeyed mu
2950: 73 74 20 62 65 20 70 69 6e 6e 65 64 20 2a 2f 0a  st be pinned */.
2960: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2970: 3e 61 5b 69 5d 2e 69 73 50 69 6e 6e 65 64 20 29  >a[i].isPinned )
2980: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  ;.      p->a[i].
2990: 6b 65 79 20 3d 20 6e 65 77 4b 65 79 3b 0a 20 20  key = newKey;.  
29a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
29b0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6b 65  }.  }..  /* Reke
29c0: 79 20 69 73 20 61 6c 77 61 79 73 20 67 69 76 65  y is always give
29d0: 6e 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 74  n a valid page t
29e0: 6f 20 77 6f 72 6b 20 77 69 74 68 20 2a 2f 0a 20  o work with */. 
29f0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a   assert( 0 );.}.
2a00: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
2a10: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
2a20: 20 20 45 76 65 72 79 20 70 61 67 65 20 77 69 74    Every page wit
2a30: 68 20 61 20 6b 65 79 20 6f 66 20 69 4c 69 6d 69  h a key of iLimi
2a40: 74 20 6f 72 20 6c 61 72 67 65 72 0a 2a 2a 20 69  t or larger.** i
2a50: 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2f 0a  s discarded..*/.
2a60: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
2a70: 70 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 73  pcacheTruncate(s
2a80: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70  qlite3_pcache *p
2a90: 43 61 63 68 65 2c 20 75 6e 73 69 67 6e 65 64 20  Cache, unsigned 
2aa0: 69 4c 69 6d 69 74 29 7b 0a 20 20 74 65 73 74 70  iLimit){.  testp
2ab0: 63 61 63 68 65 20 2a 70 20 3d 20 28 74 65 73 74  cache *p = (test
2ac0: 70 63 61 63 68 65 2a 29 70 43 61 63 68 65 3b 0a  pcache*)pCache;.
2ad0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
2ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
2af0: 4d 61 67 69 63 3d 3d 54 45 53 54 50 43 41 43 48  Magic==TESTPCACH
2b00: 45 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  E_VALID );.  ass
2b10: 65 72 74 28 20 74 65 73 74 70 63 61 63 68 65 47  ert( testpcacheG
2b20: 6c 6f 62 61 6c 2e 70 44 75 6d 6d 79 21 3d 30 20  lobal.pDummy!=0 
2b30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 73  );.  assert( tes
2b40: 74 70 63 61 63 68 65 47 6c 6f 62 61 6c 2e 6e 49  tpcacheGlobal.nI
2b50: 6e 73 74 61 6e 63 65 3e 30 20 29 3b 0a 20 20 66  nstance>0 );.  f
2b60: 6f 72 28 69 3d 30 3b 20 69 3c 54 45 53 54 50 43  or(i=0; i<TESTPC
2b70: 41 43 48 45 5f 4e 50 41 47 45 3b 20 69 2b 2b 29  ACHE_NPAGE; i++)
2b80: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69  {.    if( p->a[i
2b90: 5d 2e 6b 65 79 3e 3d 69 4c 69 6d 69 74 20 29 7b  ].key>=iLimit ){
2ba0: 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6b  .      p->a[i].k
2bb0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ey = 0;.      if
2bc0: 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50 69 6e 6e  ( p->a[i].isPinn
2bd0: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ed ){.        p-
2be0: 3e 6e 50 69 6e 6e 65 64 2d 2d 3b 0a 20 20 20 20  >nPinned--;.    
2bf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2c00: 50 69 6e 6e 65 64 3e 3d 30 20 29 3b 0a 20 20 20  Pinned>=0 );.   
2c10: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 46     }.      p->nF
2c20: 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  ree++;.      ass
2c30: 65 72 74 28 20 70 2d 3e 6e 46 72 65 65 3c 3d 54  ert( p->nFree<=T
2c40: 45 53 54 50 43 41 43 48 45 5f 4e 50 41 47 45 20  ESTPCACHE_NPAGE 
2c50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
2c60: 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 61 20  /*.** Destroy a 
2c70: 70 61 67 65 20 63 61 63 68 65 2e 0a 2a 2f 0a 73  page cache..*/.s
2c80: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 70  tatic void testp
2c90: 63 61 63 68 65 44 65 73 74 72 6f 79 28 73 71 6c  cacheDestroy(sql
2ca0: 69 74 65 33 5f 70 63 61 63 68 65 20 2a 70 43 61  ite3_pcache *pCa
2cb0: 63 68 65 29 7b 0a 20 20 74 65 73 74 70 63 61 63  che){.  testpcac
2cc0: 68 65 20 2a 70 20 3d 20 28 74 65 73 74 70 63 61  he *p = (testpca
2cd0: 63 68 65 2a 29 70 43 61 63 68 65 3b 0a 20 20 61  che*)pCache;.  a
2ce0: 73 73 65 72 74 28 20 70 2d 3e 69 4d 61 67 69 63  ssert( p->iMagic
2cf0: 3d 3d 54 45 53 54 50 43 41 43 48 45 5f 56 41 4c  ==TESTPCACHE_VAL
2d00: 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2d10: 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c  testpcacheGlobal
2d20: 2e 70 44 75 6d 6d 79 21 3d 30 20 29 3b 0a 20 20  .pDummy!=0 );.  
2d30: 61 73 73 65 72 74 28 20 74 65 73 74 70 63 61 63  assert( testpcac
2d40: 68 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 74 61 6e  heGlobal.nInstan
2d50: 63 65 3e 30 20 29 3b 0a 20 20 70 2d 3e 69 4d 61  ce>0 );.  p->iMa
2d60: 67 69 63 20 3d 20 54 45 53 54 50 43 41 43 48 45  gic = TESTPCACHE
2d70: 5f 43 4c 45 41 52 3b 0a 20 20 73 71 6c 69 74 65  _CLEAR;.  sqlite
2d80: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 74 65 73  3_free(p);.  tes
2d90: 74 70 63 61 63 68 65 47 6c 6f 62 61 6c 2e 6e 49  tpcacheGlobal.nI
2da0: 6e 73 74 61 6e 63 65 2d 2d 3b 0a 7d 0a 0a 0a 2f  nstance--;.}.../
2db0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 69 73  *.** Invoke this
2dc0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 67 69   routine to regi
2dd0: 73 74 65 72 20 6f 72 20 75 6e 72 65 67 69 73 74  ster or unregist
2de0: 65 72 20 74 68 65 20 74 65 73 74 69 6e 67 20 70  er the testing p
2df0: 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 69 6d  ager cache.** im
2e00: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 69  plemented by thi
2e10: 73 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  s file..**.** In
2e20: 73 74 61 6c 6c 20 74 68 65 20 74 65 73 74 20 70  stall the test p
2e30: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 6e  ager cache if in
2e40: 73 74 61 6c 6c 46 6c 61 67 20 69 73 20 31 20 61  stallFlag is 1 a
2e50: 6e 64 20 75 6e 69 6e 73 74 61 6c 6c 20 69 74 20  nd uninstall it 
2e60: 69 66 0a 2a 2a 20 69 6e 73 74 61 6c 6c 46 6c 61  if.** installFla
2e70: 67 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68  g is 0..**.** Wh
2e80: 65 6e 20 69 6e 73 74 61 6c 6c 69 6e 67 2c 20 64  en installing, d
2e90: 69 73 63 61 72 64 43 68 61 6e 63 65 20 69 73 20  iscardChance is 
2ea0: 61 20 6e 75 6d 62 65 72 20 62 65 74 77 65 65 6e  a number between
2eb0: 20 30 20 61 6e 64 20 31 30 30 20 74 68 61 74 0a   0 and 100 that.
2ec0: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ** indicates the
2ed0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
2ee0: 64 69 73 63 61 72 64 69 6e 67 20 61 20 70 61 67  discarding a pag
2ef0: 65 20 77 68 65 6e 20 75 6e 70 69 6e 6e 69 6e 67  e when unpinning
2f00: 20 74 68 65 0a 2a 2a 20 70 61 67 65 2e 20 20 30   the.** page.  0
2f10: 20 6d 65 61 6e 73 20 6e 65 76 65 72 20 64 69 73   means never dis
2f20: 63 61 72 64 20 28 75 6e 6c 65 73 73 20 74 68 65  card (unless the
2f30: 20 64 69 73 63 61 72 64 20 66 6c 61 67 20 69 73   discard flag is
2f40: 20 73 65 74 29 2e 0a 2a 2a 20 31 30 30 20 6d 65   set)..** 100 me
2f50: 61 6e 73 20 61 6c 77 61 79 73 20 64 69 73 63 61  ans always disca
2f60: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 69 6e 73 74  rd..*/.void inst
2f70: 61 6c 6c 54 65 73 74 50 43 61 63 68 65 28 0a 20  allTestPCache(. 
2f80: 20 69 6e 74 20 69 6e 73 74 61 6c 6c 46 6c 61 67   int installFlag
2f90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2fa0: 54 72 75 65 20 74 6f 20 69 6e 73 74 61 6c 6c 2e  True to install.
2fb0: 20 20 46 61 6c 73 65 20 74 6f 20 75 6e 69 6e 73    False to unins
2fc0: 74 61 6c 6c 2e 20 2a 2f 0a 20 20 75 6e 73 69 67  tall. */.  unsig
2fd0: 6e 65 64 20 64 69 73 63 61 72 64 43 68 61 6e 63  ned discardChanc
2fe0: 65 2c 20 20 20 20 20 2f 2a 20 30 2d 31 30 30 2e  e,     /* 0-100.
2ff0: 20 20 43 68 61 6e 63 65 20 74 6f 20 64 69 73 63    Chance to disc
3000: 61 72 64 20 6f 6e 20 75 6e 70 69 6e 20 2a 2f 0a  ard on unpin */.
3010: 20 20 75 6e 73 69 67 6e 65 64 20 70 72 6e 67 53    unsigned prngS
3020: 65 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  eed,          /*
3030: 20 53 65 65 64 20 66 6f 72 20 74 68 65 20 50 52   Seed for the PR
3040: 4e 47 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  NG */.  unsigned
3050: 20 68 69 67 68 53 74 72 65 73 73 20 20 20 20 20   highStress     
3060: 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78 53 74 72      /* Call xStr
3070: 65 73 73 20 61 67 72 65 73 73 69 76 65 6c 79 20  ess agressively 
3080: 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
3090: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 70 63 61  onst sqlite3_pca
30a0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 20 74 65 73  che_methods2 tes
30b0: 74 50 63 61 63 68 65 20 3d 20 7b 0a 20 20 20 20  tPcache = {.    
30c0: 28 76 6f 69 64 2a 29 26 74 65 73 74 70 63 61 63  (void*)&testpcac
30d0: 68 65 47 6c 6f 62 61 6c 2c 0a 20 20 20 20 74 65  heGlobal,.    te
30e0: 73 74 70 63 61 63 68 65 49 6e 69 74 2c 0a 20 20  stpcacheInit,.  
30f0: 20 20 74 65 73 74 70 63 61 63 68 65 53 68 75 74    testpcacheShut
3100: 64 6f 77 6e 2c 0a 20 20 20 20 74 65 73 74 70 63  down,.    testpc
3110: 61 63 68 65 43 72 65 61 74 65 2c 0a 20 20 20 20  acheCreate,.    
3120: 74 65 73 74 70 63 61 63 68 65 43 61 63 68 65 73  testpcacheCaches
3130: 69 7a 65 2c 0a 20 20 20 20 74 65 73 74 70 63 61  ize,.    testpca
3140: 63 68 65 50 61 67 65 63 6f 75 6e 74 2c 0a 20 20  chePagecount,.  
3150: 20 20 74 65 73 74 70 63 61 63 68 65 46 65 74 63    testpcacheFetc
3160: 68 2c 0a 20 20 20 20 74 65 73 74 70 63 61 63 68  h,.    testpcach
3170: 65 55 6e 70 69 6e 2c 0a 20 20 20 20 74 65 73 74  eUnpin,.    test
3180: 70 63 61 63 68 65 52 65 6b 65 79 2c 0a 20 20 20  pcacheRekey,.   
3190: 20 74 65 73 74 70 63 61 63 68 65 54 72 75 6e 63   testpcacheTrunc
31a0: 61 74 65 2c 0a 20 20 20 20 74 65 73 74 70 63 61  ate,.    testpca
31b0: 63 68 65 44 65 73 74 72 6f 79 2c 0a 20 20 7d 3b  cheDestroy,.  };
31c0: 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
31d0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
31e0: 32 20 64 65 66 61 75 6c 74 50 63 61 63 68 65 3b  2 defaultPcache;
31f0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73  .  static int is
3200: 49 6e 73 74 61 6c 6c 65 64 20 3d 20 30 3b 0a 0a  Installed = 0;..
3210: 20 20 61 73 73 65 72 74 28 20 74 65 73 74 70 63    assert( testpc
3220: 61 63 68 65 47 6c 6f 62 61 6c 2e 6e 49 6e 73 74  acheGlobal.nInst
3230: 61 6e 63 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ance==0 );.  ass
3240: 65 72 74 28 20 74 65 73 74 70 63 61 63 68 65 47  ert( testpcacheG
3250: 6c 6f 62 61 6c 2e 70 44 75 6d 6d 79 3d 3d 30 20  lobal.pDummy==0 
3260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 69 73  );.  assert( dis
3270: 63 61 72 64 43 68 61 6e 63 65 3c 3d 31 30 30 20  cardChance<=100 
3280: 29 3b 0a 20 20 74 65 73 74 70 63 61 63 68 65 47  );.  testpcacheG
3290: 6c 6f 62 61 6c 2e 64 69 73 63 61 72 64 43 68 61  lobal.discardCha
32a0: 6e 63 65 20 3d 20 64 69 73 63 61 72 64 43 68 61  nce = discardCha
32b0: 6e 63 65 3b 0a 20 20 74 65 73 74 70 63 61 63 68  nce;.  testpcach
32c0: 65 47 6c 6f 62 61 6c 2e 70 72 6e 67 53 65 65 64  eGlobal.prngSeed
32d0: 20 3d 20 70 72 6e 67 53 65 65 64 20 5e 20 28 70   = prngSeed ^ (p
32e0: 72 6e 67 53 65 65 64 3c 3c 31 36 29 3b 0a 20 20  rngSeed<<16);.  
32f0: 74 65 73 74 70 63 61 63 68 65 47 6c 6f 62 61 6c  testpcacheGlobal
3300: 2e 68 69 67 68 53 74 72 65 73 73 20 3d 20 68 69  .highStress = hi
3310: 67 68 53 74 72 65 73 73 3b 0a 20 20 69 66 28 20  ghStress;.  if( 
3320: 69 6e 73 74 61 6c 6c 46 6c 61 67 21 3d 69 73 49  installFlag!=isI
3330: 6e 73 74 61 6c 6c 65 64 20 29 7b 0a 20 20 20 20  nstalled ){.    
3340: 69 66 28 20 69 6e 73 74 61 6c 6c 46 6c 61 67 20  if( installFlag 
3350: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3360: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
3370: 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32  ONFIG_GETPCACHE2
3380: 2c 20 26 64 65 66 61 75 6c 74 50 63 61 63 68 65  , &defaultPcache
3390: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
33a0: 20 64 65 66 61 75 6c 74 50 63 61 63 68 65 2e 78   defaultPcache.x
33b0: 43 72 65 61 74 65 21 3d 74 65 73 74 70 63 61 63  Create!=testpcac
33c0: 68 65 43 72 65 61 74 65 20 29 3b 0a 20 20 20 20  heCreate );.    
33d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
33e0: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50  (SQLITE_CONFIG_P
33f0: 43 41 43 48 45 32 2c 20 26 74 65 73 74 50 63 61  CACHE2, &testPca
3400: 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  che);.    }else{
3410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
3420: 65 66 61 75 6c 74 50 63 61 63 68 65 2e 78 43 72  efaultPcache.xCr
3430: 65 61 74 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  eate!=0 );.     
3440: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
3450: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
3460: 41 43 48 45 32 2c 20 26 64 65 66 61 75 6c 74 50  ACHE2, &defaultP
3470: 63 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20 20  cache);.    }.  
3480: 20 20 69 73 49 6e 73 74 61 6c 6c 65 64 20 3d 20    isInstalled = 
3490: 69 6e 73 74 61 6c 6c 46 6c 61 67 3b 0a 20 20 7d  installFlag;.  }
34a0: 0a 7d 0a                                         .}.