/ Hex Artifact Content
Login

Artifact 9fc98427d1e23e84429d7e6d07d9094fbdec65a5:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  /*.** This progr
0010: 61 6d 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  am is used to ge
0020: 6e 65 72 61 74 65 20 61 6e 64 20 76 65 72 69 66  nerate and verif
0030: 79 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  y databases with
0040: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   hot journals..*
0050: 2a 20 55 73 65 20 74 68 69 73 20 70 72 6f 67 72  * Use this progr
0060: 61 6d 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  am to generate a
0070: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20   hot journal on 
0080: 6f 6e 65 20 6d 61 63 68 69 6e 65 20 61 6e 64 20  one machine and 
0090: 76 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 69  verify.** that i
00a0: 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 63 6f 72  t rolls back cor
00b0: 72 65 63 74 6c 79 20 6f 6e 20 61 6e 6f 74 68 65  rectly on anothe
00c0: 72 20 6d 61 63 68 69 6e 65 20 77 69 74 68 20 61  r machine with a
00d0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 61 72   different.** ar
00e0: 63 68 69 74 65 63 74 75 72 65 2e 0a 2a 2a 0a 2a  chitecture..**.*
00f0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
0100: 20 20 20 72 6f 6c 6c 62 61 63 6b 2d 74 65 73 74     rollback-test
0110: 20 6e 65 77 20 5b 2d 75 74 66 38 5d 20 5b 2d 75   new [-utf8] [-u
0120: 74 66 31 36 6c 65 5d 20 5b 2d 75 74 66 31 36 62  tf16le] [-utf16b
0130: 65 5d 20 5b 2d 70 61 67 65 73 69 7a 65 3d 4e 5d  e] [-pagesize=N]
0140: 20 44 41 54 41 42 41 53 45 0a 2a 2a 20 20 20 20   DATABASE.**    
0150: 20 72 6f 6c 6c 62 61 63 6b 2d 74 65 73 74 20 63   rollback-test c
0160: 68 65 63 6b 20 44 41 54 41 42 41 53 45 0a 2a 2a  heck DATABASE.**
0170: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2d 74 65       rollback-te
0180: 73 74 20 63 72 61 73 68 20 5b 2d 77 61 6c 5d 20  st crash [-wal] 
0190: 5b 2d 72 6f 6c 6c 62 61 63 6b 5d 20 44 41 54 41  [-rollback] DATA
01a0: 42 41 53 45 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  BASE.*/.#include
01b0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
01c0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
01d0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
01e0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  h>.#include "sql
01f0: 69 74 65 33 2e 68 22 0a 0a 73 74 61 74 69 63 20  ite3.h"..static 
0200: 76 6f 69 64 20 75 73 61 67 65 28 63 68 61 72 20  void usage(char 
0210: 2a 61 72 67 76 30 29 7b 0a 20 20 66 70 72 69 6e  *argv0){.  fprin
0220: 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 22  tf(stderr,.    "
0230: 55 73 61 67 65 3a 20 25 73 20 6e 65 77 20 5b 2d  Usage: %s new [-
0240: 75 74 66 38 5d 20 5b 2d 75 74 66 31 36 6c 65 5d  utf8] [-utf16le]
0250: 20 5b 2d 75 74 66 31 36 62 65 5d 20 5b 2d 70 61   [-utf16be] [-pa
0260: 67 65 73 69 7a 65 3d 4e 5d 20 44 41 54 41 42 41  gesize=N] DATABA
0270: 53 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  SE\n".    "     
0280: 20 20 25 73 20 63 68 65 63 6b 20 44 41 54 41 42    %s check DATAB
0290: 41 53 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ASE\n".    "    
02a0: 20 20 20 25 73 20 63 72 61 73 68 20 5b 2d 77 61     %s crash [-wa
02b0: 6c 5d 20 44 41 54 41 42 41 53 45 5c 6e 22 2c 0a  l] DATABASE\n",.
02c0: 20 20 20 20 61 72 67 76 30 2c 20 61 72 67 76 30      argv0, argv0
02d0: 2c 20 61 72 67 76 30 0a 20 20 29 3b 0a 20 20 65  , argv0.  );.  e
02e0: 78 69 74 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69  xit(1);.}..stati
02f0: 63 20 73 71 6c 69 74 65 33 20 2a 6f 70 65 6e 44  c sqlite3 *openD
0300: 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  b(const char *zF
0310: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
0320: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
0330: 62 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  b;.  rc = sqlite
0340: 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  3_open(zFilename
0350: 2c 20 26 64 62 29 3b 0a 20 20 69 66 28 20 72 63  , &db);.  if( rc
0360: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
0370: 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20  stderr, "Cannot 
0380: 6f 70 65 6e 20 5c 22 25 73 5c 22 3a 20 25 73 5c  open \"%s\": %s\
0390: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
03a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  zFilename, sqlit
03b0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
03c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
03d0: 65 28 64 62 29 3b 0a 20 20 20 20 65 78 69 74 28  e(db);.    exit(
03e0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
03f0: 20 64 62 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   db;.}..static i
0400: 6e 74 20 6e 52 65 70 6c 79 20 3d 20 30 3b 0a 73  nt nReply = 0;.s
0410: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 70 6c  tatic char zRepl
0420: 79 5b 31 30 30 30 5d 3b 0a 0a 73 74 61 74 69 63  y[1000];..static
0430: 20 69 6e 74 20 65 78 65 63 43 61 6c 6c 62 61 63   int execCallbac
0440: 6b 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c  k(void *NotUsed,
0450: 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
0460: 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
0470: 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 2c  azCol){.  int i,
0480: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   n;.  char *z;. 
0490: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
04a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d 20  ; i++){.    z = 
04b0: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 66  azArg[i];.    if
04c0: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 4e 55  ( z==0 ) z = "NU
04d0: 4c 4c 22 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  LL";.    if( nRe
04e0: 70 6c 79 3e 30 20 26 26 20 6e 52 65 70 6c 79 3c  ply>0 && nReply<
04f0: 73 69 7a 65 6f 66 28 7a 52 65 70 6c 79 29 2d 31  sizeof(zReply)-1
0500: 20 29 20 7a 52 65 70 6c 79 5b 6e 52 65 70 6c 79   ) zReply[nReply
0510: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 6e  ++] = ' ';.    n
0520: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
0530: 20 20 69 66 28 20 6e 52 65 70 6c 79 2b 6e 3e 3d    if( nReply+n>=
0540: 73 69 7a 65 6f 66 28 7a 52 65 70 6c 79 29 2d 31  sizeof(zReply)-1
0550: 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 52   ) n = sizeof(zR
0560: 65 70 6c 79 29 20 2d 20 6e 52 65 70 6c 79 20 2d  eply) - nReply -
0570: 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   1;.    memcpy(&
0580: 7a 52 65 70 6c 79 5b 6e 52 65 70 6c 79 5d 2c 20  zReply[nReply], 
0590: 7a 2c 20 6e 29 3b 0a 20 20 20 20 6e 52 65 70 6c  z, n);.    nRepl
05a0: 79 20 2b 3d 20 6e 3b 0a 20 20 20 20 7a 52 65 70  y += n;.    zRep
05b0: 6c 79 5b 6e 52 65 70 6c 79 5d 20 3d 20 30 3b 0a  ly[nReply] = 0;.
05c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
05d0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  }..static void r
05e0: 75 6e 53 71 6c 28 73 71 6c 69 74 65 33 20 2a 64  unSql(sqlite3 *d
05f0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
0600: 53 71 6c 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  Sql){.  char *zE
0610: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  rr = 0;.  int rc
0620: 3b 0a 20 20 6e 52 65 70 6c 79 20 3d 20 30 3b 0a  ;.  nReply = 0;.
0630: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
0640: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78  xec(db, zSql, ex
0650: 65 63 43 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 26  ecCallback, 0, &
0660: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 7a 45 72  zErr);.  if( zEr
0670: 72 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  r ){.    fprintf
0680: 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72  (stderr, "SQL er
0690: 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
06a0: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
06b0: 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a    }.  if( rc ){.
06c0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
06d0: 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20  rr, "SQL error: 
06e0: 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
06f0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
0700: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  exit(1);.  }.}..
0710: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
0720: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
0730: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0740: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
0750: 61 72 67 63 3c 33 20 29 20 75 73 61 67 65 28 61  argc<3 ) usage(a
0760: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 73  rgv[0]);.  if( s
0770: 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22  trcmp(argv[1], "
0780: 6e 65 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  new")==0 ){.    
0790: 64 62 20 3d 20 6f 70 65 6e 44 62 28 61 72 67 76  db = openDb(argv
07a0: 5b 61 72 67 63 2d 31 5d 29 3b 0a 20 20 20 20 66  [argc-1]);.    f
07b0: 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 2d 31  or(i=2; i<argc-1
07c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
07d0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
07e0: 2c 22 2d 75 74 66 38 22 29 3d 3d 30 20 29 7b 0a  ,"-utf8")==0 ){.
07f0: 20 20 20 20 20 20 20 20 72 75 6e 53 71 6c 28 64          runSql(d
0800: 62 2c 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64  b, "PRAGMA encod
0810: 69 6e 67 3d 55 54 46 38 22 29 3b 0a 20 20 20 20  ing=UTF8");.    
0820: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
0830: 6d 70 28 61 72 67 76 5b 69 5d 2c 20 22 2d 75 74  mp(argv[i], "-ut
0840: 66 31 36 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  f16le")==0 ){.  
0850: 20 20 20 20 20 20 72 75 6e 53 71 6c 28 64 62 2c        runSql(db,
0860: 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e   "PRAGMA encodin
0870: 67 3d 55 54 46 31 36 4c 45 22 29 3b 0a 20 20 20  g=UTF16LE");.   
0880: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
0890: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 20 22 2d 75  cmp(argv[i], "-u
08a0: 74 66 31 36 62 65 22 29 3d 3d 30 20 29 7b 0a 20  tf16be")==0 ){. 
08b0: 20 20 20 20 20 20 20 72 75 6e 53 71 6c 28 64 62         runSql(db
08c0: 2c 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69  , "PRAGMA encodi
08d0: 6e 67 3d 55 54 46 31 36 42 45 22 29 3b 0a 20 20  ng=UTF16BE");.  
08e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
08f0: 72 6e 63 6d 70 28 61 72 67 76 5b 69 5d 2c 20 22  rncmp(argv[i], "
0900: 2d 70 61 67 65 73 69 7a 65 3d 22 2c 20 31 30 29  -pagesize=", 10)
0910: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
0920: 6e 74 20 73 7a 50 67 20 3d 20 61 74 6f 69 28 26  nt szPg = atoi(&
0930: 61 72 67 76 5b 69 5d 5b 31 30 5d 29 3b 0a 20 20  argv[i][10]);.  
0940: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
0950: 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70  100];.        sp
0960: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 50 52 41  rintf(zBuf, "PRA
0970: 47 4d 41 20 70 61 67 65 73 69 7a 65 3d 25 64 22  GMA pagesize=%d"
0980: 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20  , szPg);.       
0990: 20 72 75 6e 53 71 6c 28 64 62 2c 20 7a 42 75 66   runSql(db, zBuf
09a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
09b0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
09c0: 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e  stderr, "unknown
09d0: 20 6f 70 74 69 6f 6e 20 25 73 5c 6e 22 2c 20 61   option %s\n", a
09e0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
09f0: 20 75 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b   usage(argv[0]);
0a00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0a10: 20 20 20 72 75 6e 53 71 6c 28 64 62 2c 20 0a 20     runSql(db, . 
0a20: 20 20 20 20 20 20 22 42 45 47 49 4e 3b 22 0a 20        "BEGIN;". 
0a30: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
0a40: 42 4c 45 20 74 31 28 78 20 49 4e 54 45 47 45 52  BLE t1(x INTEGER
0a50: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
0a60: 3b 22 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52  ;".       "INSER
0a70: 54 20 49 4e 54 4f 20 74 31 28 79 29 20 56 41 4c  T INTO t1(y) VAL
0a80: 55 45 53 28 27 61 62 63 64 65 66 67 68 69 6a 6b  UES('abcdefghijk
0a90: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 27  lmnopqrstuvwxyz'
0aa0: 29 3b 22 0a 20 20 20 20 20 20 20 22 49 4e 53 45  );".       "INSE
0ab0: 52 54 20 49 4e 54 4f 20 74 31 28 79 29 20 56 41  RT INTO t1(y) VA
0ac0: 4c 55 45 53 28 27 61 62 63 64 65 66 67 68 69 6a  LUES('abcdefghij
0ad0: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
0ae0: 27 29 3b 22 0a 20 20 20 20 20 20 20 22 49 4e 53  ');".       "INS
0af0: 45 52 54 20 49 4e 54 4f 20 74 31 28 79 29 20 53  ERT INTO t1(y) S
0b00: 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 3b  ELECT y FROM t1;
0b10: 22 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20  " /* 4 */.      
0b20: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   "INSERT INTO t1
0b30: 28 79 29 20 53 45 4c 45 43 54 20 79 20 46 52 4f  (y) SELECT y FRO
0b40: 4d 20 74 31 3b 22 20 2f 2a 20 38 20 2a 2f 0a 20  M t1;" /* 8 */. 
0b50: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
0b60: 54 4f 20 74 31 28 79 29 20 53 45 4c 45 43 54 20  TO t1(y) SELECT 
0b70: 79 20 46 52 4f 4d 20 74 31 3b 22 20 2f 2a 20 31  y FROM t1;" /* 1
0b80: 36 20 2a 2f 0a 20 20 20 20 20 20 20 22 49 4e 53  6 */.       "INS
0b90: 45 52 54 20 49 4e 54 4f 20 74 31 28 79 29 20 53  ERT INTO t1(y) S
0ba0: 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 3b  ELECT y FROM t1;
0bb0: 22 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20  " /* 32 */.     
0bc0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
0bd0: 31 28 79 29 20 53 45 4c 45 43 54 20 79 20 46 52  1(y) SELECT y FR
0be0: 4f 4d 20 74 31 3b 22 20 2f 2a 20 36 34 20 2a 2f  OM t1;" /* 64 */
0bf0: 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20  .       "INSERT 
0c00: 49 4e 54 4f 20 74 31 28 79 29 20 53 45 4c 45 43  INTO t1(y) SELEC
0c10: 54 20 79 20 46 52 4f 4d 20 74 31 3b 22 20 2f 2a  T y FROM t1;" /*
0c20: 20 31 32 38 20 2a 2f 0a 20 20 20 20 20 20 20 22   128 */.       "
0c30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 79  INSERT INTO t1(y
0c40: 29 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20  ) SELECT y FROM 
0c50: 74 31 3b 22 20 2f 2a 20 32 35 36 20 2a 2f 0a 20  t1;" /* 256 */. 
0c60: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
0c70: 54 4f 20 74 31 28 79 29 20 53 45 4c 45 43 54 20  TO t1(y) SELECT 
0c80: 79 20 46 52 4f 4d 20 74 31 3b 22 20 2f 2a 20 35  y FROM t1;" /* 5
0c90: 31 32 20 2a 2f 0a 20 20 20 20 20 20 20 22 49 4e  12 */.       "IN
0ca0: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 79 29 20  SERT INTO t1(y) 
0cb0: 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31  SELECT y FROM t1
0cc0: 3b 22 20 2f 2a 20 31 30 32 34 20 2a 2f 0a 20 20  ;" /* 1024 */.  
0cd0: 20 20 20 20 20 22 55 50 44 41 54 45 20 74 31 20       "UPDATE t1 
0ce0: 53 45 54 20 79 3d 28 79 20 7c 7c 20 78 29 3b 22  SET y=(y || x);"
0cf0: 0a 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20  .       "CREATE 
0d00: 49 4e 44 45 58 20 74 31 79 20 4f 4e 20 74 31 28  INDEX t1y ON t1(
0d10: 79 29 3b 22 0a 20 20 20 20 20 20 20 22 43 4f 4d  y);".       "COM
0d20: 4d 49 54 3b 22 0a 20 20 20 20 29 3b 0a 20 20 20  MIT;".    );.   
0d30: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
0d40: 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  b);.  }else if( 
0d50: 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20  strcmp(argv[1], 
0d60: 22 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20  "check")==0 ){. 
0d70: 20 20 20 64 62 20 3d 20 6f 70 65 6e 44 62 28 61     db = openDb(a
0d80: 72 67 76 5b 61 72 67 63 2d 31 5d 29 3b 0a 20 20  rgv[argc-1]);.  
0d90: 20 20 72 75 6e 53 71 6c 28 64 62 2c 20 22 50 52    runSql(db, "PR
0da0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
0db0: 68 65 63 6b 22 29 3b 0a 20 20 20 20 69 66 28 20  heck");.    if( 
0dc0: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 20 22  strcmp(zReply, "
0dd0: 6f 6b 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ok")!=0 ){.     
0de0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
0df0: 20 22 49 6e 74 65 67 72 69 74 79 20 63 68 65 63   "Integrity chec
0e00: 6b 3a 20 25 73 5c 6e 22 2c 20 7a 52 65 70 6c 79  k: %s\n", zReply
0e10: 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  );.      exit(1)
0e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 75 6e 53  ;.    }.    runS
0e30: 71 6c 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53  ql(db, .      "S
0e40: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
0e50: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 79 3c 3e  ROM t1 WHERE y<>
0e60: 28 27 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  ('abcdefghijklmn
0e70: 6f 70 71 72 73 74 75 76 77 78 79 7a 27 20 7c 7c  opqrstuvwxyz' ||
0e80: 20 78 29 22 0a 20 20 20 20 29 3b 0a 20 20 20 20   x)".    );.    
0e90: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
0ea0: 79 2c 20 22 30 22 29 21 3d 30 20 29 7b 0a 20 20  y, "0")!=0 ){.  
0eb0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
0ec0: 72 72 2c 20 22 57 72 6f 6e 67 20 63 6f 6e 74 65  rr, "Wrong conte
0ed0: 6e 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  nt\n");.      ex
0ee0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
0ef0: 20 70 72 69 6e 74 66 28 22 4f 6b 5c 6e 22 29 3b   printf("Ok\n");
0f00: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
0f10: 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 63 72  cmp(argv[1], "cr
0f20: 61 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ash")==0 ){.    
0f30: 64 62 20 3d 20 6f 70 65 6e 44 62 28 61 72 67 76  db = openDb(argv
0f40: 5b 61 72 67 63 2d 31 5d 29 3b 0a 20 20 20 20 66  [argc-1]);.    f
0f50: 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 2d 31  or(i=2; i<argc-1
0f60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
0f70: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
0f80: 2c 22 2d 77 61 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"-wal")==0 ){. 
0f90: 20 20 20 20 20 20 20 72 75 6e 53 71 6c 28 64 62         runSql(db
0fa0: 2c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  , "PRAGMA journa
0fb0: 6c 5f 6d 6f 64 65 3d 57 41 4c 22 29 3b 0a 20 20  l_mode=WAL");.  
0fc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
0fd0: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 20 22 2d  rcmp(argv[i], "-
0fe0: 72 6f 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b  rollback")==0 ){
0ff0: 0a 20 20 20 20 20 20 20 20 72 75 6e 53 71 6c 28  .        runSql(
1000: 64 62 2c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  db, "PRAGMA jour
1010: 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45 54 45 22  nal_mode=DELETE"
1020: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1030: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1040: 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e  stderr, "unknown
1050: 20 6f 70 74 69 6f 6e 20 25 73 5c 6e 22 2c 20 61   option %s\n", a
1060: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
1070: 20 75 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b   usage(argv[0]);
1080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1090: 20 20 20 72 75 6e 53 71 6c 28 64 62 2c 0a 20 20     runSql(db,.  
10a0: 20 20 20 20 22 50 52 41 47 4d 41 20 63 61 63 68      "PRAGMA cach
10b0: 65 5f 73 69 7a 65 3d 31 30 3b 22 0a 20 20 20 20  e_size=10;".    
10c0: 20 20 22 42 45 47 49 4e 3b 22 0a 20 20 20 20 20    "BEGIN;".     
10d0: 20 22 55 50 44 41 54 45 20 74 31 20 53 45 54 20   "UPDATE t1 SET 
10e0: 79 3d 28 79 20 7c 7c 20 2d 78 29 22 0a 20 20 20  y=(y || -x)".   
10f0: 20 29 3b 0a 20 20 20 20 65 78 69 74 28 30 29 3b   );.    exit(0);
1100: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 73  .  }else{.    us
1110: 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  age(argv[0]);.  
1120: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.