/ Hex Artifact Content
Login

Artifact 09c1c7d728ccf4feb9e481671e29dda5669bbcc2:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  /*.** This progr
0010: 61 6d 20 74 65 73 74 73 20 74 68 65 20 61 62 69  am tests the abi
0020: 6c 69 74 79 20 6f 66 20 53 51 4c 69 74 65 20 64  lity of SQLite d
0030: 61 74 61 62 61 73 65 20 74 6f 20 72 65 63 6f 76  atabase to recov
0040: 65 72 20 66 72 6f 6d 20 61 20 63 72 61 73 68 2e  er from a crash.
0050: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0060: 20 72 75 6e 73 20 75 6e 64 65 72 20 55 6e 69 78   runs under Unix
0070: 20 6f 6e 6c 79 2c 20 62 75 74 20 74 68 65 20 72   only, but the r
0080: 65 73 75 6c 74 73 20 61 72 65 20 61 70 70 6c 69  esults are appli
0090: 63 61 62 6c 65 20 74 6f 20 61 6c 6c 0a 2a 2a 20  cable to all.** 
00a0: 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54  systems..**.** T
00b0: 68 65 20 6d 61 69 6e 20 70 72 6f 63 65 73 73 20  he main process 
00c0: 66 69 72 73 74 20 63 6f 6e 73 74 72 75 63 74 73  first constructs
00d0: 20 61 20 74 65 73 74 20 64 61 74 61 62 61 73 65   a test database
00e0: 2c 20 74 68 65 6e 20 73 74 61 72 74 73 20 63 72  , then starts cr
00f0: 65 61 74 69 6e 67 0a 2a 2a 20 73 75 62 70 72 6f  eating.** subpro
0100: 63 65 73 73 65 73 20 74 68 61 74 20 77 72 69 74  cesses that writ
0110: 65 20 74 6f 20 74 68 61 74 20 64 61 74 61 62 61  e to that databa
0120: 73 65 2e 20 20 45 61 63 68 20 73 75 62 70 72 6f  se.  Each subpro
0130: 63 65 73 73 20 69 73 20 6b 69 6c 6c 65 64 20 6f  cess is killed o
0140: 66 66 2c 0a 2a 2a 20 77 69 74 68 6f 75 74 20 61  ff,.** without a
0150: 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 6e   chance to clean
0160: 20 75 70 20 69 74 73 20 64 61 74 61 62 61 73 65   up its database
0170: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 61 66 74   connection, aft
0180: 65 72 20 61 20 72 61 6e 64 6f 6d 0a 2a 2a 20 64  er a random.** d
0190: 65 6c 61 79 2e 20 20 54 68 69 73 20 6b 69 6c 6c  elay.  This kill
01a0: 69 6e 67 20 6f 66 20 74 68 65 20 73 75 62 70 72  ing of the subpr
01b0: 6f 63 65 73 73 65 73 20 73 69 6d 75 6c 61 74 65  ocesses simulate
01c0: 73 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  s a crash or pow
01d0: 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 2e 20 20  er.** failure.  
01e0: 54 68 65 20 6e 65 78 74 20 73 75 62 70 72 6f 63  The next subproc
01f0: 65 73 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ess to open the 
0200: 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
0210: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 61 74  rollback.** what
0220: 65 76 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 77  ever operation w
0230: 61 73 20 69 6e 20 70 72 6f 63 65 73 73 20 61 74  as in process at
0240: 20 74 68 65 20 74 69 6d 65 20 6f 66 20 74 68 65   the time of the
0250: 20 73 69 6d 75 6c 61 74 65 64 20 63 72 61 73 68   simulated crash
0260: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 70  ..**.** If any p
0270: 72 6f 62 6c 65 6d 73 20 61 72 65 20 65 6e 63 6f  roblems are enco
0280: 75 6e 74 65 72 65 64 2c 20 61 6e 20 65 72 72 6f  untered, an erro
0290: 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 61 6e  r is reported an
02a0: 64 20 74 68 65 20 74 65 73 74 20 73 74 6f 70 73  d the test stops
02b0: 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70 72 6f 62 6c  ..** If no probl
02c0: 65 6d 73 20 61 72 65 20 73 65 65 6e 20 61 66 74  ems are seen aft
02d0: 65 72 20 61 20 6c 61 72 67 65 20 6e 75 6d 62 65  er a large numbe
02e0: 72 20 6f 66 20 74 65 73 74 73 2c 20 77 65 20 61  r of tests, we a
02f0: 73 73 75 6d 65 20 74 68 61 74 0a 2a 2a 20 74 68  ssume that.** th
0300: 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 65 63 68 61  e rollback mecha
0310: 6e 69 73 6d 20 69 73 20 77 6f 72 6b 69 6e 67 2e  nism is working.
0320: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .*/.#include <st
0330: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
0340: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
0350: 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68  ude <sys/types.h
0360: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0370: 77 61 69 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  wait.h>.#include
0380: 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23 69 6e 63   <signal.h>.#inc
0390: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
03a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
03b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 63  .h>.#include <sc
03c0: 68 65 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  hed.h>.#include 
03d0: 22 73 71 6c 69 74 65 2e 68 22 0a 0a 73 74 61 74  "sqlite.h"..stat
03e0: 69 63 20 76 6f 69 64 20 64 6f 5f 73 6f 6d 65 5f  ic void do_some_
03f0: 73 71 6c 28 69 6e 74 20 70 61 72 65 6e 74 29 7b  sql(int parent){
0400: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
0410: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
0420: 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  _OK;.  sqlite *d
0430: 62 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  b;.  int cnt = 0
0440: 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
0450: 7a 42 69 67 5b 5d 20 3d 20 0a 20 20 20 20 22 2d  zBig[] = .    "-
0460: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
0470: 71 72 73 74 75 76 77 78 79 7a 41 42 43 44 45 46  qrstuvwxyzABCDEF
0480: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
0490: 57 58 59 5a 22 0a 20 20 20 20 22 2d 61 62 63 64  WXYZ".    "-abcd
04a0: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
04b0: 75 76 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a  uvwxyzABCDEFGHIJ
04c0: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
04d0: 22 3b 0a 0a 20 20 69 66 28 20 61 63 63 65 73 73  ";..  if( access
04e0: 28 22 2e 2f 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ("./test.db-jour
04f0: 6e 61 6c 22 2c 30 29 3d 3d 30 20 29 7b 0a 20 20  nal",0)==0 ){.  
0500: 20 20 2f 2a 70 72 69 6e 74 66 28 22 70 69 64 20    /*printf("pid 
0510: 25 64 3a 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  %d: journal exis
0520: 74 73 2e 20 20 72 6f 6c 6c 62 61 63 6b 20 77 69  ts.  rollback wi
0530: 6c 6c 20 62 65 20 72 65 71 75 69 72 65 64 5c 6e  ll be required\n
0540: 22 2c 67 65 74 70 69 64 28 29 29 3b 2a 2f 20 20  ",getpid());*/  
0550: 20 20 75 6e 6c 69 6e 6b 28 22 74 65 73 74 2e 64    unlink("test.d
0560: 62 2d 73 61 76 65 64 22 29 3b 0a 20 20 20 20 73  b-saved");.    s
0570: 79 73 74 65 6d 28 22 63 70 20 74 65 73 74 2e 64  ystem("cp test.d
0580: 62 20 74 65 73 74 2e 64 62 2d 73 61 76 65 64 22  b test.db-saved"
0590: 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 22 74  );.    unlink("t
05a0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 2d 73  est.db-journal-s
05b0: 61 76 65 64 22 29 3b 0a 20 20 20 20 73 79 73 74  aved");.    syst
05c0: 65 6d 28 22 63 70 20 74 65 73 74 2e 64 62 2d 6a  em("cp test.db-j
05d0: 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 2d 6a  ournal test.db-j
05e0: 6f 75 72 6e 61 6c 2d 73 61 76 65 64 22 29 3b 0a  ournal-saved");.
05f0: 20 20 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74    }.  db = sqlit
0600: 65 5f 6f 70 65 6e 28 22 2e 2f 74 65 73 74 2e 64  e_open("./test.d
0610: 62 22 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20  b", 0, &zErr);. 
0620: 20 69 66 28 20 64 62 3d 3d 30 20 29 7b 0a 20 20   if( db==0 ){.  
0630: 20 20 70 72 69 6e 74 66 28 22 45 52 52 4f 52 3a    printf("ERROR:
0640: 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
0650: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 45     if( strcmp(zE
0660: 72 72 2c 22 64 61 74 61 62 61 73 65 20 64 69 73  rr,"database dis
0670: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
0680: 72 6d 65 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rmed")==0 ){.   
0690: 20 20 20 6b 69 6c 6c 28 70 61 72 65 6e 74 2c 20     kill(parent, 
06a0: 53 49 47 4b 49 4c 4c 29 3b 0a 20 20 20 20 7d 0a  SIGKILL);.    }.
06b0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
06c0: 0a 20 20 73 72 61 6e 64 28 67 65 74 70 69 64 28  .  srand(getpid(
06d0: 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  ));.  while( rc=
06e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
06f0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 63 20    cnt++;.    rc 
0700: 3d 20 73 71 6c 69 74 65 5f 65 78 65 63 5f 70 72  = sqlite_exec_pr
0710: 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
0720: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   "INSERT INTO t1
0730: 20 56 41 4c 55 45 53 28 25 64 2c 27 25 64 25 73   VALUES(%d,'%d%s
0740: 27 29 22 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  ')", 0, 0, &zErr
0750: 2c 0a 20 20 20 20 20 20 20 72 61 6e 64 28 29 2c  ,.       rand(),
0760: 20 72 61 6e 64 28 29 2c 20 7a 42 69 67 29 3b 0a   rand(), zBig);.
0770: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
0780: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
0790: 72 69 6e 74 66 28 22 45 52 52 4f 52 20 23 25 64  rintf("ERROR #%d
07a0: 3a 20 25 73 5c 6e 22 2c 20 72 63 2c 20 7a 45 72  : %s\n", rc, zEr
07b0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
07c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
07d0: 7b 0a 20 20 20 20 20 20 6b 69 6c 6c 28 70 61 72  {.      kill(par
07e0: 65 6e 74 2c 20 53 49 47 4b 49 4c 4c 29 3b 0a 20  ent, SIGKILL);. 
07f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 72 69 6e 74     }.  }.  print
0800: 66 28 22 70 69 64 20 25 64 3a 20 63 6e 74 3d 25  f("pid %d: cnt=%
0810: 64 5c 6e 22 2c 20 67 65 74 70 69 64 28 29 2c 20  d\n", getpid(), 
0820: 63 6e 74 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61  cnt);.}...int ma
0830: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
0840: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  r **argv){.  int
0850: 20 69 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   i;.  sqlite *db
0860: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  ;.  char *zErr;.
0870: 20 20 69 6e 74 20 73 74 61 74 75 73 3b 0a 20 20    int status;.  
0880: 69 6e 74 20 70 61 72 65 6e 74 20 3d 20 67 65 74  int parent = get
0890: 70 69 64 28 29 3b 0a 0a 20 20 75 6e 6c 69 6e 6b  pid();..  unlink
08a0: 28 22 74 65 73 74 2e 64 62 22 29 3b 0a 20 20 75  ("test.db");.  u
08b0: 6e 6c 69 6e 6b 28 22 74 65 73 74 2e 64 62 2d 6a  nlink("test.db-j
08c0: 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 64 62 20 3d  ournal");.  db =
08d0: 20 73 71 6c 69 74 65 5f 6f 70 65 6e 28 22 74 65   sqlite_open("te
08e0: 73 74 2e 64 62 22 2c 20 30 2c 20 26 7a 45 72 72  st.db", 0, &zErr
08f0: 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
0900: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 61  {.    printf("Ca
0910: 6e 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 3a  nnot initialize:
0920: 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
0930: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
0940: 0a 20 20 73 71 6c 69 74 65 5f 65 78 65 63 28 64  .  sqlite_exec(d
0950: 62 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  b, "CREATE TABLE
0960: 20 74 31 28 61 2c 62 29 22 2c 20 30 2c 20 30 2c   t1(a,b)", 0, 0,
0970: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 5f 63 6c   0);.  sqlite_cl
0980: 6f 73 65 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  ose(db);.  for(i
0990: 3d 30 3b 20 69 3c 31 30 30 30 30 3b 20 69 2b 2b  =0; i<10000; i++
09a0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 20 3d  ){.    int pid =
09b0: 20 66 6f 72 6b 28 29 3b 0a 20 20 20 20 69 66 28   fork();.    if(
09c0: 20 70 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pid==0 ){.     
09d0: 20 73 63 68 65 64 5f 79 69 65 6c 64 28 29 3b 0a   sched_yield();.
09e0: 20 20 20 20 20 20 64 6f 5f 73 6f 6d 65 5f 73 71        do_some_sq
09f0: 6c 28 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 20  l(parent);.     
0a00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
0a10: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 74 65 73  .    printf("tes
0a20: 74 20 25 64 2c 20 70 69 64 3d 25 64 5c 6e 22 2c  t %d, pid=%d\n",
0a30: 20 69 2c 20 70 69 64 29 3b 0a 20 20 20 20 75 73   i, pid);.    us
0a40: 6c 65 65 70 28 72 61 6e 64 28 29 25 31 30 30 30  leep(rand()%1000
0a50: 30 20 2b 20 31 30 30 30 29 3b 0a 20 20 20 20 6b  0 + 1000);.    k
0a60: 69 6c 6c 28 70 69 64 2c 20 53 49 47 4b 49 4c 4c  ill(pid, SIGKILL
0a70: 29 3b 0a 20 20 20 20 77 61 69 74 70 69 64 28 70  );.    waitpid(p
0a80: 69 64 2c 20 26 73 74 61 74 75 73 2c 20 30 29 3b  id, &status, 0);
0a90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
0aa0: 0a 7d 0a                                         .}.