/ Hex Artifact Content
Login

Artifact 188b09aec776516aeedcfd13b9c6faf85ba16b3671a0897a2c740ee00a5dc4f8:


0000: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ./*.** This file
0010: 20 63 6f 6e 74 61 69 6e 73 20 74 65 73 74 73 20   contains tests 
0020: 72 65 6c 61 74 65 64 20 74 6f 20 72 65 63 6f 76  related to recov
0030: 65 72 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 70  ery following ap
0040: 70 6c 69 63 61 74 69 6f 6e 20 0a 2a 2a 20 61 6e  plication .** an
0050: 64 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  d system crashes
0060: 20 28 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73   (power failures
0070: 29 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  ) while writing 
0080: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
0090: 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 6c  .*/..#include "l
00a0: 73 6d 74 65 73 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  smtest.h"../*.**
00b0: 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
00c0: 62 79 20 74 65 73 74 43 6b 73 75 6d 44 61 74 61  by testCksumData
00d0: 62 61 73 65 28 29 20 74 6f 20 61 63 63 75 6d 75  base() to accumu
00e0: 6c 61 74 65 20 63 68 65 63 6b 73 75 6d 20 76 61  late checksum va
00f0: 6c 75 65 73 20 69 6e 2e 0a 2a 2f 0a 74 79 70 65  lues in..*/.type
0100: 64 65 66 20 73 74 72 75 63 74 20 43 6b 73 75 6d  def struct Cksum
0110: 20 43 6b 73 75 6d 3b 0a 73 74 72 75 63 74 20 43   Cksum;.struct C
0120: 6b 73 75 6d 20 7b 0a 20 20 69 6e 74 20 6e 52 6f  ksum {.  int nRo
0130: 77 3b 0a 20 20 69 6e 74 20 63 6b 73 75 6d 31 3b  w;.  int cksum1;
0140: 0a 20 20 69 6e 74 20 63 6b 73 75 6d 32 3b 0a 7d  .  int cksum2;.}
0150: 3b 0a 0a 2f 2a 0a 2a 2a 20 74 64 62 5f 73 63 61  ;../*.** tdb_sca
0160: 6e 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  n() callback use
0170: 64 20 62 79 20 74 65 73 74 43 6b 73 75 6d 44 61  d by testCksumDa
0180: 74 61 62 61 73 65 28 29 0a 2a 2f 0a 73 74 61 74  tabase().*/.stat
0190: 69 63 20 76 6f 69 64 20 73 63 61 6e 43 6b 73 75  ic void scanCksu
01a0: 6d 44 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  mDb(.  void *pCt
01b0: 78 2c 20 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79  x, .  void *pKey
01c0: 2c 20 69 6e 74 20 6e 4b 65 79 2c 0a 20 20 76 6f  , int nKey,.  vo
01d0: 69 64 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6e 56  id *pVal, int nV
01e0: 61 6c 0a 29 7b 0a 20 20 43 6b 73 75 6d 20 2a 70  al.){.  Cksum *p
01f0: 20 3d 20 28 43 6b 73 75 6d 20 2a 29 70 43 74 78   = (Cksum *)pCtx
0200: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 70 2d  ;.  int i;..  p-
0210: 3e 6e 52 6f 77 2b 2b 3b 0a 20 20 66 6f 72 28 69  >nRow++;.  for(i
0220: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
0230: 7b 0a 20 20 20 20 70 2d 3e 63 6b 73 75 6d 31 20  {.    p->cksum1 
0240: 2b 3d 20 28 28 75 38 20 2a 29 70 4b 65 79 29 5b  += ((u8 *)pKey)[
0250: 69 5d 3b 0a 20 20 20 20 70 2d 3e 63 6b 73 75 6d  i];.    p->cksum
0260: 32 20 2b 3d 20 70 2d 3e 63 6b 73 75 6d 31 3b 0a  2 += p->cksum1;.
0270: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
0280: 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
0290: 20 70 2d 3e 63 6b 73 75 6d 31 20 2b 3d 20 28 28   p->cksum1 += ((
02a0: 75 38 20 2a 29 70 56 61 6c 29 5b 69 5d 3b 0a 20  u8 *)pVal)[i];. 
02b0: 20 20 20 70 2d 3e 63 6b 73 75 6d 32 20 2b 3d 20     p->cksum2 += 
02c0: 70 2d 3e 63 6b 73 75 6d 31 3b 0a 20 20 7d 0a 7d  p->cksum1;.  }.}
02d0: 0a 0a 2f 2a 0a 2a 2a 20 74 64 62 5f 73 63 61 6e  ../*.** tdb_scan
02e0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  () callback used
02f0: 20 62 79 20 74 65 73 74 43 6f 75 6e 74 44 61 74   by testCountDat
0300: 61 62 61 73 65 28 29 0a 2a 2f 0a 73 74 61 74 69  abase().*/.stati
0310: 63 20 76 6f 69 64 20 73 63 61 6e 43 6f 75 6e 74  c void scanCount
0320: 44 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  Db(.  void *pCtx
0330: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c  , .  void *pKey,
0340: 20 69 6e 74 20 6e 4b 65 79 2c 0a 20 20 76 6f 69   int nKey,.  voi
0350: 64 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6e 56 61  d *pVal, int nVa
0360: 6c 0a 29 7b 0a 20 20 43 6b 73 75 6d 20 2a 70 20  l.){.  Cksum *p 
0370: 3d 20 28 43 6b 73 75 6d 20 2a 29 70 43 74 78 3b  = (Cksum *)pCtx;
0380: 0a 20 20 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 0a 20  .  p->nRow++;.. 
0390: 20 75 6e 75 73 65 64 5f 70 61 72 61 6d 65 74 65   unused_paramete
03a0: 72 28 70 4b 65 79 29 3b 0a 20 20 75 6e 75 73 65  r(pKey);.  unuse
03b0: 64 5f 70 61 72 61 6d 65 74 65 72 28 6e 4b 65 79  d_parameter(nKey
03c0: 29 3b 0a 20 20 75 6e 75 73 65 64 5f 70 61 72 61  );.  unused_para
03d0: 6d 65 74 65 72 28 70 56 61 6c 29 3b 0a 20 20 75  meter(pVal);.  u
03e0: 6e 75 73 65 64 5f 70 61 72 61 6d 65 74 65 72 28  nused_parameter(
03f0: 6e 56 61 6c 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  nVal);.}.../*.**
0400: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
0410: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
0420: 65 6e 74 73 20 6f 66 20 64 61 74 61 62 61 73 65  ents of database
0430: 20 70 44 62 2e 20 57 72 69 74 65 20 61 20 63 68   pDb. Write a ch
0440: 65 63 6b 73 75 6d 0a 2a 2a 20 73 74 72 69 6e 67  ecksum.** string
0450: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 64 62   based on the db
0460: 20 63 6f 6e 74 65 6e 74 73 20 69 6e 74 6f 20 62   contents into b
0470: 75 66 66 65 72 20 7a 4f 75 74 20 62 65 66 6f 72  uffer zOut befor
0480: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 41 0a 2a  e returning. A.*
0490: 2a 20 63 68 65 63 6b 73 75 6d 20 73 74 72 69 6e  * checksum strin
04a0: 67 20 69 73 20 61 74 20 6d 6f 73 74 20 32 39 20  g is at most 29 
04b0: 28 54 45 53 54 5f 43 4b 53 55 4d 5f 42 59 54 45  (TEST_CKSUM_BYTE
04c0: 53 29 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  S) bytes in size
04d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 33 32 2d  :.**.**    * 32-
04e0: 62 69 74 20 69 6e 74 65 67 65 72 20 28 31 30 20  bit integer (10 
04f0: 62 79 74 65 73 29 0a 2a 2a 20 20 20 20 2a 20 31  bytes).**    * 1
0500: 20 73 70 61 63 65 20 20 20 20 20 20 20 20 28 31   space        (1
0510: 20 62 79 74 65 29 0a 2a 2a 20 20 20 20 2a 20 33   byte).**    * 3
0520: 32 2d 62 69 74 20 68 65 78 20 20 20 20 20 28 38  2-bit hex     (8
0530: 20 62 79 74 65 73 29 0a 2a 2a 20 20 20 20 2a 20   bytes).**    * 
0540: 31 20 73 70 61 63 65 20 20 20 20 20 20 20 20 28  1 space        (
0550: 31 20 62 79 74 65 29 0a 2a 2a 20 20 20 20 2a 20  1 byte).**    * 
0560: 33 32 2d 62 69 74 20 68 65 78 20 20 20 20 20 28  32-bit hex     (
0570: 38 20 62 79 74 65 73 29 0a 2a 2a 20 20 20 20 2a  8 bytes).**    *
0580: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
0590: 28 31 20 62 79 74 65 29 0a 2a 2a 0a 2a 2a 20 54  (1 byte).**.** T
05a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
05b0: 72 69 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ries in the data
05c0: 62 61 73 65 20 69 73 20 72 65 74 75 72 6e 65 64  base is returned
05d0: 2e 0a 2a 2f 0a 69 6e 74 20 74 65 73 74 43 6b 73  ..*/.int testCks
05e0: 75 6d 44 61 74 61 62 61 73 65 28 0a 20 20 54 65  umDatabase(.  Te
05f0: 73 74 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  stDb *pDb,      
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0610: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
0620: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0640: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
0650: 74 6f 20 77 72 69 74 65 20 63 68 65 63 6b 73 75  to write checksu
0660: 6d 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 43 6b 73  m to */.){.  Cks
0670: 75 6d 20 63 6b 73 75 6d 3b 0a 20 20 6d 65 6d 73  um cksum;.  mems
0680: 65 74 28 26 63 6b 73 75 6d 2c 20 30 2c 20 73 69  et(&cksum, 0, si
0690: 7a 65 6f 66 28 43 6b 73 75 6d 29 29 3b 0a 20 20  zeof(Cksum));.  
06a0: 74 64 62 5f 73 63 61 6e 28 70 44 62 2c 20 28 76  tdb_scan(pDb, (v
06b0: 6f 69 64 20 2a 29 26 63 6b 73 75 6d 2c 20 30 2c  oid *)&cksum, 0,
06c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 73 63 61   0, 0, 0, 0, sca
06d0: 6e 43 6b 73 75 6d 44 62 29 3b 0a 20 20 73 70 72  nCksumDb);.  spr
06e0: 69 6e 74 66 28 7a 4f 75 74 2c 20 22 25 64 20 25  intf(zOut, "%d %
06f0: 78 20 25 78 22 2c 20 0a 20 20 20 20 20 20 63 6b  x %x", .      ck
0700: 73 75 6d 2e 6e 52 6f 77 2c 20 28 75 33 32 29 63  sum.nRow, (u32)c
0710: 6b 73 75 6d 2e 63 6b 73 75 6d 31 2c 20 28 75 33  ksum.cksum1, (u3
0720: 32 29 63 6b 73 75 6d 2e 63 6b 73 75 6d 32 0a 20  2)cksum.cksum2. 
0730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
0740: 72 6c 65 6e 28 7a 4f 75 74 29 3c 54 45 53 54 5f  rlen(zOut)<TEST_
0750: 43 4b 53 55 4d 5f 42 59 54 45 53 20 29 3b 0a 20  CKSUM_BYTES );. 
0760: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 2e 6e 52   return cksum.nR
0770: 6f 77 3b 0a 7d 0a 0a 69 6e 74 20 74 65 73 74 43  ow;.}..int testC
0780: 6f 75 6e 74 44 61 74 61 62 61 73 65 28 54 65 73  ountDatabase(Tes
0790: 74 44 62 20 2a 70 44 62 29 7b 0a 20 20 43 6b 73  tDb *pDb){.  Cks
07a0: 75 6d 20 63 6b 73 75 6d 3b 0a 20 20 6d 65 6d 73  um cksum;.  mems
07b0: 65 74 28 26 63 6b 73 75 6d 2c 20 30 2c 20 73 69  et(&cksum, 0, si
07c0: 7a 65 6f 66 28 43 6b 73 75 6d 29 29 3b 0a 20 20  zeof(Cksum));.  
07d0: 74 64 62 5f 73 63 61 6e 28 70 44 62 2c 20 28 76  tdb_scan(pDb, (v
07e0: 6f 69 64 20 2a 29 26 63 6b 73 75 6d 2c 20 30 2c  oid *)&cksum, 0,
07f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 73 63 61   0, 0, 0, 0, sca
0800: 6e 43 6f 75 6e 74 44 62 29 3b 0a 20 20 72 65 74  nCountDb);.  ret
0810: 75 72 6e 20 63 6b 73 75 6d 2e 6e 52 6f 77 3b 0a  urn cksum.nRow;.
0820: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
0830: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
0840: 70 20 69 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  p if *pRc is not
0850: 20 30 20 77 68 65 6e 20 69 74 20 69 73 20 63 61   0 when it is ca
0860: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  lled..**.** Othe
0870: 72 77 69 73 65 2c 20 74 68 65 20 74 77 6f 20 6e  rwise, the two n
0880: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
0890: 72 69 6e 67 73 20 7a 31 20 61 6e 64 20 7a 31 20  rings z1 and z1 
08a0: 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66  are compared. If
08b0: 0a 2a 2a 20 74 68 65 79 20 61 72 65 20 74 68 65  .** they are the
08c0: 20 73 61 6d 65 2c 20 74 68 65 20 66 75 6e 63 74   same, the funct
08d0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
08e0: 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
08f0: 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ng. Otherwise,.*
0900: 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  * an error messa
0910: 67 65 20 69 73 20 70 72 69 6e 74 65 64 2c 20 2a  ge is printed, *
0920: 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 31 20  pRc is set to 1 
0930: 61 6e 64 20 74 68 65 20 74 65 73 74 5f 66 61 69  and the test_fai
0940: 6c 65 64 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  led().** functio
0950: 6e 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69  n called..*/.voi
0960: 64 20 74 65 73 74 43 6f 6d 70 61 72 65 53 74 72  d testCompareStr
0970: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c  (const char *z1,
0980: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 2c   const char *z2,
0990: 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 66   int *pRc){.  if
09a0: 28 20 2a 70 52 63 3d 3d 30 20 29 7b 0a 20 20 20  ( *pRc==0 ){.   
09b0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 31 2c 20   if( strcmp(z1, 
09c0: 7a 32 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  z2) ){.      tes
09d0: 74 50 72 69 6e 74 45 72 72 6f 72 28 22 74 65 73  tPrintError("tes
09e0: 74 43 6f 6d 70 61 72 65 53 74 72 3a 20 5c 22 25  tCompareStr: \"%
09f0: 73 5c 22 20 21 3d 20 5c 22 25 73 5c 22 5c 6e 22  s\" != \"%s\"\n"
0a00: 2c 20 7a 31 2c 20 7a 32 29 3b 0a 20 20 20 20 20  , z1, z2);.     
0a10: 20 2a 70 52 63 20 3d 20 31 3b 0a 20 20 20 20 20   *pRc = 1;.     
0a20: 20 74 65 73 74 5f 66 61 69 6c 65 64 28 29 3b 0a   test_failed();.
0a30: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0a40: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
0a50: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a   is a no-op if *
0a60: 70 52 63 20 69 73 20 6e 6f 74 20 30 20 77 68 65  pRc is not 0 whe
0a70: 6e 20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e 0a  n it is called..
0a80: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
0a90: 20 74 68 65 20 74 77 6f 20 69 6e 74 65 67 65 72   the two integer
0aa0: 73 20 69 31 20 61 6e 64 20 69 32 20 61 72 65 20  s i1 and i2 are 
0ab0: 63 6f 6d 70 61 72 65 64 2e 20 49 66 20 74 68 65  compared. If the
0ac0: 79 20 61 72 65 20 65 71 75 61 6c 2c 0a 2a 2a 20  y are equal,.** 
0ad0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
0ae0: 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
0af0: 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
0b00: 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72  erwise, an error
0b10: 20 6d 65 73 73 61 67 65 20 0a 2a 2a 20 69 73 20   message .** is 
0b20: 70 72 69 6e 74 65 64 2c 20 2a 70 52 63 20 69 73  printed, *pRc is
0b30: 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 74 68   set to 1 and th
0b40: 65 20 74 65 73 74 5f 66 61 69 6c 65 64 28 29 20  e test_failed() 
0b50: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 2e  function called.
0b60: 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 43 6f 6d  .*/.void testCom
0b70: 70 61 72 65 49 6e 74 28 69 6e 74 20 69 31 2c 20  pareInt(int i1, 
0b80: 69 6e 74 20 69 32 2c 20 69 6e 74 20 2a 70 52 63  int i2, int *pRc
0b90: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 30  ){.  if( *pRc==0
0ba0: 20 26 26 20 69 31 21 3d 69 32 20 29 7b 0a 20 20   && i1!=i2 ){.  
0bb0: 20 20 74 65 73 74 50 72 69 6e 74 45 72 72 6f 72    testPrintError
0bc0: 28 22 74 65 73 74 43 6f 6d 70 61 72 65 49 6e 74  ("testCompareInt
0bd0: 3a 20 25 64 20 21 3d 20 25 64 5c 6e 22 2c 20 69  : %d != %d\n", i
0be0: 31 2c 20 69 32 29 3b 0a 20 20 20 20 2a 70 52 63  1, i2);.    *pRc
0bf0: 20 3d 20 31 3b 0a 20 20 20 20 74 65 73 74 5f 66   = 1;.    test_f
0c00: 61 69 6c 65 64 28 29 3b 0a 20 20 7d 0a 7d 0a 0a  ailed();.  }.}..
0c10: 76 6f 69 64 20 74 65 73 74 43 61 73 65 53 74 61  void testCaseSta
0c20: 72 74 28 69 6e 74 20 2a 70 52 63 2c 20 63 68 61  rt(int *pRc, cha
0c30: 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
0c40: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
0c50: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74  a_start(ap, zFmt
0c60: 29 3b 0a 20 20 76 70 72 69 6e 74 66 28 7a 46 6d  );.  vprintf(zFm
0c70: 74 2c 20 61 70 29 3b 0a 20 20 70 72 69 6e 74 66  t, ap);.  printf
0c80: 28 22 20 2e 2e 2e 22 29 3b 0a 20 20 76 61 5f 65  (" ...");.  va_e
0c90: 6e 64 28 61 70 29 3b 0a 20 20 2a 70 52 63 20 3d  nd(ap);.  *pRc =
0ca0: 20 30 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64   0;.  fflush(std
0cb0: 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  out);.}../*.** T
0cc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
0cd0: 61 20 6e 6f 2d 6f 70 20 69 66 20 2a 70 52 63 20  a no-op if *pRc 
0ce0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  is non-zero when
0cf0: 20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e 20 5a   it is called. Z
0d00: 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
0d10: 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
0d20: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
0d30: 2c 20 74 68 65 20 7a 46 6d 74 20 28 61 20 70 72  , the zFmt (a pr
0d40: 69 6e 74 66 20 73 74 79 6c 65 20 66 6f 72 6d 61  intf style forma
0d50: 74 20 73 74 72 69 6e 67 29 20 61 6e 64 20 66 6f  t string) and fo
0d60: 6c 6c 6f 77 69 6e 67 20 61 72 67 75 6d 65 6e 74  llowing argument
0d70: 73 20 0a 2a 2a 20 61 72 65 20 75 73 65 64 20 74  s .** are used t
0d80: 6f 20 63 72 65 61 74 65 20 61 20 74 65 73 74 20  o create a test 
0d90: 63 61 73 65 20 6e 61 6d 65 2e 20 49 66 20 7a 50  case name. If zP
0da0: 61 74 74 65 72 6e 20 69 73 20 4e 55 4c 4c 20 6f  attern is NULL o
0db0: 72 20 61 20 67 6c 6f 62 20 70 61 74 74 65 72 6e  r a glob pattern
0dc0: 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68 65 73  .** that matches
0dd0: 20 74 68 65 20 74 65 73 74 20 63 61 73 65 20 6e   the test case n
0de0: 61 6d 65 2c 20 31 20 69 73 20 72 65 74 75 72 6e  ame, 1 is return
0df0: 65 64 20 61 6e 64 20 74 68 65 20 74 65 73 74 20  ed and the test 
0e00: 63 61 73 65 20 73 74 61 72 74 65 64 2e 0a 2a 2a  case started..**
0e10: 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f   Otherwise, zero
0e20: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
0e30: 20 74 68 65 20 74 65 73 74 20 63 61 73 65 20 64   the test case d
0e40: 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 2e 0a 2a  oes not start..*
0e50: 2f 0a 69 6e 74 20 74 65 73 74 43 61 73 65 42 65  /.int testCaseBe
0e60: 67 69 6e 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f  gin(int *pRc, co
0e70: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65  nst char *zPatte
0e80: 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rn, const char *
0e90: 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e  zFmt, ...){.  in
0ea0: 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  t res = 0;.  if(
0eb0: 20 2a 70 52 63 3d 3d 30 20 29 7b 0a 20 20 20 20   *pRc==0 ){.    
0ec0: 63 68 61 72 20 2a 7a 54 65 73 74 3b 0a 20 20 20  char *zTest;.   
0ed0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 0a 20 20   va_list ap;..  
0ee0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
0ef0: 46 6d 74 29 3b 0a 20 20 20 20 7a 54 65 73 74 20  Fmt);.    zTest 
0f00: 3d 20 74 65 73 74 4d 61 6c 6c 6f 63 56 50 72 69  = testMallocVPri
0f10: 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
0f20: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
0f30: 20 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d     if( zPattern=
0f40: 3d 30 20 7c 7c 20 74 65 73 74 47 6c 6f 62 4d 61  =0 || testGlobMa
0f50: 74 63 68 28 7a 50 61 74 74 65 72 6e 2c 20 7a 54  tch(zPattern, zT
0f60: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 72  est) ){.      pr
0f70: 69 6e 74 66 28 22 25 2d 35 30 73 20 2e 2e 2e 22  intf("%-50s ..."
0f80: 2c 20 7a 54 65 73 74 29 3b 0a 20 20 20 20 20 20  , zTest);.      
0f90: 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  res = 1;.    }. 
0fa0: 20 20 20 74 65 73 74 46 72 65 65 28 7a 54 65 73     testFree(zTes
0fb0: 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73  t);.    fflush(s
0fc0: 74 64 6f 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 72  tdout);.  }..  r
0fd0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 76 6f  eturn res;.}..vo
0fe0: 69 64 20 74 65 73 74 43 61 73 65 46 69 6e 69 73  id testCaseFinis
0ff0: 68 28 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28  h(int rc){.  if(
1000: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 72   rc==0 ){.    pr
1010: 69 6e 74 66 28 22 4f 6b 5c 6e 22 29 3b 0a 20 20  intf("Ok\n");.  
1020: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74  }else{.    print
1030: 66 28 22 46 41 49 4c 45 44 5c 6e 22 29 3b 0a 20  f("FAILED\n");. 
1040: 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f   }.  fflush(stdo
1050: 75 74 29 3b 0a 7d 0a 0a 76 6f 69 64 20 74 65 73  ut);.}..void tes
1060: 74 43 61 73 65 53 6b 69 70 28 29 7b 0a 20 20 70  tCaseSkip(){.  p
1070: 72 69 6e 74 66 28 22 53 6b 69 70 70 65 64 5c 6e  rintf("Skipped\n
1080: 22 29 3b 0a 7d 0a 0a 76 6f 69 64 20 74 65 73 74  ");.}..void test
1090: 53 65 74 75 70 53 61 76 65 64 4c 73 6d 64 62 28  SetupSavedLsmdb(
10a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10b0: 43 66 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Cfg,.  const cha
10c0: 72 20 2a 7a 46 69 6c 65 2c 0a 20 20 44 61 74 61  r *zFile,.  Data
10d0: 73 6f 75 72 63 65 20 2a 70 44 61 74 61 2c 0a 20  source *pData,. 
10e0: 20 69 6e 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74   int nRow,.  int
10f0: 20 2a 70 52 63 0a 29 7b 0a 20 20 69 66 28 20 2a   *pRc.){.  if( *
1100: 70 52 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  pRc==0 ){.    in
1110: 74 20 72 63 3b 0a 20 20 20 20 54 65 73 74 44 62  t rc;.    TestDb
1120: 20 2a 70 44 62 3b 0a 20 20 20 20 72 63 20 3d 20   *pDb;.    rc = 
1130: 74 64 62 5f 6c 73 6d 5f 6f 70 65 6e 28 7a 43 66  tdb_lsm_open(zCf
1140: 67 2c 20 7a 46 69 6c 65 2c 20 31 2c 20 26 70 44  g, zFile, 1, &pD
1150: 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  b);.    if( rc==
1160: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 57  0 ){.      testW
1170: 72 69 74 65 44 61 74 61 73 6f 75 72 63 65 52 61  riteDatasourceRa
1180: 6e 67 65 28 70 44 62 2c 20 70 44 61 74 61 2c 20  nge(pDb, pData, 
1190: 30 2c 20 6e 52 6f 77 2c 20 26 72 63 29 3b 0a 20  0, nRow, &rc);. 
11a0: 20 20 20 20 20 74 65 73 74 43 6c 6f 73 65 28 26       testClose(&
11b0: 70 44 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pDb);.      if( 
11c0: 72 63 3d 3d 30 20 29 20 74 65 73 74 53 61 76 65  rc==0 ) testSave
11d0: 44 62 28 7a 46 69 6c 65 2c 20 22 6c 6f 67 22 29  Db(zFile, "log")
11e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63  ;.    }.    *pRc
11f0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = rc;.  }.}../*
1200: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1210: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
1220: 2a 70 52 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  *pRc is non-zero
1230: 20 77 68 65 6e 20 69 74 20 69 73 20 63 61 6c 6c   when it is call
1240: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
1250: 68 65 20 4c 53 4d 20 64 61 74 61 62 61 73 65 20  he LSM database 
1260: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 46  identified by zF
1270: 69 6c 65 20 61 6e 64 20 63 6f 6d 70 75 74 65 20  ile and compute 
1280: 69 74 73 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 20  its checksum.** 
1290: 28 61 20 73 74 72 69 6e 67 2c 20 61 73 20 72 65  (a string, as re
12a0: 74 75 72 6e 65 64 20 62 79 20 74 65 73 74 43 6b  turned by testCk
12b0: 73 75 6d 44 61 74 61 62 61 73 65 28 29 29 2e 20  sumDatabase()). 
12c0: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
12d0: 69 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20  is.** identical 
12e0: 74 6f 20 7a 45 78 70 65 63 74 31 20 6f 72 2c 20  to zExpect1 or, 
12f0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1300: 4c 2c 20 7a 45 78 70 65 63 74 32 2c 20 74 68 65  L, zExpect2, the
1310: 20 74 65 73 74 20 70 61 73 73 65 73 2e 0a 2a 2a   test passes..**
1320: 20 4f 74 68 65 72 77 69 73 65 2c 20 70 72 69 6e   Otherwise, prin
1330: 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
1340: 67 65 20 61 6e 64 20 73 65 74 20 2a 70 52 63 20  ge and set *pRc 
1350: 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 1..*/.static 
1360: 76 6f 69 64 20 74 65 73 74 43 6f 6d 70 61 72 65  void testCompare
1370: 43 6b 73 75 6d 4c 73 6d 64 62 28 0a 20 20 63 6f  CksumLsmdb(.  co
1380: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a0: 20 50 61 74 68 20 74 6f 20 4c 53 4d 20 64 61 74   Path to LSM dat
13b0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 62  abase */.  int b
13c0: 43 6f 6d 70 72 65 73 73 2c 20 20 20 20 20 20 20  Compress,       
13d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
13e0: 75 65 20 69 66 20 64 62 20 69 73 20 63 6f 6d 70  ue if db is comp
13f0: 72 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  ressed */.  cons
1400: 74 20 63 68 61 72 20 2a 7a 45 78 70 65 63 74 31  t char *zExpect1
1410: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ,           /* E
1420: 78 70 65 63 74 65 64 20 63 68 65 63 6b 73 75 6d  xpected checksum
1430: 20 31 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68   1 */.  const ch
1440: 61 72 20 2a 7a 45 78 70 65 63 74 32 2c 20 20 20  ar *zExpect2,   
1450: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
1460: 74 65 64 20 63 68 65 63 6b 73 75 6d 20 32 20 28  ted checksum 2 (
1470: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
1480: 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20  t *pRc          
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a0: 20 49 4e 2f 4f 55 54 3a 20 54 65 73 74 20 63 61   IN/OUT: Test ca
14b0: 73 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  se error code */
14c0: 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  .){.  if( *pRc==
14d0: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 43  0 ){.    char zC
14e0: 6b 73 75 6d 5b 54 45 53 54 5f 43 4b 53 55 4d 5f  ksum[TEST_CKSUM_
14f0: 42 59 54 45 53 5d 3b 0a 20 20 20 20 54 65 73 74  BYTES];.    Test
1500: 44 62 20 2a 70 44 62 3b 0a 0a 20 20 20 20 2a 70  Db *pDb;..    *p
1510: 52 63 20 3d 20 74 64 62 5f 6c 73 6d 5f 6f 70 65  Rc = tdb_lsm_ope
1520: 6e 28 28 62 43 6f 6d 70 72 65 73 73 3f 22 63 6f  n((bCompress?"co
1530: 6d 70 72 65 73 73 69 6f 6e 3d 31 20 6d 6d 61 70  mpression=1 mmap
1540: 3d 30 22 3a 22 22 29 2c 20 7a 46 69 6c 65 2c 20  =0":""), zFile, 
1550: 30 2c 20 26 70 44 62 29 3b 0a 20 20 20 20 74 65  0, &pDb);.    te
1560: 73 74 43 6b 73 75 6d 44 61 74 61 62 61 73 65 28  stCksumDatabase(
1570: 70 44 62 2c 20 7a 43 6b 73 75 6d 29 3b 0a 20 20  pDb, zCksum);.  
1580: 20 20 74 65 73 74 43 6c 6f 73 65 28 26 70 44 62    testClose(&pDb
1590: 29 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 52 63  );..    if( *pRc
15a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
15b0: 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 69   r1 = 0;.      i
15c0: 6e 74 20 72 32 20 3d 20 2d 31 3b 0a 0a 20 20 20  nt r2 = -1;..   
15d0: 20 20 20 72 31 20 3d 20 73 74 72 63 6d 70 28 7a     r1 = strcmp(z
15e0: 43 6b 73 75 6d 2c 20 7a 45 78 70 65 63 74 31 29  Cksum, zExpect1)
15f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45 78 70  ;.      if( zExp
1600: 65 63 74 32 20 29 20 72 32 20 3d 20 73 74 72 63  ect2 ) r2 = strc
1610: 6d 70 28 7a 43 6b 73 75 6d 2c 20 7a 45 78 70 65  mp(zCksum, zExpe
1620: 63 74 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ct2);.      if( 
1630: 72 31 20 26 26 20 72 32 20 29 7b 0a 20 20 20 20  r1 && r2 ){.    
1640: 20 20 20 20 69 66 28 20 7a 45 78 70 65 63 74 32      if( zExpect2
1650: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
1660: 73 74 50 72 69 6e 74 45 72 72 6f 72 28 22 74 65  stPrintError("te
1670: 73 74 43 6f 6d 70 61 72 65 43 6b 73 75 6d 4c 73  stCompareCksumLs
1680: 6d 64 62 3a 20 5c 22 25 73 5c 22 20 21 3d 20 28  mdb: \"%s\" != (
1690: 5c 22 25 73 5c 22 20 4f 52 20 5c 22 25 73 5c 22  \"%s\" OR \"%s\"
16a0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
16b0: 20 20 7a 43 6b 73 75 6d 2c 20 7a 45 78 70 65 63    zCksum, zExpec
16c0: 74 31 2c 20 7a 45 78 70 65 63 74 32 0a 20 20 20  t1, zExpect2.   
16d0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
16e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16f0: 20 20 20 74 65 73 74 50 72 69 6e 74 45 72 72 6f     testPrintErro
1700: 72 28 22 74 65 73 74 43 6f 6d 70 61 72 65 43 6b  r("testCompareCk
1710: 73 75 6d 4c 73 6d 64 62 3a 20 5c 22 25 73 5c 22  sumLsmdb: \"%s\"
1720: 20 21 3d 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20   != \"%s\"",.   
1730: 20 20 20 20 20 20 20 20 20 20 20 7a 43 6b 73 75             zCksu
1740: 6d 2c 20 7a 45 78 70 65 63 74 31 0a 20 20 20 20  m, zExpect1.    
1750: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1760: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20   }.        *pRc 
1770: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 74 65 73  = 1;.        tes
1780: 74 5f 66 61 69 6c 65 64 28 29 3b 0a 20 20 20 20  t_failed();.    
1790: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
17a0: 0a 23 69 66 20 30 20 2f 2a 20 6e 6f 74 20 75 73  .#if 0 /* not us
17b0: 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ed */.static voi
17c0: 64 20 74 65 73 74 43 6f 6d 70 61 72 65 43 6b 73  d testCompareCks
17d0: 75 6d 42 74 64 62 28 0a 20 20 63 6f 6e 73 74 20  umBtdb(.  const 
17e0: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20  char *zFile,    
17f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
1800: 68 20 74 6f 20 4c 53 4d 20 64 61 74 61 62 61 73  h to LSM databas
1810: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1820: 72 20 2a 7a 45 78 70 65 63 74 31 2c 20 20 20 20  r *zExpect1,    
1830: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
1840: 65 64 20 63 68 65 63 6b 73 75 6d 20 31 20 2a 2f  ed checksum 1 */
1850: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1860: 45 78 70 65 63 74 32 2c 20 20 20 20 20 20 20 20  Expect2,        
1870: 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 63     /* Expected c
1880: 68 65 63 6b 73 75 6d 20 32 20 28 6f 72 20 4e 55  hecksum 2 (or NU
1890: 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  LL) */.  int *pR
18a0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
18b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
18c0: 55 54 3a 20 54 65 73 74 20 63 61 73 65 20 65 72  UT: Test case er
18d0: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20  ror code */.){. 
18e0: 20 69 66 28 20 2a 70 52 63 3d 3d 30 20 29 7b 0a   if( *pRc==0 ){.
18f0: 20 20 20 20 63 68 61 72 20 7a 43 6b 73 75 6d 5b      char zCksum[
1900: 54 45 53 54 5f 43 4b 53 55 4d 5f 42 59 54 45 53  TEST_CKSUM_BYTES
1910: 5d 3b 0a 20 20 20 20 54 65 73 74 44 62 20 2a 70  ];.    TestDb *p
1920: 44 62 3b 0a 0a 20 20 20 20 2a 70 52 63 20 3d 20  Db;..    *pRc = 
1930: 74 64 62 5f 6f 70 65 6e 28 22 62 74 22 2c 20 7a  tdb_open("bt", z
1940: 46 69 6c 65 2c 20 30 2c 20 26 70 44 62 29 3b 0a  File, 0, &pDb);.
1950: 20 20 20 20 74 65 73 74 43 6b 73 75 6d 44 61 74      testCksumDat
1960: 61 62 61 73 65 28 70 44 62 2c 20 7a 43 6b 73 75  abase(pDb, zCksu
1970: 6d 29 3b 0a 20 20 20 20 74 65 73 74 43 6c 6f 73  m);.    testClos
1980: 65 28 26 70 44 62 29 3b 0a 0a 20 20 20 20 69 66  e(&pDb);..    if
1990: 28 20 2a 70 52 63 3d 3d 30 20 29 7b 0a 20 20 20  ( *pRc==0 ){.   
19a0: 20 20 20 69 6e 74 20 72 31 20 3d 20 30 3b 0a 20     int r1 = 0;. 
19b0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 2d 31       int r2 = -1
19c0: 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73 74  ;..      r1 = st
19d0: 72 63 6d 70 28 7a 43 6b 73 75 6d 2c 20 7a 45 78  rcmp(zCksum, zEx
19e0: 70 65 63 74 31 29 3b 0a 20 20 20 20 20 20 69 66  pect1);.      if
19f0: 28 20 7a 45 78 70 65 63 74 32 20 29 20 72 32 20  ( zExpect2 ) r2 
1a00: 3d 20 73 74 72 63 6d 70 28 7a 43 6b 73 75 6d 2c  = strcmp(zCksum,
1a10: 20 7a 45 78 70 65 63 74 32 29 3b 0a 20 20 20 20   zExpect2);.    
1a20: 20 20 69 66 28 20 72 31 20 26 26 20 72 32 20 29    if( r1 && r2 )
1a30: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45  {.        if( zE
1a40: 78 70 65 63 74 32 20 29 7b 0a 20 20 20 20 20 20  xpect2 ){.      
1a50: 20 20 20 20 74 65 73 74 50 72 69 6e 74 45 72 72      testPrintErr
1a60: 6f 72 28 22 74 65 73 74 43 6f 6d 70 61 72 65 43  or("testCompareC
1a70: 6b 73 75 6d 4c 73 6d 64 62 3a 20 5c 22 25 73 5c  ksumLsmdb: \"%s\
1a80: 22 20 21 3d 20 28 5c 22 25 73 5c 22 20 4f 52 20  " != (\"%s\" OR 
1a90: 5c 22 25 73 5c 22 29 22 2c 0a 20 20 20 20 20 20  \"%s\")",.      
1aa0: 20 20 20 20 20 20 20 20 7a 43 6b 73 75 6d 2c 20          zCksum, 
1ab0: 7a 45 78 70 65 63 74 31 2c 20 7a 45 78 70 65 63  zExpect1, zExpec
1ac0: 74 32 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  t2.          );.
1ad0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ae0: 20 20 20 20 20 20 20 20 20 74 65 73 74 50 72 69           testPri
1af0: 6e 74 45 72 72 6f 72 28 22 74 65 73 74 43 6f 6d  ntError("testCom
1b00: 70 61 72 65 43 6b 73 75 6d 4c 73 6d 64 62 3a 20  pareCksumLsmdb: 
1b10: 5c 22 25 73 5c 22 20 21 3d 20 5c 22 25 73 5c 22  \"%s\" != \"%s\"
1b20: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b30: 20 7a 43 6b 73 75 6d 2c 20 7a 45 78 70 65 63 74   zCksum, zExpect
1b40: 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  1.          );. 
1b50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b60: 20 2a 70 52 63 20 3d 20 31 3b 0a 20 20 20 20 20   *pRc = 1;.     
1b70: 20 20 20 74 65 73 74 5f 66 61 69 6c 65 64 28 29     test_failed()
1b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b90: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1ba0: 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 2f 2a 20  not used */../* 
1bb0: 41 62 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74  Above this point
1bc0: 20 61 72 65 20 72 65 75 73 61 62 6c 65 20 74 65   are reusable te
1bd0: 73 74 20 72 6f 75 74 69 6e 65 73 2e 20 4e 6f 74  st routines. Not
1be0: 20 63 6c 65 61 72 20 74 68 61 74 20 74 68 65 79   clear that they
1bf0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c  .** should reall
1c00: 79 20 62 65 20 69 6e 20 74 68 69 73 20 66 69 6c  y be in this fil
1c10: 65 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..*************
1c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
1c60: 2a 0a 2a 2a 20 54 68 69 73 20 74 65 73 74 20 76  *.** This test v
1c70: 65 72 69 66 69 65 73 20 74 68 61 74 20 69 66 20  erifies that if 
1c80: 61 20 73 79 73 74 65 6d 20 63 72 61 73 68 20 6f  a system crash o
1c90: 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
1ca0: 67 20 6d 65 72 67 65 20 77 6f 72 6b 0a 2a 2a 20  g merge work.** 
1cb0: 6f 6e 20 74 68 65 20 64 62 2c 20 6e 6f 20 64 61  on the db, no da
1cc0: 74 61 20 69 73 20 6c 6f 73 74 2e 0a 2a 2f 0a 73  ta is lost..*/.s
1cd0: 74 61 74 69 63 20 76 6f 69 64 20 63 72 61 73 68  tatic void crash
1ce0: 5f 74 65 73 74 31 28 69 6e 74 20 62 43 6f 6d 70  _test1(int bComp
1cf0: 72 65 73 73 2c 20 69 6e 74 20 2a 70 52 63 29 7b  ress, int *pRc){
1d00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44  .  const char *D
1d10: 42 4e 41 4d 45 20 3d 20 22 74 65 73 74 64 62 2e  BNAME = "testdb.
1d20: 6c 73 6d 22 3b 0a 20 20 63 6f 6e 73 74 20 44 61  lsm";.  const Da
1d30: 74 61 73 6f 75 72 63 65 44 65 66 6e 20 64 65 66  tasourceDefn def
1d40: 6e 20 3d 20 7b 54 45 53 54 5f 44 41 54 41 53 4f  n = {TEST_DATASO
1d50: 55 52 43 45 5f 52 41 4e 44 4f 4d 2c 20 31 32 2c  URCE_RANDOM, 12,
1d60: 20 31 36 2c 20 32 30 30 2c 20 32 30 30 7d 3b 0a   16, 200, 200};.
1d70: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 52 6f  .  const int nRo
1d80: 77 20 3d 20 35 30 30 30 3b 20 20 20 20 20 20 20  w = 5000;       
1d90: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1da0: 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ize */.  const i
1db0: 6e 74 20 6e 49 74 65 72 20 3d 20 32 30 30 3b 20  nt nIter = 200; 
1dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1dd0: 65 72 20 6f 66 20 74 65 73 74 20 69 74 65 72 61  er of test itera
1de0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tions */.  const
1df0: 20 69 6e 74 20 6e 57 6f 72 6b 20 3d 20 32 30 3b   int nWork = 20;
1e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1e10: 78 69 6d 75 6d 20 6c 73 6d 5f 77 6f 72 6b 28 29  ximum lsm_work()
1e20: 20 63 61 6c 6c 73 20 70 65 72 20 69 74 65 72 61   calls per itera
1e30: 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
1e40: 69 6e 74 20 6e 50 61 67 65 20 3d 20 31 35 3b 20  int nPage = 15; 
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1e60: 65 73 20 70 65 72 20 6c 73 6d 5f 77 6f 72 6b 20  es per lsm_work 
1e70: 63 61 6c 6c 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  call */..  int i
1e80: 3b 0a 20 20 69 6e 74 20 69 44 6f 74 20 3d 20 30  ;.  int iDot = 0
1e90: 3b 0a 20 20 44 61 74 61 73 6f 75 72 63 65 20 2a  ;.  Datasource *
1ea0: 70 44 61 74 61 3b 0a 20 20 43 6b 73 75 6d 44 62  pData;.  CksumDb
1eb0: 20 2a 70 43 6b 73 75 6d 44 62 3b 0a 20 20 54 65   *pCksumDb;.  Te
1ec0: 73 74 44 62 20 2a 70 44 62 3b 0a 20 20 63 68 61  stDb *pDb;.  cha
1ed0: 72 20 2a 7a 43 66 67 3b 0a 0a 20 20 63 6f 6e 73  r *zCfg;..  cons
1ee0: 74 20 63 68 61 72 20 2a 61 7a 43 6f 6e 66 69 67  t char *azConfig
1ef0: 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 22 70 61 67  [2] = {.    "pag
1f00: 65 5f 73 69 7a 65 3d 31 30 32 34 20 62 6c 6f 63  e_size=1024 bloc
1f10: 6b 5f 73 69 7a 65 3d 36 35 35 33 36 20 61 75 74  k_size=65536 aut
1f20: 6f 66 6c 75 73 68 3d 31 36 33 38 34 20 73 61 66  oflush=16384 saf
1f30: 65 74 79 3d 32 20 6d 6d 61 70 3d 30 22 2c 20 0a  ety=2 mmap=0", .
1f40: 20 20 20 20 22 70 61 67 65 5f 73 69 7a 65 3d 31      "page_size=1
1f50: 30 32 34 20 62 6c 6f 63 6b 5f 73 69 7a 65 3d 36  024 block_size=6
1f60: 35 35 33 36 20 61 75 74 6f 66 6c 75 73 68 3d 31  5536 autoflush=1
1f70: 36 33 38 34 20 73 61 66 65 74 79 3d 32 20 22 0a  6384 safety=2 ".
1f80: 20 20 20 20 22 20 63 6f 6d 70 72 65 73 73 69 6f      " compressio
1f90: 6e 3d 31 20 6d 6d 61 70 3d 30 22 0a 20 20 7d 3b  n=1 mmap=0".  };
1fa0: 0a 20 20 61 73 73 65 72 74 28 20 62 43 6f 6d 70  .  assert( bComp
1fb0: 72 65 73 73 3d 3d 30 20 7c 7c 20 62 43 6f 6d 70  ress==0 || bComp
1fc0: 72 65 73 73 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  ress==1 );..  /*
1fd0: 20 41 6c 6c 6f 63 61 74 65 20 64 61 74 61 73 6f   Allocate dataso
1fe0: 75 72 63 65 2e 20 41 6e 64 20 63 61 6c 63 75 6c  urce. And calcul
1ff0: 61 74 65 20 74 68 65 20 65 78 70 65 63 74 65 64  ate the expected
2000: 20 63 68 65 63 6b 73 75 6d 73 2e 20 2a 2f 0a 20   checksums. */. 
2010: 20 70 44 61 74 61 20 3d 20 74 65 73 74 44 61 74   pData = testDat
2020: 61 73 6f 75 72 63 65 4e 65 77 28 26 64 65 66 6e  asourceNew(&defn
2030: 29 3b 0a 20 20 70 43 6b 73 75 6d 44 62 20 3d 20  );.  pCksumDb = 
2040: 74 65 73 74 43 6b 73 75 6d 41 72 72 61 79 4e 65  testCksumArrayNe
2050: 77 28 70 44 61 74 61 2c 20 6e 52 6f 77 2c 20 6e  w(pData, nRow, n
2060: 52 6f 77 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 53  Row, 1);..  /* S
2070: 65 74 75 70 20 61 6e 64 20 73 61 76 65 20 74 68  etup and save th
2080: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
2090: 73 65 2e 20 2a 2f 0a 0a 20 20 7a 43 66 67 20 3d  se. */..  zCfg =
20a0: 20 74 65 73 74 4d 61 6c 6c 6f 63 50 72 69 6e 74   testMallocPrint
20b0: 66 28 22 25 73 20 61 75 74 6f 6d 65 72 67 65 3d  f("%s automerge=
20c0: 37 22 2c 20 61 7a 43 6f 6e 66 69 67 5b 62 43 6f  7", azConfig[bCo
20d0: 6d 70 72 65 73 73 5d 29 3b 0a 20 20 74 65 73 74  mpress]);.  test
20e0: 53 65 74 75 70 53 61 76 65 64 4c 73 6d 64 62 28  SetupSavedLsmdb(
20f0: 7a 43 66 67 2c 20 44 42 4e 41 4d 45 2c 20 70 44  zCfg, DBNAME, pD
2100: 61 74 61 2c 20 35 30 30 30 2c 20 70 52 63 29 3b  ata, 5000, pRc);
2110: 0a 20 20 74 65 73 74 46 72 65 65 28 7a 43 66 67  .  testFree(zCfg
2120: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
2130: 3c 6e 49 74 65 72 20 26 26 20 2a 70 52 63 3d 3d  <nIter && *pRc==
2140: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  0; i++){.    int
2150: 20 69 57 6f 72 6b 3b 0a 20 20 20 20 69 6e 74 20   iWork;.    int 
2160: 74 65 73 74 72 63 20 3d 20 30 3b 0a 0a 20 20 20  testrc = 0;..   
2170: 20 74 65 73 74 43 61 73 65 50 72 6f 67 72 65 73   testCaseProgres
2180: 73 28 69 2c 20 6e 49 74 65 72 2c 20 74 65 73 74  s(i, nIter, test
2190: 43 61 73 65 4e 44 6f 74 28 29 2c 20 26 69 44 6f  CaseNDot(), &iDo
21a0: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74  t);..    /* Rest
21b0: 6f 72 65 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  ore and open the
21c0: 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20   database. */.  
21d0: 20 20 74 65 73 74 52 65 73 74 6f 72 65 44 62 28    testRestoreDb(
21e0: 44 42 4e 41 4d 45 2c 20 22 6c 6f 67 22 29 3b 0a  DBNAME, "log");.
21f0: 20 20 20 20 74 65 73 74 72 63 20 3d 20 74 64 62      testrc = tdb
2200: 5f 6c 73 6d 5f 6f 70 65 6e 28 61 7a 43 6f 6e 66  _lsm_open(azConf
2210: 69 67 5b 62 43 6f 6d 70 72 65 73 73 5d 2c 20 44  ig[bCompress], D
2220: 42 4e 41 4d 45 2c 20 30 2c 20 26 70 44 62 29 3b  BNAME, 0, &pDb);
2230: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73  .    assert( tes
2240: 74 72 63 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  trc==0 );..    /
2250: 2a 20 43 61 6c 6c 20 6c 73 6d 5f 77 6f 72 6b 28  * Call lsm_work(
2260: 29 20 6f 6e 20 74 68 65 20 64 62 20 2a 2f 0a 20  ) on the db */. 
2270: 20 20 20 74 64 62 5f 6c 73 6d 5f 70 72 65 70 61     tdb_lsm_prepa
2280: 72 65 5f 73 79 6e 63 5f 63 72 61 73 68 28 70 44  re_sync_crash(pD
2290: 62 2c 20 31 20 2b 20 28 69 25 28 6e 57 6f 72 6b  b, 1 + (i%(nWork
22a0: 2a 32 29 29 29 3b 0a 20 20 20 20 66 6f 72 28 69  *2)));.    for(i
22b0: 57 6f 72 6b 3d 30 3b 20 74 65 73 74 72 63 3d 3d  Work=0; testrc==
22c0: 30 20 26 26 20 69 57 6f 72 6b 3c 6e 57 6f 72 6b  0 && iWork<nWork
22d0: 3b 20 69 57 6f 72 6b 2b 2b 29 7b 0a 20 20 20 20  ; iWork++){.    
22e0: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
22f0: 3b 0a 20 20 20 20 20 20 6c 73 6d 5f 64 62 20 2a  ;.      lsm_db *
2300: 64 62 20 3d 20 74 64 62 5f 6c 73 6d 28 70 44 62  db = tdb_lsm(pDb
2310: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 72 63 20  );.      testrc 
2320: 3d 20 6c 73 6d 5f 77 6f 72 6b 28 64 62 2c 20 30  = lsm_work(db, 0
2330: 2c 20 6e 50 61 67 65 2c 20 26 6e 57 72 69 74 65  , nPage, &nWrite
2340: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  );.      /* asse
2350: 72 74 28 20 74 65 73 74 72 63 21 3d 30 20 7c 7c  rt( testrc!=0 ||
2360: 20 6e 57 72 69 74 65 3e 30 20 29 3b 20 2a 2f 0a   nWrite>0 ); */.
2370: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 72 63        if( testrc
2380: 3d 3d 30 20 29 20 74 65 73 74 72 63 20 3d 20 6c  ==0 ) testrc = l
2390: 73 6d 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  sm_checkpoint(db
23a0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
23b0: 74 64 62 5f 63 6c 6f 73 65 28 70 44 62 29 3b 0a  tdb_close(pDb);.
23c0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
23d0: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
23e0: 63 6f 6e 74 65 6e 74 20 69 73 20 73 74 69 6c 6c  content is still
23f0: 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20 20 20   correct */.    
2400: 74 65 73 74 43 6f 6d 70 61 72 65 43 6b 73 75 6d  testCompareCksum
2410: 4c 73 6d 64 62 28 44 42 4e 41 4d 45 2c 20 0a 20  Lsmdb(DBNAME, . 
2420: 20 20 20 20 20 20 20 62 43 6f 6d 70 72 65 73 73         bCompress
2430: 2c 20 74 65 73 74 43 6b 73 75 6d 41 72 72 61 79  , testCksumArray
2440: 47 65 74 28 70 43 6b 73 75 6d 44 62 2c 20 6e 52  Get(pCksumDb, nR
2450: 6f 77 29 2c 20 30 2c 20 70 52 63 29 3b 0a 20 20  ow), 0, pRc);.  
2460: 7d 0a 0a 20 20 74 65 73 74 43 6b 73 75 6d 41 72  }..  testCksumAr
2470: 72 61 79 46 72 65 65 28 70 43 6b 73 75 6d 44 62  rayFree(pCksumDb
2480: 29 3b 0a 20 20 74 65 73 74 44 61 74 61 73 6f 75  );.  testDatasou
2490: 72 63 65 46 72 65 65 28 70 44 61 74 61 29 3b 0a  rceFree(pData);.
24a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 74 65  }../*.** This te
24b0: 73 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74  st verifies that
24c0: 20 69 66 20 61 20 73 79 73 74 65 6d 20 63 72 61   if a system cra
24d0: 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  sh occurs while 
24e0: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 0a 2a 2a 20  committing a.** 
24f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74  transaction to t
2500: 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 6e 6f 20  he log file, no 
2510: 65 61 72 6c 69 65 72 20 74 72 61 6e 73 61 63 74  earlier transact
2520: 69 6f 6e 73 20 61 72 65 20 6c 6f 73 74 20 6f 72  ions are lost or
2530: 20 64 61 6d 61 67 65 64 2e 0a 2a 2f 0a 73 74 61   damaged..*/.sta
2540: 74 69 63 20 76 6f 69 64 20 63 72 61 73 68 5f 74  tic void crash_t
2550: 65 73 74 32 28 69 6e 74 20 62 43 6f 6d 70 72 65  est2(int bCompre
2560: 73 73 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  ss, int *pRc){. 
2570: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 4e   const char *DBN
2580: 41 4d 45 20 3d 20 22 74 65 73 74 64 62 2e 6c 73  AME = "testdb.ls
2590: 6d 22 3b 0a 20 20 63 6f 6e 73 74 20 44 61 74 61  m";.  const Data
25a0: 73 6f 75 72 63 65 44 65 66 6e 20 64 65 66 6e 20  sourceDefn defn 
25b0: 3d 20 7b 54 45 53 54 5f 44 41 54 41 53 4f 55 52  = {TEST_DATASOUR
25c0: 43 45 5f 52 41 4e 44 4f 4d 2c 20 31 32 2c 20 31  CE_RANDOM, 12, 1
25d0: 36 2c 20 31 30 30 30 2c 20 31 30 30 30 7d 3b 0a  6, 1000, 1000};.
25e0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 49 74  .  const int nIt
25f0: 65 72 20 3d 20 32 30 30 3b 0a 20 20 63 6f 6e 73  er = 200;.  cons
2600: 74 20 69 6e 74 20 6e 49 6e 73 65 72 74 20 3d 20  t int nInsert = 
2610: 32 30 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a 20 20  20;..  int i;.  
2620: 69 6e 74 20 69 44 6f 74 20 3d 20 30 3b 0a 20 20  int iDot = 0;.  
2630: 44 61 74 61 73 6f 75 72 63 65 20 2a 70 44 61 74  Datasource *pDat
2640: 61 3b 0a 20 20 43 6b 73 75 6d 44 62 20 2a 70 43  a;.  CksumDb *pC
2650: 6b 73 75 6d 44 62 3b 0a 20 20 54 65 73 74 44 62  ksumDb;.  TestDb
2660: 20 2a 70 44 62 3b 0a 0a 20 20 2f 2a 20 41 6c 6c   *pDb;..  /* All
2670: 6f 63 61 74 65 20 64 61 74 61 73 6f 75 72 63 65  ocate datasource
2680: 2e 20 41 6e 64 20 63 61 6c 63 75 6c 61 74 65 20  . And calculate 
2690: 74 68 65 20 65 78 70 65 63 74 65 64 20 63 68 65  the expected che
26a0: 63 6b 73 75 6d 73 2e 20 2a 2f 0a 20 20 70 44 61  cksums. */.  pDa
26b0: 74 61 20 3d 20 74 65 73 74 44 61 74 61 73 6f 75  ta = testDatasou
26c0: 72 63 65 4e 65 77 28 26 64 65 66 6e 29 3b 0a 20  rceNew(&defn);. 
26d0: 20 70 43 6b 73 75 6d 44 62 20 3d 20 74 65 73 74   pCksumDb = test
26e0: 43 6b 73 75 6d 41 72 72 61 79 4e 65 77 28 70 44  CksumArrayNew(pD
26f0: 61 74 61 2c 20 31 30 30 2c 20 31 30 30 2b 6e 49  ata, 100, 100+nI
2700: 6e 73 65 72 74 2c 20 31 29 3b 0a 0a 20 20 2f 2a  nsert, 1);..  /*
2710: 20 53 65 74 75 70 20 61 6e 64 20 73 61 76 65 20   Setup and save 
2720: 74 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  the initial data
2730: 62 61 73 65 2e 20 2a 2f 0a 20 20 74 65 73 74 53  base. */.  testS
2740: 65 74 75 70 53 61 76 65 64 4c 73 6d 64 62 28 22  etupSavedLsmdb("
2750: 22 2c 20 44 42 4e 41 4d 45 2c 20 70 44 61 74 61  ", DBNAME, pData
2760: 2c 20 31 30 30 2c 20 70 52 63 29 3b 0a 0a 20 20  , 100, pRc);..  
2770: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 74 65 72  for(i=0; i<nIter
2780: 20 26 26 20 2a 70 52 63 3d 3d 30 3b 20 69 2b 2b   && *pRc==0; i++
2790: 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 6e 73 3b  ){.    int iIns;
27a0: 0a 20 20 20 20 69 6e 74 20 74 65 73 74 72 63 20  .    int testrc 
27b0: 3d 20 30 3b 0a 0a 20 20 20 20 74 65 73 74 43 61  = 0;..    testCa
27c0: 73 65 50 72 6f 67 72 65 73 73 28 69 2c 20 6e 49  seProgress(i, nI
27d0: 74 65 72 2c 20 74 65 73 74 43 61 73 65 4e 44 6f  ter, testCaseNDo
27e0: 74 28 29 2c 20 26 69 44 6f 74 29 3b 0a 0a 20 20  t(), &iDot);..  
27f0: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 61 6e 64    /* Restore and
2800: 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
2810: 73 65 2e 20 2a 2f 0a 20 20 20 20 74 65 73 74 52  se. */.    testR
2820: 65 73 74 6f 72 65 44 62 28 44 42 4e 41 4d 45 2c  estoreDb(DBNAME,
2830: 20 22 6c 6f 67 22 29 3b 0a 20 20 20 20 74 65 73   "log");.    tes
2840: 74 72 63 20 3d 20 74 64 62 5f 6c 73 6d 5f 6f 70  trc = tdb_lsm_op
2850: 65 6e 28 22 73 61 66 65 74 79 3d 32 22 2c 20 44  en("safety=2", D
2860: 42 4e 41 4d 45 2c 20 30 2c 20 26 70 44 62 29 3b  BNAME, 0, &pDb);
2870: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73  .    assert( tes
2880: 74 72 63 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  trc==0 );..    /
2890: 2a 20 49 6e 73 65 72 74 20 6e 49 6e 73 65 72 74  * Insert nInsert
28a0: 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
28b0: 65 20 64 61 74 61 62 61 73 65 2e 20 43 72 61 73  e database. Cras
28c0: 68 20 6d 69 64 77 61 79 20 74 68 72 6f 75 67 68  h midway through
28d0: 2e 20 2a 2f 0a 20 20 20 20 74 64 62 5f 6c 73 6d  . */.    tdb_lsm
28e0: 5f 70 72 65 70 61 72 65 5f 73 79 6e 63 5f 63 72  _prepare_sync_cr
28f0: 61 73 68 28 70 44 62 2c 20 31 20 2b 20 28 69 25  ash(pDb, 1 + (i%
2900: 28 6e 49 6e 73 65 72 74 2b 32 29 29 29 3b 0a 20  (nInsert+2)));. 
2910: 20 20 20 66 6f 72 28 69 49 6e 73 3d 30 3b 20 69     for(iIns=0; i
2920: 49 6e 73 3c 6e 49 6e 73 65 72 74 3b 20 69 49 6e  Ins<nInsert; iIn
2930: 73 2b 2b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  s++){.      void
2940: 20 2a 70 4b 65 79 3b 20 69 6e 74 20 6e 4b 65 79   *pKey; int nKey
2950: 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 56  ;.      void *pV
2960: 61 6c 3b 20 69 6e 74 20 6e 56 61 6c 3b 0a 0a 20  al; int nVal;.. 
2970: 20 20 20 20 20 74 65 73 74 44 61 74 61 73 6f 75       testDatasou
2980: 72 63 65 45 6e 74 72 79 28 70 44 61 74 61 2c 20  rceEntry(pData, 
2990: 31 30 30 2b 69 49 6e 73 2c 20 26 70 4b 65 79 2c  100+iIns, &pKey,
29a0: 20 26 6e 4b 65 79 2c 20 26 70 56 61 6c 2c 20 26   &nKey, &pVal, &
29b0: 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  nVal);.      tes
29c0: 74 72 63 20 3d 20 74 64 62 5f 77 72 69 74 65 28  trc = tdb_write(
29d0: 70 44 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  pDb, pKey, nKey,
29e0: 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20   pVal, nVal);.  
29f0: 20 20 20 20 69 66 28 20 74 65 73 74 72 63 20 29      if( testrc )
2a00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2a10: 20 20 74 64 62 5f 63 6c 6f 73 65 28 70 44 62 29    tdb_close(pDb)
2a20: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
2a30: 74 68 61 74 20 6e 6f 20 64 61 74 61 20 77 61 73  that no data was
2a40: 20 6c 6f 73 74 20 77 68 65 6e 20 74 68 65 20 73   lost when the s
2a50: 79 73 74 65 6d 20 63 72 61 73 68 65 64 2e 20 2a  ystem crashed. *
2a60: 2f 0a 20 20 20 20 74 65 73 74 43 6f 6d 70 61 72  /.    testCompar
2a70: 65 43 6b 73 75 6d 4c 73 6d 64 62 28 44 42 4e 41  eCksumLsmdb(DBNA
2a80: 4d 45 2c 20 62 43 6f 6d 70 72 65 73 73 2c 0a 20  ME, bCompress,. 
2a90: 20 20 20 20 20 74 65 73 74 43 6b 73 75 6d 41 72       testCksumAr
2aa0: 72 61 79 47 65 74 28 70 43 6b 73 75 6d 44 62 2c  rayGet(pCksumDb,
2ab0: 20 31 30 30 20 2b 20 69 49 6e 73 29 2c 0a 20 20   100 + iIns),.  
2ac0: 20 20 20 20 74 65 73 74 43 6b 73 75 6d 41 72 72      testCksumArr
2ad0: 61 79 47 65 74 28 70 43 6b 73 75 6d 44 62 2c 20  ayGet(pCksumDb, 
2ae0: 31 30 30 20 2b 20 69 49 6e 73 20 2b 20 31 29 2c  100 + iIns + 1),
2af0: 0a 20 20 20 20 20 20 70 52 63 0a 20 20 20 20 29  .      pRc.    )
2b00: 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 44 61 74  ;.  }..  testDat
2b10: 61 73 6f 75 72 63 65 46 72 65 65 28 70 44 61 74  asourceFree(pDat
2b20: 61 29 3b 0a 20 20 74 65 73 74 43 6b 73 75 6d 41  a);.  testCksumA
2b30: 72 72 61 79 46 72 65 65 28 70 43 6b 73 75 6d 44  rrayFree(pCksumD
2b40: 62 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  b);.}.../*.** Th
2b50: 69 73 20 74 65 73 74 20 76 65 72 69 66 69 65 73  is test verifies
2b60: 20 74 68 61 74 20 69 66 20 61 20 73 79 73 74 65   that if a syste
2b70: 6d 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77  m crash occurs w
2b80: 68 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e  hen checkpointin
2b90: 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
2ba0: 65 2c 20 64 61 74 61 20 69 73 20 6e 6f 74 20 6c  e, data is not l
2bb0: 6f 73 74 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ost (assuming th
2bc0: 61 74 20 61 6e 79 20 77 72 69 74 65 73 20 6e 6f  at any writes no
2bd0: 74 20 73 79 6e 63 65 64 0a 2a 2a 20 74 6f 20 74  t synced.** to t
2be0: 68 65 20 64 62 20 68 61 76 65 20 62 65 65 6e 20  he db have been 
2bf0: 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
2c00: 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2f 0a 73 74  log file)..*/.st
2c10: 61 74 69 63 20 76 6f 69 64 20 63 72 61 73 68 5f  atic void crash_
2c20: 74 65 73 74 33 28 69 6e 74 20 62 43 6f 6d 70 72  test3(int bCompr
2c30: 65 73 73 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a  ess, int *pRc){.
2c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42    const char *DB
2c50: 4e 41 4d 45 20 3d 20 22 74 65 73 74 64 62 2e 6c  NAME = "testdb.l
2c60: 73 6d 22 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  sm";.  const int
2c70: 20 6e 49 74 65 72 20 3d 20 31 30 30 3b 0a 20 20   nIter = 100;.  
2c80: 63 6f 6e 73 74 20 44 61 74 61 73 6f 75 72 63 65  const Datasource
2c90: 44 65 66 6e 20 64 65 66 6e 20 3d 20 7b 54 45 53  Defn defn = {TES
2ca0: 54 5f 44 41 54 41 53 4f 55 52 43 45 5f 52 41 4e  T_DATASOURCE_RAN
2cb0: 44 4f 4d 2c 20 31 32 2c 20 31 36 2c 20 31 30 30  DOM, 12, 16, 100
2cc0: 30 2c 20 31 30 30 30 7d 3b 0a 0a 20 20 69 6e 74  0, 1000};..  int
2cd0: 20 69 3b 0a 20 20 69 6e 74 20 69 44 6f 74 20 3d   i;.  int iDot =
2ce0: 20 30 3b 0a 20 20 44 61 74 61 73 6f 75 72 63 65   0;.  Datasource
2cf0: 20 2a 70 44 61 74 61 3b 0a 20 20 43 6b 73 75 6d   *pData;.  Cksum
2d00: 44 62 20 2a 70 43 6b 73 75 6d 44 62 3b 0a 20 20  Db *pCksumDb;.  
2d10: 54 65 73 74 44 62 20 2a 70 44 62 3b 0a 0a 20 20  TestDb *pDb;..  
2d20: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 64 61 74 61  /* Allocate data
2d30: 73 6f 75 72 63 65 2e 20 41 6e 64 20 63 61 6c 63  source. And calc
2d40: 75 6c 61 74 65 20 74 68 65 20 65 78 70 65 63 74  ulate the expect
2d50: 65 64 20 63 68 65 63 6b 73 75 6d 73 2e 20 2a 2f  ed checksums. */
2d60: 0a 20 20 70 44 61 74 61 20 3d 20 74 65 73 74 44  .  pData = testD
2d70: 61 74 61 73 6f 75 72 63 65 4e 65 77 28 26 64 65  atasourceNew(&de
2d80: 66 6e 29 3b 0a 20 20 70 43 6b 73 75 6d 44 62 20  fn);.  pCksumDb 
2d90: 3d 20 74 65 73 74 43 6b 73 75 6d 41 72 72 61 79  = testCksumArray
2da0: 4e 65 77 28 70 44 61 74 61 2c 20 31 31 30 2c 20  New(pData, 110, 
2db0: 31 35 30 2c 20 31 30 29 3b 0a 0a 20 20 2f 2a 20  150, 10);..  /* 
2dc0: 53 65 74 75 70 20 61 6e 64 20 73 61 76 65 20 74  Setup and save t
2dd0: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
2de0: 61 73 65 2e 20 2a 2f 0a 20 20 74 65 73 74 53 65  ase. */.  testSe
2df0: 74 75 70 53 61 76 65 64 4c 73 6d 64 62 28 22 22  tupSavedLsmdb(""
2e00: 2c 20 44 42 4e 41 4d 45 2c 20 70 44 61 74 61 2c  , DBNAME, pData,
2e10: 20 31 30 30 2c 20 70 52 63 29 3b 0a 0a 20 20 66   100, pRc);..  f
2e20: 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 74 65 72 20  or(i=0; i<nIter 
2e30: 26 26 20 2a 70 52 63 3d 3d 30 3b 20 69 2b 2b 29  && *pRc==0; i++)
2e40: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 70 65 6e 3b  {.    int iOpen;
2e50: 0a 20 20 20 20 74 65 73 74 43 61 73 65 50 72 6f  .    testCasePro
2e60: 67 72 65 73 73 28 69 2c 20 6e 49 74 65 72 2c 20  gress(i, nIter, 
2e70: 74 65 73 74 43 61 73 65 4e 44 6f 74 28 29 2c 20  testCaseNDot(), 
2e80: 26 69 44 6f 74 29 3b 0a 20 20 20 20 74 65 73 74  &iDot);.    test
2e90: 52 65 73 74 6f 72 65 44 62 28 44 42 4e 41 4d 45  RestoreDb(DBNAME
2ea0: 2c 20 22 6c 6f 67 22 29 3b 0a 0a 20 20 20 20 66  , "log");..    f
2eb0: 6f 72 28 69 4f 70 65 6e 3d 30 3b 20 69 4f 70 65  or(iOpen=0; iOpe
2ec0: 6e 3c 35 3b 20 69 4f 70 65 6e 2b 2b 29 7b 0a 20  n<5; iOpen++){. 
2ed0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
2ee0: 20 64 61 74 61 62 61 73 65 2e 20 49 6e 73 65 72   database. Inser
2ef0: 74 20 31 30 20 6d 6f 72 65 20 72 65 63 6f 72 64  t 10 more record
2f00: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 62 20  s. */.      pDb 
2f10: 3d 20 74 65 73 74 4f 70 65 6e 28 22 6c 73 6d 22  = testOpen("lsm"
2f20: 2c 20 30 2c 20 70 52 63 29 3b 0a 20 20 20 20 20  , 0, pRc);.     
2f30: 20 74 65 73 74 57 72 69 74 65 44 61 74 61 73 6f   testWriteDataso
2f40: 75 72 63 65 52 61 6e 67 65 28 70 44 62 2c 20 70  urceRange(pDb, p
2f50: 44 61 74 61 2c 20 31 30 30 2b 69 4f 70 65 6e 2a  Data, 100+iOpen*
2f60: 31 30 2c 20 31 30 2c 20 70 52 63 29 3b 0a 0a 20  10, 10, pRc);.. 
2f70: 20 20 20 20 20 2f 2a 20 53 63 68 65 64 75 6c 65       /* Schedule
2f80: 20 61 20 63 72 61 73 68 20 73 69 6d 75 6c 61 74   a crash simulat
2f90: 69 6f 6e 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  ion then close t
2fa0: 68 65 20 64 62 2e 20 2a 2f 0a 20 20 20 20 20 20  he db. */.      
2fb0: 74 64 62 5f 6c 73 6d 5f 70 72 65 70 61 72 65 5f  tdb_lsm_prepare_
2fc0: 73 79 6e 63 5f 63 72 61 73 68 28 70 44 62 2c 20  sync_crash(pDb, 
2fd0: 31 20 2b 20 28 69 25 32 29 29 3b 0a 20 20 20 20  1 + (i%2));.    
2fe0: 20 20 74 64 62 5f 63 6c 6f 73 65 28 70 44 62 29    tdb_close(pDb)
2ff0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ;..      /* Open
3000: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
3010: 64 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  d check that the
3020: 20 63 72 61 73 68 20 64 69 64 20 6e 6f 74 20 63   crash did not c
3030: 61 75 73 65 20 61 6e 79 0a 20 20 20 20 20 20 2a  ause any.      *
3040: 2a 20 64 61 74 61 20 6c 6f 73 73 2e 20 20 2a 2f  * data loss.  */
3050: 0a 20 20 20 20 20 20 74 65 73 74 43 6f 6d 70 61  .      testCompa
3060: 72 65 43 6b 73 75 6d 4c 73 6d 64 62 28 44 42 4e  reCksumLsmdb(DBN
3070: 41 4d 45 2c 20 62 43 6f 6d 70 72 65 73 73 2c 0a  AME, bCompress,.
3080: 20 20 20 20 20 20 20 20 74 65 73 74 43 6b 73 75          testCksu
3090: 6d 41 72 72 61 79 47 65 74 28 70 43 6b 73 75 6d  mArrayGet(pCksum
30a0: 44 62 2c 20 31 31 30 20 2b 20 69 4f 70 65 6e 2a  Db, 110 + iOpen*
30b0: 31 30 29 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  10), 0,.        
30c0: 70 52 63 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  pRc.      );.   
30d0: 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 44 61   }.  }..  testDa
30e0: 74 61 73 6f 75 72 63 65 46 72 65 65 28 70 44 61  tasourceFree(pDa
30f0: 74 61 29 3b 0a 20 20 74 65 73 74 43 6b 73 75 6d  ta);.  testCksum
3100: 41 72 72 61 79 46 72 65 65 28 70 43 6b 73 75 6d  ArrayFree(pCksum
3110: 44 62 29 3b 0a 7d 0a 0a 76 6f 69 64 20 64 6f 5f  Db);.}..void do_
3120: 63 72 61 73 68 5f 74 65 73 74 28 63 6f 6e 73 74  crash_test(const
3130: 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c   char *zPattern,
3140: 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 73 74   int *pRc){.  st
3150: 72 75 63 74 20 54 65 73 74 20 7b 0a 20 20 20 20  ruct Test {.    
3160: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 73  const char *zTes
3170: 74 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 29  t;.    void (*x)
3180: 28 69 6e 74 2c 20 69 6e 74 20 2a 29 3b 0a 20 20  (int, int *);.  
3190: 20 20 69 6e 74 20 62 43 6f 6d 70 72 65 73 73 3b    int bCompress;
31a0: 0a 20 20 7d 20 61 54 65 73 74 20 5b 5d 20 3d 20  .  } aTest [] = 
31b0: 7b 0a 20 20 20 20 7b 20 22 63 72 61 73 68 2e 6c  {.    { "crash.l
31c0: 73 6d 2e 31 22 2c 20 20 20 20 20 63 72 61 73 68  sm.1",     crash
31d0: 5f 74 65 73 74 31 2c 20 30 20 7d 2c 0a 23 69 66  _test1, 0 },.#if
31e0: 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 0a 20 20  def HAVE_ZLIB.  
31f0: 20 20 7b 20 22 63 72 61 73 68 2e 6c 73 6d 5f 7a    { "crash.lsm_z
3200: 69 70 2e 31 22 2c 20 63 72 61 73 68 5f 74 65 73  ip.1", crash_tes
3210: 74 31 2c 20 31 20 7d 2c 0a 23 65 6e 64 69 66 0a  t1, 1 },.#endif.
3220: 20 20 20 20 7b 20 22 63 72 61 73 68 2e 6c 73 6d      { "crash.lsm
3230: 2e 32 22 2c 20 20 20 20 20 63 72 61 73 68 5f 74  .2",     crash_t
3240: 65 73 74 32 2c 20 30 20 7d 2c 0a 20 20 20 20 7b  est2, 0 },.    {
3250: 20 22 63 72 61 73 68 2e 6c 73 6d 2e 33 22 2c 20   "crash.lsm.3", 
3260: 20 20 20 20 63 72 61 73 68 5f 74 65 73 74 33 2c      crash_test3,
3270: 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74   0 },.  };.  int
3280: 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   i;..  for(i=0; 
3290: 2a 70 52 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  *pRc==LSM_OK && 
32a0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54 65 73  i<ArraySize(aTes
32b0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  t); i++){.    st
32c0: 72 75 63 74 20 54 65 73 74 20 2a 70 20 3d 20 26  ruct Test *p = &
32d0: 61 54 65 73 74 5b 69 5d 3b 0a 20 20 20 20 69 66  aTest[i];.    if
32e0: 28 20 74 65 73 74 43 61 73 65 42 65 67 69 6e 28  ( testCaseBegin(
32f0: 70 52 63 2c 20 7a 50 61 74 74 65 72 6e 2c 20 22  pRc, zPattern, "
3300: 25 73 22 2c 20 70 2d 3e 7a 54 65 73 74 29 20 29  %s", p->zTest) )
3310: 7b 0a 20 20 20 20 20 20 70 2d 3e 78 28 70 2d 3e  {.      p->x(p->
3320: 62 43 6f 6d 70 72 65 73 73 2c 20 70 52 63 29 3b  bCompress, pRc);
3330: 0a 20 20 20 20 20 20 74 65 73 74 43 61 73 65 46  .      testCaseF
3340: 69 6e 69 73 68 28 2a 70 52 63 29 3b 0a 20 20 20  inish(*pRc);.   
3350: 20 7d 0a 20 20 7d 0a 7d 0a                        }.  }.}.