/ Hex Artifact Content
Login

Artifact edc1f96fd5e0e4b16eb03e2a73041013d59e8723:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 20 4a 61 6e 75 61  /*.** 2017 Janua
0010: 72 79 20 33 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ry 31.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u 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 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
0190: 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 61  ource code for a
01a0: 20 73 74 61 6e 64 61 6c 6f 6e 65 20 70 72 6f 67   standalone prog
01b0: 72 61 6d 20 75 73 65 64 20 74 6f 0a 2a 2a 20 74  ram used to.** t
01c0: 65 73 74 20 74 68 65 20 70 65 72 66 6f 72 6d 61  est the performa
01d0: 6e 63 65 20 6f 66 20 74 68 65 20 73 65 73 73 69  nce of the sessi
01e0: 6f 6e 73 20 6d 6f 64 75 6c 65 2e 20 43 6f 6d 70  ons module. Comp
01f0: 69 6c 65 20 61 6e 64 20 72 75 6e 3a 0a 2a 2a 0a  ile and run:.**.
0200: 2a 2a 20 20 20 2e 2f 73 65 73 73 69 6f 6e 5f 73  **   ./session_s
0210: 70 65 65 64 5f 74 65 73 74 20 2d 68 65 6c 70 0a  peed_test -help.
0220: 2a 2a 0a 2a 2a 20 66 6f 72 20 64 65 74 61 69 6c  **.** for detail
0230: 73 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20  s..*/..#include 
0240: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63  "sqlite3.h".#inc
0250: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0260: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0270: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
0280: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0290: 3c 73 74 64 64 65 66 2e 68 3e 0a 23 69 6e 63 6c  <stddef.h>.#incl
02a0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 0a  ude <unistd.h>..
02b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 74  **********.** St
0300: 61 72 74 20 6f 66 20 67 65 6e 65 72 69 63 20 63  art of generic c
0310: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 61 72 73  ommand line pars
0320: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  er..*/.#define C
0330: 4d 44 4c 49 4e 45 5f 42 41 52 45 20 20 20 20 20  MDLINE_BARE     
0340: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 4d 44 4c    0.#define CMDL
0350: 49 4e 45 5f 49 4e 54 45 47 45 52 20 20 20 20 31  INE_INTEGER    1
0360: 0a 23 64 65 66 69 6e 65 20 43 4d 44 4c 49 4e 45  .#define CMDLINE
0370: 5f 53 54 52 49 4e 47 20 20 20 20 20 32 0a 23 64  _STRING     2.#d
0380: 65 66 69 6e 65 20 43 4d 44 4c 49 4e 45 5f 42 4f  efine CMDLINE_BO
0390: 4f 4c 45 41 4e 20 20 20 20 33 0a 0a 74 79 70 65  OLEAN    3..type
03a0: 64 65 66 20 73 74 72 75 63 74 20 43 6d 64 4c 69  def struct CmdLi
03b0: 6e 65 4f 70 74 69 6f 6e 20 43 6d 64 4c 69 6e 65  neOption CmdLine
03c0: 4f 70 74 69 6f 6e 3b 0a 73 74 72 75 63 74 20 43  Option;.struct C
03d0: 6d 64 4c 69 6e 65 4f 70 74 69 6f 6e 20 7b 0a 20  mdLineOption {. 
03e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
03f0: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
0400: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6d 6d   /* Name of comm
0410: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and line option 
0420: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0430: 2a 7a 48 65 6c 70 3b 20 20 20 20 20 20 20 20 20  *zHelp;         
0440: 20 20 20 20 20 2f 2a 20 48 65 6c 70 20 74 65 78       /* Help tex
0450: 74 20 66 6f 72 20 6f 70 74 69 6f 6e 20 2a 2f 0a  t for option */.
0460: 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
0490: 43 4d 44 4c 49 4e 45 5f 2a 20 76 61 6c 75 65 73  CMDLINE_* values
04a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
04d0: 6f 66 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  of output variab
04e0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  le */.};..#defin
04f0: 65 20 43 4d 44 4c 49 4e 45 5f 49 4e 54 33 32 28  e CMDLINE_INT32(
0500: 78 2c 79 2c 7a 29 20 7b 78 2c 20 79 2c 20 43 4d  x,y,z) {x, y, CM
0510: 44 4c 49 4e 45 5f 49 4e 54 45 47 45 52 2c 20 7a  DLINE_INTEGER, z
0520: 7d 0a 23 64 65 66 69 6e 65 20 43 4d 44 4c 49 4e  }.#define CMDLIN
0530: 45 5f 42 4f 4f 4c 28 78 2c 79 2c 7a 29 20 20 7b  E_BOOL(x,y,z)  {
0540: 78 2c 20 79 2c 20 43 4d 44 4c 49 4e 45 5f 42 4f  x, y, CMDLINE_BO
0550: 4f 4c 45 41 4e 2c 20 7a 7d 0a 23 64 65 66 69 6e  OLEAN, z}.#defin
0560: 65 20 43 4d 44 4c 49 4e 45 5f 54 45 58 54 28 78  e CMDLINE_TEXT(x
0570: 2c 79 2c 7a 29 20 20 7b 78 2c 20 79 2c 20 43 4d  ,y,z)  {x, y, CM
0580: 44 4c 49 4e 45 5f 53 54 52 49 4e 47 2c 20 7a 7d  DLINE_STRING, z}
0590: 0a 23 64 65 66 69 6e 65 20 43 4d 44 4c 49 4e 45  .#define CMDLINE
05a0: 5f 4e 4f 4e 45 28 78 2c 79 2c 7a 29 20 20 7b 78  _NONE(x,y,z)  {x
05b0: 2c 20 79 2c 20 43 4d 44 4c 49 4e 45 5f 42 41 52  , y, CMDLINE_BAR
05c0: 45 2c 20 7a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  E, z}..static vo
05d0: 69 64 20 6f 70 74 69 6f 6e 5f 72 65 71 75 69 72  id option_requir
05e0: 65 73 5f 61 72 67 75 6d 65 6e 74 5f 65 72 72 6f  es_argument_erro
05f0: 72 28 43 6d 64 4c 69 6e 65 4f 70 74 69 6f 6e 20  r(CmdLineOption 
0600: 2a 70 4f 70 74 29 7b 0a 20 20 66 70 72 69 6e 74  *pOpt){.  fprint
0610: 66 28 73 74 64 65 72 72 2c 20 22 4f 70 74 69 6f  f(stderr, "Optio
0620: 6e 20 72 65 71 75 69 72 65 73 20 61 25 73 20 61  n requires a%s a
0630: 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20  rgument: %s\n", 
0640: 0a 20 20 20 20 20 20 70 4f 70 74 2d 3e 65 54 79  .      pOpt->eTy
0650: 70 65 3d 3d 43 4d 44 4c 49 4e 45 5f 49 4e 54 45  pe==CMDLINE_INTE
0660: 47 45 52 20 3f 20 22 6e 20 69 6e 74 65 67 65 72  GER ? "n integer
0670: 22 20 3a 0a 20 20 20 20 20 20 70 4f 70 74 2d 3e  " :.      pOpt->
0680: 65 54 79 70 65 3d 3d 43 4d 44 4c 49 4e 45 5f 53  eType==CMDLINE_S
0690: 54 52 49 4e 47 20 3f 20 22 20 73 74 72 69 6e 67  TRING ? " string
06a0: 22 20 3a 20 22 20 62 6f 6f 6c 65 61 6e 22 2c 0a  " : " boolean",.
06b0: 20 20 20 20 20 20 70 4f 70 74 2d 3e 7a 54 65 78        pOpt->zTex
06c0: 74 0a 20 20 29 3b 0a 20 20 65 78 69 74 28 31 29  t.  );.  exit(1)
06d0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
06e0: 20 61 6d 62 69 67 75 6f 75 73 5f 6f 70 74 69 6f   ambiguous_optio
06f0: 6e 5f 65 72 72 6f 72 28 63 6f 6e 73 74 20 63 68  n_error(const ch
0700: 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 66 70 72  ar *zArg){.  fpr
0710: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 70  intf(stderr, "Op
0720: 74 69 6f 6e 20 69 73 20 61 6d 62 69 67 75 6f 75  tion is ambiguou
0730: 73 3a 20 25 73 5c 6e 22 2c 20 7a 41 72 67 29 3b  s: %s\n", zArg);
0740: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 73  .  exit(1);.}..s
0750: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6b 6e 6f  tatic void unkno
0760: 77 6e 5f 6f 70 74 69 6f 6e 5f 65 72 72 6f 72 28  wn_option_error(
0770: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0780: 41 72 67 2c 20 0a 20 20 43 6d 64 4c 69 6e 65 4f  Arg, .  CmdLineO
0790: 70 74 69 6f 6e 20 2a 61 4f 70 74 2c 0a 20 20 63  ption *aOpt,.  c
07a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48 65 6c 70  onst char *zHelp
07b0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
07c0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
07d0: 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  Unknown option: 
07e0: 25 73 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a 20 20  %s\n", zArg);.  
07f0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0800: 22 5c 6e 4f 70 74 69 6f 6e 73 20 61 72 65 3a 5c  "\nOptions are:\
0810: 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  n");.  fprintf(s
0820: 74 64 65 72 72 2c 20 22 20 20 25 20 2d 33 30 73  tderr, "  % -30s
0830: 45 63 68 6f 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  Echo command lin
0840: 65 20 6f 70 74 69 6f 6e 73 5c 6e 22 2c 20 22 2d  e options\n", "-
0850: 63 6d 64 6c 69 6e 65 3a 76 65 72 62 6f 73 65 22  cmdline:verbose"
0860: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 4f  );.  for(i=0; aO
0870: 70 74 5b 69 5d 2e 7a 54 65 78 74 3b 20 69 2b 2b  pt[i].zText; i++
0880: 29 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  ){.    int eType
0890: 20 3d 20 61 4f 70 74 5b 69 5d 2e 65 54 79 70 65   = aOpt[i].eType
08a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74  ;.    char *zOpt
08b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
08c0: 74 66 28 22 25 73 20 25 73 22 2c 20 61 4f 70 74  tf("%s %s", aOpt
08d0: 5b 69 5d 2e 7a 54 65 78 74 2c 0a 20 20 20 20 20  [i].zText,.     
08e0: 20 20 20 65 54 79 70 65 3d 3d 43 4d 44 4c 49 4e     eType==CMDLIN
08f0: 45 5f 42 41 52 45 20 3f 20 22 22 20 3a 0a 20 20  E_BARE ? "" :.  
0900: 20 20 20 20 20 20 65 54 79 70 65 3d 3d 43 4d 44        eType==CMD
0910: 4c 49 4e 45 5f 49 4e 54 45 47 45 52 20 3f 20 22  LINE_INTEGER ? "
0920: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 65 54 79  N" :.        eTy
0930: 70 65 3d 3d 43 4d 44 4c 49 4e 45 5f 42 4f 4f 4c  pe==CMDLINE_BOOL
0940: 45 41 4e 20 3f 20 22 42 4f 4f 4c 45 41 4e 22 20  EAN ? "BOOLEAN" 
0950: 3a 20 22 54 45 58 54 22 0a 20 20 20 20 29 3b 0a  : "TEXT".    );.
0960: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
0970: 72 72 2c 20 22 20 20 25 20 2d 33 30 73 25 73 5c  rr, "  % -30s%s\
0980: 6e 22 2c 20 7a 4f 70 74 2c 20 61 4f 70 74 5b 69  n", zOpt, aOpt[i
0990: 5d 2e 7a 48 65 6c 70 29 3b 0a 20 20 20 20 73 71  ].zHelp);.    sq
09a0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 74 29  lite3_free(zOpt)
09b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 48 65 6c  ;.  }.  if( zHel
09c0: 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  p ){.    fprintf
09d0: 28 73 74 64 65 72 72 2c 20 22 5c 6e 25 73 5c 6e  (stderr, "\n%s\n
09e0: 22 2c 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 0a 20  ", zHelp);.  }. 
09f0: 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 73 74 61   exit(1);.}..sta
0a00: 74 69 63 20 69 6e 74 20 67 65 74 5f 69 6e 74 65  tic int get_inte
0a10: 67 65 72 5f 6f 70 74 69 6f 6e 28 43 6d 64 4c 69  ger_option(CmdLi
0a20: 6e 65 4f 70 74 69 6f 6e 20 2a 70 4f 70 74 2c 20  neOption *pOpt, 
0a30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
0a40: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
0a50: 20 20 69 6e 74 20 69 52 65 74 20 3d 20 30 3b 0a    int iRet = 0;.
0a60: 20 20 69 6e 74 20 62 53 69 67 6e 20 3d 20 31 3b    int bSign = 1;
0a70: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
0a80: 27 2d 27 20 29 7b 0a 20 20 20 20 62 53 69 67 6e  '-' ){.    bSign
0a90: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 20 3d 20 31   = -1;.    i = 1
0aa0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a  ;.  }.  while( z
0ab0: 41 72 67 5b 69 5d 20 29 7b 0a 20 20 20 20 69 66  Arg[i] ){.    if
0ac0: 28 20 7a 41 72 67 5b 69 5d 3c 27 30 27 20 7c 7c  ( zArg[i]<'0' ||
0ad0: 20 7a 41 72 67 5b 69 5d 3e 27 39 27 20 29 20 6f   zArg[i]>'9' ) o
0ae0: 70 74 69 6f 6e 5f 72 65 71 75 69 72 65 73 5f 61  ption_requires_a
0af0: 72 67 75 6d 65 6e 74 5f 65 72 72 6f 72 28 70 4f  rgument_error(pO
0b00: 70 74 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20  pt);.    iRet = 
0b10: 69 52 65 74 2a 31 30 20 2b 20 28 7a 41 72 67 5b  iRet*10 + (zArg[
0b20: 69 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 69  i] - '0');.    i
0b30: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
0b40: 20 28 69 52 65 74 2a 62 53 69 67 6e 29 3b 0a 7d   (iRet*bSign);.}
0b50: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  ..static int get
0b60: 5f 62 6f 6f 6c 65 61 6e 5f 6f 70 74 69 6f 6e 28  _boolean_option(
0b70: 43 6d 64 4c 69 6e 65 4f 70 74 69 6f 6e 20 2a 70  CmdLineOption *p
0b80: 4f 70 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Opt, const char 
0b90: 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20 30 3d  *zArg){.  if( 0=
0ba0: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
0bb0: 28 7a 41 72 67 2c 20 22 74 72 75 65 22 29 20 29  (zArg, "true") )
0bc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
0bd0: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
0be0: 63 6d 70 28 7a 41 72 67 2c 20 22 31 22 29 20 29  cmp(zArg, "1") )
0bf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
0c00: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
0c10: 63 6d 70 28 7a 41 72 67 2c 20 22 30 22 29 20 29  cmp(zArg, "0") )
0c20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
0c30: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
0c40: 63 6d 70 28 7a 41 72 67 2c 20 22 66 61 6c 73 65  cmp(zArg, "false
0c50: 22 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ") ) return 0;. 
0c60: 20 6f 70 74 69 6f 6e 5f 72 65 71 75 69 72 65 73   option_requires
0c70: 5f 61 72 67 75 6d 65 6e 74 5f 65 72 72 6f 72 28  _argument_error(
0c80: 70 4f 70 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  pOpt);.  return 
0c90: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
0ca0: 64 20 70 61 72 73 65 5f 63 6f 6d 6d 61 6e 64 5f  d parse_command_
0cb0: 6c 69 6e 65 28 0a 20 20 69 6e 74 20 61 72 67 63  line(.  int argc
0cc0: 2c 20 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  , .  char **argv
0cd0: 2c 20 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  , .  int iStart,
0ce0: 0a 20 20 43 6d 64 4c 69 6e 65 4f 70 74 69 6f 6e  .  CmdLineOption
0cf0: 20 2a 61 4f 70 74 2c 0a 20 20 76 6f 69 64 20 2a   *aOpt,.  void *
0d00: 70 53 74 72 75 63 74 2c 0a 20 20 63 6f 6e 73 74  pStruct,.  const
0d10: 20 63 68 61 72 20 2a 7a 48 65 6c 70 0a 29 7b 0a   char *zHelp.){.
0d20: 20 20 63 68 61 72 20 2a 70 4f 75 74 20 3d 20 28    char *pOut = (
0d30: 63 68 61 72 2a 29 70 53 74 72 75 63 74 3b 0a 20  char*)pStruct;. 
0d40: 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20   int bVerbose = 
0d50: 30 3b 0a 20 20 69 6e 74 20 69 41 72 67 3b 0a 0a  0;.  int iArg;..
0d60: 20 20 66 6f 72 28 69 41 72 67 3d 69 53 74 61 72    for(iArg=iStar
0d70: 74 3b 20 69 41 72 67 3c 61 72 67 63 3b 20 69 41  t; iArg<argc; iA
0d80: 72 67 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74  rg++){.    const
0d90: 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 61 72   char *zArg = ar
0da0: 67 76 5b 69 41 72 67 5d 3b 0a 20 20 20 20 69 6e  gv[iArg];.    in
0db0: 74 20 6e 41 72 67 20 3d 20 73 74 72 6c 65 6e 28  t nArg = strlen(
0dc0: 7a 41 72 67 29 3b 0a 20 20 20 20 69 6e 74 20 6e  zArg);.    int n
0dd0: 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Match = 0;.    i
0de0: 6e 74 20 69 4f 70 74 3b 0a 0a 20 20 20 20 66 6f  nt iOpt;..    fo
0df0: 72 28 69 4f 70 74 3d 30 3b 20 61 4f 70 74 5b 69  r(iOpt=0; aOpt[i
0e00: 4f 70 74 5d 2e 7a 54 65 78 74 3b 20 69 4f 70 74  Opt].zText; iOpt
0e10: 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6d 64 4c 69  ++){.      CmdLi
0e20: 6e 65 4f 70 74 69 6f 6e 20 2a 70 4f 70 74 20 3d  neOption *pOpt =
0e30: 20 26 61 4f 70 74 5b 69 4f 70 74 5d 3b 0a 20 20   &aOpt[iOpt];.  
0e40: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
0e50: 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 4f 70 74  e3_strnicmp(pOpt
0e60: 2d 3e 7a 54 65 78 74 2c 20 7a 41 72 67 2c 20 6e  ->zText, zArg, n
0e70: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Arg) ){.        
0e80: 69 66 28 20 6e 4d 61 74 63 68 20 29 7b 0a 20 20  if( nMatch ){.  
0e90: 20 20 20 20 20 20 20 20 61 6d 62 69 67 75 6f 75          ambiguou
0ea0: 73 5f 6f 70 74 69 6f 6e 5f 65 72 72 6f 72 28 7a  s_option_error(z
0eb0: 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Arg);.        }.
0ec0: 20 20 20 20 20 20 20 20 6e 4d 61 74 63 68 2b 2b          nMatch++
0ed0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
0ee0: 70 74 2d 3e 65 54 79 70 65 3d 3d 43 4d 44 4c 49  pt->eType==CMDLI
0ef0: 4e 45 5f 42 41 52 45 20 29 7b 0a 20 20 20 20 20  NE_BARE ){.     
0f00: 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 26 70 4f       *(int*)(&pO
0f10: 75 74 5b 70 4f 70 74 2d 3e 69 4f 66 66 5d 29 20  ut[pOpt->iOff]) 
0f20: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
0f30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 41  se{.          iA
0f40: 72 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  rg++;.          
0f50: 69 66 28 20 69 41 72 67 3d 3d 61 72 67 63 20 29  if( iArg==argc )
0f60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  {.            op
0f70: 74 69 6f 6e 5f 72 65 71 75 69 72 65 73 5f 61 72  tion_requires_ar
0f80: 67 75 6d 65 6e 74 5f 65 72 72 6f 72 28 70 4f 70  gument_error(pOp
0f90: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
0fa0: 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
0fb0: 28 20 70 4f 70 74 2d 3e 65 54 79 70 65 20 29 7b  ( pOpt->eType ){
0fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
0fd0: 65 20 43 4d 44 4c 49 4e 45 5f 49 4e 54 45 47 45  e CMDLINE_INTEGE
0fe0: 52 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R:.             
0ff0: 20 2a 28 69 6e 74 2a 29 28 26 70 4f 75 74 5b 70   *(int*)(&pOut[p
1000: 4f 70 74 2d 3e 69 4f 66 66 5d 29 20 3d 20 67 65  Opt->iOff]) = ge
1010: 74 5f 69 6e 74 65 67 65 72 5f 6f 70 74 69 6f 6e  t_integer_option
1020: 28 70 4f 70 74 2c 20 61 72 67 76 5b 69 41 72 67  (pOpt, argv[iArg
1030: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
1040: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1050: 20 20 20 20 20 63 61 73 65 20 43 4d 44 4c 49 4e       case CMDLIN
1060: 45 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  E_STRING:.      
1070: 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20          *(const 
1080: 63 68 61 72 2a 2a 29 28 26 70 4f 75 74 5b 70 4f  char**)(&pOut[pO
1090: 70 74 2d 3e 69 4f 66 66 5d 29 20 3d 20 61 72 67  pt->iOff]) = arg
10a0: 76 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  v[iArg];.       
10b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10c0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 43            case C
10d0: 4d 44 4c 49 4e 45 5f 42 4f 4f 4c 45 41 4e 3a 0a  MDLINE_BOOLEAN:.
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28                *(
10f0: 69 6e 74 2a 29 28 26 70 4f 75 74 5b 70 4f 70 74  int*)(&pOut[pOpt
1100: 2d 3e 69 4f 66 66 5d 29 20 3d 20 67 65 74 5f 62  ->iOff]) = get_b
1110: 6f 6f 6c 65 61 6e 5f 6f 70 74 69 6f 6e 28 70 4f  oolean_option(pO
1120: 70 74 2c 20 61 72 67 76 5b 69 41 72 67 5d 29 3b  pt, argv[iArg]);
1130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
1140: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1150: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1160: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
1170: 66 28 20 6e 4d 61 74 63 68 3d 3d 30 20 26 26 20  f( nMatch==0 && 
1180: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
1190: 63 6d 70 28 22 2d 63 6d 64 6c 69 6e 65 3a 76 65  cmp("-cmdline:ve
11a0: 72 62 6f 73 65 22 2c 20 7a 41 72 67 2c 20 6e 41  rbose", zArg, nA
11b0: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 62 56 65  rg) ){.      bVe
11c0: 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 20  rbose = 1;.     
11d0: 20 6e 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20   nMatch = 1;.   
11e0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 74   }..    if( nMat
11f0: 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  ch==0 ){.      u
1200: 6e 6b 6e 6f 77 6e 5f 6f 70 74 69 6f 6e 5f 65 72  nknown_option_er
1210: 72 6f 72 28 7a 41 72 67 2c 20 61 4f 70 74 2c 20  ror(zArg, aOpt, 
1220: 7a 48 65 6c 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zHelp);.    }.  
1230: 7d 0a 0a 20 20 69 66 28 20 62 56 65 72 62 6f 73  }..  if( bVerbos
1240: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 70  e ){.    int iOp
1250: 74 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  t;.    fprintf(s
1260: 74 64 6f 75 74 2c 20 22 4f 70 74 69 6f 6e 73 20  tdout, "Options 
1270: 61 72 65 3a 20 22 29 3b 0a 20 20 20 20 66 6f 72  are: ");.    for
1280: 28 69 4f 70 74 3d 30 3b 20 61 4f 70 74 5b 69 4f  (iOpt=0; aOpt[iO
1290: 70 74 5d 2e 7a 54 65 78 74 3b 20 69 4f 70 74 2b  pt].zText; iOpt+
12a0: 2b 29 7b 0a 20 20 20 20 20 20 43 6d 64 4c 69 6e  +){.      CmdLin
12b0: 65 4f 70 74 69 6f 6e 20 2a 70 4f 70 74 20 3d 20  eOption *pOpt = 
12c0: 26 61 4f 70 74 5b 69 4f 70 74 5d 3b 0a 20 20 20  &aOpt[iOpt];.   
12d0: 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 65 54 79     if( pOpt->eTy
12e0: 70 65 21 3d 43 4d 44 4c 49 4e 45 5f 42 41 52 45  pe!=CMDLINE_BARE
12f0: 20 7c 7c 20 2a 28 69 6e 74 2a 29 28 26 70 4f 75   || *(int*)(&pOu
1300: 74 5b 70 4f 70 74 2d 3e 69 4f 66 66 5d 29 20 29  t[pOpt->iOff]) )
1310: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1320: 66 28 73 74 64 6f 75 74 2c 20 22 25 73 20 22 2c  f(stdout, "%s ",
1330: 20 70 4f 70 74 2d 3e 7a 54 65 78 74 29 3b 0a 20   pOpt->zText);. 
1340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69       }.      swi
1350: 74 63 68 28 20 70 4f 70 74 2d 3e 65 54 79 70 65  tch( pOpt->eType
1360: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
1370: 20 43 4d 44 4c 49 4e 45 5f 49 4e 54 45 47 45 52   CMDLINE_INTEGER
1380: 3a 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  :.          fpri
1390: 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 64 20  ntf(stdout, "%d 
13a0: 22 2c 20 2a 28 69 6e 74 2a 29 28 26 70 4f 75 74  ", *(int*)(&pOut
13b0: 5b 70 4f 70 74 2d 3e 69 4f 66 66 5d 29 29 3b 0a  [pOpt->iOff]));.
13c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
13d0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 43 4d  .        case CM
13e0: 44 4c 49 4e 45 5f 42 4f 4f 4c 45 41 4e 3a 0a 20  DLINE_BOOLEAN:. 
13f0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
1400: 28 73 74 64 6f 75 74 2c 20 22 25 64 20 22 2c 20  (stdout, "%d ", 
1410: 2a 28 69 6e 74 2a 29 28 26 70 4f 75 74 5b 70 4f  *(int*)(&pOut[pO
1420: 70 74 2d 3e 69 4f 66 66 5d 29 29 3b 0a 20 20 20  pt->iOff]));.   
1430: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1440: 20 20 20 20 20 20 63 61 73 65 20 43 4d 44 4c 49        case CMDLI
1450: 4e 45 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  NE_STRING:.     
1460: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1470: 6f 75 74 2c 20 22 25 73 20 22 2c 20 2a 28 63 6f  out, "%s ", *(co
1480: 6e 73 74 20 63 68 61 72 2a 2a 29 28 26 70 4f 75  nst char**)(&pOu
1490: 74 5b 70 4f 70 74 2d 3e 69 4f 66 66 5d 29 29 3b  t[pOpt->iOff]));
14a0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
14b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14c0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f      fprintf(stdo
14d0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  ut, "\n");.  }.}
14e0: 0a 2f 2a 20 0a 2a 2a 20 45 6e 64 20 6f 66 20 67  ./* .** End of g
14f0: 65 6e 65 72 69 63 20 63 6f 6d 6d 61 6e 64 20 6c  eneric command l
1500: 69 6e 65 20 70 61 72 73 65 72 2e 0a 2a 2a 2a 2a  ine parser..****
1510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1550: 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63 20 76  *****/..static v
1560: 6f 69 64 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oid abort_due_to
1570: 5f 65 72 72 6f 72 28 69 6e 74 20 72 63 29 7b 0a  _error(int rc){.
1580: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1590: 2c 20 22 45 72 72 6f 72 3a 20 25 64 5c 6e 22 29  , "Error: %d\n")
15a0: 3b 0a 20 20 65 78 69 74 28 2d 31 29 3b 0a 7d 0a  ;.  exit(-1);.}.
15b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 65  .static void exe
15c0: 63 73 71 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  csql(sqlite3 *db
15d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
15e0: 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ql){.  int rc = 
15f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
1600: 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
1610: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1620: 45 5f 4f 4b 20 29 20 61 62 6f 72 74 5f 64 75 65  E_OK ) abort_due
1630: 5f 74 6f 5f 65 72 72 6f 72 28 72 63 29 3b 0a 7d  _to_error(rc);.}
1640: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 78 43 6f  ..static int xCo
1650: 6e 66 6c 69 63 74 28 76 6f 69 64 20 2a 70 43 74  nflict(void *pCt
1660: 78 2c 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74  x, int eConflict
1670: 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  , sqlite3_change
1680: 73 65 74 5f 69 74 65 72 20 2a 70 29 7b 0a 20 20  set_iter *p){.  
1690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 48  return SQLITE_CH
16a0: 41 4e 47 45 53 45 54 5f 41 42 4f 52 54 3b 0a 7d  ANGESET_ABORT;.}
16b0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 75  ..static void ru
16c0: 6e 5f 74 65 73 74 28 0a 20 20 73 71 6c 69 74 65  n_test(.  sqlite
16d0: 33 20 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74 65  3 *db, .  sqlite
16e0: 33 20 2a 64 62 32 2c 20 0a 20 20 69 6e 74 20 6e  3 *db2, .  int n
16f0: 52 6f 77 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Row, .  const ch
1700: 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 73 71  ar *zSql.){.  sq
1710: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
1720: 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73  Session = 0;.  s
1730: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1740: 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
1750: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1760: 20 6e 43 68 61 6e 67 65 73 65 74 3b 0a 20 20 76   nChangeset;.  v
1770: 6f 69 64 20 2a 70 43 68 61 6e 67 65 73 65 74 3b  oid *pChangeset;
1780: 0a 0a 20 20 2f 2a 20 41 74 74 61 63 68 20 61 20  ..  /* Attach a 
1790: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  session object t
17a0: 6f 20 64 61 74 61 62 61 73 65 20 64 62 20 2a 2f  o database db */
17b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73  .  rc = sqlite3s
17c0: 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 64 62  ession_create(db
17d0: 2c 20 22 6d 61 69 6e 22 2c 20 26 70 53 65 73 73  , "main", &pSess
17e0: 69 6f 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ion);.  if( rc!=
17f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61 62 6f 72  SQLITE_OK ) abor
1800: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 28 72  t_due_to_error(r
1810: 63 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 66 69 67  c);..  /* Config
1820: 75 72 65 20 74 68 65 20 73 65 73 73 69 6f 6e 20  ure the session 
1830: 74 6f 20 63 61 70 74 75 72 65 20 63 68 61 6e 67  to capture chang
1840: 65 73 20 6f 6e 20 61 6c 6c 20 74 61 62 6c 65 73  es on all tables
1850: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1860: 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68  e3session_attach
1870: 28 70 53 65 73 73 69 6f 6e 2c 20 30 29 3b 0a 20  (pSession, 0);. 
1880: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1890: 4f 4b 20 29 20 61 62 6f 72 74 5f 64 75 65 5f 74  OK ) abort_due_t
18a0: 6f 5f 65 72 72 6f 72 28 72 63 29 3b 0a 0a 20 20  o_error(rc);..  
18b0: 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 53  /* Prepare the S
18c0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
18d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
18e0: 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c  repare(db, zSql,
18f0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1900: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1910: 45 5f 4f 4b 20 29 20 61 62 6f 72 74 5f 64 75 65  E_OK ) abort_due
1920: 5f 74 6f 5f 65 72 72 6f 72 28 72 63 29 3b 0a 0a  _to_error(rc);..
1930: 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61 6e    /* Open a tran
1940: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 65 78 65  saction */.  exe
1950: 63 73 71 6c 28 64 62 2c 20 22 42 45 47 49 4e 22  csql(db, "BEGIN"
1960: 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  );..  /* Execute
1970: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1980: 6e 74 20 6e 52 6f 77 20 74 69 6d 65 73 20 2a 2f  nt nRow times */
1990: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
19a0: 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ow; i++){.    sq
19b0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
19c0: 53 74 6d 74 2c 20 31 2c 20 69 29 3b 0a 20 20 20  Stmt, 1, i);.   
19d0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
19e0: 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tmt);.    rc = s
19f0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
1a00: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  mt);.    if( rc!
1a10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61 62 6f  =SQLITE_OK ) abo
1a20: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 28  rt_due_to_error(
1a30: 72 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rc);.  }.  sqlit
1a40: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1a50: 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  t);..  /* Extrac
1a60: 74 20 61 20 63 68 61 6e 67 65 73 65 74 20 66 72  t a changeset fr
1a70: 6f 6d 20 74 68 65 20 73 65 73 73 69 6f 6e 73 20  om the sessions 
1a80: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 72 63 20 3d  object */.  rc =
1a90: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
1aa0: 63 68 61 6e 67 65 73 65 74 28 70 53 65 73 73 69  changeset(pSessi
1ab0: 6f 6e 2c 20 26 6e 43 68 61 6e 67 65 73 65 74 2c  on, &nChangeset,
1ac0: 20 26 70 43 68 61 6e 67 65 73 65 74 29 3b 0a 20   &pChangeset);. 
1ad0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ae0: 4f 4b 20 29 20 61 62 6f 72 74 5f 64 75 65 5f 74  OK ) abort_due_t
1af0: 6f 5f 65 72 72 6f 72 28 72 63 29 3b 0a 20 20 65  o_error(rc);.  e
1b00: 78 65 63 73 71 6c 28 64 62 2c 20 22 43 4f 4d 4d  xecsql(db, "COMM
1b10: 49 54 22 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 6c  IT");..  /* Appl
1b20: 79 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  y the changeset 
1b30: 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 64 62  to the second db
1b40: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1b50: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
1b60: 79 28 64 62 32 2c 20 6e 43 68 61 6e 67 65 73 65  y(db2, nChangese
1b70: 74 2c 20 70 43 68 61 6e 67 65 73 65 74 2c 20 30  t, pChangeset, 0
1b80: 2c 20 78 43 6f 6e 66 6c 69 63 74 2c 20 30 29 3b  , xConflict, 0);
1b90: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ba0: 45 5f 4f 4b 20 29 20 61 62 6f 72 74 5f 64 75 65  E_OK ) abort_due
1bb0: 5f 74 6f 5f 65 72 72 6f 72 28 72 63 29 3b 0a 0a  _to_error(rc);..
1bc0: 20 20 2f 2a 20 43 6c 65 61 6e 75 70 20 2a 2f 0a    /* Cleanup */.
1bd0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1be0: 43 68 61 6e 67 65 73 65 74 29 3b 0a 20 20 73 71  Changeset);.  sq
1bf0: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c  lite3session_del
1c00: 65 74 65 28 70 53 65 73 73 69 6f 6e 29 3b 0a 7d  ete(pSession);.}
1c10: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
1c20: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
1c30: 29 7b 0a 20 20 73 74 72 75 63 74 20 4f 70 74 69  ){.  struct Opti
1c40: 6f 6e 73 20 7b 0a 20 20 20 20 69 6e 74 20 6e 52  ons {.    int nR
1c50: 6f 77 3b 0a 20 20 20 20 69 6e 74 20 62 57 69 74  ow;.    int bWit
1c60: 68 6f 75 74 52 6f 77 69 64 3b 0a 20 20 20 20 69  houtRowid;.    i
1c70: 6e 74 20 62 49 6e 74 65 67 65 72 3b 0a 20 20 20  nt bInteger;.   
1c80: 20 69 6e 74 20 62 41 6c 6c 3b 0a 20 20 20 20 63   int bAll;.    c
1c90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
1ca0: 20 20 7d 3b 0a 20 20 73 74 72 75 63 74 20 4f 70    };.  struct Op
1cb0: 74 69 6f 6e 73 20 6f 20 3d 20 7b 20 32 35 30 30  tions o = { 2500
1cc0: 2c 20 30 2c 20 30 2c 20 30 2c 20 22 73 65 73 73  , 0, 0, 0, "sess
1cd0: 69 6f 6e 5f 73 70 65 65 64 5f 74 65 73 74 2e 64  ion_speed_test.d
1ce0: 62 22 20 7d 3b 0a 0a 20 20 43 6d 64 4c 69 6e 65  b" };..  CmdLine
1cf0: 4f 70 74 69 6f 6e 20 61 4f 70 74 5b 5d 20 3d 20  Option aOpt[] = 
1d00: 7b 0a 20 20 20 20 43 4d 44 4c 49 4e 45 5f 49 4e  {.    CMDLINE_IN
1d10: 54 33 32 28 20 22 2d 72 6f 77 73 22 2c 20 22 6e  T32( "-rows", "n
1d20: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1d30: 20 74 65 73 74 22 2c 0a 20 20 20 20 20 20 6f 66   test",.      of
1d40: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 4f 70  fsetof(struct Op
1d50: 74 69 6f 6e 73 2c 20 6e 52 6f 77 29 20 29 2c 0a  tions, nRow) ),.
1d60: 20 20 20 20 43 4d 44 4c 49 4e 45 5f 42 4f 4f 4c      CMDLINE_BOOL
1d70: 28 22 2d 77 69 74 68 6f 75 74 2d 72 6f 77 69 64  ("-without-rowid
1d80: 22 2c 20 22 75 73 65 20 57 49 54 48 4f 55 54 20  ", "use WITHOUT 
1d90: 52 4f 57 49 44 20 74 61 62 6c 65 73 22 2c 20 0a  ROWID tables", .
1da0: 20 20 20 20 20 20 6f 66 66 73 65 74 6f 66 28 73        offsetof(s
1db0: 74 72 75 63 74 20 4f 70 74 69 6f 6e 73 2c 20 62  truct Options, b
1dc0: 57 69 74 68 6f 75 74 52 6f 77 69 64 29 20 29 2c  WithoutRowid) ),
1dd0: 0a 20 20 20 20 43 4d 44 4c 49 4e 45 5f 42 4f 4f  .    CMDLINE_BOO
1de0: 4c 28 22 2d 69 6e 74 65 67 65 72 22 2c 20 22 75  L("-integer", "u
1df0: 73 65 20 69 6e 74 65 67 65 72 20 64 61 74 61 20  se integer data 
1e00: 28 69 6e 73 74 65 61 64 20 6f 66 20 74 65 78 74  (instead of text
1e10: 2f 62 6c 6f 62 73 29 22 2c 0a 20 20 20 20 20 20  /blobs)",.      
1e20: 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20  offsetof(struct 
1e30: 4f 70 74 69 6f 6e 73 2c 20 62 49 6e 74 65 67 65  Options, bIntege
1e40: 72 29 20 29 2c 0a 20 20 20 20 43 4d 44 4c 49 4e  r) ),.    CMDLIN
1e50: 45 5f 4e 4f 4e 45 28 22 2d 61 6c 6c 22 2c 20 22  E_NONE("-all", "
1e60: 52 75 6e 20 61 6c 6c 20 34 20 63 6f 6d 62 6f 73  Run all 4 combos
1e70: 20 6f 66 20 2d 77 69 74 68 6f 75 74 2d 72 6f 77   of -without-row
1e80: 69 64 20 61 6e 64 20 2d 69 6e 74 65 67 65 72 22  id and -integer"
1e90: 2c 0a 20 20 20 20 20 20 6f 66 66 73 65 74 6f 66  ,.      offsetof
1ea0: 28 73 74 72 75 63 74 20 4f 70 74 69 6f 6e 73 2c  (struct Options,
1eb0: 20 62 41 6c 6c 29 20 29 2c 0a 20 20 20 20 43 4d   bAll) ),.    CM
1ec0: 44 4c 49 4e 45 5f 54 45 58 54 28 22 2d 64 61 74  DLINE_TEXT("-dat
1ed0: 61 62 61 73 65 22 2c 20 22 70 72 65 66 69 78 20  abase", "prefix 
1ee0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
1ef0: 65 73 20 74 6f 20 75 73 65 22 2c 0a 20 20 20 20  es to use",.    
1f00: 20 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63    offsetof(struc
1f10: 74 20 4f 70 74 69 6f 6e 73 2c 20 7a 44 62 29 20  t Options, zDb) 
1f20: 29 2c 0a 20 20 20 20 7b 30 2c 20 30 2c 20 30 2c  ),.    {0, 0, 0,
1f30: 20 30 7d 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73   0}.  };..  cons
1f40: 74 20 63 68 61 72 20 2a 61 7a 43 72 65 61 74 65  t char *azCreate
1f50: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 43 52 45 41  [] = {.    "CREA
1f60: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
1f70: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c  IMARY KEY, b, c,
1f80: 20 64 29 22 2c 0a 20 20 20 20 22 43 52 45 41 54   d)",.    "CREAT
1f90: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
1fa0: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c 20  MARY KEY, b, c, 
1fb0: 64 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  d) WITHOUT ROWID
1fc0: 22 2c 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74  ",.  };..  const
1fd0: 20 63 68 61 72 20 2a 61 7a 49 6e 73 65 72 74 5b   char *azInsert[
1fe0: 5d 20 3d 20 7b 0a 20 20 20 20 22 49 4e 53 45 52  ] = {.    "INSER
1ff0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2000: 28 22 0a 20 20 20 20 22 70 72 69 6e 74 66 28 27  (".    "printf('
2010: 25 2e 38 64 27 2c 3f 29 2c 20 72 61 6e 64 6f 6d  %.8d',?), random
2020: 62 6c 6f 62 28 35 30 29 2c 20 72 61 6e 64 6f 6d  blob(50), random
2030: 62 6c 6f 62 28 35 30 29 2c 20 72 61 6e 64 6f 6d  blob(50), random
2040: 62 6c 6f 62 28 35 30 29 29 22 2c 0a 20 20 20 20  blob(50))",.    
2050: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20  "INSERT INTO t1 
2060: 56 41 4c 55 45 53 28 3f 2c 20 72 61 6e 64 6f 6d  VALUES(?, random
2070: 28 29 2c 20 72 61 6e 64 6f 6d 28 29 2c 20 72 61  (), random(), ra
2080: 6e 64 6f 6d 28 29 29 22 0a 20 20 7d 3b 0a 0a 20  ndom())".  };.. 
2090: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 55   const char *azU
20a0: 70 64 61 74 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  pdate[] = {.    
20b0: 22 55 50 44 41 54 45 20 74 31 20 53 45 54 20 64  "UPDATE t1 SET d
20c0: 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30   = randomblob(50
20d0: 29 20 57 48 45 52 45 20 61 20 3d 20 70 72 69 6e  ) WHERE a = prin
20e0: 74 66 28 27 25 2e 38 64 27 2c 3f 29 22 2c 0a 20  tf('%.8d',?)",. 
20f0: 20 20 20 22 55 50 44 41 54 45 20 74 31 20 53 45     "UPDATE t1 SE
2100: 54 20 64 20 3d 20 72 61 6e 64 6f 6d 28 29 20 57  T d = random() W
2110: 48 45 52 45 20 61 20 3d 20 3f 22 0a 20 20 7d 3b  HERE a = ?".  };
2120: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
2130: 61 7a 44 65 6c 65 74 65 5b 5d 20 3d 20 7b 0a 20  azDelete[] = {. 
2140: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
2150: 74 31 20 57 48 45 52 45 20 61 20 3d 20 70 72 69  t1 WHERE a = pri
2160: 6e 74 66 28 27 25 2e 38 64 27 2c 3f 29 22 2c 0a  ntf('%.8d',?)",.
2170: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
2180: 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 22   t1 WHERE a = ?"
2190: 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 72 63 3b  .  };..  int rc;
21a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
21b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 32 3b 0a    sqlite3 *db2;.
21c0: 20 20 63 68 61 72 20 2a 7a 44 62 32 3b 0a 20 20    char *zDb2;.  
21d0: 69 6e 74 20 62 57 69 74 68 6f 75 74 52 6f 77 69  int bWithoutRowi
21e0: 64 3b 0a 20 20 69 6e 74 20 62 49 6e 74 65 67 65  d;.  int bIntege
21f0: 72 3b 0a 0a 20 20 70 61 72 73 65 5f 63 6f 6d 6d  r;..  parse_comm
2200: 61 6e 64 5f 6c 69 6e 65 28 61 72 67 63 2c 20 61  and_line(argc, a
2210: 72 67 76 2c 20 31 2c 20 61 4f 70 74 2c 20 28 76  rgv, 1, aOpt, (v
2220: 6f 69 64 2a 29 26 6f 2c 0a 20 20 20 20 22 54 68  oid*)&o,.    "Th
2230: 69 73 20 70 72 6f 67 72 61 6d 20 63 72 65 61 74  is program creat
2240: 65 73 20 74 77 6f 20 6e 65 77 2c 20 65 6d 70 74  es two new, empt
2250: 79 2c 20 64 61 74 61 62 61 73 65 73 20 65 61 63  y, databases eac
2260: 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73  h containing a s
2270: 69 6e 67 6c 65 5c 6e 22 0a 20 20 20 20 22 74 61  ingle\n".    "ta
2280: 62 6c 65 2e 20 49 74 20 74 68 65 6e 20 64 6f 65  ble. It then doe
2290: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
22a0: 5c 6e 5c 6e 22 0a 20 20 20 20 22 20 20 31 2e 20  \n\n".    "  1. 
22b0: 49 6e 73 65 72 74 73 20 2d 72 6f 77 73 20 72 6f  Inserts -rows ro
22c0: 77 73 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73  ws into the firs
22d0: 74 20 64 61 74 61 62 61 73 65 5c 6e 22 0a 20 20  t database\n".  
22e0: 20 20 22 20 20 32 2e 20 55 70 64 61 74 65 73 20    "  2. Updates 
22f0: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
2300: 66 69 72 73 74 20 64 62 5c 6e 22 0a 20 20 20 20  first db\n".    
2310: 22 20 20 33 2e 20 44 65 6c 65 74 65 20 65 61 63  "  3. Delete eac
2320: 68 20 72 6f 77 20 66 72 6f 6d 20 74 68 65 20 66  h row from the f
2330: 69 72 73 74 20 64 62 5c 6e 5c 6e 22 0a 20 20 20  irst db\n\n".   
2340: 20 22 54 68 65 20 6d 6f 64 69 66 69 63 61 74 69   "The modificati
2350: 6f 6e 73 20 6d 61 64 65 20 62 79 20 65 61 63 68  ons made by each
2360: 20 73 74 65 70 20 61 72 65 20 63 61 70 74 75 72   step are captur
2370: 65 64 20 69 6e 20 61 20 63 68 61 6e 67 65 73 65  ed in a changese
2380: 74 20 61 6e 64 5c 6e 22 0a 20 20 20 20 22 61 70  t and\n".    "ap
2390: 70 6c 69 65 64 20 74 6f 20 74 68 65 20 73 65 63  plied to the sec
23a0: 6f 6e 64 20 64 61 74 61 62 61 73 65 2e 5c 6e 22  ond database.\n"
23b0: 0a 20 20 29 3b 0a 20 20 7a 44 62 32 20 3d 20 73  .  );.  zDb2 = s
23c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
23d0: 25 73 32 22 2c 20 6f 2e 7a 44 62 29 3b 0a 0a 20  %s2", o.zDb);.. 
23e0: 20 66 6f 72 28 62 57 69 74 68 6f 75 74 52 6f 77   for(bWithoutRow
23f0: 69 64 3d 30 3b 20 62 57 69 74 68 6f 75 74 52 6f  id=0; bWithoutRo
2400: 77 69 64 3c 32 3b 20 62 57 69 74 68 6f 75 74 52  wid<2; bWithoutR
2410: 6f 77 69 64 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  owid++){.    for
2420: 28 62 49 6e 74 65 67 65 72 3d 30 3b 20 62 49 6e  (bInteger=0; bIn
2430: 74 65 67 65 72 3c 32 3b 20 62 49 6e 74 65 67 65  teger<2; bIntege
2440: 72 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  r++){.      if( 
2450: 6f 2e 62 41 6c 6c 20 7c 7c 20 28 6f 2e 62 57 69  o.bAll || (o.bWi
2460: 74 68 6f 75 74 52 6f 77 69 64 3d 3d 62 57 69 74  thoutRowid==bWit
2470: 68 6f 75 74 52 6f 77 69 64 20 26 26 20 6f 2e 62  houtRowid && o.b
2480: 49 6e 74 65 67 65 72 3d 3d 62 49 6e 74 65 67 65  Integer==bIntege
2490: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  r) ){.        fp
24a0: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 54  rintf(stdout, "T
24b0: 65 73 74 69 6e 67 20 25 73 20 64 61 74 61 20 77  esting %s data w
24c0: 69 74 68 20 25 73 20 74 61 62 6c 65 5c 6e 22 2c  ith %s table\n",
24d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 49 6e  .            bIn
24e0: 74 65 67 65 72 20 3f 20 22 69 6e 74 65 67 65 72  teger ? "integer
24f0: 22 20 3a 20 22 62 6c 6f 62 2f 74 65 78 74 22 2c  " : "blob/text",
2500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 57 69  .            bWi
2510: 74 68 6f 75 74 52 6f 77 69 64 20 3f 20 22 57 49  thoutRowid ? "WI
2520: 54 48 4f 55 54 20 52 4f 57 49 44 22 20 3a 20 22  THOUT ROWID" : "
2530: 72 6f 77 69 64 22 0a 20 20 20 20 20 20 20 20 29  rowid".        )
2540: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ;..        /* Op
2550: 65 6e 20 6e 65 77 20 64 61 74 61 62 61 73 65 20  en new database 
2560: 68 61 6e 64 6c 65 73 20 6f 6e 20 74 77 6f 20 65  handles on two e
2570: 6d 70 74 79 20 64 61 74 61 62 61 73 65 73 20 2a  mpty databases *
2580: 2f 0a 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b  /.        unlink
2590: 28 6f 2e 7a 44 62 29 3b 0a 20 20 20 20 20 20 20  (o.zDb);.       
25a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
25b0: 65 6e 28 6f 2e 7a 44 62 2c 20 26 64 62 29 3b 0a  en(o.zDb, &db);.
25c0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
25d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61 62 6f 72  SQLITE_OK ) abor
25e0: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 28 72  t_due_to_error(r
25f0: 63 29 3b 0a 20 20 20 20 20 20 20 20 75 6e 6c 69  c);.        unli
2600: 6e 6b 28 7a 44 62 32 29 3b 0a 20 20 20 20 20 20  nk(zDb2);.      
2610: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
2620: 70 65 6e 28 7a 44 62 32 2c 20 26 64 62 32 29 3b  pen(zDb2, &db2);
2630: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2640: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61 62 6f  =SQLITE_OK ) abo
2650: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 28  rt_due_to_error(
2660: 72 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  rc);..        /*
2670: 20 43 72 65 61 74 65 20 74 68 65 20 73 63 68 65   Create the sche
2680: 6d 61 20 69 6e 20 62 6f 74 68 20 64 61 74 61 62  ma in both datab
2690: 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ases. */.       
26a0: 20 65 78 65 63 73 71 6c 28 64 62 2c 20 61 7a 43   execsql(db, azC
26b0: 72 65 61 74 65 5b 6f 2e 62 57 69 74 68 6f 75 74  reate[o.bWithout
26c0: 52 6f 77 69 64 5d 29 3b 0a 20 20 20 20 20 20 20  Rowid]);.       
26d0: 20 65 78 65 63 73 71 6c 28 64 62 32 2c 20 61 7a   execsql(db2, az
26e0: 43 72 65 61 74 65 5b 6f 2e 62 57 69 74 68 6f 75  Create[o.bWithou
26f0: 74 52 6f 77 69 64 5d 29 3b 0a 0a 20 20 20 20 20  tRowid]);..     
2700: 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 74 68     /* Run the th
2710: 72 65 65 20 74 65 73 74 73 20 2a 2f 0a 20 20 20  ree tests */.   
2720: 20 20 20 20 20 72 75 6e 5f 74 65 73 74 28 64 62       run_test(db
2730: 2c 20 64 62 32 2c 20 6f 2e 6e 52 6f 77 2c 20 61  , db2, o.nRow, a
2740: 7a 49 6e 73 65 72 74 5b 6f 2e 62 49 6e 74 65 67  zInsert[o.bInteg
2750: 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 75  er]);.        ru
2760: 6e 5f 74 65 73 74 28 64 62 2c 20 64 62 32 2c 20  n_test(db, db2, 
2770: 6f 2e 6e 52 6f 77 2c 20 61 7a 55 70 64 61 74 65  o.nRow, azUpdate
2780: 5b 6f 2e 62 49 6e 74 65 67 65 72 5d 29 3b 0a 20  [o.bInteger]);. 
2790: 20 20 20 20 20 20 20 72 75 6e 5f 74 65 73 74 28         run_test(
27a0: 64 62 2c 20 64 62 32 2c 20 6f 2e 6e 52 6f 77 2c  db, db2, o.nRow,
27b0: 20 61 7a 44 65 6c 65 74 65 5b 6f 2e 62 49 6e 74   azDelete[o.bInt
27c0: 65 67 65 72 5d 29 3b 0a 0a 20 20 20 20 20 20 20  eger]);..       
27d0: 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 62   /* Close the db
27e0: 20 68 61 6e 64 6c 65 73 20 2a 2f 0a 20 20 20 20   handles */.    
27f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2800: 65 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  e(db);.        s
2810: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 32  qlite3_close(db2
2820: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2830: 0a 20 20 7d 0a 0a 0a 20 20 72 65 74 75 72 6e 20  .  }...  return 
2840: 30 3b 0a 7d 0a 0a 0a                             0;.}...