/ Hex Artifact Content
Login

Artifact 40e3458f0015290be8ecb6e03f9dbf1bb1e264c0:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 34 2d 30 36  /*.** 2015-04-06
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
0180: 75 74 69 6c 69 74 79 20 70 72 6f 67 72 61 6d 20  utility program 
0190: 74 68 61 74 20 63 6f 6d 70 75 74 65 73 20 74 68  that computes th
01a0: 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 69 6e  e differences in
01b0: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 65 74 77   content.** betw
01c0: 65 65 6e 20 74 77 6f 20 53 51 4c 69 74 65 20 64  een two SQLite d
01d0: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
01e0: 54 6f 20 63 6f 6d 70 69 6c 65 2c 20 73 69 6d 70  To compile, simp
01f0: 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20  ly link against 
0200: 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  SQLite..**.** Se
0210: 65 20 74 68 65 20 73 68 6f 77 48 65 6c 70 28 29  e the showHelp()
0220: 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 20 66   routine below f
0230: 6f 72 20 61 20 62 72 69 65 66 20 64 65 73 63 72  or a brief descr
0240: 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 74 6f  iption of how to
0250: 0a 2a 2a 20 72 75 6e 20 74 68 65 20 75 74 69 6c  .** run the util
0260: 69 74 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ity..*/.#include
0270: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0280: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0290: 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e  include <stdarg.
02a0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79  h>.#include <cty
02b0: 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  pe.h>.#include <
02c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
02d0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
02e0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
02f0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 67 6c  h"../*.** All gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  obal variables a
0310: 72 65 20 67 61 74 68 65 72 65 64 20 69 6e 74 6f  re gathered into
0320: 20 74 68 65 20 22 67 22 20 73 69 6e 67 6c 65 74   the "g" singlet
0330: 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 47 6c  on..*/.struct Gl
0340: 6f 62 61 6c 56 61 72 73 20 7b 0a 20 20 63 6f 6e  obalVars {.  con
0350: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 76 30 3b  st char *zArgv0;
0360: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0370: 66 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69  f program */.  i
0380: 6e 74 20 62 53 63 68 65 6d 61 4f 6e 6c 79 3b 20  nt bSchemaOnly; 
0390: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
03a0: 20 73 68 6f 77 20 73 63 68 65 6d 61 20 64 69 66   show schema dif
03b0: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 69 6e  ferences */.  in
03c0: 74 20 62 53 63 68 65 6d 61 50 4b 3b 20 20 20 20  t bSchemaPK;    
03d0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
03e0: 68 65 20 73 63 68 65 6d 61 2d 64 65 66 69 6e 65  he schema-define
03f0: 64 20 50 4b 2c 20 6e 6f 74 20 74 68 65 20 74 72  d PK, not the tr
0400: 75 65 20 50 4b 20 2a 2f 0a 20 20 75 6e 73 69 67  ue PK */.  unsig
0410: 6e 65 64 20 66 44 65 62 75 67 3b 20 20 20 20 20  ned fDebug;     
0420: 20 20 20 20 20 2f 2a 20 44 65 62 75 67 20 66 6c       /* Debug fl
0430: 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
0440: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
0450: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
0460: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
0470: 0a 7d 20 67 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  .} g;../*.** All
0480: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
0490: 67 2e 66 44 65 62 75 67 0a 2a 2f 0a 23 64 65 66  g.fDebug.*/.#def
04a0: 69 6e 65 20 44 45 42 55 47 5f 43 4f 4c 55 4d 4e  ine DEBUG_COLUMN
04b0: 5f 4e 41 4d 45 53 20 20 30 78 30 30 30 30 30 31  _NAMES  0x000001
04c0: 0a 23 64 65 66 69 6e 65 20 44 45 42 55 47 5f 44  .#define DEBUG_D
04d0: 49 46 46 5f 53 51 4c 20 20 20 20 20 20 30 78 30  IFF_SQL      0x0
04e0: 30 30 30 30 32 0a 0a 2f 2a 0a 2a 2a 20 44 79 6e  00002../*.** Dyn
04f0: 61 6d 69 63 20 73 74 72 69 6e 67 20 6f 62 6a 65  amic string obje
0500: 63 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ct.*/.typedef st
0510: 72 75 63 74 20 53 74 72 20 53 74 72 3b 0a 73 74  ruct Str Str;.st
0520: 72 75 63 74 20 53 74 72 20 7b 0a 20 20 63 68 61  ruct Str {.  cha
0530: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f 2a 20  r *z;        /* 
0540: 54 65 78 74 20 6f 66 20 74 68 65 20 73 74 72 69  Text of the stri
0550: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  ng */.  int nAll
0560: 6f 63 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  oc;     /* Bytes
0570: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 7a 5b   allocated in z[
0580: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64  ] */.  int nUsed
0590: 3b 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  ;      /* Bytes 
05a0: 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 69 6e  actually used in
05b0: 20 7a 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   z[] */.};../*.*
05c0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53  * Initialize a S
05d0: 74 72 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  tr object.*/.sta
05e0: 74 69 63 20 76 6f 69 64 20 73 74 72 49 6e 69 74  tic void strInit
05f0: 28 53 74 72 20 2a 70 29 7b 0a 20 20 70 2d 3e 7a  (Str *p){.  p->z
0600: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 41 6c 6c 6f   = 0;.  p->nAllo
0610: 63 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 55 73 65  c = 0;.  p->nUse
0620: 64 20 3d 20 30 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a  d = 0;.}.  ./*.*
0630: 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  * Print an error
0640: 20 72 65 73 75 6c 74 69 6e 67 20 66 72 6f 6d 20   resulting from 
0650: 66 61 75 6c 74 69 6e 67 20 63 6f 6d 6d 61 6e 64  faulting command
0660: 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20  -line arguments 
0670: 61 6e 64 0a 2a 2a 20 61 62 6f 72 74 20 74 68 65  and.** abort the
0680: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 73 74 61   program..*/.sta
0690: 74 69 63 20 76 6f 69 64 20 63 6d 64 6c 69 6e 65  tic void cmdline
06a0: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  Error(const char
06b0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
06c0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
06d0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
06e0: 20 22 25 73 3a 20 22 2c 20 67 2e 7a 41 72 67 76   "%s: ", g.zArgv
06f0: 30 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  0);.  va_start(a
0700: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76  p, zFormat);.  v
0710: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0720: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
0730: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70  va_end(ap);.  fp
0740: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
0750: 6e 5c 22 25 73 20 2d 2d 68 65 6c 70 5c 22 20 66  n\"%s --help\" f
0760: 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 2c  or more help\n",
0770: 20 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 65 78   g.zArgv0);.  ex
0780: 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(1);.}../*.** 
0790: 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  Print an error m
07a0: 65 73 73 61 67 65 20 66 6f 72 20 61 6e 20 65 72  essage for an er
07b0: 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  ror that occurs 
07c0: 61 74 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e  at runtime, then
07d0: 0a 2a 2a 20 61 62 6f 72 74 20 74 68 65 20 70 72  .** abort the pr
07e0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  ogram..*/.static
07f0: 20 76 6f 69 64 20 72 75 6e 74 69 6d 65 45 72 72   void runtimeErr
0800: 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  or(const char *z
0810: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
0820: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 66 70  va_list ap;.  fp
0830: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
0840: 73 3a 20 22 2c 20 67 2e 7a 41 72 67 76 30 29 3b  s: ", g.zArgv0);
0850: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
0860: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72  zFormat);.  vfpr
0870: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 7a 46 6f  intf(stderr, zFo
0880: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
0890: 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e  end(ap);.  fprin
08a0: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
08b0: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  ;.  exit(1);.}..
08c0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
08d0: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20  emory held by a 
08e0: 53 74 72 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  Str object.*/.st
08f0: 61 74 69 63 20 76 6f 69 64 20 73 74 72 46 72 65  atic void strFre
0900: 65 28 53 74 72 20 2a 70 29 7b 0a 20 20 73 71 6c  e(Str *p){.  sql
0910: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 29 3b  ite3_free(p->z);
0920: 0a 20 20 73 74 72 49 6e 69 74 28 70 29 3b 0a 7d  .  strInit(p);.}
0930: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 66 6f 72 6d  ../*.** Add form
0940: 61 74 74 65 64 20 74 65 78 74 20 74 6f 20 74 68  atted text to th
0950: 65 20 65 6e 64 20 6f 66 20 61 20 53 74 72 20 6f  e end of a Str o
0960: 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
0970: 76 6f 69 64 20 73 74 72 50 72 69 6e 74 66 28 53  void strPrintf(S
0980: 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  tr *p, const cha
0990: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
09a0: 7b 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 0a 20 20  {.  int nNew;.  
09b0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 66 28  for(;;){.    if(
09c0: 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 76   p->z ){.      v
09d0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 20  a_list ap;.     
09e0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
09f0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20 20 73 71  ormat);.      sq
0a00: 6c 69 74 65 33 5f 76 73 6e 70 72 69 6e 74 66 28  lite3_vsnprintf(
0a10: 70 2d 3e 6e 41 6c 6c 6f 63 2d 70 2d 3e 6e 55 73  p->nAlloc-p->nUs
0a20: 65 64 2c 20 70 2d 3e 7a 2b 70 2d 3e 6e 55 73 65  ed, p->z+p->nUse
0a30: 64 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  d, zFormat, ap);
0a40: 0a 20 20 20 20 20 20 76 61 5f 65 6e 64 28 61 70  .      va_end(ap
0a50: 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  );.      nNew = 
0a60: 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a  (int)strlen(p->z
0a70: 20 2b 20 70 2d 3e 6e 55 73 65 64 29 3b 0a 20 20   + p->nUsed);.  
0a80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
0a90: 4e 65 77 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 3b  New = p->nAlloc;
0aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
0ab0: 2d 3e 6e 55 73 65 64 2b 6e 4e 65 77 20 3c 20 70  ->nUsed+nNew < p
0ac0: 2d 3e 6e 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20  ->nAlloc-1 ){.  
0ad0: 20 20 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20      p->nUsed += 
0ae0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 62 72 65 61  nNew;.      brea
0af0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  k;.    }.    p->
0b00: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c  nAlloc = p->nAll
0b10: 6f 63 2a 32 20 2b 20 31 30 30 30 3b 0a 20 20 20  oc*2 + 1000;.   
0b20: 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f   p->z = sqlite3_
0b30: 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d  realloc(p->z, p-
0b40: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
0b50: 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 72 75 6e 74  ( p->z==0 ) runt
0b60: 69 6d 65 45 72 72 6f 72 28 22 6f 75 74 20 6f 66  imeError("out of
0b70: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 7d 0a 7d   memory");.  }.}
0b80: 0a 0a 0a 0a 2f 2a 20 53 61 66 65 6c 79 20 71 75  ..../* Safely qu
0b90: 6f 74 65 20 61 6e 20 53 51 4c 20 69 64 65 6e 74  ote an SQL ident
0ba0: 69 66 69 65 72 2e 20 20 55 73 65 20 74 68 65 20  ifier.  Use the 
0bb0: 6d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  minimum amount o
0bc0: 66 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  f transformation
0bd0: 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
0be0: 20 61 6c 6c 6f 77 20 74 68 65 20 73 74 72 69 6e   allow the strin
0bf0: 67 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  g to be used wit
0c00: 68 20 25 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  h %s..**.** Spac
0c10: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
0c20: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
0c30: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
0c40: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
0c50: 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20    The.** caller 
0c60: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
0c70: 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 69 73  or ensuring this
0c80: 20 73 70 61 63 65 20 69 73 20 66 72 65 65 64 20   space is freed 
0c90: 77 68 65 6e 20 6e 6f 20 6c 6f 6e 67 65 72 0a 2a  when no longer.*
0ca0: 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
0cb0: 74 69 63 20 63 68 61 72 20 2a 73 61 66 65 49 64  tic char *safeId
0cc0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64  (const char *zId
0cd0: 29 7b 0a 20 20 2f 2a 20 41 6c 6c 20 53 51 4c 69  ){.  /* All SQLi
0ce0: 74 65 20 6b 65 79 77 6f 72 64 73 2c 20 69 6e 20  te keywords, in 
0cf0: 61 6c 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64  alphabetical ord
0d00: 65 72 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  er */.  static c
0d10: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4b 65 79  onst char *azKey
0d20: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0d30: 22 41 42 4f 52 54 22 2c 20 22 41 43 54 49 4f 4e  "ABORT", "ACTION
0d40: 22 2c 20 22 41 44 44 22 2c 20 22 41 46 54 45 52  ", "ADD", "AFTER
0d50: 22 2c 20 22 41 4c 4c 22 2c 20 22 41 4c 54 45 52  ", "ALL", "ALTER
0d60: 22 2c 20 22 41 4e 41 4c 59 5a 45 22 2c 20 22 41  ", "ANALYZE", "A
0d70: 4e 44 22 2c 20 22 41 53 22 2c 0a 20 20 20 20 22  ND", "AS",.    "
0d80: 41 53 43 22 2c 20 22 41 54 54 41 43 48 22 2c 20  ASC", "ATTACH", 
0d90: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22 2c  "AUTOINCREMENT",
0da0: 20 22 42 45 46 4f 52 45 22 2c 20 22 42 45 47 49   "BEFORE", "BEGI
0db0: 4e 22 2c 20 22 42 45 54 57 45 45 4e 22 2c 20 22  N", "BETWEEN", "
0dc0: 42 59 22 2c 0a 20 20 20 20 22 43 41 53 43 41 44  BY",.    "CASCAD
0dd0: 45 22 2c 20 22 43 41 53 45 22 2c 20 22 43 41 53  E", "CASE", "CAS
0de0: 54 22 2c 20 22 43 48 45 43 4b 22 2c 20 22 43 4f  T", "CHECK", "CO
0df0: 4c 4c 41 54 45 22 2c 20 22 43 4f 4c 55 4d 4e 22  LLATE", "COLUMN"
0e00: 2c 20 22 43 4f 4d 4d 49 54 22 2c 0a 20 20 20 20  , "COMMIT",.    
0e10: 22 43 4f 4e 46 4c 49 43 54 22 2c 20 22 43 4f 4e  "CONFLICT", "CON
0e20: 53 54 52 41 49 4e 54 22 2c 20 22 43 52 45 41 54  STRAINT", "CREAT
0e30: 45 22 2c 20 22 43 52 4f 53 53 22 2c 20 22 43 55  E", "CROSS", "CU
0e40: 52 52 45 4e 54 5f 44 41 54 45 22 2c 0a 20 20 20  RRENT_DATE",.   
0e50: 20 22 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 2c   "CURRENT_TIME",
0e60: 20 22 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54   "CURRENT_TIMEST
0e70: 41 4d 50 22 2c 20 22 44 41 54 41 42 41 53 45 22  AMP", "DATABASE"
0e80: 2c 20 22 44 45 46 41 55 4c 54 22 2c 20 22 44 45  , "DEFAULT", "DE
0e90: 46 45 52 52 41 42 4c 45 22 2c 0a 20 20 20 20 22  FERRABLE",.    "
0ea0: 44 45 46 45 52 52 45 44 22 2c 20 22 44 45 4c 45  DEFERRED", "DELE
0eb0: 54 45 22 2c 20 22 44 45 53 43 22 2c 20 22 44 45  TE", "DESC", "DE
0ec0: 54 41 43 48 22 2c 20 22 44 49 53 54 49 4e 43 54  TACH", "DISTINCT
0ed0: 22 2c 20 22 44 52 4f 50 22 2c 20 22 45 41 43 48  ", "DROP", "EACH
0ee0: 22 2c 0a 20 20 20 20 22 45 4c 53 45 22 2c 20 22  ",.    "ELSE", "
0ef0: 45 4e 44 22 2c 20 22 45 53 43 41 50 45 22 2c 20  END", "ESCAPE", 
0f00: 22 45 58 43 45 50 54 22 2c 20 22 45 58 43 4c 55  "EXCEPT", "EXCLU
0f10: 53 49 56 45 22 2c 20 22 45 58 49 53 54 53 22 2c  SIVE", "EXISTS",
0f20: 20 22 45 58 50 4c 41 49 4e 22 2c 0a 20 20 20 20   "EXPLAIN",.    
0f30: 22 46 41 49 4c 22 2c 20 22 46 4f 52 22 2c 20 22  "FAIL", "FOR", "
0f40: 46 4f 52 45 49 47 4e 22 2c 20 22 46 52 4f 4d 22  FOREIGN", "FROM"
0f50: 2c 20 22 46 55 4c 4c 22 2c 20 22 47 4c 4f 42 22  , "FULL", "GLOB"
0f60: 2c 20 22 47 52 4f 55 50 22 2c 20 22 48 41 56 49  , "GROUP", "HAVI
0f70: 4e 47 22 2c 20 22 49 46 22 2c 0a 20 20 20 20 22  NG", "IF",.    "
0f80: 49 47 4e 4f 52 45 22 2c 20 22 49 4d 4d 45 44 49  IGNORE", "IMMEDI
0f90: 41 54 45 22 2c 20 22 49 4e 22 2c 20 22 49 4e 44  ATE", "IN", "IND
0fa0: 45 58 22 2c 20 22 49 4e 44 45 58 45 44 22 2c 20  EX", "INDEXED", 
0fb0: 22 49 4e 49 54 49 41 4c 4c 59 22 2c 20 22 49 4e  "INITIALLY", "IN
0fc0: 4e 45 52 22 2c 0a 20 20 20 20 22 49 4e 53 45 52  NER",.    "INSER
0fd0: 54 22 2c 20 22 49 4e 53 54 45 41 44 22 2c 20 22  T", "INSTEAD", "
0fe0: 49 4e 54 45 52 53 45 43 54 22 2c 20 22 49 4e 54  INTERSECT", "INT
0ff0: 4f 22 2c 20 22 49 53 22 2c 20 22 49 53 4e 55 4c  O", "IS", "ISNUL
1000: 4c 22 2c 20 22 4a 4f 49 4e 22 2c 20 22 4b 45 59  L", "JOIN", "KEY
1010: 22 2c 0a 20 20 20 20 22 4c 45 46 54 22 2c 20 22  ",.    "LEFT", "
1020: 4c 49 4b 45 22 2c 20 22 4c 49 4d 49 54 22 2c 20  LIKE", "LIMIT", 
1030: 22 4d 41 54 43 48 22 2c 20 22 4e 41 54 55 52 41  "MATCH", "NATURA
1040: 4c 22 2c 20 22 4e 4f 22 2c 20 22 4e 4f 54 22 2c  L", "NO", "NOT",
1050: 20 22 4e 4f 54 4e 55 4c 4c 22 2c 0a 20 20 20 20   "NOTNULL",.    
1060: 22 4e 55 4c 4c 22 2c 20 22 4f 46 22 2c 20 22 4f  "NULL", "OF", "O
1070: 46 46 53 45 54 22 2c 20 22 4f 4e 22 2c 20 22 4f  FFSET", "ON", "O
1080: 52 22 2c 20 22 4f 52 44 45 52 22 2c 20 22 4f 55  R", "ORDER", "OU
1090: 54 45 52 22 2c 20 22 50 4c 41 4e 22 2c 20 22 50  TER", "PLAN", "P
10a0: 52 41 47 4d 41 22 2c 0a 20 20 20 20 22 50 52 49  RAGMA",.    "PRI
10b0: 4d 41 52 59 22 2c 20 22 51 55 45 52 59 22 2c 20  MARY", "QUERY", 
10c0: 22 52 41 49 53 45 22 2c 20 22 52 45 43 55 52 53  "RAISE", "RECURS
10d0: 49 56 45 22 2c 20 22 52 45 46 45 52 45 4e 43 45  IVE", "REFERENCE
10e0: 53 22 2c 20 22 52 45 47 45 58 50 22 2c 0a 20 20  S", "REGEXP",.  
10f0: 20 20 22 52 45 49 4e 44 45 58 22 2c 20 22 52 45    "REINDEX", "RE
1100: 4c 45 41 53 45 22 2c 20 22 52 45 4e 41 4d 45 22  LEASE", "RENAME"
1110: 2c 20 22 52 45 50 4c 41 43 45 22 2c 20 22 52 45  , "REPLACE", "RE
1120: 53 54 52 49 43 54 22 2c 20 22 52 49 47 48 54 22  STRICT", "RIGHT"
1130: 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22  ,.    "ROLLBACK"
1140: 2c 20 22 52 4f 57 22 2c 20 22 53 41 56 45 50 4f  , "ROW", "SAVEPO
1150: 49 4e 54 22 2c 20 22 53 45 4c 45 43 54 22 2c 20  INT", "SELECT", 
1160: 22 53 45 54 22 2c 20 22 54 41 42 4c 45 22 2c 20  "SET", "TABLE", 
1170: 22 54 45 4d 50 22 2c 0a 20 20 20 20 22 54 45 4d  "TEMP",.    "TEM
1180: 50 4f 52 41 52 59 22 2c 20 22 54 48 45 4e 22 2c  PORARY", "THEN",
1190: 20 22 54 4f 22 2c 20 22 54 52 41 4e 53 41 43 54   "TO", "TRANSACT
11a0: 49 4f 4e 22 2c 20 22 54 52 49 47 47 45 52 22 2c  ION", "TRIGGER",
11b0: 20 22 55 4e 49 4f 4e 22 2c 20 22 55 4e 49 51 55   "UNION", "UNIQU
11c0: 45 22 2c 0a 20 20 20 20 22 55 50 44 41 54 45 22  E",.    "UPDATE"
11d0: 2c 20 22 55 53 49 4e 47 22 2c 20 22 56 41 43 55  , "USING", "VACU
11e0: 55 4d 22 2c 20 22 56 41 4c 55 45 53 22 2c 20 22  UM", "VALUES", "
11f0: 56 49 45 57 22 2c 20 22 56 49 52 54 55 41 4c 22  VIEW", "VIRTUAL"
1200: 2c 20 22 57 48 45 4e 22 2c 20 22 57 48 45 52 45  , "WHEN", "WHERE
1210: 22 2c 0a 20 20 20 20 22 57 49 54 48 22 2c 20 22  ",.    "WITH", "
1220: 57 49 54 48 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20  WITHOUT",.  };. 
1230: 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 6d   int lwr, upr, m
1240: 69 64 2c 20 63 2c 20 69 2c 20 78 3b 0a 20 20 66  id, c, i, x;.  f
1250: 6f 72 28 69 3d 78 3d 30 3b 20 28 63 20 3d 20 7a  or(i=x=0; (c = z
1260: 49 64 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  Id[i])!=0; i++){
1270: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68  .    if( !isalph
1280: 61 28 63 29 20 26 26 20 63 21 3d 27 5f 27 20 29  a(c) && c!='_' )
1290: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  {.      if( i>0 
12a0: 26 26 20 69 73 64 69 67 69 74 28 63 29 20 29 7b  && isdigit(c) ){
12b0: 0a 20 20 20 20 20 20 20 20 78 2b 2b 3b 0a 20 20  .        x++;.  
12c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
12e0: 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c  3_mprintf("\"%w\
12f0: 22 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  "", zId);.      
1300: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
1310: 28 20 78 20 29 20 72 65 74 75 72 6e 20 73 71 6c  ( x ) return sql
1320: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1330: 22 2c 20 7a 49 64 29 3b 0a 20 20 6c 77 72 20 3d  ", zId);.  lwr =
1340: 20 30 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65   0;.  upr = size
1350: 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73 29 2f 73  of(azKeywords)/s
1360: 69 7a 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73  izeof(azKeywords
1370: 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c  [0]) - 1;.  whil
1380: 65 28 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20  e( lwr<=upr ){. 
1390: 20 20 20 6d 69 64 20 3d 20 28 6c 77 72 2b 75 70     mid = (lwr+up
13a0: 72 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 71  r)/2;.    c = sq
13b0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a  lite3_stricmp(az
13c0: 4b 65 79 77 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a  Keywords[mid], z
13d0: 49 64 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  Id);.    if( c==
13e0: 30 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74  0 ) return sqlit
13f0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
1400: 5c 22 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 69  \"", zId);.    i
1410: 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
1420: 6c 77 72 20 3d 20 6d 69 64 2b 31 3b 0a 20 20 20  lwr = mid+1;.   
1430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 70   }else{.      up
1440: 72 20 3d 20 6d 69 64 2d 31 3b 0a 20 20 20 20 7d  r = mid-1;.    }
1450: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
1460: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1470: 73 22 2c 20 7a 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a  s", zId);.}../*.
1480: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 6e 65 77  ** Prepare a new
1490: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
14a0: 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20   Print an error 
14b0: 61 6e 64 20 61 62 6f 72 74 20 69 66 20 61 6e 79  and abort if any
14c0: 74 68 69 6e 67 0a 2a 2a 20 67 6f 65 73 20 77 72  thing.** goes wr
14d0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ong..*/.static s
14e0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 64 62 5f  qlite3_stmt *db_
14f0: 76 70 72 65 70 61 72 65 28 63 6f 6e 73 74 20 63  vprepare(const c
1500: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61  har *zFormat, va
1510: 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 63 68 61  _list ap){.  cha
1520: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72  r *zSql;.  int r
1530: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  c;.  sqlite3_stm
1540: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 7a 53 71  t *pStmt;..  zSq
1550: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  l = sqlite3_vmpr
1560: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
1570: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1580: 20 29 20 72 75 6e 74 69 6d 65 45 72 72 6f 72 28   ) runtimeError(
1590: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
15a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15b0: 5f 70 72 65 70 61 72 65 5f 76 32 28 67 2e 64 62  _prepare_v2(g.db
15c0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
15d0: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
15e0: 20 29 7b 0a 20 20 20 20 72 75 6e 74 69 6d 65 45   ){.    runtimeE
15f0: 72 72 6f 72 28 22 53 51 4c 20 73 74 61 74 65 6d  rror("SQL statem
1600: 65 6e 74 20 65 72 72 6f 72 3a 20 25 73 5c 6e 5c  ent error: %s\n\
1610: 22 25 73 5c 22 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\"", sqlite3_
1620: 65 72 72 6d 73 67 28 67 2e 64 62 29 2c 0a 20 20  errmsg(g.db),.  
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1640: 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Sql);.  }.  sqli
1650: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
1660: 20 20 72 65 74 75 72 6e 20 70 53 74 6d 74 3b 0a    return pStmt;.
1670: 7d 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  }.static sqlite3
1680: 5f 73 74 6d 74 20 2a 64 62 5f 70 72 65 70 61 72  _stmt *db_prepar
1690: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
16a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
16b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c  a_list ap;.  sql
16c0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
16d0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
16e0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 53 74   zFormat);.  pSt
16f0: 6d 74 20 3d 20 64 62 5f 76 70 72 65 70 61 72 65  mt = db_vprepare
1700: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
1710: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
1720: 65 74 75 72 6e 20 70 53 74 6d 74 3b 0a 7d 0a 0a  eturn pStmt;.}..
1730: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 6c 69 73  /*.** Free a lis
1740: 74 20 6f 66 20 73 74 72 69 6e 67 73 0a 2a 2f 0a  t of strings.*/.
1750: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 61 6d 65  static void name
1760: 6c 69 73 74 46 72 65 65 28 63 68 61 72 20 2a 2a  listFree(char **
1770: 61 7a 29 7b 0a 20 20 69 66 28 20 61 7a 20 29 7b  az){.  if( az ){
1780: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1790: 66 6f 72 28 69 3d 30 3b 20 61 7a 5b 69 5d 3b 20  for(i=0; az[i]; 
17a0: 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66 72 65  i++) sqlite3_fre
17b0: 65 28 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 73 71  e(az[i]);.    sq
17c0: 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 29 3b 0a  lite3_free(az);.
17d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
17e0: 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 63 6f  urn a list of co
17f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74  lumn names for t
1800: 68 65 20 74 61 62 6c 65 20 7a 44 62 2e 7a 54 61  he table zDb.zTa
1810: 62 2e 20 20 53 70 61 63 65 20 74 6f 0a 2a 2a 20  b.  Space to.** 
1820: 68 6f 6c 64 20 74 68 65 20 6c 69 73 74 20 69 73  hold the list is
1830: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1840: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
1850: 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 6c 65 61  and should relea
1860: 73 65 64 0a 2a 2a 20 75 73 69 6e 67 20 6e 61 6d  sed.** using nam
1870: 65 6c 69 73 74 46 72 65 65 28 29 20 77 68 65 6e  elistFree() when
1880: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65   no longer neede
1890: 64 2e 0a 2a 2a 0a 2a 2a 20 50 72 69 6d 61 72 79  d..**.** Primary
18a0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 72 65   key columns are
18b0: 20 6c 69 73 74 65 64 20 66 69 72 73 74 2c 20 66   listed first, f
18c0: 6f 6c 6c 6f 77 65 64 20 62 79 20 64 61 74 61 20  ollowed by data 
18d0: 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20 54 68 65 20  columns..** The 
18e0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
18f0: 73 20 69 6e 20 74 68 65 20 70 72 69 6d 61 72 79  s in the primary
1900: 20 6b 65 79 20 69 73 20 72 65 74 75 72 6e 65 64   key is returned
1910: 20 69 6e 20 2a 70 6e 50 6b 65 79 2e 0a 2a 2a 0a   in *pnPkey..**.
1920: 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 65  ** Normally, the
1930: 20 22 70 72 69 6d 61 72 79 20 6b 65 79 22 20 69   "primary key" i
1940: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
1950: 65 6e 74 65 6e 63 65 20 69 73 20 74 68 65 20 74  entence is the t
1960: 72 75 65 0a 2a 2a 20 70 72 69 6d 61 72 79 20 6b  rue.** primary k
1970: 65 79 20 2d 20 74 68 65 20 72 6f 77 69 64 20 6f  ey - the rowid o
1980: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
1990: 59 20 4b 45 59 20 66 6f 72 20 6f 72 64 69 6e 61  Y KEY for ordina
19a0: 72 79 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ry tables.** or 
19b0: 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52 49  the declared PRI
19c0: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 57 49 54  MARY KEY for WIT
19d0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
19e0: 73 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 0a  s.  However, if.
19f0: 2a 2a 20 74 68 65 20 67 2e 62 53 63 68 65 6d 61  ** the g.bSchema
1a00: 50 4b 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  PK flag is set, 
1a10: 74 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 2d  then the schema-
1a20: 64 65 66 69 6e 65 64 20 50 52 49 4d 41 52 59 20  defined PRIMARY 
1a30: 4b 45 59 20 69 73 0a 2a 2a 20 75 73 65 64 20 69  KEY is.** used i
1a40: 6e 20 61 6c 6c 20 63 61 73 65 73 2e 20 20 49 6e  n all cases.  In
1a50: 20 74 68 61 74 20 63 61 73 65 2c 20 65 6e 74 72   that case, entr
1a60: 69 65 73 20 74 68 61 74 20 68 61 76 65 20 4e 55  ies that have NU
1a70: 4c 4c 20 76 61 6c 75 65 73 20 69 6e 0a 2a 2a 20  LL values in.** 
1a80: 61 6e 79 20 6f 66 20 74 68 65 69 72 20 70 72 69  any of their pri
1a90: 6d 61 72 79 20 6b 65 79 20 66 69 65 6c 64 73 20  mary key fields 
1aa0: 77 69 6c 6c 20 62 65 20 65 78 63 6c 75 64 65 64  will be excluded
1ab0: 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73   from the analys
1ac0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  is..**.** If the
1ad0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 66 6f 72   primary key for
1ae0: 20 61 20 74 61 62 6c 65 20 69 73 20 74 68 65 20   a table is the 
1af0: 72 6f 77 69 64 20 62 75 74 20 72 6f 77 69 64 20  rowid but rowid 
1b00: 69 73 20 69 6e 61 63 63 65 73 73 69 62 6c 65 2c  is inaccessible,
1b10: 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f  .** then this ro
1b20: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20  utine returns a 
1b30: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  NULL pointer..**
1b40: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  .** Examples:.**
1b50: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1b60: 20 74 31 28 61 20 49 4e 54 20 55 4e 49 51 55 45   t1(a INT UNIQUE
1b70: 2c 20 62 20 49 4e 54 45 47 45 52 2c 20 63 20 54  , b INTEGER, c T
1b80: 45 58 54 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  EXT, PRIMARY KEY
1b90: 28 63 29 29 3b 0a 2a 2a 20 20 20 20 2a 70 6e 50  (c));.**    *pnP
1ba0: 4b 65 79 20 3d 20 31 3b 0a 2a 2a 20 20 20 20 61  Key = 1;.**    a
1bb0: 7a 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  z = { "rowid", "
1bc0: 61 22 2c 20 22 62 22 2c 20 22 63 22 2c 20 30 20  a", "b", "c", 0 
1bd0: 7d 20 20 2f 2f 20 4e 6f 72 6d 61 6c 20 63 61 73  }  // Normal cas
1be0: 65 0a 2a 2a 20 20 20 20 61 7a 20 3d 20 7b 20 22  e.**    az = { "
1bf0: 63 22 2c 20 22 61 22 2c 20 22 62 22 2c 20 30 20  c", "a", "b", 0 
1c00: 7d 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 67  }           // g
1c10: 2e 62 53 63 68 65 6d 61 50 4b 3d 3d 31 0a 2a 2a  .bSchemaPK==1.**
1c20: 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 41  .**    CREATE TA
1c30: 42 4c 45 20 74 32 28 61 20 49 4e 54 20 55 4e 49  BLE t2(a INT UNI
1c40: 51 55 45 2c 20 62 20 49 4e 54 45 47 45 52 2c 20  QUE, b INTEGER, 
1c50: 63 20 54 45 58 54 2c 20 50 52 49 4d 41 52 59 20  c TEXT, PRIMARY 
1c60: 4b 45 59 28 62 29 29 3b 0a 2a 2a 20 20 20 20 2a  KEY(b));.**    *
1c70: 70 6e 50 4b 65 79 20 3d 20 31 3b 0a 2a 2a 20 20  pnPKey = 1;.**  
1c80: 20 20 61 7a 20 3d 20 7b 20 22 62 22 2c 20 22 61    az = { "b", "a
1c90: 22 2c 20 22 63 22 2c 20 30 20 7d 0a 2a 2a 0a 2a  ", "c", 0 }.**.*
1ca0: 2a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  *    CREATE TABL
1cb0: 45 20 74 33 28 78 2c 79 2c 7a 2c 50 52 49 4d 41  E t3(x,y,z,PRIMA
1cc0: 52 59 20 4b 45 59 28 79 2c 7a 29 29 3b 0a 2a 2a  RY KEY(y,z));.**
1cd0: 20 20 20 20 2a 70 6e 50 4b 65 79 20 3d 20 31 20      *pnPKey = 1 
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 20 20 20 20 2f 2f 20 4e 6f 72 6d 61          // Norma
1d00: 6c 20 63 61 73 65 0a 2a 2a 20 20 20 20 61 7a 20  l case.**    az 
1d10: 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 78 22  = { "rowid", "x"
1d20: 2c 20 22 79 22 2c 20 22 7a 22 2c 20 30 20 7d 20  , "y", "z", 0 } 
1d30: 20 2f 2f 20 4e 6f 72 6d 61 6c 20 63 61 73 65 0a   // Normal case.
1d40: 2a 2a 20 20 20 20 2a 70 6e 50 4b 65 79 20 3d 20  **    *pnPKey = 
1d50: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1d60: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 67 2e 62            // g.b
1d70: 53 63 68 65 6d 61 50 4b 3d 3d 31 0a 2a 2a 20 20  SchemaPK==1.**  
1d80: 20 20 61 7a 20 3d 20 7b 20 22 79 22 2c 20 22 78    az = { "y", "x
1d90: 22 2c 20 22 7a 22 2c 20 30 20 7d 20 20 20 20 20  ", "z", 0 }     
1da0: 20 20 20 20 20 20 2f 2f 20 67 2e 62 53 63 68 65        // g.bSche
1db0: 6d 61 50 4b 3d 3d 31 0a 2a 2a 0a 2a 2a 20 20 20  maPK==1.**.**   
1dc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
1dd0: 28 78 2c 79 2c 7a 2c 50 52 49 4d 41 52 59 20 4b  (x,y,z,PRIMARY K
1de0: 45 59 28 79 2c 7a 29 29 20 57 49 54 48 4f 55 54  EY(y,z)) WITHOUT
1df0: 20 52 4f 57 49 44 3b 0a 2a 2a 20 20 20 20 2a 70   ROWID;.**    *p
1e00: 6e 50 4b 65 79 20 3d 20 32 0a 2a 2a 20 20 20 20  nPKey = 2.**    
1e10: 61 7a 20 3d 20 7b 20 22 79 22 2c 20 22 7a 22 2c  az = { "y", "z",
1e20: 20 22 78 22 2c 20 30 20 7d 0a 2a 2a 0a 2a 2a 20   "x", 0 }.**.** 
1e30: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1e40: 74 35 28 72 6f 77 69 64 2c 5f 72 6f 77 69 64 5f  t5(rowid,_rowid_
1e50: 2c 6f 69 64 29 3b 0a 2a 2a 20 20 20 20 61 7a 20  ,oid);.**    az 
1e60: 3d 20 30 20 20 20 20 20 2f 2f 20 54 68 65 20 72  = 0     // The r
1e70: 6f 77 69 64 20 69 73 20 6e 6f 74 20 61 63 63 65  owid is not acce
1e80: 73 73 69 62 6c 65 0a 2a 2f 0a 73 74 61 74 69 63  ssible.*/.static
1e90: 20 63 68 61 72 20 2a 2a 63 6f 6c 75 6d 6e 4e 61   char **columnNa
1ea0: 6d 65 73 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mes(.  const cha
1eb0: 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
1ec0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1ed0: 73 65 20 28 22 6d 61 69 6e 22 20 6f 72 20 22 61  se ("main" or "a
1ee0: 75 78 22 29 20 74 6f 20 71 75 65 72 79 20 2a 2f  ux") to query */
1ef0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f00: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
1f10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
1f20: 62 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 64 65  ble to return de
1f30: 74 61 69 6c 73 20 6f 66 20 2a 2f 0a 20 20 69 6e  tails of */.  in
1f40: 74 20 2a 70 6e 50 4b 65 79 2c 20 20 20 20 20 20  t *pnPKey,      
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f60: 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20   OUT: Number of 
1f70: 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  PK columns */.  
1f80: 69 6e 74 20 2a 70 62 52 6f 77 69 64 20 20 20 20  int *pbRowid    
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20  /* OUT: True if 
1fb0: 50 4b 20 69 73 20 61 6e 20 69 6d 70 6c 69 63 69  PK is an implici
1fc0: 74 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  t rowid */.){.  
1fd0: 63 68 61 72 20 2a 2a 61 7a 20 3d 20 30 3b 20 20  char **az = 0;  
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1ff0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
2000: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
2010: 2a 2f 0a 20 20 69 6e 74 20 6e 61 7a 20 3d 20 30  */.  int naz = 0
2020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2030: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2040: 65 73 20 69 6e 20 61 7a 5b 5d 20 2a 2f 0a 20 20  es in az[] */.  
2050: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2060: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 51 4c 20  tmt;     /* SQL 
2070: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2080: 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  run */.  char *z
2090: 50 6b 49 64 78 4e 61 6d 65 20 3d 20 30 3b 20 20  PkIdxName = 0;  
20a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
20b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
20c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 74 72 75 65  ex */.  int true
20d0: 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pk = 0;         
20e0: 20 2f 2a 20 50 52 41 47 4d 41 20 74 61 62 6c 65   /* PRAGMA table
20f0: 5f 69 6e 66 6f 20 69 6e 64 65 6e 74 69 66 69 65  _info indentifie
2100: 73 20 74 68 65 20 50 4b 20 74 6f 20 75 73 65 20  s the PK to use 
2110: 2a 2f 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30  */.  int nPK = 0
2120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2130: 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41   Number of PRIMA
2140: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 2a  RY KEY columns *
2150: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2170: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2180: 0a 0a 20 20 69 66 28 20 67 2e 62 53 63 68 65 6d  ..  if( g.bSchem
2190: 61 50 4b 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  aPK==0 ){.    /*
21a0: 20 4e 6f 72 6d 61 6c 20 63 61 73 65 3a 20 20 46   Normal case:  F
21b0: 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74  igure out what t
21c0: 68 65 20 74 72 75 65 20 70 72 69 6d 61 72 79 20  he true primary 
21d0: 6b 65 79 20 69 73 20 66 6f 72 20 74 68 65 20 74  key is for the t
21e0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 20 20 2a  able..    **   *
21f0: 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f    For WITHOUT RO
2200: 57 49 44 20 74 61 62 6c 65 73 2c 20 74 68 65 20  WID tables, the 
2210: 74 72 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79  true primary key
2220: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 0a   is the same as.
2230: 20 20 20 20 2a 2a 20 20 20 20 20 20 74 68 65 20      **      the 
2240: 73 63 68 65 6d 61 20 50 52 49 4d 41 52 59 20 4b  schema PRIMARY K
2250: 45 59 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  EY, which is gua
2260: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 70 72  ranteed to be pr
2270: 65 73 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 20 20  esent..    **   
2280: 2a 20 20 46 6f 72 20 72 6f 77 69 64 20 74 61 62  *  For rowid tab
2290: 6c 65 73 20 77 69 74 68 20 61 6e 20 49 4e 54 45  les with an INTE
22a0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
22b0: 20 74 68 65 20 74 72 75 65 20 70 72 69 6d 61 72   the true primar
22c0: 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6b 65  y.    **      ke
22d0: 79 20 69 73 20 74 68 65 20 49 4e 54 45 47 45 52  y is the INTEGER
22e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20   PRIMARY KEY..  
22f0: 20 20 2a 2a 20 20 20 2a 20 20 46 6f 72 20 61 6c    **   *  For al
2300: 6c 20 6f 74 68 65 72 20 72 6f 77 69 64 20 74 61  l other rowid ta
2310: 62 6c 65 73 2c 20 74 68 65 20 72 6f 77 69 64 20  bles, the rowid 
2320: 69 73 20 74 68 65 20 74 72 75 65 20 70 72 69 6d  is the true prim
2330: 61 72 79 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  ary key..    */.
2340: 20 20 20 20 70 53 74 6d 74 20 3d 20 64 62 5f 70      pStmt = db_p
2350: 72 65 70 61 72 65 28 22 50 52 41 47 4d 41 20 25  repare("PRAGMA %
2360: 73 2e 69 6e 64 65 78 5f 6c 69 73 74 3d 25 51 22  s.index_list=%Q"
2370: 2c 20 7a 44 62 2c 20 7a 54 61 62 29 3b 0a 20 20  , zDb, zTab);.  
2380: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
2390: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
23a0: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
23b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
23c0: 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61  ricmp((const cha
23d0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
23e0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 33 29 2c  n_text(pStmt,3),
23f0: 22 70 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "pk")==0 ){.    
2400: 20 20 20 20 7a 50 6b 49 64 78 4e 61 6d 65 20 3d      zPkIdxName =
2410: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2420: 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ("%s", sqlite3_c
2430: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2440: 2c 20 31 29 29 3b 0a 20 20 20 20 20 20 20 20 62  , 1));.        b
2450: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2460: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2470: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2480: 0a 20 20 20 20 69 66 28 20 7a 50 6b 49 64 78 4e  .    if( zPkIdxN
2490: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ame ){.      int
24a0: 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 20   nKey = 0;.     
24b0: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
24c0: 20 20 20 20 20 74 72 75 65 50 6b 20 3d 20 30 3b       truePk = 0;
24d0: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 64  .      pStmt = d
24e0: 62 5f 70 72 65 70 61 72 65 28 22 50 52 41 47 4d  b_prepare("PRAGM
24f0: 41 20 25 73 2e 69 6e 64 65 78 5f 78 69 6e 66 6f  A %s.index_xinfo
2500: 3d 25 51 22 2c 20 7a 44 62 2c 20 7a 50 6b 49 64  =%Q", zDb, zPkId
2510: 78 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 77 68  xName);.      wh
2520: 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
2530: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
2540: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
2550: 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
2560: 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
2570: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 35 29 20  mn_int(pStmt,5) 
2580: 29 7b 20 6e 4b 65 79 2b 2b 3b 20 63 6f 6e 74 69  ){ nKey++; conti
2590: 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  nue; }.        i
25a0: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
25b0: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 3e 3d  n_int(pStmt,1)>=
25c0: 30 20 29 20 74 72 75 65 50 6b 20 3d 20 31 3b 0a  0 ) truePk = 1;.
25d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25e0: 28 20 6e 43 6f 6c 3d 3d 6e 4b 65 79 20 29 20 74  ( nCol==nKey ) t
25f0: 72 75 65 50 6b 20 3d 20 31 3b 0a 20 20 20 20 20  ruePk = 1;.     
2600: 20 69 66 28 20 74 72 75 65 50 6b 20 29 7b 0a 20   if( truePk ){. 
2610: 20 20 20 20 20 20 20 6e 50 4b 20 3d 20 6e 4b 65         nPK = nKe
2620: 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
2630: 20 20 20 20 20 20 20 20 6e 50 4b 20 3d 20 31 3b          nPK = 1;
2640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2650: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2660: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71  pStmt);.      sq
2670: 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 6b 49 64  lite3_free(zPkId
2680: 78 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  xName);.    }els
2690: 65 7b 0a 20 20 20 20 20 20 74 72 75 65 50 6b 20  e{.      truePk 
26a0: 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50 4b 20 3d  = 1;.      nPK =
26b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   1;.    }.    pS
26c0: 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65  tmt = db_prepare
26d0: 28 22 50 52 41 47 4d 41 20 25 73 2e 74 61 62 6c  ("PRAGMA %s.tabl
26e0: 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 44 62 2c  e_info=%Q", zDb,
26f0: 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b   zTab);.  }else{
2700: 0a 20 20 20 20 2f 2a 20 54 68 65 20 67 2e 62 53  .    /* The g.bS
2710: 63 68 65 6d 61 50 4b 3d 3d 31 20 63 61 73 65 3a  chemaPK==1 case:
2720: 20 20 55 73 65 20 77 68 61 74 65 76 65 72 20 70    Use whatever p
2730: 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 64 65  rimary key is de
2740: 63 6c 61 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e  clared.    ** in
2750: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 20 54 68   the schema.  Th
2760: 65 20 22 72 6f 77 69 64 22 20 77 69 6c 6c 20 73  e "rowid" will s
2770: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20  till be used as 
2780: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  the primary key.
2790: 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 74 61      ** if the ta
27a0: 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 64  ble definition d
27b0: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
27c0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20  a PRIMARY KEY.. 
27d0: 20 20 20 2a 2f 0a 20 20 20 20 6e 50 4b 20 3d 20     */.    nPK = 
27e0: 30 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 64  0;.    pStmt = d
27f0: 62 5f 70 72 65 70 61 72 65 28 22 50 52 41 47 4d  b_prepare("PRAGM
2800: 41 20 25 73 2e 74 61 62 6c 65 5f 69 6e 66 6f 3d  A %s.table_info=
2810: 25 51 22 2c 20 7a 44 62 2c 20 7a 54 61 62 29 3b  %Q", zDb, zTab);
2820: 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
2830: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2840: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
2850: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2860: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
2870: 74 2c 35 29 3e 30 20 29 20 6e 50 4b 2b 2b 3b 0a  t,5)>0 ) nPK++;.
2880: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2890: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
28a0: 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 30 20 29      if( nPK==0 )
28b0: 20 6e 50 4b 20 3d 20 31 3b 0a 20 20 20 20 74 72   nPK = 1;.    tr
28c0: 75 65 50 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  uePk = 1;.  }.  
28d0: 2a 70 6e 50 4b 65 79 20 3d 20 6e 50 4b 3b 0a 20  *pnPKey = nPK;. 
28e0: 20 6e 61 7a 20 3d 20 6e 50 4b 3b 0a 20 20 61 7a   naz = nPK;.  az
28f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2900: 63 28 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  c( sizeof(char*)
2910: 2a 28 6e 50 4b 2b 31 29 20 29 3b 0a 20 20 69 66  *(nPK+1) );.  if
2920: 28 20 61 7a 3d 3d 30 20 29 20 72 75 6e 74 69 6d  ( az==0 ) runtim
2930: 65 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d  eError("out of m
2940: 65 6d 6f 72 79 22 29 3b 0a 20 20 6d 65 6d 73 65  emory");.  memse
2950: 74 28 61 7a 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(az, 0, sizeof(
2960: 63 68 61 72 2a 29 2a 28 6e 50 4b 2b 31 29 29 3b  char*)*(nPK+1));
2970: 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
2980: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2990: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
29a0: 20 69 6e 74 20 69 50 4b 65 79 3b 0a 20 20 20 20   int iPKey;.    
29b0: 69 66 28 20 74 72 75 65 50 6b 20 26 26 20 28 69  if( truePk && (i
29c0: 50 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 63  PKey = sqlite3_c
29d0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
29e0: 35 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 61  5))>0 ){.      a
29f0: 7a 5b 69 50 4b 65 79 2d 31 5d 20 3d 20 73 61 66  z[iPKey-1] = saf
2a00: 65 49 64 28 28 63 68 61 72 2a 29 73 71 6c 69 74  eId((char*)sqlit
2a10: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2a20: 53 74 6d 74 2c 31 29 29 3b 0a 20 20 20 20 7d 65  Stmt,1));.    }e
2a30: 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 20 3d 20  lse{.      az = 
2a40: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
2a50: 61 7a 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  az, sizeof(char*
2a60: 29 2a 28 6e 61 7a 2b 32 29 20 29 3b 0a 20 20 20  )*(naz+2) );.   
2a70: 20 20 20 69 66 28 20 61 7a 3d 3d 30 20 29 20 72     if( az==0 ) r
2a80: 75 6e 74 69 6d 65 45 72 72 6f 72 28 22 6f 75 74  untimeError("out
2a90: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
2aa0: 20 20 20 20 61 7a 5b 6e 61 7a 2b 2b 5d 20 3d 20      az[naz++] = 
2ab0: 73 61 66 65 49 64 28 28 63 68 61 72 2a 29 73 71  safeId((char*)sq
2ac0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2ad0: 74 28 70 53 74 6d 74 2c 31 29 29 3b 0a 20 20 20  t(pStmt,1));.   
2ae0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2af0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2b00: 3b 0a 20 20 69 66 28 20 61 7a 20 29 20 61 7a 5b  ;.  if( az ) az[
2b10: 6e 61 7a 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  naz] = 0;..  /* 
2b20: 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  If it is non-NUL
2b30: 4c 2c 20 73 65 74 20 2a 70 62 52 6f 77 69 64 20  L, set *pbRowid 
2b40: 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 74  to indicate whet
2b50: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 50  her or not the P
2b60: 4b 20 6f 66 20 0a 20 20 2a 2a 20 74 68 69 73 20  K of .  ** this 
2b70: 74 61 62 6c 65 20 69 73 20 61 6e 20 69 6d 70 6c  table is an impl
2b80: 69 63 69 74 20 72 6f 77 69 64 20 28 2a 70 62 52  icit rowid (*pbR
2b90: 6f 77 69 64 3d 3d 31 29 20 6f 72 20 6e 6f 74 20  owid==1) or not 
2ba0: 28 2a 70 62 52 6f 77 69 64 3d 3d 30 29 2e 20 20  (*pbRowid==0).  
2bb0: 2a 2f 0a 20 20 69 66 28 20 70 62 52 6f 77 69 64  */.  if( pbRowid
2bc0: 20 29 20 2a 70 62 52 6f 77 69 64 20 3d 20 28 61   ) *pbRowid = (a
2bd0: 7a 5b 30 5d 3d 3d 30 29 3b 0a 0a 20 20 2f 2a 20  z[0]==0);..  /* 
2be0: 49 66 20 74 68 69 73 20 74 61 62 6c 65 20 68 61  If this table ha
2bf0: 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f  s an implicit ro
2c00: 77 69 64 20 66 6f 72 20 61 20 50 4b 2c 20 66 69  wid for a PK, fi
2c10: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f 20  gure out how to 
2c20: 72 65 66 65 72 0a 20 20 2a 2a 20 74 6f 20 69 74  refer.  ** to it
2c30: 2e 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  . There are thre
2c40: 65 20 6f 70 74 69 6f 6e 73 20 2d 20 22 72 6f 77  e options - "row
2c50: 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 20 61  id", "_rowid_" a
2c60: 6e 64 20 22 6f 69 64 22 2e 20 41 6e 79 0a 20 20  nd "oid". Any.  
2c70: 2a 2a 20 6f 66 20 74 68 65 73 65 20 77 69 6c 6c  ** of these will
2c80: 20 77 6f 72 6b 2c 20 75 6e 6c 65 73 73 20 74 68   work, unless th
2c90: 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65  e table has an e
2ca0: 78 70 6c 69 63 69 74 20 63 6f 6c 75 6d 6e 20 6f  xplicit column o
2cb0: 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  f the.  ** same 
2cc0: 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  name.  */.  if( 
2cd0: 61 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  az[0]==0 ){.    
2ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 52 6f  const char *azRo
2cf0: 77 69 64 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64  wid[] = { "rowid
2d00: 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f  ", "_rowid_", "o
2d10: 69 64 22 20 7d 3b 0a 20 20 20 20 66 6f 72 28 69  id" };.    for(i
2d20: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 52  =0; i<sizeof(azR
2d30: 6f 77 69 64 29 2f 73 69 7a 65 6f 66 28 61 7a 52  owid)/sizeof(azR
2d40: 6f 77 69 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  owid[0]); i++){.
2d50: 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
2d60: 3c 6e 61 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  <naz; j++){.    
2d70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2d80: 73 74 72 69 63 6d 70 28 61 7a 5b 6a 5d 2c 20 61  stricmp(az[j], a
2d90: 7a 52 6f 77 69 64 5b 69 5d 29 3d 3d 30 20 29 20  zRowid[i])==0 ) 
2da0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2db0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 6e 61 7a 20       if( j>=naz 
2dc0: 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 5b 30 5d  ){.        az[0]
2dd0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2de0: 74 66 28 22 25 73 22 2c 20 61 7a 52 6f 77 69 64  tf("%s", azRowid
2df0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72  [i]);.        br
2e00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2e10: 20 7d 0a 20 20 20 20 69 66 28 20 61 7a 5b 30 5d   }.    if( az[0]
2e20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2e30: 28 69 3d 31 3b 20 69 3c 6e 61 7a 3b 20 69 2b 2b  (i=1; i<naz; i++
2e40: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61  ) sqlite3_free(a
2e50: 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  z[i]);.      sql
2e60: 69 74 65 33 5f 66 72 65 65 28 61 7a 29 3b 0a 20  ite3_free(az);. 
2e70: 20 20 20 20 20 61 7a 20 3d 20 30 3b 0a 20 20 20       az = 0;.   
2e80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2e90: 61 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  az;.}../*.** Pri
2ea0: 6e 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  nt the sqlite3_v
2eb0: 61 6c 75 65 20 58 20 61 73 20 61 6e 20 53 51 4c  alue X as an SQL
2ec0: 20 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 73 74 61   literal..*/.sta
2ed0: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 51 75  tic void printQu
2ee0: 6f 74 65 64 28 46 49 4c 45 20 2a 6f 75 74 2c 20  oted(FILE *out, 
2ef0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 58  sqlite3_value *X
2f00: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  ){.  switch( sql
2f10: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
2f20: 58 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  X) ){.    case S
2f30: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
2f40: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 31 3b 0a       double r1;.
2f50: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
2f60: 35 30 5d 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  50];.      r1 = 
2f70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
2f80: 75 62 6c 65 28 58 29 3b 0a 20 20 20 20 20 20 73  uble(X);.      s
2f90: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2fa0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
2fb0: 75 66 2c 20 22 25 21 2e 31 35 67 22 2c 20 72 31  uf, "%!.15g", r1
2fc0: 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
2fd0: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66  (out, "%s", zBuf
2fe0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2ff0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3000: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
3010: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
3020: 75 74 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69  ut, "%lld", sqli
3030: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
3040: 58 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  X));.      break
3050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3060: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
3070: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
3080: 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 6c 6f 62  gned char *zBlob
3090: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
30a0: 5f 62 6c 6f 62 28 58 29 3b 0a 20 20 20 20 20 20  _blob(X);.      
30b0: 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  int nBlob = sqli
30c0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
30d0: 58 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42  X);.      if( zB
30e0: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  lob ){.        i
30f0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 70  nt i;.        fp
3100: 72 69 6e 74 66 28 6f 75 74 2c 20 22 78 27 22 29  rintf(out, "x'")
3110: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
3120: 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29  0; i<nBlob; i++)
3130: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
3140: 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
3150: 20 7a 42 6c 6f 62 5b 69 5d 29 3b 0a 20 20 20 20   zBlob[i]);.    
3160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70      }.        fp
3170: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
3180: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3190: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
31a0: 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  t, "NULL");.    
31b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
31c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
31d0: 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
31e0: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
31f0: 6e 65 64 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  ned char *zArg =
3200: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
3210: 65 78 74 28 58 29 3b 0a 20 20 20 20 20 20 69 6e  ext(X);.      in
3220: 74 20 69 2c 20 6a 3b 0a 0a 20 20 20 20 20 20 69  t i, j;..      i
3230: 66 28 20 7a 41 72 67 3d 3d 30 20 29 7b 0a 20 20  f( zArg==0 ){.  
3240: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
3250: 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  t, "NULL");.    
3260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3270: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27   fprintf(out, "'
3280: 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
3290: 69 3d 6a 3d 30 3b 20 7a 41 72 67 5b 69 5d 3b 20  i=j=0; zArg[i]; 
32a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
32b0: 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27  if( zArg[i]=='\'
32c0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
32d0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
32e0: 2e 2a 73 27 22 2c 20 69 2d 6a 2b 31 2c 20 26 7a  .*s'", i-j+1, &z
32f0: 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[j]);.       
3300: 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20       j = i+1;.  
3310: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3320: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69    }.        fpri
3330: 6e 74 66 28 6f 75 74 2c 20 22 25 73 27 22 2c 20  ntf(out, "%s'", 
3340: 26 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20  &zArg[j]);.     
3350: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
3360: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3370: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
3380: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
3390: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20   "NULL");.      
33a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
33b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
33c0: 20 53 51 4c 20 74 68 61 74 20 77 69 6c 6c 20 72   SQL that will r
33d0: 65 63 72 65 61 74 65 20 74 68 65 20 61 75 78 2e  ecreate the aux.
33e0: 7a 54 61 62 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  zTab table..*/.s
33f0: 74 61 74 69 63 20 76 6f 69 64 20 64 75 6d 70 5f  tatic void dump_
3400: 74 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  table(const char
3410: 20 2a 7a 54 61 62 2c 20 46 49 4c 45 20 2a 6f 75   *zTab, FILE *ou
3420: 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 49 64 20  t){.  char *zId 
3430: 3d 20 73 61 66 65 49 64 28 7a 54 61 62 29 3b 20  = safeId(zTab); 
3440: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3450: 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  able */.  char *
3460: 2a 61 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *az = 0;        
3470: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
3480: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
3490: 6e 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  nPk;            
34a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
34b0: 6f 66 20 74 72 75 65 20 70 72 69 6d 61 72 79 20  of true primary 
34c0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  key columns */. 
34d0: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
34f0: 6d 62 65 72 20 6f 66 20 64 61 74 61 20 63 6f 6c  mber of data col
3500: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  umns */.  int i;
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
3530: 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
3540: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
3550: 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
3560: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
3570: 68 61 72 20 2a 7a 53 65 70 3b 20 20 20 20 20 20  har *zSep;      
3580: 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20     /* Separator 
3590: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 53 74 72 20  string */.  Str 
35a0: 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ins;            
35b0: 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
35c0: 6e 67 20 6f 66 20 74 68 65 20 49 4e 53 45 52 54  ng of the INSERT
35d0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
35e0: 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70   pStmt = db_prep
35f0: 61 72 65 28 22 53 45 4c 45 43 54 20 73 71 6c 20  are("SELECT sql 
3600: 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f  FROM aux.sqlite_
3610: 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d  master WHERE nam
3620: 65 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20  e=%Q", zTab);.  
3630: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
3640: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
3650: 6d 74 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  mt) ){.    fprin
3660: 74 66 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  tf(out, "%s;\n",
3670: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3680: 74 65 78 74 28 70 53 74 6d 74 2c 30 29 29 3b 0a  text(pStmt,0));.
3690: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
36a0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
36b0: 20 69 66 28 20 21 67 2e 62 53 63 68 65 6d 61 4f   if( !g.bSchemaO
36c0: 6e 6c 79 20 29 7b 0a 20 20 20 20 61 7a 20 3d 20  nly ){.    az = 
36d0: 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22 61 75 78  columnNames("aux
36e0: 22 2c 20 7a 54 61 62 2c 20 26 6e 50 6b 2c 20 30  ", zTab, &nPk, 0
36f0: 29 3b 0a 20 20 20 20 73 74 72 49 6e 69 74 28 26  );.    strInit(&
3700: 69 6e 73 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  ins);.    if( az
3710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 74  ==0 ){.      pSt
3720: 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28  mt = db_prepare(
3730: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61  "SELECT * FROM a
3740: 75 78 2e 25 73 22 2c 20 7a 49 64 29 3b 0a 20 20  ux.%s", zId);.  
3750: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 69      strPrintf(&i
3760: 6e 73 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ns,"INSERT INTO 
3770: 25 73 20 56 41 4c 55 45 53 22 2c 20 7a 49 64 29  %s VALUES", zId)
3780: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3790: 20 20 20 53 74 72 20 73 71 6c 3b 0a 20 20 20 20     Str sql;.    
37a0: 20 20 73 74 72 49 6e 69 74 28 26 73 71 6c 29 3b    strInit(&sql);
37b0: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 20 22  .      zSep =  "
37c0: 53 45 4c 45 43 54 22 3b 0a 20 20 20 20 20 20 66  SELECT";.      f
37d0: 6f 72 28 69 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69  or(i=0; az[i]; i
37e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
37f0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73  Printf(&sql, "%s
3800: 20 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69   %s", zSep, az[i
3810: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  ]);.        zSep
3820: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 7d 0a   = ",";.      }.
3830: 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28        strPrintf(
3840: 26 73 71 6c 2c 22 20 46 52 4f 4d 20 61 75 78 2e  &sql," FROM aux.
3850: 25 73 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  %s", zId);.     
3860: 20 7a 53 65 70 20 3d 20 22 20 4f 52 44 45 52 20   zSep = " ORDER 
3870: 42 59 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  BY";.      for(i
3880: 3d 31 3b 20 69 3c 3d 6e 50 6b 3b 20 69 2b 2b 29  =1; i<=nPk; i++)
3890: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 50 72 69  {.        strPri
38a0: 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 20 25 64  ntf(&sql, "%s %d
38b0: 22 2c 20 7a 53 65 70 2c 20 69 29 3b 0a 20 20 20  ", zSep, i);.   
38c0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b       zSep = ",";
38d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
38e0: 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72  Stmt = db_prepar
38f0: 65 28 22 25 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a  e("%s", sql.z);.
3900: 20 20 20 20 20 20 73 74 72 46 72 65 65 28 26 73        strFree(&s
3910: 71 6c 29 3b 0a 20 20 20 20 20 20 73 74 72 50 72  ql);.      strPr
3920: 69 6e 74 66 28 26 69 6e 73 2c 20 22 49 4e 53 45  intf(&ins, "INSE
3930: 52 54 20 49 4e 54 4f 20 25 73 22 2c 20 7a 49 64  RT INTO %s", zId
3940: 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  );.      zSep = 
3950: 22 28 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  "(";.      for(i
3960: 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  =0; az[i]; i++){
3970: 0a 20 20 20 20 20 20 20 20 73 74 72 50 72 69 6e  .        strPrin
3980: 74 66 28 26 69 6e 73 2c 20 22 25 73 25 73 22 2c  tf(&ins, "%s%s",
3990: 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 29 3b 0a 20   zSep, az[i]);. 
39a0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
39b0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
39c0: 20 73 74 72 50 72 69 6e 74 66 28 26 69 6e 73 2c   strPrintf(&ins,
39d0: 22 29 20 56 41 4c 55 45 53 22 29 3b 0a 20 20 20  ") VALUES");.   
39e0: 20 20 20 6e 61 6d 65 6c 69 73 74 46 72 65 65 28     namelistFree(
39f0: 61 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  az);.    }.    n
3a00: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
3a10: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
3a20: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  );.    while( SQ
3a30: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
3a40: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
3a50: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
3a60: 75 74 2c 20 22 25 73 22 2c 69 6e 73 2e 7a 29 3b  ut, "%s",ins.z);
3a70: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 28  .      zSep = "(
3a80: 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ";.      for(i=0
3a90: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
3aa0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
3ab0: 6f 75 74 2c 20 22 25 73 22 2c 7a 53 65 70 29 3b  out, "%s",zSep);
3ac0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 51 75  .        printQu
3ad0: 6f 74 65 64 28 6f 75 74 2c 20 73 71 6c 69 74 65  oted(out, sqlite
3ae0: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
3af0: 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20  Stmt,i));.      
3b00: 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20    zSep = ",";.  
3b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
3b20: 6e 74 66 28 6f 75 74 2c 20 22 29 3b 5c 6e 22 29  ntf(out, ");\n")
3b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3b40: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
3b50: 6d 74 29 3b 0a 20 20 20 20 73 74 72 46 72 65 65  mt);.    strFree
3b60: 28 26 69 6e 73 29 3b 0a 20 20 7d 20 2f 2a 20 65  (&ins);.  } /* e
3b70: 6e 64 69 66 20 21 67 2e 62 53 63 68 65 6d 61 4f  ndif !g.bSchemaO
3b80: 6e 6c 79 20 2a 2f 0a 20 20 70 53 74 6d 74 20 3d  nly */.  pStmt =
3b90: 20 64 62 5f 70 72 65 70 61 72 65 28 22 53 45 4c   db_prepare("SEL
3ba0: 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 61 75 78  ECT sql FROM aux
3bb0: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a  .sqlite_master".
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70       " WHERE typ
3be0: 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
3bf0: 6c 5f 6e 61 6d 65 3d 25 51 20 41 4e 44 20 73 71  l_name=%Q AND sq
3c00: 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 2c 0a  l IS NOT NULL",.
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 20 20 7a 54 61 62 29 3b 0a 20 20 77 68       zTab);.  wh
3c30: 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
3c40: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
3c50: 74 6d 74 29 20 29 7b 0a 20 20 20 20 66 70 72 69  tmt) ){.    fpri
3c60: 6e 74 66 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  ntf(out, "%s;\n"
3c70: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
3c80: 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29 29 3b  _text(pStmt,0));
3c90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
3ca0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
3cb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
3cc0: 65 20 61 6c 6c 20 64 69 66 66 65 72 65 6e 63 65  e all difference
3cd0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
3ce0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
3cf0: 76 6f 69 64 20 64 69 66 66 5f 6f 6e 65 5f 74 61  void diff_one_ta
3d00: 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ble(const char *
3d10: 7a 54 61 62 2c 20 46 49 4c 45 20 2a 6f 75 74 29  zTab, FILE *out)
3d20: 7b 0a 20 20 63 68 61 72 20 2a 7a 49 64 20 3d 20  {.  char *zId = 
3d30: 73 61 66 65 49 64 28 7a 54 61 62 29 3b 20 2f 2a  safeId(zTab); /*
3d40: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 28   Name of table (
3d50: 74 72 61 6e 73 6c 61 74 65 64 20 66 6f 72 20 75  translated for u
3d60: 73 20 69 6e 20 53 51 4c 29 20 2a 2f 0a 20 20 63  s in SQL) */.  c
3d70: 68 61 72 20 2a 2a 61 7a 20 3d 20 30 3b 20 20 20  har **az = 0;   
3d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3d90: 6d 6e 73 20 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20  mns in main */. 
3da0: 20 63 68 61 72 20 2a 2a 61 7a 32 20 3d 20 30 3b   char **az2 = 0;
3db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3dc0: 6c 75 6d 6e 73 20 69 6e 20 61 75 78 20 2a 2f 0a  lumns in aux */.
3dd0: 20 20 69 6e 74 20 6e 50 6b 3b 20 20 20 20 20 20    int nPk;      
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3df0: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
3e00: 6e 73 20 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20  ns in main */.  
3e10: 69 6e 74 20 6e 50 6b 32 3b 20 20 20 20 20 20 20  int nPk2;       
3e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69            /* Pri
3e30: 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  mary key columns
3e40: 20 69 6e 20 61 75 78 20 2a 2f 0a 20 20 69 6e 74   in aux */.  int
3e50: 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
3e60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3e70: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6d   of columns in m
3e80: 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 3b  ain */.  int n2;
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3eb0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 75 78 20 2a  columns in aux *
3ec0: 2f 0a 20 20 69 6e 74 20 6e 51 3b 20 20 20 20 20  /.  int nQ;     
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   Number of outpu
3ef0: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
3f00: 20 64 69 66 66 20 71 75 65 72 79 20 2a 2f 0a 20   diff query */. 
3f10: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
3f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
3f30: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
3f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
3f50: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 70  ;         /* Sep
3f60: 61 72 61 74 6f 72 20 73 74 72 69 6e 67 20 2a 2f  arator string */
3f70: 0a 20 20 53 74 72 20 73 71 6c 3b 20 20 20 20 20  .  Str sql;     
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f90: 43 6f 6d 70 61 72 69 73 6f 6e 20 71 75 65 72 79  Comparison query
3fa0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
3fb0: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
3fc0: 2f 2a 20 51 75 65 72 79 20 73 74 61 74 65 6d 65  /* Query stateme
3fd0: 6e 74 20 74 6f 20 64 6f 20 74 68 65 20 64 69 66  nt to do the dif
3fe0: 66 20 2a 2f 0a 0a 20 20 73 74 72 49 6e 69 74 28  f */..  strInit(
3ff0: 26 73 71 6c 29 3b 0a 20 20 69 66 28 20 67 2e 66  &sql);.  if( g.f
4000: 44 65 62 75 67 3d 3d 44 45 42 55 47 5f 43 4f 4c  Debug==DEBUG_COL
4010: 55 4d 4e 5f 4e 41 4d 45 53 20 29 7b 0a 20 20 20  UMN_NAMES ){.   
4020: 20 2f 2a 20 53 69 6d 70 6c 79 20 72 75 6e 20 63   /* Simply run c
4030: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 6f 6e 20  olumnNames() on 
4040: 61 6c 6c 20 74 61 62 6c 65 73 20 6f 66 20 74 68  all tables of th
4050: 65 20 6f 72 69 67 69 6e 0a 20 20 20 20 2a 2a 20  e origin.    ** 
4060: 64 61 74 61 62 61 73 65 20 61 6e 64 20 73 68 6f  database and sho
4070: 77 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  w the results.  
4080: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
4090: 20 74 65 73 74 69 6e 67 0a 20 20 20 20 2a 2a 20   testing.    ** 
40a0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 66  and debugging of
40b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73   the columnNames
40c0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  () function..   
40d0: 20 2a 2f 0a 20 20 20 20 61 7a 20 3d 20 63 6f 6c   */.    az = col
40e0: 75 6d 6e 4e 61 6d 65 73 28 22 61 75 78 22 2c 7a  umnNames("aux",z
40f0: 54 61 62 2c 20 26 6e 50 6b 2c 20 30 29 3b 0a 20  Tab, &nPk, 0);. 
4100: 20 20 20 69 66 28 20 61 7a 3d 3d 30 20 29 7b 0a     if( az==0 ){.
4110: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 52 6f        printf("Ro
4120: 77 69 64 20 6e 6f 74 20 61 63 63 65 73 73 69 62  wid not accessib
4130: 6c 65 20 66 6f 72 20 25 73 5c 6e 22 2c 20 7a 49  le for %s\n", zI
4140: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
4150: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 3a       printf("%s:
4160: 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 66  ", zId);.      f
4170: 6f 72 28 69 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69  or(i=0; az[i]; i
4180: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  ++){.        pri
4190: 6e 74 66 28 22 20 25 73 22 2c 20 61 7a 5b 69 5d  ntf(" %s", az[i]
41a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
41b0: 2b 31 3d 3d 6e 50 6b 20 29 20 70 72 69 6e 74 66  +1==nPk ) printf
41c0: 28 22 20 2a 22 29 3b 0a 20 20 20 20 20 20 7d 0a  (" *");.      }.
41d0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e        printf("\n
41e0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  ");.    }.    go
41f0: 74 6f 20 65 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f  to end_diff_one_
4200: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 20 20 0a  table;.  }.    .
4210: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
4220: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
4230: 64 61 74 61 28 67 2e 64 62 2c 22 61 75 78 22 2c  data(g.db,"aux",
4240: 7a 54 61 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  zTab,0,0,0,0,0,0
4250: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71  ) ){.    if( !sq
4260: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
4270: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 67 2e 64 62  mn_metadata(g.db
4280: 2c 22 6d 61 69 6e 22 2c 7a 54 61 62 2c 30 2c 30  ,"main",zTab,0,0
4290: 2c 30 2c 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20  ,0,0,0,0) ){.   
42a0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6d 69 73 73     /* Table miss
42b0: 69 6e 67 20 66 72 6f 6d 20 73 65 63 6f 6e 64 20  ing from second 
42c0: 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20  database. */.   
42d0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
42e0: 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73 3b 5c  "DROP TABLE %s;\
42f0: 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 7d 0a  n", zId);.    }.
4300: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 69 66      goto end_dif
4310: 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d  f_one_table;.  }
4320: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
4330: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
4340: 61 64 61 74 61 28 67 2e 64 62 2c 22 6d 61 69 6e  adata(g.db,"main
4350: 22 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c 30 2c 30  ",zTab,0,0,0,0,0
4360: 2c 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61  ,0) ){.    /* Ta
4370: 62 6c 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  ble missing from
4380: 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 64   source */.    d
4390: 75 6d 70 5f 74 61 62 6c 65 28 7a 54 61 62 2c 20  ump_table(zTab, 
43a0: 6f 75 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  out);.    goto e
43b0: 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c  nd_diff_one_tabl
43c0: 65 3b 0a 20 20 7d 0a 0a 20 20 61 7a 20 3d 20 63  e;.  }..  az = c
43d0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22 6d 61 69 6e  olumnNames("main
43e0: 22 2c 20 7a 54 61 62 2c 20 26 6e 50 6b 2c 20 30  ", zTab, &nPk, 0
43f0: 29 3b 0a 20 20 61 7a 32 20 3d 20 63 6f 6c 75 6d  );.  az2 = colum
4400: 6e 4e 61 6d 65 73 28 22 61 75 78 22 2c 20 7a 54  nNames("aux", zT
4410: 61 62 2c 20 26 6e 50 6b 32 2c 20 30 29 3b 0a 20  ab, &nPk2, 0);. 
4420: 20 69 66 28 20 61 7a 20 26 26 20 61 7a 32 20 29   if( az && az2 )
4430: 7b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 61  {.    for(n=0; a
4440: 7a 5b 6e 5d 20 26 26 20 61 7a 32 5b 6e 5d 3b 20  z[n] && az2[n]; 
4450: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  n++){.      if( 
4460: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
4470: 61 7a 5b 6e 5d 2c 61 7a 32 5b 6e 5d 29 21 3d 30  az[n],az2[n])!=0
4480: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
4490: 20 20 7d 0a 20 20 69 66 28 20 61 7a 3d 3d 30 0a    }.  if( az==0.
44a0: 20 20 20 7c 7c 20 61 7a 32 3d 3d 30 0a 20 20 20     || az2==0.   
44b0: 7c 7c 20 6e 50 6b 21 3d 6e 50 6b 32 0a 20 20 20  || nPk!=nPk2.   
44c0: 7c 7c 20 61 7a 5b 6e 5d 0a 20 20 29 7b 0a 20 20  || az[n].  ){.  
44d0: 20 20 2f 2a 20 53 63 68 65 6d 61 20 6d 69 73 6d    /* Schema mism
44e0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 66 70 72 69  atch */.    fpri
44f0: 6e 74 66 28 6f 75 74 2c 20 22 44 52 4f 50 20 54  ntf(out, "DROP T
4500: 41 42 4c 45 20 25 73 3b 20 2d 2d 20 64 75 65 20  ABLE %s; -- due 
4510: 74 6f 20 73 63 68 65 6d 61 20 6d 69 73 6d 61 74  to schema mismat
4520: 63 68 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 20  ch\n", zId);.   
4530: 20 64 75 6d 70 5f 74 61 62 6c 65 28 7a 54 61 62   dump_table(zTab
4540: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 67 6f 74 6f  , out);.    goto
4550: 20 65 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f 74 61   end_diff_one_ta
4560: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  ble;.  }..  /* B
4570: 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 61 72 69  uild the compari
4580: 73 6f 6e 20 71 75 65 72 79 20 2a 2f 0a 20 20 66  son query */.  f
4590: 6f 72 28 6e 32 3d 6e 3b 20 61 7a 32 5b 6e 32 5d  or(n2=n; az2[n2]
45a0: 3b 20 6e 32 2b 2b 29 7b 0a 20 20 20 20 66 70 72  ; n2++){.    fpr
45b0: 69 6e 74 66 28 6f 75 74 2c 20 22 41 4c 54 45 52  intf(out, "ALTER
45c0: 20 54 41 42 4c 45 20 25 73 20 41 44 44 20 43 4f   TABLE %s ADD CO
45d0: 4c 55 4d 4e 20 25 73 3b 5c 6e 22 2c 20 7a 49 64  LUMN %s;\n", zId
45e0: 2c 20 73 61 66 65 49 64 28 61 7a 32 5b 6e 32 5d  , safeId(az2[n2]
45f0: 29 29 3b 0a 20 20 7d 0a 20 20 6e 51 20 3d 20 6e  ));.  }.  nQ = n
4600: 50 6b 32 2b 31 2b 32 2a 28 6e 32 2d 6e 50 6b 32  Pk2+1+2*(n2-nPk2
4610: 29 3b 0a 20 20 69 66 28 20 6e 32 3e 6e 50 6b 32  );.  if( n2>nPk2
4620: 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22   ){.    zSep = "
4630: 53 45 4c 45 43 54 20 22 3b 0a 20 20 20 20 66 6f  SELECT ";.    fo
4640: 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  r(i=0; i<nPk; i+
4650: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69  +){.      strPri
4660: 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 42 2e 25  ntf(&sql, "%sB.%
4670: 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 29  s", zSep, az[i])
4680: 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  ;.      zSep = "
4690: 2c 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  , ";.    }.    s
46a0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
46b0: 2c 20 31 25 73 20 2d 2d 20 63 68 61 6e 67 65 64  , 1%s -- changed
46c0: 20 72 6f 77 5c 6e 22 2c 20 6e 50 6b 3d 3d 6e 20   row\n", nPk==n 
46d0: 3f 20 22 22 20 3a 20 22 2c 22 29 3b 0a 20 20 20  ? "" : ",");.   
46e0: 20 77 68 69 6c 65 28 20 61 7a 5b 69 5d 20 29 7b   while( az[i] ){
46f0: 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66  .      strPrintf
4700: 28 26 73 71 6c 2c 20 22 20 20 20 20 20 20 20 41  (&sql, "       A
4710: 2e 25 73 20 49 53 20 4e 4f 54 20 42 2e 25 73 2c  .%s IS NOT B.%s,
4720: 20 42 2e 25 73 25 73 5c 6e 22 2c 0a 20 20 20 20   B.%s%s\n",.    
4730: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 5b 69              az[i
4740: 5d 2c 20 61 7a 32 5b 69 5d 2c 20 61 7a 32 5b 69  ], az2[i], az2[i
4750: 5d 2c 20 61 7a 32 5b 69 2b 31 5d 3d 3d 30 20 3f  ], az2[i+1]==0 ?
4760: 20 22 22 20 3a 20 22 2c 22 29 3b 0a 20 20 20 20   "" : ",");.    
4770: 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    i++;.    }.   
4780: 20 77 68 69 6c 65 28 20 61 7a 32 5b 69 5d 20 29   while( az2[i] )
4790: 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74  {.      strPrint
47a0: 66 28 26 73 71 6c 2c 20 22 20 20 20 20 20 20 20  f(&sql, "       
47b0: 42 2e 25 73 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  B.%s IS NOT NULL
47c0: 2c 20 42 2e 25 73 25 73 5c 6e 22 2c 0a 20 20 20  , B.%s%s\n",.   
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 32               az2
47e0: 5b 69 5d 2c 20 61 7a 32 5b 69 5d 2c 20 61 7a 32  [i], az2[i], az2
47f0: 5b 69 2b 31 5d 3d 3d 30 20 3f 20 22 22 20 3a 20  [i+1]==0 ? "" : 
4800: 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  ",");.      i++;
4810: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72 50 72  .    }.    strPr
4820: 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20 46 52  intf(&sql, "  FR
4830: 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 2c 20 61 75  OM main.%s A, au
4840: 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49 64 2c 20  x.%s B\n", zId, 
4850: 7a 49 64 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  zId);.    zSep =
4860: 20 22 20 57 48 45 52 45 22 3b 0a 20 20 20 20 66   " WHERE";.    f
4870: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  or(i=0; i<nPk; i
4880: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72  ++){.      strPr
4890: 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 20 41  intf(&sql, "%s A
48a0: 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c  .%s=B.%s", zSep,
48b0: 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a   az[i], az[i]);.
48c0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41        zSep = " A
48d0: 4e 44 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ND";.    }.    z
48e0: 53 65 70 20 3d 20 22 5c 6e 20 20 20 41 4e 44 20  Sep = "\n   AND 
48f0: 28 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61  (";.    while( a
4900: 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 74  z[i] ){.      st
4910: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
4920: 73 41 2e 25 73 20 49 53 20 4e 4f 54 20 42 2e 25  sA.%s IS NOT B.%
4930: 73 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s%s\n",.        
4940: 20 20 20 20 20 20 20 20 7a 53 65 70 2c 20 61 7a          zSep, az
4950: 5b 69 5d 2c 20 61 7a 32 5b 69 5d 2c 20 61 7a 32  [i], az2[i], az2
4960: 5b 69 2b 31 5d 3d 3d 30 20 3f 20 22 29 22 20 3a  [i+1]==0 ? ")" :
4970: 20 22 22 29 3b 0a 20 20 20 20 20 20 7a 53 65 70   "");.      zSep
4980: 20 3d 20 22 20 20 20 20 20 20 20 20 4f 52 20 22   = "        OR "
4990: 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  ;.      i++;.   
49a0: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 61 7a   }.    while( az
49b0: 32 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 74  2[i] ){.      st
49c0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
49d0: 73 42 2e 25 73 20 49 53 20 4e 4f 54 20 4e 55 4c  sB.%s IS NOT NUL
49e0: 4c 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  L%s\n",.        
49f0: 20 20 20 20 20 20 20 20 7a 53 65 70 2c 20 61 7a          zSep, az
4a00: 32 5b 69 5d 2c 20 61 7a 32 5b 69 2b 31 5d 3d 3d  2[i], az2[i+1]==
4a10: 30 20 3f 20 22 29 22 20 3a 20 22 22 29 3b 0a 20  0 ? ")" : "");. 
4a20: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 20 20       zSep = "   
4a30: 20 20 20 20 20 4f 52 20 22 3b 0a 20 20 20 20 20       OR ";.     
4a40: 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   i++;.    }.    
4a50: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
4a60: 22 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b  " UNION ALL\n");
4a70: 0a 20 20 7d 0a 20 20 7a 53 65 70 20 3d 20 22 53  .  }.  zSep = "S
4a80: 45 4c 45 43 54 20 22 3b 0a 20 20 66 6f 72 28 69  ELECT ";.  for(i
4a90: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
4aa0: 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26  .    strPrintf(&
4ab0: 73 71 6c 2c 20 22 25 73 41 2e 25 73 22 2c 20 7a  sql, "%sA.%s", z
4ac0: 53 65 70 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20  Sep, az[i]);.   
4ad0: 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20   zSep = ", ";.  
4ae0: 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  }.  strPrintf(&s
4af0: 71 6c 2c 20 22 2c 20 32 25 73 20 2d 2d 20 64 65  ql, ", 2%s -- de
4b00: 6c 65 74 65 64 20 72 6f 77 5c 6e 22 2c 20 6e 50  leted row\n", nP
4b10: 6b 3d 3d 6e 20 3f 20 22 22 20 3a 20 22 2c 22 29  k==n ? "" : ",")
4b20: 3b 0a 20 20 77 68 69 6c 65 28 20 61 7a 32 5b 69  ;.  while( az2[i
4b30: 5d 20 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e  ] ){.    strPrin
4b40: 74 66 28 26 73 71 6c 2c 20 22 20 20 20 20 20 20  tf(&sql, "      
4b50: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 25 73 5c 6e 22   NULL, NULL%s\n"
4b60: 2c 20 69 3d 3d 6e 32 2d 31 20 3f 20 22 22 20 3a  , i==n2-1 ? "" :
4b70: 20 22 2c 22 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a   ",");.    i++;.
4b80: 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28    }.  strPrintf(
4b90: 26 73 71 6c 2c 20 22 20 20 46 52 4f 4d 20 6d 61  &sql, "  FROM ma
4ba0: 69 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a 49 64 29  in.%s A\n", zId)
4bb0: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  ;.  strPrintf(&s
4bc0: 71 6c 2c 20 22 20 57 48 45 52 45 20 4e 4f 54 20  ql, " WHERE NOT 
4bd0: 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20  EXISTS(SELECT 1 
4be0: 46 52 4f 4d 20 61 75 78 2e 25 73 20 42 5c 6e 22  FROM aux.%s B\n"
4bf0: 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d  , zId);.  zSep =
4c00: 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
4c20: 45 52 45 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ERE";.  for(i=0;
4c30: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
4c40: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
4c50: 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e 25 73 22  , "%s A.%s=B.%s"
4c60: 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 2c 20 61  , zSep, az[i], a
4c70: 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  z[i]);.    zSep 
4c80: 3d 20 22 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20  = " AND";.  }.  
4c90: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
4ca0: 22 29 5c 6e 22 29 3b 0a 20 20 7a 53 65 70 20 3d  ")\n");.  zSep =
4cb0: 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 53 45   " UNION ALL\nSE
4cc0: 4c 45 43 54 20 22 3b 0a 20 20 66 6f 72 28 69 3d  LECT ";.  for(i=
4cd0: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
4ce0: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
4cf0: 71 6c 2c 20 22 25 73 42 2e 25 73 22 2c 20 7a 53  ql, "%sB.%s", zS
4d00: 65 70 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  ep, az[i]);.    
4d10: 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 7d  zSep = ", ";.  }
4d20: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
4d30: 6c 2c 20 22 2c 20 33 25 73 20 2d 2d 20 69 6e 73  l, ", 3%s -- ins
4d40: 65 72 74 65 64 20 72 6f 77 5c 6e 22 2c 20 6e 50  erted row\n", nP
4d50: 6b 3d 3d 6e 20 3f 20 22 22 20 3a 20 22 2c 22 29  k==n ? "" : ",")
4d60: 3b 0a 20 20 77 68 69 6c 65 28 20 61 7a 32 5b 69  ;.  while( az2[i
4d70: 5d 20 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e  ] ){.    strPrin
4d80: 74 66 28 26 73 71 6c 2c 20 22 20 20 20 20 20 20  tf(&sql, "      
4d90: 20 31 2c 20 42 2e 25 73 25 73 5c 6e 22 2c 20 61   1, B.%s%s\n", a
4da0: 7a 32 5b 69 5d 2c 20 61 7a 32 5b 69 2b 31 5d 3d  z2[i], az2[i+1]=
4db0: 3d 30 20 3f 20 22 22 20 3a 20 22 2c 22 29 3b 0a  =0 ? "" : ",");.
4dc0: 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 73      i++;.  }.  s
4dd0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
4de0: 20 20 46 52 4f 4d 20 61 75 78 2e 25 73 20 42 5c    FROM aux.%s B\
4df0: 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 73 74 72 50  n", zId);.  strP
4e00: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 57 48  rintf(&sql, " WH
4e10: 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 28 53  ERE NOT EXISTS(S
4e20: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d 61 69  ELECT 1 FROM mai
4e30: 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a 49 64 29 3b  n.%s A\n", zId);
4e40: 0a 20 20 7a 53 65 70 20 3d 20 20 20 20 20 20 20  .  zSep =       
4e50: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20     "            
4e60: 20 20 20 20 20 20 20 57 48 45 52 45 22 3b 0a 20         WHERE";. 
4e70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b   for(i=0; i<nPk;
4e80: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72   i++){.    strPr
4e90: 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 20 41  intf(&sql, "%s A
4ea0: 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c  .%s=B.%s", zSep,
4eb0: 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a   az[i], az[i]);.
4ec0: 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44      zSep = " AND
4ed0: 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e  ";.  }.  strPrin
4ee0: 74 66 28 26 73 71 6c 2c 20 22 29 5c 6e 20 4f 52  tf(&sql, ")\n OR
4ef0: 44 45 52 20 42 59 22 29 3b 0a 20 20 7a 53 65 70  DER BY");.  zSep
4f00: 20 3d 20 22 20 22 3b 0a 20 20 66 6f 72 28 69 3d   = " ";.  for(i=
4f10: 31 3b 20 69 3c 3d 6e 50 6b 3b 20 69 2b 2b 29 7b  1; i<=nPk; i++){
4f20: 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26  .    strPrintf(&
4f30: 73 71 6c 2c 20 22 25 73 25 64 22 2c 20 7a 53 65  sql, "%s%d", zSe
4f40: 70 2c 20 69 29 3b 0a 20 20 20 20 7a 53 65 70 20  p, i);.    zSep 
4f50: 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20 20 73 74  = ", ";.  }.  st
4f60: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 3b  rPrintf(&sql, ";
4f70: 5c 6e 22 29 3b 0a 0a 20 20 69 66 28 20 67 2e 66  \n");..  if( g.f
4f80: 44 65 62 75 67 20 26 20 44 45 42 55 47 5f 44 49  Debug & DEBUG_DI
4f90: 46 46 5f 53 51 4c 20 29 7b 20 0a 20 20 20 20 70  FF_SQL ){ .    p
4fa0: 72 69 6e 74 66 28 22 53 51 4c 20 66 6f 72 20 25  rintf("SQL for %
4fb0: 73 3a 5c 6e 25 73 5c 6e 22 2c 20 7a 49 64 2c 20  s:\n%s\n", zId, 
4fc0: 73 71 6c 2e 7a 29 3b 0a 20 20 20 20 67 6f 74 6f  sql.z);.    goto
4fd0: 20 65 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f 74 61   end_diff_one_ta
4fe0: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ble;.  }..  /* D
4ff0: 72 6f 70 20 69 6e 64 65 78 65 73 20 74 68 61 74  rop indexes that
5000: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 69 6e 20   are missing in 
5010: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
5020: 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f  */.  pStmt = db_
5030: 70 72 65 70 61 72 65 28 0a 20 20 20 20 22 53 45  prepare(.    "SE
5040: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 6d  LECT name FROM m
5050: 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  ain.sqlite_maste
5060: 72 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 74  r".    " WHERE t
5070: 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20  ype='index' AND 
5080: 74 62 6c 5f 6e 61 6d 65 3d 25 51 22 0a 20 20 20  tbl_name=%Q".   
5090: 20 22 20 20 20 41 4e 44 20 73 71 6c 20 49 53 20   "   AND sql IS 
50a0: 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 22 20  NOT NULL".    " 
50b0: 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 49 4e    AND sql NOT IN
50c0: 20 28 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   (SELECT sql FRO
50d0: 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73  M aux.sqlite_mas
50e0: 74 65 72 22 0a 20 20 20 20 22 20 20 20 20 20 20  ter".    "      
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
5100: 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
5110: 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 3d 25 51   AND tbl_name=%Q
5120: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20  ".    "         
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44               AND
5140: 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c   sql IS NOT NULL
5150: 29 22 2c 0a 20 20 20 20 7a 54 61 62 2c 20 7a 54  )",.    zTab, zT
5160: 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51  ab);.  while( SQ
5170: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
5180: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
5190: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73  .    char *z = s
51a0: 61 66 65 49 64 28 28 63 6f 6e 73 74 20 63 68 61  afeId((const cha
51b0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
51c0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29 29  n_text(pStmt,0))
51d0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
51e0: 74 2c 20 22 44 52 4f 50 20 49 4e 44 45 58 20 25  t, "DROP INDEX %
51f0: 73 3b 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 73  s;\n", z);.    s
5200: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
5210: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
5220: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 0a  nalize(pStmt);..
5230: 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 71 75 65    /* Run the que
5240: 72 79 20 61 6e 64 20 6f 75 74 70 75 74 20 64 69  ry and output di
5250: 66 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 69  fferences */.  i
5260: 66 28 20 21 67 2e 62 53 63 68 65 6d 61 4f 6e 6c  f( !g.bSchemaOnl
5270: 79 20 29 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d  y ){.    pStmt =
5280: 20 64 62 5f 70 72 65 70 61 72 65 28 73 71 6c 2e   db_prepare(sql.
5290: 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53  z);.    while( S
52a0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
52b0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
52c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 79 70  {.      int iTyp
52d0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
52e0: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 6e 50  mn_int(pStmt, nP
52f0: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  k);.      if( iT
5300: 79 70 65 3d 3d 31 20 7c 7c 20 69 54 79 70 65 3d  ype==1 || iType=
5310: 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =2 ){.        if
5320: 28 20 69 54 79 70 65 3d 3d 31 20 29 7b 20 20 20  ( iType==1 ){   
5330: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
5340: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 72  e content of a r
5350: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ow */.          
5360: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 55 50  fprintf(out, "UP
5370: 44 41 54 45 20 25 73 22 2c 20 7a 49 64 29 3b 0a  DATE %s", zId);.
5380: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
5390: 20 22 20 53 45 54 22 3b 0a 20 20 20 20 20 20 20   " SET";.       
53a0: 20 20 20 66 6f 72 28 69 3d 6e 50 6b 2b 31 3b 20     for(i=nPk+1; 
53b0: 69 3c 6e 51 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  i<nQ; i+=2){.   
53c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
53d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
53e0: 70 53 74 6d 74 2c 69 29 3d 3d 30 20 29 20 63 6f  pStmt,i)==0 ) co
53f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5400: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
5410: 20 22 25 73 20 25 73 3d 22 2c 20 7a 53 65 70 2c   "%s %s=", zSep,
5420: 20 61 7a 32 5b 28 69 2b 6e 50 6b 2d 31 29 2f 32   az2[(i+nPk-1)/2
5430: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
5440: 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20  zSep = ",";.    
5450: 20 20 20 20 20 20 20 20 70 72 69 6e 74 51 75 6f          printQuo
5460: 74 65 64 28 6f 75 74 2c 20 73 71 6c 69 74 65 33  ted(out, sqlite3
5470: 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53  _column_value(pS
5480: 74 6d 74 2c 69 2b 31 29 29 3b 0a 20 20 20 20 20  tmt,i+1));.     
5490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
54a0: 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
54b0: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
54c0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
54d0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
54e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 22 2c  DELETE FROM %s",
54f0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 7d   zId);.        }
5500: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
5510: 22 20 57 48 45 52 45 22 3b 0a 20 20 20 20 20 20  " WHERE";.      
5520: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
5530: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5540: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
5550: 25 73 20 25 73 3d 22 2c 20 7a 53 65 70 2c 20 61  %s %s=", zSep, a
5560: 7a 32 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  z2[i]);.        
5570: 20 20 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75    printQuoted(ou
5580: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t, sqlite3_colum
5590: 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 69 29  n_value(pStmt,i)
55a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
55b0: 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20 20 20  p = " AND";.    
55c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70      }.        fp
55d0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 3b 5c 6e 22  rintf(out, ";\n"
55e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  );.      }else{ 
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 2f 2a 20 49 6e 73 65 72 74 20 61 20 72 6f 77   /* Insert a row
5610: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 70 72 69   */.        fpri
5620: 6e 74 66 28 6f 75 74 2c 20 22 49 4e 53 45 52 54  ntf(out, "INSERT
5630: 20 49 4e 54 4f 20 25 73 28 25 73 22 2c 20 7a 49   INTO %s(%s", zI
5640: 64 2c 20 61 7a 32 5b 30 5d 29 3b 0a 20 20 20 20  d, az2[0]);.    
5650: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 32      for(i=1; az2
5660: 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74  [i]; i++) fprint
5670: 66 28 6f 75 74 2c 20 22 2c 25 73 22 2c 20 61 7a  f(out, ",%s", az
5680: 32 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  2[i]);.        f
5690: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 29 20 56  printf(out, ") V
56a0: 41 4c 55 45 53 22 29 3b 0a 20 20 20 20 20 20 20  ALUES");.       
56b0: 20 7a 53 65 70 20 3d 20 22 28 22 3b 0a 20 20 20   zSep = "(";.   
56c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
56d0: 6e 50 6b 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nPk2; i++){.    
56e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
56f0: 74 2c 20 22 25 73 22 2c 20 7a 53 65 70 29 3b 0a  t, "%s", zSep);.
5700: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
5710: 20 22 2c 22 3b 0a 20 20 20 20 20 20 20 20 20 20   ",";.          
5720: 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75 74 2c  printQuoted(out,
5730: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
5740: 76 61 6c 75 65 28 70 53 74 6d 74 2c 69 29 29 3b  value(pStmt,i));
5750: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5760: 20 20 20 66 6f 72 28 69 3d 6e 50 6b 32 2b 32 3b     for(i=nPk2+2;
5770: 20 69 3c 6e 51 3b 20 69 2b 3d 32 29 7b 0a 20 20   i<nQ; i+=2){.  
5780: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
5790: 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  out, ",");.     
57a0: 20 20 20 20 20 70 72 69 6e 74 51 75 6f 74 65 64       printQuoted
57b0: 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f  (out, sqlite3_co
57c0: 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74  lumn_value(pStmt
57d0: 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ,i));.        }.
57e0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
57f0: 6f 75 74 2c 20 22 29 3b 5c 6e 22 29 3b 0a 20 20  out, ");\n");.  
5800: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5810: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
5820: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 20 2f 2a 20  (pStmt);.  } /* 
5830: 65 6e 64 69 66 20 21 67 2e 62 53 63 68 65 6d 61  endif !g.bSchema
5840: 4f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  Only */..  /* Cr
5850: 65 61 74 65 20 69 6e 64 65 78 65 73 20 74 68 61  eate indexes tha
5860: 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 69 6e  t are missing in
5870: 20 74 68 65 20 73 6f 75 72 63 65 20 2a 2f 0a 20   the source */. 
5880: 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70   pStmt = db_prep
5890: 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54  are(.    "SELECT
58a0: 20 73 71 6c 20 46 52 4f 4d 20 61 75 78 2e 73 71   sql FROM aux.sq
58b0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
58c0: 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 69   " WHERE type='i
58d0: 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61  ndex' AND tbl_na
58e0: 6d 65 3d 25 51 22 0a 20 20 20 20 22 20 20 20 41  me=%Q".    "   A
58f0: 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55  ND sql IS NOT NU
5900: 4c 4c 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20  LL".    "   AND 
5910: 73 71 6c 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45  sql NOT IN (SELE
5920: 43 54 20 73 71 6c 20 46 52 4f 4d 20 6d 61 69 6e  CT sql FROM main
5930: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a  .sqlite_master".
5940: 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20      "           
5950: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74           WHERE t
5960: 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20  ype='index' AND 
5970: 74 62 6c 5f 6e 61 6d 65 3d 25 51 22 0a 20 20 20  tbl_name=%Q".   
5980: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
5990: 20 20 20 20 20 20 20 20 41 4e 44 20 73 71 6c 20          AND sql 
59a0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 29 22 2c 0a 20  IS NOT NULL)",. 
59b0: 20 20 20 7a 54 61 62 2c 20 7a 54 61 62 29 3b 0a     zTab, zTab);.
59c0: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
59d0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
59e0: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
59f0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
5a00: 3b 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ;\n", sqlite3_co
5a10: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
5a20: 30 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  0));.  }.  sqlit
5a30: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5a40: 74 29 3b 0a 0a 65 6e 64 5f 64 69 66 66 5f 6f 6e  t);..end_diff_on
5a50: 65 5f 74 61 62 6c 65 3a 0a 20 20 73 74 72 46 72  e_table:.  strFr
5a60: 65 65 28 26 73 71 6c 29 3b 0a 20 20 73 71 6c 69  ee(&sql);.  sqli
5a70: 74 65 33 5f 66 72 65 65 28 7a 49 64 29 3b 0a 20  te3_free(zId);. 
5a80: 20 6e 61 6d 65 6c 69 73 74 46 72 65 65 28 61 7a   namelistFree(az
5a90: 29 3b 0a 20 20 6e 61 6d 65 6c 69 73 74 46 72 65  );.  namelistFre
5aa0: 65 28 61 7a 32 29 3b 0a 20 20 72 65 74 75 72 6e  e(az2);.  return
5ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
5ac0: 20 74 68 61 74 20 74 61 62 6c 65 20 7a 54 61 62   that table zTab
5ad0: 20 65 78 69 73 74 73 20 61 6e 64 20 68 61 73 20   exists and has 
5ae0: 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20  the same schema 
5af0: 69 6e 20 62 6f 74 68 20 74 68 65 20 22 6d 61 69  in both the "mai
5b00: 6e 22 0a 2a 2a 20 61 6e 64 20 22 61 75 78 22 20  n".** and "aux" 
5b10: 64 61 74 61 62 61 73 65 73 20 63 75 72 72 65 6e  databases curren
5b20: 74 6c 79 20 6f 70 65 6e 65 64 20 62 79 20 74 68  tly opened by th
5b30: 65 20 67 6c 6f 62 61 6c 20 64 62 20 68 61 6e 64  e global db hand
5b40: 6c 65 2e 20 49 66 20 74 68 65 79 0a 2a 2a 20 64  le. If they.** d
5b50: 6f 20 6e 6f 74 2c 20 6f 75 74 70 75 74 20 61 6e  o not, output an
5b60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f   error message o
5b70: 6e 20 73 74 64 65 72 72 20 61 6e 64 20 65 78 69  n stderr and exi
5b80: 74 28 31 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  t(1). Otherwise,
5b90: 20 69 66 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d   if.** the schem
5ba0: 61 73 20 64 6f 20 6d 61 74 63 68 2c 20 72 65 74  as do match, ret
5bb0: 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  urn control to t
5bc0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
5bd0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 53  atic void checkS
5be0: 63 68 65 6d 61 73 4d 61 74 63 68 28 63 6f 6e 73  chemasMatch(cons
5bf0: 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
5c00: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
5c10: 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72  Stmt = db_prepar
5c20: 65 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  e(.      "SELECT
5c30: 20 41 2e 73 71 6c 3d 42 2e 73 71 6c 20 46 52 4f   A.sql=B.sql FRO
5c40: 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  M main.sqlite_ma
5c50: 73 74 65 72 20 41 2c 20 61 75 78 2e 73 71 6c 69  ster A, aux.sqli
5c60: 74 65 5f 6d 61 73 74 65 72 20 42 22 0a 20 20 20  te_master B".   
5c70: 20 20 20 22 20 57 48 45 52 45 20 41 2e 6e 61 6d     " WHERE A.nam
5c80: 65 3d 25 51 20 41 4e 44 20 42 2e 6e 61 6d 65 3d  e=%Q AND B.name=
5c90: 25 51 22 2c 20 7a 54 61 62 2c 20 7a 54 61 62 0a  %Q", zTab, zTab.
5ca0: 20 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54    );.  if( SQLIT
5cb0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
5cc0: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
5cd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
5ce0: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30  lumn_int(pStmt,0
5cf0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75  )==0 ){.      ru
5d00: 6e 74 69 6d 65 45 72 72 6f 72 28 22 73 63 68 65  ntimeError("sche
5d10: 6d 61 20 63 68 61 6e 67 65 73 20 66 6f 72 20 74  ma changes for t
5d20: 61 62 6c 65 20 25 73 22 2c 20 73 61 66 65 49 64  able %s", safeId
5d30: 28 7a 54 61 62 29 29 3b 0a 20 20 20 20 7d 0a 20  (zTab));.    }. 
5d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 75 6e 74   }else{.    runt
5d50: 69 6d 65 45 72 72 6f 72 28 22 74 61 62 6c 65 20  imeError("table 
5d60: 25 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  %s missing from 
5d70: 6f 6e 65 20 6f 72 20 62 6f 74 68 20 64 61 74 61  one or both data
5d80: 62 61 73 65 73 22 2c 20 73 61 66 65 49 64 28 7a  bases", safeId(z
5d90: 54 61 62 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Tab));.  }.  sql
5da0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
5db0: 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  tmt);.}../******
5dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e00: 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
5e10: 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 63 6f  owing code is co
5e20: 70 69 65 64 20 66 72 6f 6d 20 66 6f 73 73 69 6c  pied from fossil
5e30: 2e 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 20  . It is used to 
5e40: 67 65 6e 65 72 61 74 65 20 74 68 65 0a 2a 2a 20  generate the.** 
5e50: 66 6f 73 73 69 6c 20 64 65 6c 74 61 20 62 6c 6f  fossil delta blo
5e60: 62 73 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  bs sometimes use
5e70: 64 20 69 6e 20 52 42 55 20 75 70 64 61 74 65 20  d in RBU update 
5e80: 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 0a 74 79 70  records..*/..typ
5e90: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68  edef unsigned sh
5ea0: 6f 72 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66  ort u16;.typedef
5eb0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33   unsigned int u3
5ec0: 32 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  2;.typedef unsig
5ed0: 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 0a 2f 2a  ned char u8;../*
5ee0: 0a 2a 2a 20 54 68 65 20 77 69 64 74 68 20 6f 66  .** The width of
5ef0: 20 61 20 68 61 73 68 20 77 69 6e 64 6f 77 20 69   a hash window i
5f00: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 61 6c  n bytes.  The al
5f10: 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
5f20: 6b 73 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  ks if this.** is
5f30: 20 61 20 70 6f 77 65 72 20 6f 66 20 32 2e 0a 2a   a power of 2..*
5f40: 2f 0a 23 64 65 66 69 6e 65 20 4e 48 41 53 48 20  /.#define NHASH 
5f50: 31 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  16../*.** The cu
5f60: 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
5f70: 68 65 20 72 6f 6c 6c 69 6e 67 20 68 61 73 68 2e  he rolling hash.
5f80: 0a 2a 2a 0a 2a 2a 20 7a 5b 5d 20 68 6f 6c 64 73  .**.** z[] holds
5f90: 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
5fa0: 20 68 61 76 65 20 62 65 65 6e 20 68 61 73 68 65   have been hashe
5fb0: 64 2e 20 20 7a 5b 5d 20 69 73 20 61 20 63 69 72  d.  z[] is a cir
5fc0: 63 75 6c 61 72 20 62 75 66 66 65 72 2e 0a 2a 2a  cular buffer..**
5fd0: 20 7a 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72   z[i] is the fir
5fe0: 73 74 20 65 6e 74 72 79 20 61 6e 64 20 7a 5b 28  st entry and z[(
5ff0: 69 2b 4e 48 41 53 48 2d 31 29 25 4e 48 41 53 48  i+NHASH-1)%NHASH
6000: 5d 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  ] is the last en
6010: 74 72 79 20 6f 66 0a 2a 2a 20 74 68 65 20 77 69  try of.** the wi
6020: 6e 64 6f 77 2e 0a 2a 2a 0a 2a 2a 20 48 61 73 68  ndow..**.** Hash
6030: 2e 61 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  .a is the sum of
6040: 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66   all elements of
6050: 20 68 61 73 68 2e 7a 5b 5d 2e 20 20 48 61 73 68   hash.z[].  Hash
6060: 2e 62 20 69 73 20 61 20 77 65 69 67 68 74 65 64  .b is a weighted
6070: 0a 2a 2a 20 73 75 6d 2e 20 20 48 61 73 68 2e 62  .** sum.  Hash.b
6080: 20 69 73 20 7a 5b 69 5d 2a 4e 48 41 53 48 20 2b   is z[i]*NHASH +
6090: 20 7a 5b 69 2b 31 5d 2a 28 4e 48 41 53 48 2d 31   z[i+1]*(NHASH-1
60a0: 29 20 2b 20 2e 2e 2e 20 2b 20 7a 5b 69 2b 4e 48  ) + ... + z[i+NH
60b0: 41 53 48 2d 31 5d 2a 31 2e 0a 2a 2a 20 28 45 61  ASH-1]*1..** (Ea
60c0: 63 68 20 69 6e 64 65 78 20 66 6f 72 20 7a 5b 5d  ch index for z[]
60d0: 20 73 68 6f 75 6c 64 20 62 65 20 6d 6f 64 75 6c   should be modul
60e0: 65 20 4e 48 41 53 48 2c 20 6f 66 20 63 6f 75 72  e NHASH, of cour
60f0: 73 65 2e 20 20 54 68 65 20 25 4e 48 41 53 48 20  se.  The %NHASH 
6100: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f  operator.** is o
6110: 6d 69 74 74 65 64 20 69 6e 20 74 68 65 20 70 72  mitted in the pr
6120: 69 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 66  ior expression f
6130: 6f 72 20 62 72 65 76 69 74 79 2e 29 0a 2a 2f 0a  or brevity.).*/.
6140: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 68  typedef struct h
6150: 61 73 68 20 68 61 73 68 3b 0a 73 74 72 75 63 74  ash hash;.struct
6160: 20 68 61 73 68 20 7b 0a 20 20 75 31 36 20 61 2c   hash {.  u16 a,
6170: 20 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48   b;         /* H
6180: 61 73 68 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ash values */.  
6190: 75 31 36 20 69 3b 20 20 20 20 20 20 20 20 20 20  u16 i;          
61a0: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68    /* Start of th
61b0: 65 20 68 61 73 68 20 77 69 6e 64 6f 77 20 2a 2f  e hash window */
61c0: 0a 20 20 63 68 61 72 20 7a 5b 4e 48 41 53 48 5d  .  char z[NHASH]
61d0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;    /* The valu
61e0: 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
61f0: 6e 20 68 61 73 68 65 64 20 2a 2f 0a 7d 3b 0a 0a  n hashed */.};..
6200: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
6210: 20 74 68 65 20 72 6f 6c 6c 69 6e 67 20 68 61 73   the rolling has
6220: 68 20 75 73 69 6e 67 20 74 68 65 20 66 69 72 73  h using the firs
6230: 74 20 4e 48 41 53 48 20 63 68 61 72 61 63 74 65  t NHASH characte
6240: 72 73 20 6f 66 20 7a 5b 5d 0a 2a 2f 0a 73 74 61  rs of z[].*/.sta
6250: 74 69 63 20 76 6f 69 64 20 68 61 73 68 5f 69 6e  tic void hash_in
6260: 69 74 28 68 61 73 68 20 2a 70 48 61 73 68 2c 20  it(hash *pHash, 
6270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
6280: 20 20 75 31 36 20 61 2c 20 62 2c 20 69 3b 0a 20    u16 a, b, i;. 
6290: 20 61 20 3d 20 62 20 3d 20 30 3b 0a 20 20 66 6f   a = b = 0;.  fo
62a0: 72 28 69 3d 30 3b 20 69 3c 4e 48 41 53 48 3b 20  r(i=0; i<NHASH; 
62b0: 69 2b 2b 29 7b 0a 20 20 20 20 61 20 2b 3d 20 7a  i++){.    a += z
62c0: 5b 69 5d 3b 0a 20 20 20 20 62 20 2b 3d 20 28 4e  [i];.    b += (N
62d0: 48 41 53 48 2d 69 29 2a 7a 5b 69 5d 3b 0a 20 20  HASH-i)*z[i];.  
62e0: 20 20 70 48 61 73 68 2d 3e 7a 5b 69 5d 20 3d 20    pHash->z[i] = 
62f0: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 48 61 73  z[i];.  }.  pHas
6300: 68 2d 3e 61 20 3d 20 61 20 26 20 30 78 66 66 66  h->a = a & 0xfff
6310: 66 3b 0a 20 20 70 48 61 73 68 2d 3e 62 20 3d 20  f;.  pHash->b = 
6320: 62 20 26 20 30 78 66 66 66 66 3b 0a 20 20 70 48  b & 0xffff;.  pH
6330: 61 73 68 2d 3e 69 20 3d 20 30 3b 0a 7d 0a 0a 2f  ash->i = 0;.}../
6340: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
6350: 20 72 6f 6c 6c 69 6e 67 20 68 61 73 68 20 62 79   rolling hash by
6360: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
6370: 74 65 72 20 22 63 22 0a 2a 2f 0a 73 74 61 74 69  ter "c".*/.stati
6380: 63 20 76 6f 69 64 20 68 61 73 68 5f 6e 65 78 74  c void hash_next
6390: 28 68 61 73 68 20 2a 70 48 61 73 68 2c 20 69 6e  (hash *pHash, in
63a0: 74 20 63 29 7b 0a 20 20 75 31 36 20 6f 6c 64 20  t c){.  u16 old 
63b0: 3d 20 70 48 61 73 68 2d 3e 7a 5b 70 48 61 73 68  = pHash->z[pHash
63c0: 2d 3e 69 5d 3b 0a 20 20 70 48 61 73 68 2d 3e 7a  ->i];.  pHash->z
63d0: 5b 70 48 61 73 68 2d 3e 69 5d 20 3d 20 28 63 68  [pHash->i] = (ch
63e0: 61 72 29 63 3b 0a 20 20 70 48 61 73 68 2d 3e 69  ar)c;.  pHash->i
63f0: 20 3d 20 28 70 48 61 73 68 2d 3e 69 2b 31 29 26   = (pHash->i+1)&
6400: 28 4e 48 41 53 48 2d 31 29 3b 0a 20 20 70 48 61  (NHASH-1);.  pHa
6410: 73 68 2d 3e 61 20 3d 20 70 48 61 73 68 2d 3e 61  sh->a = pHash->a
6420: 20 2d 20 6f 6c 64 20 2b 20 28 63 68 61 72 29 63   - old + (char)c
6430: 3b 0a 20 20 70 48 61 73 68 2d 3e 62 20 3d 20 70  ;.  pHash->b = p
6440: 48 61 73 68 2d 3e 62 20 2d 20 4e 48 41 53 48 2a  Hash->b - NHASH*
6450: 6f 6c 64 20 2b 20 70 48 61 73 68 2d 3e 61 3b 0a  old + pHash->a;.
6460: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6470: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 76 61  a 32-bit hash va
6480: 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  lue.*/.static u3
6490: 32 20 68 61 73 68 5f 33 32 62 69 74 28 68 61 73  2 hash_32bit(has
64a0: 68 20 2a 70 48 61 73 68 29 7b 0a 20 20 72 65 74  h *pHash){.  ret
64b0: 75 72 6e 20 28 70 48 61 73 68 2d 3e 61 20 26 20  urn (pHash->a & 
64c0: 30 78 66 66 66 66 29 20 7c 20 28 28 28 75 33 32  0xffff) | (((u32
64d0: 29 28 70 48 61 73 68 2d 3e 62 20 26 20 30 78 66  )(pHash->b & 0xf
64e0: 66 66 66 29 29 3c 3c 31 36 29 3b 0a 7d 0a 0a 2f  fff))<<16);.}../
64f0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 62 61  *.** Write an ba
6500: 73 65 2d 36 34 20 69 6e 74 65 67 65 72 20 69 6e  se-64 integer in
6510: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 62 75 66  to the given buf
6520: 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  fer..*/.static v
6530: 6f 69 64 20 70 75 74 49 6e 74 28 75 6e 73 69 67  oid putInt(unsig
6540: 6e 65 64 20 69 6e 74 20 76 2c 20 63 68 61 72 20  ned int v, char 
6550: 2a 2a 70 7a 29 7b 0a 20 20 73 74 61 74 69 63 20  **pz){.  static 
6560: 63 6f 6e 73 74 20 63 68 61 72 20 7a 44 69 67 69  const char zDigi
6570: 74 73 5b 5d 20 3d 0a 20 20 20 20 22 30 31 32 33  ts[] =.    "0123
6580: 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 4a  456789ABCDEFGHIJ
6590: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
65a0: 5f 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  _abcdefghijklmno
65b0: 70 71 72 73 74 75 76 77 78 79 7a 7e 22 3b 0a 20  pqrstuvwxyz~";. 
65c0: 20 2f 2a 20 20 31 32 33 34 35 36 37 38 39 20 31   /*  123456789 1
65d0: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
65e0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
65f0: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
6600: 20 31 32 33 20 2a 2f 0a 20 20 69 6e 74 20 69 2c   123 */.  int i,
6610: 20 6a 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   j;.  char zBuf[
6620: 32 30 5d 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  20];.  if( v==0 
6630: 29 7b 0a 20 20 20 20 2a 28 2a 70 7a 29 2b 2b 20  ){.    *(*pz)++ 
6640: 3d 20 27 30 27 3b 0a 20 20 20 20 72 65 74 75 72  = '0';.    retur
6650: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
6660: 3b 20 76 3e 30 3b 20 69 2b 2b 2c 20 76 3e 3e 3d  ; v>0; i++, v>>=
6670: 36 29 7b 0a 20 20 20 20 7a 42 75 66 5b 69 5d 20  6){.    zBuf[i] 
6680: 3d 20 7a 44 69 67 69 74 73 5b 76 26 30 78 33 66  = zDigits[v&0x3f
6690: 5d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6a 3d 69  ];.  }.  for(j=i
66a0: 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
66b0: 20 20 20 20 2a 28 2a 70 7a 29 2b 2b 20 3d 20 7a      *(*pz)++ = z
66c0: 42 75 66 5b 6a 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Buf[j];.  }.}../
66d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
66e0: 6e 75 6d 62 65 72 20 64 69 67 69 74 73 20 69 6e  number digits in
66f0: 20 74 68 65 20 62 61 73 65 2d 36 34 20 72 65 70   the base-64 rep
6700: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
6710: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
6720: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
6730: 64 69 67 69 74 5f 63 6f 75 6e 74 28 69 6e 74 20  digit_count(int 
6740: 76 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  v){.  unsigned i
6750: 6e 74 20 69 2c 20 78 3b 0a 20 20 66 6f 72 28 69  nt i, x;.  for(i
6760: 3d 31 2c 20 78 3d 36 34 3b 20 28 75 6e 73 69 67  =1, x=64; (unsig
6770: 6e 65 64 20 69 6e 74 29 76 3e 3d 78 3b 20 69 2b  ned int)v>=x; i+
6780: 2b 2c 20 78 20 3c 3c 3d 20 36 29 7b 7d 0a 20 20  +, x <<= 6){}.  
6790: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
67a0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 33 32 2d  ** Compute a 32-
67b0: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
67c0: 74 68 65 20 4e 2d 62 79 74 65 20 62 75 66 66 65  the N-byte buffe
67d0: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
67e0: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
67f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 68   unsigned int ch
6800: 65 63 6b 73 75 6d 28 63 6f 6e 73 74 20 63 68 61  ecksum(const cha
6810: 72 20 2a 7a 49 6e 2c 20 73 69 7a 65 5f 74 20 4e  r *zIn, size_t N
6820: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
6830: 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  ned char *z = (c
6840: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6850: 61 72 20 2a 29 7a 49 6e 3b 0a 20 20 75 6e 73 69  ar *)zIn;.  unsi
6860: 67 6e 65 64 20 73 75 6d 30 20 3d 20 30 3b 0a 20  gned sum0 = 0;. 
6870: 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 31 20 3d   unsigned sum1 =
6880: 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73   0;.  unsigned s
6890: 75 6d 32 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  um2 = 0;.  unsig
68a0: 6e 65 64 20 73 75 6d 33 20 3d 20 30 3b 0a 20 20  ned sum3 = 0;.  
68b0: 77 68 69 6c 65 28 4e 20 3e 3d 20 31 36 29 7b 0a  while(N >= 16){.
68c0: 20 20 20 20 73 75 6d 30 20 2b 3d 20 28 28 75 6e      sum0 += ((un
68d0: 73 69 67 6e 65 64 29 7a 5b 30 5d 20 2b 20 7a 5b  signed)z[0] + z[
68e0: 34 5d 20 2b 20 7a 5b 38 5d 20 2b 20 7a 5b 31 32  4] + z[8] + z[12
68f0: 5d 29 3b 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20  ]);.    sum1 += 
6900: 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 31 5d 20  ((unsigned)z[1] 
6910: 2b 20 7a 5b 35 5d 20 2b 20 7a 5b 39 5d 20 2b 20  + z[5] + z[9] + 
6920: 7a 5b 31 33 5d 29 3b 0a 20 20 20 20 73 75 6d 32  z[13]);.    sum2
6930: 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a   += ((unsigned)z
6940: 5b 32 5d 20 2b 20 7a 5b 36 5d 20 2b 20 7a 5b 31  [2] + z[6] + z[1
6950: 30 5d 2b 20 7a 5b 31 34 5d 29 3b 0a 20 20 20 20  0]+ z[14]);.    
6960: 73 75 6d 33 20 2b 3d 20 28 28 75 6e 73 69 67 6e  sum3 += ((unsign
6970: 65 64 29 7a 5b 33 5d 20 2b 20 7a 5b 37 5d 20 2b  ed)z[3] + z[7] +
6980: 20 7a 5b 31 31 5d 2b 20 7a 5b 31 35 5d 29 3b 0a   z[11]+ z[15]);.
6990: 20 20 20 20 7a 20 2b 3d 20 31 36 3b 0a 20 20 20      z += 16;.   
69a0: 20 4e 20 2d 3d 20 31 36 3b 0a 20 20 7d 0a 20 20   N -= 16;.  }.  
69b0: 77 68 69 6c 65 28 4e 20 3e 3d 20 34 29 7b 0a 20  while(N >= 4){. 
69c0: 20 20 20 73 75 6d 30 20 2b 3d 20 7a 5b 30 5d 3b     sum0 += z[0];
69d0: 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20 7a 5b 31  .    sum1 += z[1
69e0: 5d 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d 20 7a  ];.    sum2 += z
69f0: 5b 32 5d 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d  [2];.    sum3 +=
6a00: 20 7a 5b 33 5d 3b 0a 20 20 20 20 7a 20 2b 3d 20   z[3];.    z += 
6a10: 34 3b 0a 20 20 20 20 4e 20 2d 3d 20 34 3b 0a 20  4;.    N -= 4;. 
6a20: 20 7d 0a 20 20 73 75 6d 33 20 2b 3d 20 28 73 75   }.  sum3 += (su
6a30: 6d 32 20 3c 3c 20 38 29 20 2b 20 28 73 75 6d 31  m2 << 8) + (sum1
6a40: 20 3c 3c 20 31 36 29 20 2b 20 28 73 75 6d 30 20   << 16) + (sum0 
6a50: 3c 3c 20 32 34 29 3b 0a 20 20 73 77 69 74 63 68  << 24);.  switch
6a60: 28 4e 29 7b 0a 20 20 20 20 63 61 73 65 20 33 3a  (N){.    case 3:
6a70: 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 32 5d     sum3 += (z[2]
6a80: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 63 61 73 65   << 8);.    case
6a90: 20 32 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a   2:   sum3 += (z
6aa0: 5b 31 5d 20 3c 3c 20 31 36 29 3b 0a 20 20 20 20  [1] << 16);.    
6ab0: 63 61 73 65 20 31 3a 20 20 20 73 75 6d 33 20 2b  case 1:   sum3 +
6ac0: 3d 20 28 7a 5b 30 5d 20 3c 3c 20 32 34 29 3b 0a  = (z[0] << 24);.
6ad0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 3b 0a      default:  ;.
6ae0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 75 6d    }.  return sum
6af0: 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  3;.}../*.** Crea
6b00: 74 65 20 61 20 6e 65 77 20 64 65 6c 74 61 2e 0a  te a new delta..
6b10: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20  **.** The delta 
6b20: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
6b30: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
6b40: 75 66 66 65 72 2c 20 7a 44 65 6c 74 61 2c 20 77  uffer, zDelta, w
6b50: 68 69 63 68 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  hich.** should b
6b60: 65 20 61 74 20 6c 65 61 73 74 20 36 30 20 62 79  e at least 60 by
6b70: 74 65 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  tes longer than 
6b80: 74 68 65 20 74 61 72 67 65 74 20 66 69 6c 65 2c  the target file,
6b90: 20 7a 4f 75 74 2e 0a 2a 2a 20 54 68 65 20 64 65   zOut..** The de
6ba0: 6c 74 61 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  lta string will 
6bb0: 62 65 20 4e 55 4c 2d 74 65 72 6d 69 6e 61 74 65  be NUL-terminate
6bc0: 64 2c 20 62 75 74 20 69 74 20 6d 69 67 68 74 20  d, but it might 
6bd0: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  also contain.** 
6be0: 65 6d 62 65 64 64 65 64 20 4e 55 4c 20 63 68 61  embedded NUL cha
6bf0: 72 61 63 74 65 72 73 20 69 66 20 65 69 74 68 65  racters if eithe
6c00: 72 20 74 68 65 20 7a 53 72 63 20 6f 72 20 7a 4f  r the zSrc or zO
6c10: 75 74 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ut files are.** 
6c20: 62 69 6e 61 72 79 2e 20 20 54 68 69 73 20 66 75  binary.  This fu
6c30: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
6c40: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
6c50: 20 64 65 6c 74 61 20 73 74 72 69 6e 67 0a 2a 2a   delta string.**
6c60: 20 69 6e 20 62 79 74 65 73 2c 20 65 78 63 6c 75   in bytes, exclu
6c70: 64 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 4e  ding the final N
6c80: 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  UL terminator ch
6c90: 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f  aracter..**.** O
6ca0: 75 74 70 75 74 20 46 6f 72 6d 61 74 3a 0a 2a 2a  utput Format:.**
6cb0: 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 62 65  .** The delta be
6cc0: 67 69 6e 73 20 77 69 74 68 20 61 20 62 61 73 65  gins with a base
6cd0: 36 34 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77  64 number follow
6ce0: 65 64 20 62 79 20 61 20 6e 65 77 6c 69 6e 65 2e  ed by a newline.
6cf0: 20 20 54 68 69 73 0a 2a 2a 20 6e 75 6d 62 65 72    This.** number
6d00: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
6d10: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 54  f bytes in the T
6d20: 41 52 47 45 54 20 66 69 6c 65 2e 20 20 54 68 75  ARGET file.  Thu
6d30: 73 2c 20 67 69 76 65 6e 20 61 0a 2a 2a 20 64 65  s, given a.** de
6d40: 6c 74 61 20 66 69 6c 65 20 7a 2c 20 61 20 70 72  lta file z, a pr
6d50: 6f 67 72 61 6d 20 63 61 6e 20 63 6f 6d 70 75 74  ogram can comput
6d60: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
6d70: 65 20 6f 75 74 70 75 74 20 66 69 6c 65 0a 2a 2a  e output file.**
6d80: 20 73 69 6d 70 6c 79 20 62 79 20 72 65 61 64 69   simply by readi
6d90: 6e 67 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  ng the first lin
6da0: 65 20 61 6e 64 20 64 65 63 6f 64 69 6e 67 20 74  e and decoding t
6db0: 68 65 20 62 61 73 65 2d 36 34 20 6e 75 6d 62 65  he base-64 numbe
6dc0: 72 0a 2a 2a 20 66 6f 75 6e 64 20 74 68 65 72 65  r.** found there
6dd0: 2e 20 20 54 68 65 20 64 65 6c 74 61 5f 6f 75 74  .  The delta_out
6de0: 70 75 74 5f 73 69 7a 65 28 29 20 72 6f 75 74 69  put_size() routi
6df0: 6e 65 20 64 6f 65 73 20 65 78 61 63 74 6c 79 20  ne does exactly 
6e00: 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  this..**.** Afte
6e10: 72 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 69  r the initial si
6e20: 7a 65 20 6e 75 6d 62 65 72 2c 20 74 68 65 20 64  ze number, the d
6e30: 65 6c 74 61 20 63 6f 6e 73 69 73 74 73 20 6f 66  elta consists of
6e40: 20 61 20 73 65 72 69 65 73 20 6f 66 0a 2a 2a 20   a series of.** 
6e50: 6c 69 74 65 72 61 6c 20 74 65 78 74 20 73 65 67  literal text seg
6e60: 6d 65 6e 74 73 20 61 6e 64 20 63 6f 6d 6d 61 6e  ments and comman
6e70: 64 73 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20  ds to copy from 
6e80: 74 68 65 20 53 4f 55 52 43 45 20 66 69 6c 65 2e  the SOURCE file.
6e90: 0a 2a 2a 20 41 20 63 6f 70 79 20 63 6f 6d 6d 61  .** A copy comma
6ea0: 6e 64 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  nd looks like th
6eb0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e 4e  is:.**.**     NN
6ec0: 4e 40 4d 4d 4d 2c 0a 2a 2a 0a 2a 2a 20 77 68 65  N@MMM,.**.** whe
6ed0: 72 65 20 4e 4e 4e 20 69 73 20 74 68 65 20 6e 75  re NNN is the nu
6ee0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
6ef0: 20 62 65 20 63 6f 70 69 65 64 20 61 6e 64 20 4d   be copied and M
6f00: 4d 4d 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  MM is the offset
6f10: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 6f 75  .** into the sou
6f20: 72 63 65 20 66 69 6c 65 20 6f 66 20 74 68 65 20  rce file of the 
6f30: 66 69 72 73 74 20 62 79 74 65 20 28 62 6f 74 68  first byte (both
6f40: 20 62 61 73 65 2d 36 34 29 2e 20 20 20 49 66 20   base-64).   If 
6f50: 4e 4e 4e 20 69 73 20 30 0a 2a 2a 20 69 74 20 6d  NNN is 0.** it m
6f60: 65 61 6e 73 20 63 6f 70 79 20 74 68 65 20 72 65  eans copy the re
6f70: 73 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  st of the input 
6f80: 66 69 6c 65 2e 20 20 4c 69 74 65 72 61 6c 20 74  file.  Literal t
6f90: 65 78 74 20 69 73 20 6c 69 6b 65 20 74 68 69 73  ext is like this
6fa0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e 4e 4e 3a  :.**.**     NNN:
6fb0: 54 54 54 54 54 0a 2a 2a 0a 2a 2a 20 77 68 65 72  TTTTT.**.** wher
6fc0: 65 20 4e 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  e NNN is the num
6fd0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
6fe0: 74 65 78 74 20 28 62 61 73 65 2d 36 34 29 20 61  text (base-64) a
6ff0: 6e 64 20 54 54 54 54 54 20 69 73 20 74 68 65 20  nd TTTTT is the 
7000: 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  text..**.** The 
7010: 6c 61 73 74 20 74 65 72 6d 20 69 73 20 6f 66 20  last term is of 
7020: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
7030: 20 20 20 4e 4e 4e 3b 0a 2a 2a 0a 2a 2a 20 49 6e     NNN;.**.** In
7040: 20 74 68 69 73 20 63 61 73 65 2c 20 4e 4e 4e 20   this case, NNN 
7050: 69 73 20 61 20 33 32 2d 62 69 74 20 62 69 67 65  is a 32-bit bige
7060: 6e 64 69 61 6e 20 63 68 65 63 6b 73 75 6d 20 6f  ndian checksum o
7070: 66 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c  f the output fil
7080: 65 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65  e.** that can be
7090: 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   used to verify 
70a0: 74 68 61 74 20 74 68 65 20 64 65 6c 74 61 20 61  that the delta a
70b0: 70 70 6c 69 65 64 20 63 6f 72 72 65 63 74 6c 79  pplied correctly
70c0: 2e 20 20 41 6c 6c 0a 2a 2a 20 6e 75 6d 62 65 72  .  All.** number
70d0: 73 20 61 72 65 20 69 6e 20 62 61 73 65 2d 36 34  s are in base-64
70e0: 2e 0a 2a 2a 0a 2a 2a 20 50 75 72 65 20 74 65 78  ..**.** Pure tex
70f0: 74 20 66 69 6c 65 73 20 67 65 6e 65 72 61 74 65  t files generate
7100: 20 61 20 70 75 72 65 20 74 65 78 74 20 64 65 6c   a pure text del
7110: 74 61 2e 20 20 42 69 6e 61 72 79 20 66 69 6c 65  ta.  Binary file
7120: 73 20 67 65 6e 65 72 61 74 65 20 61 0a 2a 2a 20  s generate a.** 
7130: 64 65 6c 74 61 20 74 68 61 74 20 6d 61 79 20 63  delta that may c
7140: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 62 69 6e 61  ontain some bina
7150: 72 79 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 41  ry data..**.** A
7160: 6c 67 6f 72 69 74 68 6d 3a 0a 2a 2a 0a 2a 2a 20  lgorithm:.**.** 
7170: 54 68 65 20 65 6e 63 6f 64 65 72 20 66 69 72 73  The encoder firs
7180: 74 20 62 75 69 6c 64 73 20 61 20 68 61 73 68 20  t builds a hash 
7190: 74 61 62 6c 65 20 74 6f 20 68 65 6c 70 20 69 74  table to help it
71a0: 20 66 69 6e 64 20 6d 61 74 63 68 69 6e 67 0a 2a   find matching.*
71b0: 2a 20 70 61 74 74 65 72 6e 73 20 69 6e 20 74 68  * patterns in th
71c0: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 20 20  e source file.  
71d0: 31 36 2d 62 79 74 65 20 63 68 75 6e 6b 73 20 6f  16-byte chunks o
71e0: 66 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c  f the source fil
71f0: 65 0a 2a 2a 20 73 61 6d 70 6c 65 64 20 61 74 20  e.** sampled at 
7200: 65 76 65 6e 6c 79 20 73 70 61 63 65 64 20 69 6e  evenly spaced in
7210: 74 65 72 76 61 6c 73 20 61 72 65 20 75 73 65 64  tervals are used
7220: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
7230: 20 68 61 73 68 0a 2a 2a 20 74 61 62 6c 65 2e 0a   hash.** table..
7240: 2a 2a 0a 2a 2a 20 4e 65 78 74 20 77 65 20 62 65  **.** Next we be
7250: 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 65  gin scanning the
7260: 20 74 61 72 67 65 74 20 66 69 6c 65 20 75 73 69   target file usi
7270: 6e 67 20 61 20 73 6c 69 64 69 6e 67 20 31 36 2d  ng a sliding 16-
7280: 62 79 74 65 0a 2a 2a 20 77 69 6e 64 6f 77 2e 20  byte.** window. 
7290: 20 54 68 65 20 68 61 73 68 20 6f 66 20 74 68 65   The hash of the
72a0: 20 31 36 2d 62 79 74 65 20 77 69 6e 64 6f 77 20   16-byte window 
72b0: 69 6e 20 74 68 65 20 74 61 72 67 65 74 20 69 73  in the target is
72c0: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 73 65 61 72   used to.** sear
72d0: 63 68 20 66 6f 72 20 61 20 6d 61 74 63 68 69 6e  ch for a matchin
72e0: 67 20 73 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  g section in the
72f0: 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 20 20 57   source file.  W
7300: 68 65 6e 20 61 20 6d 61 74 63 68 0a 2a 2a 20 69  hen a match.** i
7310: 73 20 66 6f 75 6e 64 2c 20 61 20 63 6f 70 79 20  s found, a copy 
7320: 63 6f 6d 6d 61 6e 64 20 69 73 20 61 64 64 65 64  command is added
7330: 20 74 6f 20 74 68 65 20 64 65 6c 74 61 2e 20 20   to the delta.  
7340: 41 6e 20 65 66 66 6f 72 74 20 69 73 0a 2a 2a 20  An effort is.** 
7350: 6d 61 64 65 20 74 6f 20 65 78 74 65 6e 64 20 74  made to extend t
7360: 68 65 20 6d 61 74 63 68 69 6e 67 20 73 65 63 74  he matching sect
7370: 69 6f 6e 20 74 6f 20 72 65 67 69 6f 6e 73 20 74  ion to regions t
7380: 68 61 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a  hat come before.
7390: 2a 2a 20 61 6e 64 20 61 66 74 65 72 20 74 68 65  ** and after the
73a0: 20 31 36 2d 62 79 74 65 20 68 61 73 68 20 77 69   16-byte hash wi
73b0: 6e 64 6f 77 2e 20 20 41 20 63 6f 70 79 20 63 6f  ndow.  A copy co
73c0: 6d 6d 61 6e 64 20 69 73 20 6f 6e 6c 79 20 69 73  mmand is only is
73d0: 73 75 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 72  sued.** if the r
73e0: 65 73 75 6c 74 20 77 6f 75 6c 64 20 75 73 65 20  esult would use 
73f0: 6c 65 73 73 20 73 70 61 63 65 20 74 68 61 74 20  less space that 
7400: 6a 75 73 74 20 71 75 6f 74 69 6e 67 20 74 68 65  just quoting the
7410: 20 74 65 78 74 0a 2a 2a 20 6c 69 74 65 72 61 6c   text.** literal
7420: 6c 79 2e 20 4c 69 74 65 72 61 6c 20 74 65 78 74  ly. Literal text
7430: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
7440: 20 64 65 6c 74 61 20 66 6f 72 20 73 65 63 74 69   delta for secti
7450: 6f 6e 73 20 74 68 61 74 0a 2a 2a 20 64 6f 20 6e  ons that.** do n
7460: 6f 74 20 6d 61 74 63 68 20 6f 72 20 77 68 69 63  ot match or whic
7470: 68 20 63 61 6e 20 6e 6f 74 20 62 65 20 65 6e 63  h can not be enc
7480: 6f 64 65 64 20 65 66 66 69 63 69 65 6e 74 6c 79  oded efficiently
7490: 20 75 73 69 6e 67 20 63 6f 70 79 0a 2a 2a 20 63   using copy.** c
74a0: 6f 6d 6d 61 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74  ommands..*/.stat
74b0: 69 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61 43  ic int rbuDeltaC
74c0: 72 65 61 74 65 28 0a 20 20 63 6f 6e 73 74 20 63  reate(.  const c
74d0: 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20 20 20  har *zSrc,      
74e0: 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20 6f 72  /* The source or
74f0: 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20 2a 2f   pattern file */
7500: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
7510: 6c 65 6e 53 72 63 2c 20 20 20 2f 2a 20 4c 65 6e  lenSrc,   /* Len
7520: 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63  gth of the sourc
7530: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  e file */.  cons
7540: 74 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20  t char *zOut,   
7550: 20 20 20 2f 2a 20 54 68 65 20 74 61 72 67 65 74     /* The target
7560: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67   file */.  unsig
7570: 6e 65 64 20 69 6e 74 20 6c 65 6e 4f 75 74 2c 20  ned int lenOut, 
7580: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
7590: 68 65 20 74 61 72 67 65 74 20 66 69 6c 65 20 2a  he target file *
75a0: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 74 61  /.  char *zDelta
75b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
75c0: 69 74 65 20 74 68 65 20 64 65 6c 74 61 20 69 6e  ite the delta in
75d0: 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
75e0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
75f0: 69 6e 74 20 69 2c 20 62 61 73 65 3b 0a 20 20 63  int i, base;.  c
7600: 68 61 72 20 2a 7a 4f 72 69 67 44 65 6c 74 61 20  har *zOrigDelta 
7610: 3d 20 7a 44 65 6c 74 61 3b 0a 20 20 68 61 73 68  = zDelta;.  hash
7620: 20 68 3b 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b   h;.  int nHash;
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 61   /* Number of ha
7650: 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  sh table entries
7660: 20 2a 2f 0a 20 20 69 6e 74 20 2a 6c 61 6e 64 6d   */.  int *landm
7670: 61 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ark;            
7680: 20 2f 2a 20 50 72 69 6d 61 72 79 20 68 61 73 68   /* Primary hash
7690: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
76a0: 2a 63 6f 6c 6c 69 64 65 3b 20 20 20 20 20 20 20  *collide;       
76b0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 69 73         /* Collis
76c0: 69 6f 6e 20 63 68 61 69 6e 20 2a 2f 0a 20 20 69  ion chain */.  i
76d0: 6e 74 20 6c 61 73 74 52 65 61 64 20 3d 20 2d 31  nt lastRead = -1
76e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73  ;         /* Las
76f0: 74 20 62 79 74 65 20 6f 66 20 7a 53 72 63 20 72  t byte of zSrc r
7700: 65 61 64 20 62 79 20 61 20 43 4f 50 59 20 63 6f  ead by a COPY co
7710: 6d 6d 61 6e 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41  mmand */..  /* A
7720: 64 64 20 74 68 65 20 74 61 72 67 65 74 20 66 69  dd the target fi
7730: 6c 65 20 73 69 7a 65 20 74 6f 20 74 68 65 20 62  le size to the b
7740: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
7750: 64 65 6c 74 61 0a 20 20 2a 2f 0a 20 20 70 75 74  delta.  */.  put
7760: 49 6e 74 28 6c 65 6e 4f 75 74 2c 20 26 7a 44 65  Int(lenOut, &zDe
7770: 6c 74 61 29 3b 0a 20 20 2a 28 7a 44 65 6c 74 61  lta);.  *(zDelta
7780: 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 0a 20 20 2f  ++) = '\n';..  /
7790: 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 20  * If the source 
77a0: 66 69 6c 65 20 69 73 20 76 65 72 79 20 73 6d 61  file is very sma
77b0: 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
77c0: 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 2a  t we have no.  *
77d0: 2a 20 63 68 61 6e 63 65 20 6f 66 20 65 76 65 72  * chance of ever
77e0: 20 64 6f 69 6e 67 20 61 20 63 6f 70 79 20 63 6f   doing a copy co
77f0: 6d 6d 61 6e 64 2e 20 20 4a 75 73 74 20 6f 75 74  mmand.  Just out
7800: 70 75 74 20 61 20 73 69 6e 67 6c 65 0a 20 20 2a  put a single.  *
7810: 2a 20 6c 69 74 65 72 61 6c 20 73 65 67 6d 65 6e  * literal segmen
7820: 74 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  t for the entire
7830: 20 74 61 72 67 65 74 20 61 6e 64 20 65 78 69 74   target and exit
7840: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6e  ..  */.  if( len
7850: 53 72 63 3c 3d 4e 48 41 53 48 20 29 7b 0a 20 20  Src<=NHASH ){.  
7860: 20 20 70 75 74 49 6e 74 28 6c 65 6e 4f 75 74 2c    putInt(lenOut,
7870: 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20 20 20 2a   &zDelta);.    *
7880: 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20 27 3a 27  (zDelta++) = ':'
7890: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 65  ;.    memcpy(zDe
78a0: 6c 74 61 2c 20 7a 4f 75 74 2c 20 6c 65 6e 4f 75  lta, zOut, lenOu
78b0: 74 29 3b 0a 20 20 20 20 7a 44 65 6c 74 61 20 2b  t);.    zDelta +
78c0: 3d 20 6c 65 6e 4f 75 74 3b 0a 20 20 20 20 70 75  = lenOut;.    pu
78d0: 74 49 6e 74 28 63 68 65 63 6b 73 75 6d 28 7a 4f  tInt(checksum(zO
78e0: 75 74 2c 20 6c 65 6e 4f 75 74 29 2c 20 26 7a 44  ut, lenOut), &zD
78f0: 65 6c 74 61 29 3b 0a 20 20 20 20 2a 28 7a 44 65  elta);.    *(zDe
7900: 6c 74 61 2b 2b 29 20 3d 20 27 3b 27 3b 0a 20 20  lta++) = ';';.  
7910: 20 20 72 65 74 75 72 6e 20 7a 44 65 6c 74 61 20    return zDelta 
7920: 2d 20 7a 4f 72 69 67 44 65 6c 74 61 3b 0a 20 20  - zOrigDelta;.  
7930: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
7940: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75  the hash table u
7950: 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 6d 61  sed to locate ma
7960: 74 63 68 69 6e 67 20 73 65 63 74 69 6f 6e 73 20  tching sections 
7970: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73 6f 75 72  in the.  ** sour
7980: 63 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ce file..  */.  
7990: 6e 48 61 73 68 20 3d 20 6c 65 6e 53 72 63 2f 4e  nHash = lenSrc/N
79a0: 48 41 53 48 3b 0a 20 20 63 6f 6c 6c 69 64 65 20  HASH;.  collide 
79b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
79c0: 28 20 6e 48 61 73 68 2a 32 2a 73 69 7a 65 6f 66  ( nHash*2*sizeof
79d0: 28 69 6e 74 29 20 29 3b 0a 20 20 6c 61 6e 64 6d  (int) );.  landm
79e0: 61 72 6b 20 3d 20 26 63 6f 6c 6c 69 64 65 5b 6e  ark = &collide[n
79f0: 48 61 73 68 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  Hash];.  memset(
7a00: 6c 61 6e 64 6d 61 72 6b 2c 20 2d 31 2c 20 6e 48  landmark, -1, nH
7a10: 61 73 68 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  ash*sizeof(int))
7a20: 3b 0a 20 20 6d 65 6d 73 65 74 28 63 6f 6c 6c 69  ;.  memset(colli
7a30: 64 65 2c 20 2d 31 2c 20 6e 48 61 73 68 2a 73 69  de, -1, nHash*si
7a40: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 66 6f  zeof(int));.  fo
7a50: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 53 72 63 2d  r(i=0; i<lenSrc-
7a60: 4e 48 41 53 48 3b 20 69 2b 3d 4e 48 41 53 48 29  NHASH; i+=NHASH)
7a70: 7b 0a 20 20 20 20 69 6e 74 20 68 76 3b 0a 20 20  {.    int hv;.  
7a80: 20 20 68 61 73 68 5f 69 6e 69 74 28 26 68 2c 20    hash_init(&h, 
7a90: 26 7a 53 72 63 5b 69 5d 29 3b 0a 20 20 20 20 68  &zSrc[i]);.    h
7aa0: 76 20 3d 20 68 61 73 68 5f 33 32 62 69 74 28 26  v = hash_32bit(&
7ab0: 68 29 20 25 20 6e 48 61 73 68 3b 0a 20 20 20 20  h) % nHash;.    
7ac0: 63 6f 6c 6c 69 64 65 5b 69 2f 4e 48 41 53 48 5d  collide[i/NHASH]
7ad0: 20 3d 20 6c 61 6e 64 6d 61 72 6b 5b 68 76 5d 3b   = landmark[hv];
7ae0: 0a 20 20 20 20 6c 61 6e 64 6d 61 72 6b 5b 68 76  .    landmark[hv
7af0: 5d 20 3d 20 69 2f 4e 48 41 53 48 3b 0a 20 20 7d  ] = i/NHASH;.  }
7b00: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61  ..  /* Begin sca
7b10: 6e 6e 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  nning the target
7b20: 20 66 69 6c 65 20 61 6e 64 20 67 65 6e 65 72 61   file and genera
7b30: 74 69 6e 67 20 63 6f 70 79 20 63 6f 6d 6d 61 6e  ting copy comman
7b40: 64 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 69 74 65  ds and.  ** lite
7b50: 72 61 6c 20 73 65 63 74 69 6f 6e 73 20 6f 66 20  ral sections of 
7b60: 74 68 65 20 64 65 6c 74 61 2e 0a 20 20 2a 2f 0a  the delta..  */.
7b70: 20 20 62 61 73 65 20 3d 20 30 3b 20 20 20 20 2f    base = 0;    /
7b80: 2a 20 57 65 20 68 61 76 65 20 61 6c 72 65 61 64  * We have alread
7b90: 79 20 67 65 6e 65 72 61 74 65 64 20 65 76 65 72  y generated ever
7ba0: 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20 7a 4f  ything before zO
7bb0: 75 74 5b 62 61 73 65 5d 20 2a 2f 0a 20 20 77 68  ut[base] */.  wh
7bc0: 69 6c 65 28 20 62 61 73 65 2b 4e 48 41 53 48 3c  ile( base+NHASH<
7bd0: 6c 65 6e 4f 75 74 20 29 7b 0a 20 20 20 20 69 6e  lenOut ){.    in
7be0: 74 20 69 53 72 63 2c 20 69 42 6c 6f 63 6b 3b 0a  t iSrc, iBlock;.
7bf0: 20 20 20 20 69 6e 74 20 62 65 73 74 43 6e 74 2c      int bestCnt,
7c00: 20 62 65 73 74 4f 66 73 74 3d 30 2c 20 62 65 73   bestOfst=0, bes
7c10: 74 4c 69 74 73 7a 3d 30 3b 0a 20 20 20 20 68 61  tLitsz=0;.    ha
7c20: 73 68 5f 69 6e 69 74 28 26 68 2c 20 26 7a 4f 75  sh_init(&h, &zOu
7c30: 74 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20 69 20  t[base]);.    i 
7c40: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 79 69  = 0;     /* Tryi
7c50: 6e 67 20 74 6f 20 6d 61 74 63 68 20 61 20 6c 61  ng to match a la
7c60: 6e 64 6d 61 72 6b 20 61 67 61 69 6e 73 74 20 7a  ndmark against z
7c70: 4f 75 74 5b 62 61 73 65 2b 69 5d 20 2a 2f 0a 20  Out[base+i] */. 
7c80: 20 20 20 62 65 73 74 43 6e 74 20 3d 20 30 3b 0a     bestCnt = 0;.
7c90: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
7ca0: 20 20 20 20 20 20 69 6e 74 20 68 76 3b 0a 20 20        int hv;.  
7cb0: 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
7cc0: 32 35 30 3b 0a 0a 20 20 20 20 20 20 68 76 20 3d  250;..      hv =
7cd0: 20 68 61 73 68 5f 33 32 62 69 74 28 26 68 29 20   hash_32bit(&h) 
7ce0: 25 20 6e 48 61 73 68 3b 0a 20 20 20 20 20 20 69  % nHash;.      i
7cf0: 42 6c 6f 63 6b 20 3d 20 6c 61 6e 64 6d 61 72 6b  Block = landmark
7d00: 5b 68 76 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c  [hv];.      whil
7d10: 65 28 20 69 42 6c 6f 63 6b 3e 3d 30 20 26 26 20  e( iBlock>=0 && 
7d20: 28 6c 69 6d 69 74 2d 2d 29 3e 30 20 29 7b 0a 20  (limit--)>0 ){. 
7d30: 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
7d40: 20 20 2a 2a 20 54 68 65 20 68 61 73 68 20 77 69    ** The hash wi
7d50: 6e 64 6f 77 20 68 61 73 20 69 64 65 6e 74 69 66  ndow has identif
7d60: 69 65 64 20 61 20 70 6f 74 65 6e 74 69 61 6c 20  ied a potential 
7d70: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 0a 20 20  match against.  
7d80: 20 20 20 20 20 20 2a 2a 20 6c 61 6e 64 6d 61 72        ** landmar
7d90: 6b 20 62 6c 6f 63 6b 20 69 42 6c 6f 63 6b 2e 20  k block iBlock. 
7da0: 20 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   But we need to 
7db0: 69 6e 76 65 73 74 69 67 61 74 65 20 66 75 72 74  investigate furt
7dc0: 68 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  her..        **.
7dd0: 20 20 20 20 20 20 20 20 2a 2a 20 4c 6f 6f 6b 20          ** Look 
7de0: 66 6f 72 20 61 20 72 65 67 69 6f 6e 20 69 6e 20  for a region in 
7df0: 7a 4f 75 74 20 74 68 61 74 20 6d 61 74 63 68 65  zOut that matche
7e00: 73 20 7a 53 72 63 2e 20 41 6e 63 68 6f 72 20 74  s zSrc. Anchor t
7e10: 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 20 20  he search.      
7e20: 20 20 2a 2a 20 61 74 20 7a 53 72 63 5b 69 53 72    ** at zSrc[iSr
7e30: 63 5d 20 61 6e 64 20 7a 4f 75 74 5b 62 61 73 65  c] and zOut[base
7e40: 2b 69 5d 2e 20 20 44 6f 20 6e 6f 74 20 69 6e 63  +i].  Do not inc
7e50: 6c 75 64 65 20 61 6e 79 74 68 69 6e 67 20 70 72  lude anything pr
7e60: 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ior to.        *
7e70: 2a 20 7a 4f 75 74 5b 62 61 73 65 5d 20 6f 72 20  * zOut[base] or 
7e80: 61 66 74 65 72 20 7a 4f 75 74 5b 6f 75 74 4c 65  after zOut[outLe
7e90: 6e 5d 20 6e 6f 72 20 61 6e 79 74 68 69 6e 67 20  n] nor anything 
7ea0: 61 66 74 65 72 20 7a 53 72 63 5b 73 72 63 4c 65  after zSrc[srcLe
7eb0: 6e 5d 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  n]..        **. 
7ec0: 20 20 20 20 20 20 20 2a 2a 20 53 65 74 20 63 6e         ** Set cn
7ed0: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6c  t equal to the l
7ee0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6d 61 74  ength of the mat
7ef0: 63 68 20 61 6e 64 20 73 65 74 20 6f 66 73 74 20  ch and set ofst 
7f00: 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  so that.        
7f10: 2a 2a 20 7a 53 72 63 5b 6f 66 73 74 5d 20 69 73  ** zSrc[ofst] is
7f20: 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
7f30: 6e 74 20 6f 66 20 74 68 65 20 6d 61 74 63 68 2e  nt of the match.
7f40: 20 20 6c 69 74 73 7a 20 69 73 20 74 68 65 20 6e    litsz is the n
7f50: 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  umber.        **
7f60: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 62   of characters b
7f70: 65 74 77 65 65 6e 20 7a 4f 75 74 5b 62 61 73 65  etween zOut[base
7f80: 5d 20 61 6e 64 20 74 68 65 20 62 65 67 69 6e 6e  ] and the beginn
7f90: 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 74 63 68  ing of the match
7fa0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 7a 20  ..        ** sz 
7fb0: 77 69 6c 6c 20 62 65 20 74 68 65 20 6f 76 65 72  will be the over
7fc0: 68 65 61 64 20 28 69 6e 20 62 79 74 65 73 29 20  head (in bytes) 
7fd0: 6e 65 65 64 65 64 20 74 6f 20 65 6e 63 6f 64 65  needed to encode
7fe0: 20 74 68 65 20 63 6f 70 79 0a 20 20 20 20 20 20   the copy.      
7ff0: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 4f    ** command.  O
8000: 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 70  nly generate cop
8010: 79 20 63 6f 6d 6d 61 6e 64 20 69 66 20 74 68 65  y command if the
8020: 20 6f 76 65 72 68 65 61 64 20 6f 66 20 74 68 65   overhead of the
8030: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
8040: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6c 65 73 73   command is less
8050: 20 74 68 61 6e 20 74 68 65 20 61 6d 6f 75 6e 74   than the amount
8060: 20 6f 66 20 6c 69 74 65 72 61 6c 20 74 65 78 74   of literal text
8070: 20 74 6f 20 62 65 20 63 6f 70 69 65 64 2e 0a 20   to be copied.. 
8080: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8090: 20 20 69 6e 74 20 63 6e 74 2c 20 6f 66 73 74 2c    int cnt, ofst,
80a0: 20 6c 69 74 73 7a 3b 0a 20 20 20 20 20 20 20 20   litsz;.        
80b0: 69 6e 74 20 6a 2c 20 6b 2c 20 78 2c 20 79 3b 0a  int j, k, x, y;.
80c0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a          int sz;.
80d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  .        /* Begi
80e0: 6e 6e 69 6e 67 20 61 74 20 69 53 72 63 2c 20 6d  nning at iSrc, m
80f0: 61 74 63 68 20 66 6f 72 77 61 72 64 73 20 61 73  atch forwards as
8100: 20 66 61 72 20 61 73 20 77 65 20 63 61 6e 2e 20   far as we can. 
8110: 20 6a 20 63 6f 75 6e 74 73 0a 20 20 20 20 20 20   j counts.      
8120: 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
8130: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74 68  of characters th
8140: 61 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  at match */.    
8150: 20 20 20 20 69 53 72 63 20 3d 20 69 42 6c 6f 63      iSrc = iBloc
8160: 6b 2a 4e 48 41 53 48 3b 0a 20 20 20 20 20 20 20  k*NHASH;.       
8170: 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20   for(.          
8180: 6a 3d 30 2c 20 78 3d 69 53 72 63 2c 20 79 3d 62  j=0, x=iSrc, y=b
8190: 61 73 65 2b 69 3b 0a 20 20 20 20 20 20 20 20 20  ase+i;.         
81a0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 78   (unsigned int)x
81b0: 3c 6c 65 6e 53 72 63 20 26 26 20 28 75 6e 73 69  <lenSrc && (unsi
81c0: 67 6e 65 64 20 69 6e 74 29 79 3c 6c 65 6e 4f 75  gned int)y<lenOu
81d0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  t;.          j++
81e0: 2c 20 78 2b 2b 2c 20 79 2b 2b 0a 20 20 20 20 20  , x++, y++.     
81f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
8200: 69 66 28 20 7a 53 72 63 5b 78 5d 21 3d 7a 4f 75  if( zSrc[x]!=zOu
8210: 74 5b 79 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  t[y] ) break;.  
8220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8230: 6a 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  j--;..        /*
8240: 20 42 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   Beginning at iS
8250: 72 63 2d 31 2c 20 6d 61 74 63 68 20 62 61 63 6b  rc-1, match back
8260: 77 61 72 64 73 20 61 73 20 66 61 72 20 61 73 20  wards as far as 
8270: 77 65 20 63 61 6e 2e 20 20 6b 20 63 6f 75 6e 74  we can.  k count
8280: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  s.        ** the
8290: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
82a0: 63 74 65 72 73 20 74 68 61 74 20 6d 61 74 63 68  cters that match
82b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
82c0: 6b 3d 31 3b 20 6b 3c 69 53 72 63 20 26 26 20 28  k=1; k<iSrc && (
82d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 6b 3c 3d  unsigned int)k<=
82e0: 69 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  i; k++){.       
82f0: 20 20 20 69 66 28 20 7a 53 72 63 5b 69 53 72 63     if( zSrc[iSrc
8300: 2d 6b 5d 21 3d 7a 4f 75 74 5b 62 61 73 65 2b 69  -k]!=zOut[base+i
8310: 2d 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  -k] ) break;.   
8320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b       }.        k
8330: 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  --;..        /* 
8340: 43 6f 6d 70 75 74 65 20 74 68 65 20 6f 66 66 73  Compute the offs
8350: 65 74 20 61 6e 64 20 73 69 7a 65 20 6f 66 20 74  et and size of t
8360: 68 65 20 6d 61 74 63 68 69 6e 67 20 72 65 67 69  he matching regi
8370: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66  on */.        of
8380: 73 74 20 3d 20 69 53 72 63 2d 6b 3b 0a 20 20 20  st = iSrc-k;.   
8390: 20 20 20 20 20 63 6e 74 20 3d 20 6a 2b 6b 2b 31       cnt = j+k+1
83a0: 3b 0a 20 20 20 20 20 20 20 20 6c 69 74 73 7a 20  ;.        litsz 
83b0: 3d 20 69 2d 6b 3b 20 20 2f 2a 20 4e 75 6d 62 65  = i-k;  /* Numbe
83c0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6c 69  r of bytes of li
83d0: 74 65 72 61 6c 20 74 65 78 74 20 62 65 66 6f 72  teral text befor
83e0: 65 20 74 68 65 20 63 6f 70 79 20 2a 2f 0a 20 20  e the copy */.  
83f0: 20 20 20 20 20 20 2f 2a 20 73 7a 20 77 69 6c 6c        /* sz will
8400: 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62 65 72   hold the number
8410: 20 6f 66 20 62 79 74 65 73 20 6e 65 65 64 65 64   of bytes needed
8420: 20 74 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 22   to encode the "
8430: 69 6e 73 65 72 74 22 0a 20 20 20 20 20 20 20 20  insert".        
8440: 2a 2a 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 74  ** command and t
8450: 68 65 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 2c  he copy command,
8460: 20 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68   not counting th
8470: 65 20 22 69 6e 73 65 72 74 22 20 74 65 78 74 20  e "insert" text 
8480: 2a 2f 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  */.        sz = 
8490: 64 69 67 69 74 5f 63 6f 75 6e 74 28 69 2d 6b 29  digit_count(i-k)
84a0: 2b 64 69 67 69 74 5f 63 6f 75 6e 74 28 63 6e 74  +digit_count(cnt
84b0: 29 2b 64 69 67 69 74 5f 63 6f 75 6e 74 28 6f 66  )+digit_count(of
84c0: 73 74 29 2b 33 3b 0a 20 20 20 20 20 20 20 20 69  st)+3;.        i
84d0: 66 28 20 63 6e 74 3e 3d 73 7a 20 26 26 20 63 6e  f( cnt>=sz && cn
84e0: 74 3e 62 65 73 74 43 6e 74 20 29 7b 0a 20 20 20  t>bestCnt ){.   
84f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62         /* Rememb
8500: 65 72 20 74 68 69 73 20 6d 61 74 63 68 20 6f 6e  er this match on
8510: 6c 79 20 69 66 20 69 74 20 69 73 20 74 68 65 20  ly if it is the 
8520: 62 65 73 74 20 73 6f 20 66 61 72 20 61 6e 64 20  best so far and 
8530: 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
8540: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 72 65 61 73  does not increas
8550: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
8560: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  */.          bes
8570: 74 43 6e 74 20 3d 20 63 6e 74 3b 0a 20 20 20 20  tCnt = cnt;.    
8580: 20 20 20 20 20 20 62 65 73 74 4f 66 73 74 20 3d        bestOfst =
8590: 20 69 53 72 63 2d 6b 3b 0a 20 20 20 20 20 20 20   iSrc-k;.       
85a0: 20 20 20 62 65 73 74 4c 69 74 73 7a 20 3d 20 6c     bestLitsz = l
85b0: 69 74 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a  itsz;.        }.
85c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
85d0: 6b 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  k the next match
85e0: 69 6e 67 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ing block */.   
85f0: 20 20 20 20 20 69 42 6c 6f 63 6b 20 3d 20 63 6f       iBlock = co
8600: 6c 6c 69 64 65 5b 69 42 6c 6f 63 6b 5d 3b 0a 20  llide[iBlock];. 
8610: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
8620: 20 57 65 20 68 61 76 65 20 61 20 63 6f 70 79 20   We have a copy 
8630: 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20 64 6f 65  command that doe
8640: 73 20 6e 6f 74 20 63 61 75 73 65 20 74 68 65 20  s not cause the 
8650: 64 65 6c 74 61 20 74 6f 20 62 65 20 6c 61 72 67  delta to be larg
8660: 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  er.      ** than
8670: 20 61 20 6c 69 74 65 72 61 6c 20 69 6e 73 65 72   a literal inser
8680: 74 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 63  t.  So add the c
8690: 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74  opy command to t
86a0: 68 65 20 64 65 6c 74 61 2e 0a 20 20 20 20 20 20  he delta..      
86b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 65 73  */.      if( bes
86c0: 74 43 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  tCnt>0 ){.      
86d0: 20 20 69 66 28 20 62 65 73 74 4c 69 74 73 7a 3e    if( bestLitsz>
86e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
86f0: 2a 20 41 64 64 20 61 6e 20 69 6e 73 65 72 74 20  * Add an insert 
8700: 63 6f 6d 6d 61 6e 64 20 62 65 66 6f 72 65 20 74  command before t
8710: 68 65 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20  he copy */.     
8720: 20 20 20 20 20 70 75 74 49 6e 74 28 62 65 73 74       putInt(best
8730: 4c 69 74 73 7a 2c 26 7a 44 65 6c 74 61 29 3b 0a  Litsz,&zDelta);.
8740: 20 20 20 20 20 20 20 20 20 20 2a 28 7a 44 65 6c            *(zDel
8750: 74 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20 20 20  ta++) = ':';.   
8760: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44         memcpy(zD
8770: 65 6c 74 61 2c 20 26 7a 4f 75 74 5b 62 61 73 65  elta, &zOut[base
8780: 5d 2c 20 62 65 73 74 4c 69 74 73 7a 29 3b 0a 20  ], bestLitsz);. 
8790: 20 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 20           zDelta 
87a0: 2b 3d 20 62 65 73 74 4c 69 74 73 7a 3b 0a 20 20  += bestLitsz;.  
87b0: 20 20 20 20 20 20 20 20 62 61 73 65 20 2b 3d 20          base += 
87c0: 62 65 73 74 4c 69 74 73 7a 3b 0a 20 20 20 20 20  bestLitsz;.     
87d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 61 73     }.        bas
87e0: 65 20 2b 3d 20 62 65 73 74 43 6e 74 3b 0a 20 20  e += bestCnt;.  
87f0: 20 20 20 20 20 20 70 75 74 49 6e 74 28 62 65 73        putInt(bes
8800: 74 43 6e 74 2c 20 26 7a 44 65 6c 74 61 29 3b 0a  tCnt, &zDelta);.
8810: 20 20 20 20 20 20 20 20 2a 28 7a 44 65 6c 74 61          *(zDelta
8820: 2b 2b 29 20 3d 20 27 40 27 3b 0a 20 20 20 20 20  ++) = '@';.     
8830: 20 20 20 70 75 74 49 6e 74 28 62 65 73 74 4f 66     putInt(bestOf
8840: 73 74 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20  st, &zDelta);.  
8850: 20 20 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b        *(zDelta++
8860: 29 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  ) = ',';.       
8870: 20 69 66 28 20 62 65 73 74 4f 66 73 74 20 2b 20   if( bestOfst + 
8880: 62 65 73 74 43 6e 74 20 2d 31 20 3e 20 6c 61 73  bestCnt -1 > las
8890: 74 52 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20  tRead ){.       
88a0: 20 20 20 6c 61 73 74 52 65 61 64 20 3d 20 62 65     lastRead = be
88b0: 73 74 4f 66 73 74 20 2b 20 62 65 73 74 43 6e 74  stOfst + bestCnt
88c0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 1;.        }.
88d0: 20 20 20 20 20 20 20 20 62 65 73 74 43 6e 74 20          bestCnt 
88e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
88f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
8900: 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
8910: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
8920: 20 6d 65 61 6e 73 20 6e 6f 20 6d 61 74 63 68 20   means no match 
8930: 69 73 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  is found so far 
8940: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 61 73  */.      if( bas
8950: 65 2b 69 2b 4e 48 41 53 48 3e 3d 6c 65 6e 4f 75  e+i+NHASH>=lenOu
8960: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
8970: 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20  We have reached 
8980: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
8990: 69 6c 65 20 61 6e 64 20 68 61 76 65 20 6e 6f 74  ile and have not
89a0: 20 66 6f 75 6e 64 20 61 6e 79 0a 20 20 20 20 20   found any.     
89b0: 20 20 20 2a 2a 20 6d 61 74 63 68 65 73 2e 20 20     ** matches.  
89c0: 44 6f 20 61 6e 20 22 69 6e 73 65 72 74 22 20 66  Do an "insert" f
89d0: 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 74 68  or everything th
89e0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  at does not matc
89f0: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  h */.        put
8a00: 49 6e 74 28 6c 65 6e 4f 75 74 2d 62 61 73 65 2c  Int(lenOut-base,
8a10: 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20 20 20 20   &zDelta);.     
8a20: 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d     *(zDelta++) =
8a30: 20 27 3a 27 3b 0a 20 20 20 20 20 20 20 20 6d 65   ':';.        me
8a40: 6d 63 70 79 28 7a 44 65 6c 74 61 2c 20 26 7a 4f  mcpy(zDelta, &zO
8a50: 75 74 5b 62 61 73 65 5d 2c 20 6c 65 6e 4f 75 74  ut[base], lenOut
8a60: 2d 62 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  -base);.        
8a70: 7a 44 65 6c 74 61 20 2b 3d 20 6c 65 6e 4f 75 74  zDelta += lenOut
8a80: 2d 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 62  -base;.        b
8a90: 61 73 65 20 3d 20 6c 65 6e 4f 75 74 3b 0a 20 20  ase = lenOut;.  
8aa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8ab0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
8ac0: 64 76 61 6e 63 65 20 74 68 65 20 68 61 73 68 20  dvance the hash 
8ad0: 62 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  by one character
8ae0: 2e 20 20 4b 65 65 70 20 6c 6f 6f 6b 69 6e 67 20  .  Keep looking 
8af0: 66 6f 72 20 61 20 6d 61 74 63 68 20 2a 2f 0a 20  for a match */. 
8b00: 20 20 20 20 20 68 61 73 68 5f 6e 65 78 74 28 26       hash_next(&
8b10: 68 2c 20 7a 4f 75 74 5b 62 61 73 65 2b 69 2b 4e  h, zOut[base+i+N
8b20: 48 41 53 48 5d 29 3b 0a 20 20 20 20 20 20 69 2b  HASH]);.      i+
8b30: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  +;.    }.  }.  /
8b40: 2a 20 4f 75 74 70 75 74 20 61 20 66 69 6e 61 6c  * Output a final
8b50: 20 22 69 6e 73 65 72 74 22 20 72 65 63 6f 72 64   "insert" record
8b60: 20 74 6f 20 67 65 74 20 61 6c 6c 20 74 68 65 20   to get all the 
8b70: 74 65 78 74 20 61 74 20 74 68 65 20 65 6e 64 20  text at the end 
8b80: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  of.  ** the file
8b90: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
8ba0: 61 74 63 68 20 61 6e 79 74 68 69 6e 67 20 69 6e  atch anything in
8bb0: 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65   the source file
8bc0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 62 61 73  ..  */.  if( bas
8bd0: 65 3c 6c 65 6e 4f 75 74 20 29 7b 0a 20 20 20 20  e<lenOut ){.    
8be0: 70 75 74 49 6e 74 28 6c 65 6e 4f 75 74 2d 62 61  putInt(lenOut-ba
8bf0: 73 65 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20  se, &zDelta);.  
8c00: 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20    *(zDelta++) = 
8c10: 27 3a 27 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ':';.    memcpy(
8c20: 7a 44 65 6c 74 61 2c 20 26 7a 4f 75 74 5b 62 61  zDelta, &zOut[ba
8c30: 73 65 5d 2c 20 6c 65 6e 4f 75 74 2d 62 61 73 65  se], lenOut-base
8c40: 29 3b 0a 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d  );.    zDelta +=
8c50: 20 6c 65 6e 4f 75 74 2d 62 61 73 65 3b 0a 20 20   lenOut-base;.  
8c60: 7d 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  }.  /* Output th
8c70: 65 20 66 69 6e 61 6c 20 63 68 65 63 6b 73 75 6d  e final checksum
8c80: 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 70 75   record. */.  pu
8c90: 74 49 6e 74 28 63 68 65 63 6b 73 75 6d 28 7a 4f  tInt(checksum(zO
8ca0: 75 74 2c 20 6c 65 6e 4f 75 74 29 2c 20 26 7a 44  ut, lenOut), &zD
8cb0: 65 6c 74 61 29 3b 0a 20 20 2a 28 7a 44 65 6c 74  elta);.  *(zDelt
8cc0: 61 2b 2b 29 20 3d 20 27 3b 27 3b 0a 20 20 73 71  a++) = ';';.  sq
8cd0: 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6c 6c 69  lite3_free(colli
8ce0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44  de);.  return zD
8cf0: 65 6c 74 61 20 2d 20 7a 4f 72 69 67 44 65 6c 74  elta - zOrigDelt
8d00: 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  a;.}../*.** End 
8d10: 6f 66 20 63 6f 64 65 20 63 6f 70 69 65 64 20 66  of code copied f
8d20: 72 6f 6d 20 66 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a  rom fossil..****
8d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8d70: 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63 20  ******/..static 
8d80: 76 6f 69 64 20 73 74 72 50 72 69 6e 74 66 41 72  void strPrintfAr
8d90: 72 61 79 28 0a 20 20 53 74 72 20 2a 70 53 74 72  ray(.  Str *pStr
8da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8db0: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
8dc0: 20 6f 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e   object to appen
8dd0: 64 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  d to */.  const 
8de0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 20 20 20 20  char *zSep,     
8df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 70            /* Sep
8e00: 61 72 61 74 6f 72 20 73 74 72 69 6e 67 20 2a 2f  arator string */
8e10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8e20: 46 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Fmt,            
8e30: 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72     /* Format for
8e40: 20 65 61 63 68 20 65 6e 74 72 79 20 2a 2f 0a 20   each entry */. 
8e50: 20 63 68 61 72 20 2a 2a 61 7a 2c 20 69 6e 74 20   char **az, int 
8e60: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
8e70: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 74 72   /* Array of str
8e80: 69 6e 67 73 20 26 20 69 74 73 20 73 69 7a 65 20  ings & its size 
8e90: 28 6f 72 20 2d 31 29 20 2a 2f 0a 29 7b 0a 20 20  (or -1) */.){.  
8ea0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
8eb0: 3b 20 61 7a 5b 69 5d 20 26 26 20 28 69 3c 6e 20  ; az[i] && (i<n 
8ec0: 7c 7c 20 6e 3c 30 29 3b 20 69 2b 2b 29 7b 0a 20  || n<0); i++){. 
8ed0: 20 20 20 69 66 28 20 69 21 3d 30 20 29 20 73 74     if( i!=0 ) st
8ee0: 72 50 72 69 6e 74 66 28 70 53 74 72 2c 20 22 25  rPrintf(pStr, "%
8ef0: 73 22 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 73  s", zSep);.    s
8f00: 74 72 50 72 69 6e 74 66 28 70 53 74 72 2c 20 7a  trPrintf(pStr, z
8f10: 46 6d 74 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69  Fmt, az[i], az[i
8f20: 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 7d  ], az[i]);.  }.}
8f30: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  ..static void ge
8f40: 74 52 62 75 64 69 66 66 51 75 65 72 79 28 0a 20  tRbudiffQuery(. 
8f50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
8f60: 62 2c 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  b,.  char **azCo
8f70: 6c 2c 0a 20 20 69 6e 74 20 6e 50 4b 2c 0a 20 20  l,.  int nPK,.  
8f80: 69 6e 74 20 62 4f 74 61 52 6f 77 69 64 2c 0a 20  int bOtaRowid,. 
8f90: 20 53 74 72 20 2a 70 53 71 6c 0a 29 7b 0a 20 20   Str *pSql.){.  
8fa0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69 72  int i;..  /* Fir
8fb0: 73 74 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73  st the newly ins
8fc0: 65 72 74 65 64 20 72 6f 77 73 3a 20 2a 2a 2f 20  erted rows: **/ 
8fd0: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71  .  strPrintf(pSq
8fe0: 6c 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20  l, "SELECT ");. 
8ff0: 20 73 74 72 50 72 69 6e 74 66 41 72 72 61 79 28   strPrintfArray(
9000: 70 53 71 6c 2c 20 22 2c 20 22 2c 20 22 25 73 22  pSql, ", ", "%s"
9010: 2c 20 61 7a 43 6f 6c 2c 20 2d 31 29 3b 0a 20 20  , azCol, -1);.  
9020: 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20  strPrintf(pSql, 
9030: 22 2c 20 30 2c 20 22 29 3b 20 20 20 20 20 20 20  ", 0, ");       
9040: 2f 2a 20 53 65 74 20 6f 74 61 5f 63 6f 6e 74 72  /* Set ota_contr
9050: 6f 6c 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 69  ol to 0 for an i
9060: 6e 73 65 72 74 20 2a 2f 0a 20 20 73 74 72 50 72  nsert */.  strPr
9070: 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20  intfArray(pSql, 
9080: 22 2c 20 22 2c 20 22 4e 55 4c 4c 22 2c 20 61 7a  ", ", "NULL", az
9090: 43 6f 6c 2c 20 2d 31 29 3b 0a 20 20 73 74 72 50  Col, -1);.  strP
90a0: 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 20 46 52  rintf(pSql, " FR
90b0: 4f 4d 20 61 75 78 2e 25 51 20 41 53 20 6e 20 57  OM aux.%Q AS n W
90c0: 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 20  HERE NOT EXISTS 
90d0: 28 5c 6e 22 2c 20 7a 54 61 62 29 3b 0a 20 20 73  (\n", zTab);.  s
90e0: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
90f0: 20 20 20 20 53 45 4c 45 43 54 20 31 20 46 52 4f      SELECT 1 FRO
9100: 4d 20 22 2c 20 7a 54 61 62 29 3b 0a 20 20 73 74  M ", zTab);.  st
9110: 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 20  rPrintf(pSql, " 
9120: 6d 61 69 6e 2e 25 51 20 41 53 20 6f 20 57 48 45  main.%Q AS o WHE
9130: 52 45 20 22 2c 20 7a 54 61 62 29 3b 0a 20 20 73  RE ", zTab);.  s
9140: 74 72 50 72 69 6e 74 66 41 72 72 61 79 28 70 53  trPrintfArray(pS
9150: 71 6c 2c 20 22 20 41 4e 44 20 22 2c 20 22 28 6e  ql, " AND ", "(n
9160: 2e 25 51 20 49 53 20 6f 2e 25 51 29 22 2c 20 61  .%Q IS o.%Q)", a
9170: 7a 43 6f 6c 2c 20 6e 50 4b 29 3b 0a 20 20 73 74  zCol, nPK);.  st
9180: 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 5c  rPrintf(pSql, "\
9190: 6e 29 22 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  n)");..  /* Dele
91a0: 74 65 64 20 72 6f 77 73 3a 20 2a 2f 0a 20 20 73  ted rows: */.  s
91b0: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
91c0: 5c 6e 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 53 45 4c  \nUNION ALL\nSEL
91d0: 45 43 54 20 22 29 3b 0a 20 20 73 74 72 50 72 69  ECT ");.  strPri
91e0: 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22  ntfArray(pSql, "
91f0: 2c 20 22 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c  , ", "%s", azCol
9200: 2c 20 6e 50 4b 29 3b 0a 20 20 69 66 28 20 61 7a  , nPK);.  if( az
9210: 43 6f 6c 5b 6e 50 4b 5d 20 29 7b 0a 20 20 20 20  Col[nPK] ){.    
9220: 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20  strPrintf(pSql, 
9230: 22 2c 20 22 29 3b 0a 20 20 20 20 73 74 72 50 72  ", ");.    strPr
9240: 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20  intfArray(pSql, 
9250: 22 2c 20 22 2c 20 22 4e 55 4c 4c 22 2c 20 26 61  ", ", "NULL", &a
9260: 7a 43 6f 6c 5b 6e 50 4b 5d 2c 20 2d 31 29 3b 0a  zCol[nPK], -1);.
9270: 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28    }.  strPrintf(
9280: 70 53 71 6c 2c 20 22 2c 20 31 2c 20 22 29 3b 20  pSql, ", 1, "); 
9290: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 74 61        /* Set ota
92a0: 5f 63 6f 6e 74 72 6f 6c 20 74 6f 20 31 20 66 6f  _control to 1 fo
92b0: 72 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  r a delete */.  
92c0: 73 74 72 50 72 69 6e 74 66 41 72 72 61 79 28 70  strPrintfArray(p
92d0: 53 71 6c 2c 20 22 2c 20 22 2c 20 22 4e 55 4c 4c  Sql, ", ", "NULL
92e0: 22 2c 20 61 7a 43 6f 6c 2c 20 2d 31 29 3b 0a 20  ", azCol, -1);. 
92f0: 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c   strPrintf(pSql,
9300: 20 22 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 51 20   " FROM main.%Q 
9310: 41 53 20 6e 20 57 48 45 52 45 20 4e 4f 54 20 45  AS n WHERE NOT E
9320: 58 49 53 54 53 20 28 5c 6e 22 2c 20 7a 54 61 62  XISTS (\n", zTab
9330: 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70  );.  strPrintf(p
9340: 53 71 6c 2c 20 22 20 20 20 20 53 45 4c 45 43 54  Sql, "    SELECT
9350: 20 31 20 46 52 4f 4d 20 22 2c 20 7a 54 61 62 29   1 FROM ", zTab)
9360: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53  ;.  strPrintf(pS
9370: 71 6c 2c 20 22 20 61 75 78 2e 25 51 20 41 53 20  ql, " aux.%Q AS 
9380: 6f 20 57 48 45 52 45 20 22 2c 20 7a 54 61 62 29  o WHERE ", zTab)
9390: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 41 72 72  ;.  strPrintfArr
93a0: 61 79 28 70 53 71 6c 2c 20 22 20 41 4e 44 20 22  ay(pSql, " AND "
93b0: 2c 20 22 28 6e 2e 25 51 20 49 53 20 6f 2e 25 51  , "(n.%Q IS o.%Q
93c0: 29 22 2c 20 61 7a 43 6f 6c 2c 20 6e 50 4b 29 3b  )", azCol, nPK);
93d0: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71  .  strPrintf(pSq
93e0: 6c 2c 20 22 5c 6e 29 20 22 29 3b 0a 0a 20 20 2f  l, "\n) ");..  /
93f0: 2a 20 55 70 64 61 74 65 64 20 72 6f 77 73 2e 20  * Updated rows. 
9400: 49 66 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  If all table col
9410: 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66  umns are part of
9420: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
9430: 2c 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 63 61  , there .  ** ca
9440: 6e 20 62 65 20 6e 6f 20 75 70 64 61 74 65 73 2e  n be no updates.
9450: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
9460: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  is part of the c
9470: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 63  ompound SELECT c
9480: 61 6e 0a 20 20 2a 2a 20 62 65 20 6f 6d 69 74 74  an.  ** be omitt
9490: 65 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a  ed altogether. *
94a0: 2f 0a 20 20 69 66 28 20 61 7a 43 6f 6c 5b 6e 50  /.  if( azCol[nP
94b0: 4b 5d 20 29 7b 0a 20 20 20 20 73 74 72 50 72 69  K] ){.    strPri
94c0: 6e 74 66 28 70 53 71 6c 2c 20 22 5c 6e 55 4e 49  ntf(pSql, "\nUNI
94d0: 4f 4e 20 41 4c 4c 5c 6e 53 45 4c 45 43 54 20 22  ON ALL\nSELECT "
94e0: 29 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  );.    strPrintf
94f0: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 2c 20 22  Array(pSql, ", "
9500: 2c 20 22 6e 2e 25 73 22 2c 20 61 7a 43 6f 6c 2c  , "n.%s", azCol,
9510: 20 6e 50 4b 29 3b 0a 20 20 20 20 73 74 72 50 72   nPK);.    strPr
9520: 69 6e 74 66 28 70 53 71 6c 2c 20 22 2c 5c 6e 22  intf(pSql, ",\n"
9530: 29 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  );.    strPrintf
9540: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 20 2c 5c  Array(pSql, " ,\
9550: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 22 20 20  n", .        "  
9560: 20 20 43 41 53 45 20 57 48 45 4e 20 6e 2e 25 73    CASE WHEN n.%s
9570: 20 49 53 20 6f 2e 25 73 20 54 48 45 4e 20 4e 55   IS o.%s THEN NU
9580: 4c 4c 20 45 4c 53 45 20 6e 2e 25 73 20 45 4e 44  LL ELSE n.%s END
9590: 22 2c 20 26 61 7a 43 6f 6c 5b 6e 50 4b 5d 2c 20  ", &azCol[nPK], 
95a0: 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  -1.    );..    i
95b0: 66 28 20 62 4f 74 61 52 6f 77 69 64 3d 3d 30 20  f( bOtaRowid==0 
95c0: 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e  ){.      strPrin
95d0: 74 66 28 70 53 71 6c 2c 20 22 2c 20 27 22 29 3b  tf(pSql, ", '");
95e0: 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66  .      strPrintf
95f0: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 22 2c 20  Array(pSql, "", 
9600: 22 2e 22 2c 20 61 7a 43 6f 6c 2c 20 6e 50 4b 29  ".", azCol, nPK)
9610: 3b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74  ;.      strPrint
9620: 66 28 70 53 71 6c 2c 20 22 27 20 7c 7c 5c 6e 22  f(pSql, "' ||\n"
9630: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9640: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 70 53      strPrintf(pS
9650: 71 6c 2c 20 22 2c 5c 6e 22 29 3b 0a 20 20 20 20  ql, ",\n");.    
9660: 7d 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 41  }.    strPrintfA
9670: 72 72 61 79 28 70 53 71 6c 2c 20 22 20 7c 7c 5c  rray(pSql, " ||\
9680: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 22 20 20  n", .        "  
9690: 20 20 43 41 53 45 20 57 48 45 4e 20 6e 2e 25 73    CASE WHEN n.%s
96a0: 20 49 53 20 6f 2e 25 73 20 54 48 45 4e 20 27 2e   IS o.%s THEN '.
96b0: 27 20 45 4c 53 45 20 27 78 27 20 45 4e 44 22 2c  ' ELSE 'x' END",
96c0: 20 26 61 7a 43 6f 6c 5b 6e 50 4b 5d 2c 20 2d 31   &azCol[nPK], -1
96d0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 74 72 50  .    );.    strP
96e0: 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 5c 6e 41  rintf(pSql, "\nA
96f0: 53 20 6f 74 61 5f 63 6f 6e 74 72 6f 6c 2c 20 22  S ota_control, "
9700: 29 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  );.    strPrintf
9710: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 2c 20 22  Array(pSql, ", "
9720: 2c 20 22 4e 55 4c 4c 22 2c 20 61 7a 43 6f 6c 2c  , "NULL", azCol,
9730: 20 6e 50 4b 29 3b 0a 20 20 20 20 73 74 72 50 72   nPK);.    strPr
9740: 69 6e 74 66 28 70 53 71 6c 2c 20 22 2c 5c 6e 22  intf(pSql, ",\n"
9750: 29 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  );.    strPrintf
9760: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 20 2c 5c  Array(pSql, " ,\
9770: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 22 20 20  n", .        "  
9780: 20 20 43 41 53 45 20 57 48 45 4e 20 6e 2e 25 73    CASE WHEN n.%s
9790: 20 49 53 20 6f 2e 25 73 20 54 48 45 4e 20 4e 55   IS o.%s THEN NU
97a0: 4c 4c 20 45 4c 53 45 20 6f 2e 25 73 20 45 4e 44  LL ELSE o.%s END
97b0: 22 2c 20 26 61 7a 43 6f 6c 5b 6e 50 4b 5d 2c 20  ", &azCol[nPK], 
97c0: 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 73  -1.    );..    s
97d0: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
97e0: 5c 6e 46 52 4f 4d 20 6d 61 69 6e 2e 25 51 20 41  \nFROM main.%Q A
97f0: 53 20 6f 2c 20 61 75 78 2e 25 51 20 41 53 20 6e  S o, aux.%Q AS n
9800: 5c 6e 57 48 45 52 45 20 22 2c 20 7a 54 61 62 2c  \nWHERE ", zTab,
9810: 20 7a 54 61 62 29 3b 0a 20 20 20 20 73 74 72 50   zTab);.    strP
9820: 72 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c  rintfArray(pSql,
9830: 20 22 20 41 4e 44 20 22 2c 20 22 28 6e 2e 25 51   " AND ", "(n.%Q
9840: 20 49 53 20 6f 2e 25 51 29 22 2c 20 61 7a 43 6f   IS o.%Q)", azCo
9850: 6c 2c 20 6e 50 4b 29 3b 0a 20 20 20 20 73 74 72  l, nPK);.    str
9860: 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 20 41  Printf(pSql, " A
9870: 4e 44 20 6f 74 61 5f 63 6f 6e 74 72 6f 6c 20 4c  ND ota_control L
9880: 49 4b 45 20 27 25 25 78 25 25 27 22 29 3b 0a 20  IKE '%%x%%'");. 
9890: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 61 64 64   }..  /* Now add
98a0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
98b0: 75 73 65 20 74 6f 20 73 6f 72 74 20 65 76 65 72  use to sort ever
98c0: 79 74 68 69 6e 67 20 62 79 20 50 4b 2e 20 2a 2f  ything by PK. */
98d0: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71  .  strPrintf(pSq
98e0: 6c 2c 20 22 5c 6e 4f 52 44 45 52 20 42 59 20 22  l, "\nORDER BY "
98f0: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
9900: 3d 6e 50 4b 3b 20 69 2b 2b 29 20 73 74 72 50 72  =nPK; i++) strPr
9910: 69 6e 74 66 28 70 53 71 6c 2c 20 22 25 73 25 64  intf(pSql, "%s%d
9920: 22 2c 20 28 28 69 3e 31 29 3f 22 2c 20 22 3a 22  ", ((i>1)?", ":"
9930: 22 29 2c 20 69 29 3b 0a 7d 0a 0a 73 74 61 74 69  "), i);.}..stati
9940: 63 20 76 6f 69 64 20 72 62 75 64 69 66 66 5f 6f  c void rbudiff_o
9950: 6e 65 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20 63  ne_table(const c
9960: 68 61 72 20 2a 7a 54 61 62 2c 20 46 49 4c 45 20  har *zTab, FILE 
9970: 2a 6f 75 74 29 7b 0a 20 20 69 6e 74 20 62 4f 74  *out){.  int bOt
9980: 61 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  aRowid;         
9990: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
99a0: 20 74 6f 20 75 73 65 20 61 6e 20 6f 74 61 5f 72   to use an ota_r
99b0: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  owid column */. 
99c0: 20 69 6e 74 20 6e 50 4b 3b 20 20 20 20 20 20 20   int nPK;       
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72   /* Number of pr
99f0: 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e  imary key column
9a00: 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  s in table */.  
9a10: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20  char **azCol;   
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 2f 2a 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74  /* NULL terminat
9a40: 65 64 20 61 72 72 61 79 20 6f 66 20 63 6f 6c 20  ed array of col 
9a50: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  names */.  int i
9a60: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
9a70: 53 74 72 20 63 74 20 3d 20 7b 30 2c 20 30 2c 20  Str ct = {0, 0, 
9a80: 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0};             
9a90: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 20 54  /* The "CREATE T
9aa0: 41 42 4c 45 20 64 61 74 61 5f 78 78 78 22 20 73  ABLE data_xxx" s
9ab0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 74  tatement */.  St
9ac0: 72 20 73 71 6c 20 3d 20 7b 30 2c 20 30 2c 20 30  r sql = {0, 0, 0
9ad0: 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  };            /*
9ae0: 20 51 75 65 72 79 20 74 6f 20 66 69 6e 64 20 64   Query to find d
9af0: 69 66 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20  ifferences */.  
9b00: 53 74 72 20 69 6e 73 65 72 74 20 3d 20 7b 30 2c  Str insert = {0,
9b10: 20 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20   0, 0};         
9b20: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
9b30: 20 6f 75 74 70 75 74 20 49 4e 53 45 52 54 20 73   output INSERT s
9b40: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 73 71  tatement */.  sq
9b50: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
9b60: 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 2d 2d 72  t = 0;..  /* --r
9b70: 62 75 20 6d 6f 64 65 20 6d 75 73 74 20 75 73 65  bu mode must use
9b80: 20 72 65 61 6c 20 70 72 69 6d 61 72 79 20 6b 65   real primary ke
9b90: 79 73 2e 20 2a 2f 0a 20 20 67 2e 62 53 63 68 65  ys. */.  g.bSche
9ba0: 6d 61 50 4b 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  maPK = 1;..  /* 
9bb0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 73  Check that the s
9bc0: 63 68 65 6d 61 73 20 6f 66 20 74 68 65 20 74 77  chemas of the tw
9bd0: 6f 20 74 61 62 6c 65 73 20 6d 61 74 63 68 2e 20  o tables match. 
9be0: 45 78 69 74 20 65 61 72 6c 79 20 6f 74 68 65 72  Exit early other
9bf0: 77 69 73 65 2e 20 2a 2f 0a 20 20 63 68 65 63 6b  wise. */.  check
9c00: 53 63 68 65 6d 61 73 4d 61 74 63 68 28 7a 54 61  SchemasMatch(zTa
9c10: 62 29 3b 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  b);..  /* Grab t
9c20: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
9c30: 61 6e 64 20 50 4b 20 64 65 74 61 69 6c 73 20 66  and PK details f
9c40: 6f 72 20 74 68 65 20 74 61 62 6c 65 28 73 29 2e  or the table(s).
9c50: 20 49 66 20 6e 6f 20 75 73 61 62 6c 65 20 50 4b   If no usable PK
9c60: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 72  .  ** columns ar
9c70: 65 20 66 6f 75 6e 64 2c 20 62 61 69 6c 20 6f 75  e found, bail ou
9c80: 74 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 61  t early.  */.  a
9c90: 7a 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d  zCol = columnNam
9ca0: 65 73 28 22 6d 61 69 6e 22 2c 20 7a 54 61 62 2c  es("main", zTab,
9cb0: 20 26 6e 50 4b 2c 20 26 62 4f 74 61 52 6f 77 69   &nPK, &bOtaRowi
9cc0: 64 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d  d);.  if( azCol=
9cd0: 3d 30 20 29 7b 0a 20 20 20 20 72 75 6e 74 69 6d  =0 ){.    runtim
9ce0: 65 45 72 72 6f 72 28 22 74 61 62 6c 65 20 25 73  eError("table %s
9cf0: 20 68 61 73 20 6e 6f 20 75 73 61 62 6c 65 20 50   has no usable P
9d00: 4b 20 63 6f 6c 75 6d 6e 73 22 2c 20 7a 54 61 62  K columns", zTab
9d10: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 43 6f  );.  }.  for(nCo
9d20: 6c 3d 30 3b 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 5d  l=0; azCol[nCol]
9d30: 3b 20 6e 43 6f 6c 2b 2b 29 3b 0a 0a 20 20 2f 2a  ; nCol++);..  /*
9d40: 20 42 75 69 6c 64 20 61 6e 64 20 6f 75 74 70 75   Build and outpu
9d50: 74 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  t the CREATE TAB
9d60: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  LE statement for
9d70: 20 74 68 65 20 64 61 74 61 5f 78 78 78 20 74 61   the data_xxx ta
9d80: 62 6c 65 20 2a 2f 0a 20 20 73 74 72 50 72 69 6e  ble */.  strPrin
9d90: 74 66 28 26 63 74 2c 20 22 43 52 45 41 54 45 20  tf(&ct, "CREATE 
9da0: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
9db0: 53 54 53 20 27 64 61 74 61 5f 25 71 27 28 22 2c  STS 'data_%q'(",
9dc0: 20 7a 54 61 62 29 3b 0a 20 20 69 66 28 20 62 4f   zTab);.  if( bO
9dd0: 74 61 52 6f 77 69 64 20 29 20 73 74 72 50 72 69  taRowid ) strPri
9de0: 6e 74 66 28 26 63 74 2c 20 22 72 62 75 5f 72 6f  ntf(&ct, "rbu_ro
9df0: 77 69 64 2c 20 22 29 3b 0a 20 20 73 74 72 50 72  wid, ");.  strPr
9e00: 69 6e 74 66 41 72 72 61 79 28 26 63 74 2c 20 22  intfArray(&ct, "
9e10: 2c 20 22 2c 20 22 25 73 22 2c 20 26 61 7a 43 6f  , ", "%s", &azCo
9e20: 6c 5b 62 4f 74 61 52 6f 77 69 64 5d 2c 20 2d 31  l[bOtaRowid], -1
9e30: 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26  );.  strPrintf(&
9e40: 63 74 2c 20 22 2c 20 72 62 75 5f 63 6f 6e 74 72  ct, ", rbu_contr
9e50: 6f 6c 29 3b 22 29 3b 0a 0a 20 20 2f 2a 20 47 65  ol);");..  /* Ge
9e60: 74 20 74 68 65 20 53 51 4c 20 66 6f 72 20 74 68  t the SQL for th
9e70: 65 20 71 75 65 72 79 20 74 6f 20 72 65 74 72 69  e query to retri
9e80: 65 76 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  eve data from th
9e90: 65 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  e two databases 
9ea0: 2a 2f 0a 20 20 67 65 74 52 62 75 64 69 66 66 51  */.  getRbudiffQ
9eb0: 75 65 72 79 28 7a 54 61 62 2c 20 61 7a 43 6f 6c  uery(zTab, azCol
9ec0: 2c 20 6e 50 4b 2c 20 62 4f 74 61 52 6f 77 69 64  , nPK, bOtaRowid
9ed0: 2c 20 26 73 71 6c 29 3b 0a 0a 20 20 2f 2a 20 42  , &sql);..  /* B
9ee0: 75 69 6c 64 20 74 68 65 20 66 69 72 73 74 20 70  uild the first p
9ef0: 61 72 74 20 6f 66 20 74 68 65 20 49 4e 53 45 52  art of the INSER
9f00: 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 75 74 70  T statement outp
9f10: 75 74 20 66 6f 72 20 65 61 63 68 20 72 6f 77 0a  ut for each row.
9f20: 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
9f30: 5f 78 78 78 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  _xxx table. */. 
9f40: 20 73 74 72 50 72 69 6e 74 66 28 26 69 6e 73 65   strPrintf(&inse
9f50: 72 74 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  rt, "INSERT INTO
9f60: 20 27 64 61 74 61 5f 25 71 27 20 28 22 2c 20 7a   'data_%q' (", z
9f70: 54 61 62 29 3b 0a 20 20 69 66 28 20 62 4f 74 61  Tab);.  if( bOta
9f80: 52 6f 77 69 64 20 29 20 73 74 72 50 72 69 6e 74  Rowid ) strPrint
9f90: 66 28 26 69 6e 73 65 72 74 2c 20 22 72 62 75 5f  f(&insert, "rbu_
9fa0: 72 6f 77 69 64 2c 20 22 29 3b 0a 20 20 73 74 72  rowid, ");.  str
9fb0: 50 72 69 6e 74 66 41 72 72 61 79 28 26 69 6e 73  PrintfArray(&ins
9fc0: 65 72 74 2c 20 22 2c 20 22 2c 20 22 25 73 22 2c  ert, ", ", "%s",
9fd0: 20 26 61 7a 43 6f 6c 5b 62 4f 74 61 52 6f 77 69   &azCol[bOtaRowi
9fe0: 64 5d 2c 20 2d 31 29 3b 0a 20 20 73 74 72 50 72  d], -1);.  strPr
9ff0: 69 6e 74 66 28 26 69 6e 73 65 72 74 2c 20 22 2c  intf(&insert, ",
a000: 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 20 56 41   rbu_control) VA
a010: 4c 55 45 53 28 22 29 3b 0a 0a 20 20 70 53 74 6d  LUES(");..  pStm
a020: 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28 22  t = db_prepare("
a030: 25 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a 0a 20 20  %s", sql.z);..  
a040: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
a050: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
a060: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 0a 20  TE_ROW ){.    . 
a070: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
a080: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f   the first row o
a090: 75 74 70 75 74 2c 20 70 72 69 6e 74 20 6f 75 74  utput, print out
a0a0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
a0b0: 45 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  E .    ** statem
a0c0: 65 6e 74 20 66 69 72 73 74 2e 20 41 6e 64 20 74  ent first. And t
a0d0: 68 65 6e 20 73 65 74 20 63 74 2e 7a 20 74 6f 20  hen set ct.z to 
a0e0: 4e 55 4c 4c 20 73 6f 20 74 68 61 74 20 69 74 20  NULL so that it 
a0f0: 69 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 70  is not .    ** p
a100: 72 69 6e 74 65 64 20 61 67 61 69 6e 2e 20 20 2a  rinted again.  *
a110: 2f 0a 20 20 20 20 69 66 28 20 63 74 2e 7a 20 29  /.    if( ct.z )
a120: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
a130: 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 63 74 2e  out, "%s\n", ct.
a140: 7a 29 3b 0a 20 20 20 20 20 20 73 74 72 46 72 65  z);.      strFre
a150: 65 28 26 63 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  e(&ct);.    }.. 
a160: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
a170: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
a180: 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  he INSERT statem
a190: 65 6e 74 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e  ent */.    fprin
a1a0: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 69 6e  tf(out, "%s", in
a1b0: 73 65 72 74 2e 7a 29 3b 0a 0a 20 20 20 20 69 66  sert.z);..    if
a1c0: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
a1d0: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 6e 43 6f  _type(pStmt, nCo
a1e0: 6c 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  l)==SQLITE_INTEG
a1f0: 45 52 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ER ){.      for(
a200: 69 3d 30 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b  i=0; i<=nCol; i+
a210: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
a220: 69 3e 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  i>0 ) fprintf(ou
a230: 74 2c 20 22 2c 20 22 29 3b 0a 20 20 20 20 20 20  t, ", ");.      
a240: 20 20 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75    printQuoted(ou
a250: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t, sqlite3_colum
a260: 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69  n_value(pStmt, i
a270: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
a280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
a290: 72 20 2a 7a 4f 74 61 43 6f 6e 74 72 6f 6c 3b 0a  r *zOtaControl;.
a2a0: 20 20 20 20 20 20 69 6e 74 20 6e 4f 74 61 43 6f        int nOtaCo
a2b0: 6e 74 72 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f  ntrol = sqlite3_
a2c0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
a2d0: 6d 74 2c 20 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20  mt, nCol);..    
a2e0: 20 20 7a 4f 74 61 43 6f 6e 74 72 6f 6c 20 3d 20    zOtaControl = 
a2f0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
a300: 61 6c 6c 6f 63 28 6e 4f 74 61 43 6f 6e 74 72 6f  alloc(nOtaContro
a310: 6c 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  l);.      memcpy
a320: 28 7a 4f 74 61 43 6f 6e 74 72 6f 6c 2c 20 73 71  (zOtaControl, sq
a330: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
a340: 74 28 70 53 74 6d 74 2c 20 6e 43 6f 6c 29 2c 20  t(pStmt, nCol), 
a350: 6e 4f 74 61 43 6f 6e 74 72 6f 6c 2b 31 29 3b 0a  nOtaControl+1);.
a360: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a370: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
a380: 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20        int bDone 
a390: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
a3a0: 20 69 3e 3d 6e 50 4b 20 0a 20 20 20 20 20 20 20   i>=nPK .       
a3b0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
a3c0: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
a3d0: 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f 42 4c  t, i)==SQLITE_BL
a3e0: 4f 42 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  OB.            &
a3f0: 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
a400: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 6e 43 6f  _type(pStmt, nCo
a410: 6c 2b 31 2b 69 29 3d 3d 53 51 4c 49 54 45 5f 42  l+1+i)==SQLITE_B
a420: 4c 4f 42 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  LOB.        ){. 
a430: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
a440: 68 61 72 20 2a 61 53 72 63 20 3d 20 73 71 6c 69  har *aSrc = sqli
a450: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
a460: 70 53 74 6d 74 2c 20 6e 43 6f 6c 2b 31 2b 69 29  pStmt, nCol+1+i)
a470: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
a480: 6e 53 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  nSrc = sqlite3_c
a490: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
a4a0: 74 2c 20 6e 43 6f 6c 2b 31 2b 69 29 3b 0a 20 20  t, nCol+1+i);.  
a4b0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a4c0: 61 72 20 2a 61 46 69 6e 61 6c 20 3d 20 73 71 6c  ar *aFinal = sql
a4d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
a4e0: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
a4f0: 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6e 61 6c        int nFinal
a500: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
a510: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
a520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  );.          cha
a530: 72 20 2a 61 44 65 6c 74 61 3b 0a 20 20 20 20 20  r *aDelta;.     
a540: 20 20 20 20 20 69 6e 74 20 6e 44 65 6c 74 61 3b       int nDelta;
a550: 0a 0a 20 20 20 20 20 20 20 20 20 20 61 44 65 6c  ..          aDel
a560: 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ta = sqlite3_mal
a570: 6c 6f 63 28 6e 46 69 6e 61 6c 20 2b 20 36 30 29  loc(nFinal + 60)
a580: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 6c  ;.          nDel
a590: 74 61 20 3d 20 72 62 75 44 65 6c 74 61 43 72 65  ta = rbuDeltaCre
a5a0: 61 74 65 28 61 53 72 63 2c 20 6e 53 72 63 2c 20  ate(aSrc, nSrc, 
a5b0: 61 46 69 6e 61 6c 2c 20 6e 46 69 6e 61 6c 2c 20  aFinal, nFinal, 
a5c0: 61 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  aDelta);.       
a5d0: 20 20 20 69 66 28 20 6e 44 65 6c 74 61 3c 6e 46     if( nDelta<nF
a5e0: 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
a5f0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
a600: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
a610: 75 74 2c 20 22 78 27 22 29 3b 0a 20 20 20 20 20  ut, "x'");.     
a620: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
a630: 6a 3c 6e 44 65 6c 74 61 3b 20 6a 2b 2b 29 20 66  j<nDelta; j++) f
a640: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
a650: 78 22 2c 20 28 75 38 29 61 44 65 6c 74 61 5b 6a  x", (u8)aDelta[j
a660: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
a670: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  fprintf(out, "'"
a680: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
a690: 4f 74 61 43 6f 6e 74 72 6f 6c 5b 69 2d 62 4f 74  OtaControl[i-bOt
a6a0: 61 52 6f 77 69 64 5d 20 3d 20 27 66 27 3b 0a 20  aRowid] = 'f';. 
a6b0: 20 20 20 20 20 20 20 20 20 20 20 62 44 6f 6e 65             bDone
a6c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
a6d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
a6e0: 74 65 33 5f 66 72 65 65 28 61 44 65 6c 74 61 29  te3_free(aDelta)
a6f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
a700: 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 3d 3d       if( bDone==
a710: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
a720: 72 69 6e 74 51 75 6f 74 65 64 28 6f 75 74 2c 20  rintQuoted(out, 
a730: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
a740: 61 6c 75 65 28 70 53 74 6d 74 2c 20 69 29 29 3b  alue(pStmt, i));
a750: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a760: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
a770: 22 2c 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", ");.      }. 
a780: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
a790: 2c 20 22 27 25 73 27 22 2c 20 7a 4f 74 61 43 6f  , "'%s'", zOtaCo
a7a0: 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71  ntrol);.      sq
a7b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 74 61 43  lite3_free(zOtaC
a7c0: 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 7d 0a 0a  ontrol);.    }..
a7d0: 20 20 20 20 2f 2a 20 41 6e 64 20 74 68 65 20 63      /* And the c
a7e0: 6c 6f 73 69 6e 67 20 62 72 61 63 6b 65 74 20 6f  losing bracket o
a7f0: 66 20 74 68 65 20 69 6e 73 65 72 74 20 73 74 61  f the insert sta
a800: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 66 70  tement */.    fp
a810: 72 69 6e 74 66 28 6f 75 74 2c 20 22 29 3b 5c 6e  rintf(out, ");\n
a820: 22 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  ");.  }..  sqlit
a830: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
a840: 74 29 3b 0a 0a 20 20 73 74 72 46 72 65 65 28 26  t);..  strFree(&
a850: 63 74 29 3b 0a 20 20 73 74 72 46 72 65 65 28 26  ct);.  strFree(&
a860: 73 71 6c 29 3b 0a 20 20 73 74 72 46 72 65 65 28  sql);.  strFree(
a870: 26 69 6e 73 65 72 74 29 3b 0a 7d 0a 0a 2f 2a 0a  &insert);.}../*.
a880: 2a 2a 20 44 69 73 70 6c 61 79 20 61 20 73 75 6d  ** Display a sum
a890: 6d 61 72 79 20 6f 66 20 64 69 66 66 65 72 65 6e  mary of differen
a8a0: 63 65 73 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ces between two 
a8b0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
a8c0: 73 61 6d 65 0a 2a 2a 20 74 61 62 6c 65 20 74 61  same.** table ta
a8d0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ble..**.**   *  
a8e0: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63  Number of rows c
a8f0: 68 61 6e 67 65 64 0a 2a 2a 20 20 20 2a 20 20 4e  hanged.**   *  N
a900: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 61 64  umber of rows ad
a910: 64 65 64 0a 2a 2a 20 20 20 2a 20 20 4e 75 6d 62  ded.**   *  Numb
a920: 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 65 74  er of rows delet
a930: 65 64 0a 2a 2a 20 20 20 2a 20 20 4e 75 6d 62 65  ed.**   *  Numbe
a940: 72 20 6f 66 20 69 64 65 6e 74 69 63 61 6c 20 72  r of identical r
a950: 6f 77 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ows.*/.static vo
a960: 69 64 20 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e 65  id summarize_one
a970: 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61  _table(const cha
a980: 72 20 2a 7a 54 61 62 2c 20 46 49 4c 45 20 2a 6f  r *zTab, FILE *o
a990: 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 49 64  ut){.  char *zId
a9a0: 20 3d 20 73 61 66 65 49 64 28 7a 54 61 62 29 3b   = safeId(zTab);
a9b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
a9c0: 65 20 28 74 72 61 6e 73 6c 61 74 65 64 20 66 6f  e (translated fo
a9d0: 72 20 75 73 20 69 6e 20 53 51 4c 29 20 2a 2f 0a  r us in SQL) */.
a9e0: 20 20 63 68 61 72 20 2a 2a 61 7a 20 3d 20 30 3b    char **az = 0;
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
aa00: 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61 69 6e 20 2a  olumns in main *
aa10: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 32 20 3d  /.  char **az2 =
aa20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
aa30: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 61 75 78 20   Columns in aux 
aa40: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 3b 20 20 20  */.  int nPk;   
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa60: 2a 20 50 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  * Primary key co
aa70: 6c 75 6d 6e 73 20 69 6e 20 6d 61 69 6e 20 2a 2f  lumns in main */
aa80: 0a 20 20 69 6e 74 20 6e 50 6b 32 3b 20 20 20 20  .  int nPk2;    
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aaa0: 50 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75  Primary key colu
aab0: 6d 6e 73 20 69 6e 20 61 75 78 20 2a 2f 0a 20 20  mns in aux */.  
aac0: 69 6e 74 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  int n = 0;      
aad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
aae0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
aaf0: 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  n main */.  int 
ab00: 6e 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  n2;             
ab10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ab20: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 75  of columns in au
ab30: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  x */.  int i;   
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
ab60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ab70: 20 2a 7a 53 65 70 3b 20 20 20 20 20 20 20 20 20   *zSep;         
ab80: 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 73 74 72  /* Separator str
ab90: 69 6e 67 20 2a 2f 0a 20 20 53 74 72 20 73 71 6c  ing */.  Str sql
aba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
abb0: 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
abc0: 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
abd0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
abe0: 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 73        /* Query s
abf0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 6f 20 74  tatement to do t
ac00: 68 65 20 64 69 66 66 20 2a 2f 0a 20 20 73 71 6c  he diff */.  sql
ac10: 69 74 65 33 5f 69 6e 74 36 34 20 6e 55 70 64 61  ite3_int64 nUpda
ac20: 74 65 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  te;    /* Number
ac30: 20 6f 66 20 75 70 64 61 74 65 64 20 72 6f 77 73   of updated rows
ac40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
ac50: 74 36 34 20 6e 55 6e 63 68 61 6e 67 65 64 3b 20  t64 nUnchanged; 
ac60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 6d  /* Number of unm
ac70: 6f 64 69 66 69 65 64 20 72 6f 77 73 20 2a 2f 0a  odified rows */.
ac80: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
ac90: 6e 44 65 6c 65 74 65 3b 20 20 20 20 2f 2a 20 4e  nDelete;    /* N
aca0: 75 6d 62 65 72 20 6f 66 20 64 65 6c 65 74 65 64  umber of deleted
acb0: 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
acc0: 65 33 5f 69 6e 74 36 34 20 6e 49 6e 73 65 72 74  e3_int64 nInsert
acd0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
ace0: 66 20 69 6e 73 65 72 74 65 64 20 72 6f 77 73 20  f inserted rows 
acf0: 2a 2f 0a 0a 20 20 73 74 72 49 6e 69 74 28 26 73  */..  strInit(&s
ad00: 71 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ql);.  if( sqlit
ad10: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
ad20: 6d 65 74 61 64 61 74 61 28 67 2e 64 62 2c 22 61  metadata(g.db,"a
ad30: 75 78 22 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c 30  ux",zTab,0,0,0,0
ad40: 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 69 66 28  ,0,0) ){.    if(
ad50: 20 21 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f   !sqlite3_table_
ad60: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
ad70: 67 2e 64 62 2c 22 6d 61 69 6e 22 2c 7a 54 61 62  g.db,"main",zTab
ad80: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 20 29 7b  ,0,0,0,0,0,0) ){
ad90: 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  .      /* Table 
ada0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 65 63  missing from sec
adb0: 6f 6e 64 20 64 61 74 61 62 61 73 65 2e 20 2a 2f  ond database. */
adc0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
add0: 75 74 2c 20 22 25 73 3a 20 6d 69 73 73 69 6e 67  ut, "%s: missing
ade0: 20 66 72 6f 6d 20 73 65 63 6f 6e 64 20 64 61 74   from second dat
adf0: 61 62 61 73 65 5c 6e 22 2c 20 7a 54 61 62 29 3b  abase\n", zTab);
ae00: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
ae10: 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e  end_summarize_on
ae20: 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  e_table;.  }..  
ae30: 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  if( sqlite3_tabl
ae40: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
ae50: 61 28 67 2e 64 62 2c 22 6d 61 69 6e 22 2c 7a 54  a(g.db,"main",zT
ae60: 61 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 20  ab,0,0,0,0,0,0) 
ae70: 29 7b 0a 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ){.    /* Table 
ae80: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 75  missing from sou
ae90: 72 63 65 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e  rce */.    fprin
aea0: 74 66 28 6f 75 74 2c 20 22 25 73 3a 20 6d 69 73  tf(out, "%s: mis
aeb0: 73 69 6e 67 20 66 72 6f 6d 20 66 69 72 73 74 20  sing from first 
aec0: 64 61 74 61 62 61 73 65 5c 6e 22 2c 20 7a 54 61  database\n", zTa
aed0: 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  b);.    goto end
aee0: 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e 65 5f 74  _summarize_one_t
aef0: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 61 7a 20  able;.  }..  az 
af00: 3d 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22 6d  = columnNames("m
af10: 61 69 6e 22 2c 20 7a 54 61 62 2c 20 26 6e 50 6b  ain", zTab, &nPk
af20: 2c 20 30 29 3b 0a 20 20 61 7a 32 20 3d 20 63 6f  , 0);.  az2 = co
af30: 6c 75 6d 6e 4e 61 6d 65 73 28 22 61 75 78 22 2c  lumnNames("aux",
af40: 20 7a 54 61 62 2c 20 26 6e 50 6b 32 2c 20 30 29   zTab, &nPk2, 0)
af50: 3b 0a 20 20 69 66 28 20 61 7a 20 26 26 20 61 7a  ;.  if( az && az
af60: 32 20 29 7b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  2 ){.    for(n=0
af70: 3b 20 61 7a 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20  ; az[n]; n++){. 
af80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
af90: 5f 73 74 72 69 63 6d 70 28 61 7a 5b 6e 5d 2c 61  _stricmp(az[n],a
afa0: 7a 32 5b 6e 5d 29 21 3d 30 20 29 20 62 72 65 61  z2[n])!=0 ) brea
afb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
afc0: 66 28 20 61 7a 3d 3d 30 0a 20 20 20 7c 7c 20 61  f( az==0.   || a
afd0: 7a 32 3d 3d 30 0a 20 20 20 7c 7c 20 6e 50 6b 21  z2==0.   || nPk!
afe0: 3d 6e 50 6b 32 0a 20 20 20 7c 7c 20 61 7a 5b 6e  =nPk2.   || az[n
aff0: 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 63  ].  ){.    /* Sc
b000: 68 65 6d 61 20 6d 69 73 6d 61 74 63 68 20 2a 2f  hema mismatch */
b010: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
b020: 2c 20 22 25 73 3a 20 69 6e 63 6f 6d 70 61 74 69  , "%s: incompati
b030: 62 6c 65 20 73 63 68 65 6d 61 5c 6e 22 2c 20 7a  ble schema\n", z
b040: 54 61 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Tab);.    goto e
b050: 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e 65  nd_summarize_one
b060: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _table;.  }..  /
b070: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70  * Build the comp
b080: 61 72 69 73 6f 6e 20 71 75 65 72 79 20 2a 2f 0a  arison query */.
b090: 20 20 66 6f 72 28 6e 32 3d 6e 3b 20 61 7a 5b 6e    for(n2=n; az[n
b0a0: 32 5d 3b 20 6e 32 2b 2b 29 7b 7d 0a 20 20 73 74  2]; n2++){}.  st
b0b0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 53  rPrintf(&sql, "S
b0c0: 45 4c 45 43 54 20 31 2c 20 63 6f 75 6e 74 28 2a  ELECT 1, count(*
b0d0: 29 22 29 3b 0a 20 20 69 66 28 20 6e 32 3d 3d 6e  )");.  if( n2==n
b0e0: 50 6b 32 20 29 7b 0a 20 20 20 20 73 74 72 50 72  Pk2 ){.    strPr
b0f0: 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c 20 30 5c  intf(&sql, ", 0\
b100: 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n");.  }else{.  
b110: 20 20 7a 53 65 70 20 3d 20 22 2c 20 73 75 6d 28    zSep = ", sum(
b120: 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 50 6b  ";.    for(i=nPk
b130: 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  ; az[i]; i++){. 
b140: 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26       strPrintf(&
b150: 73 71 6c 2c 20 22 25 73 41 2e 25 73 20 49 53 20  sql, "%sA.%s IS 
b160: 4e 4f 54 20 42 2e 25 73 22 2c 20 7a 53 65 70 2c  NOT B.%s", zSep,
b170: 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a   az[i], az[i]);.
b180: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f        zSep = " O
b190: 52 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  R ";.    }.    s
b1a0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
b1b0: 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 74 72  )\n");.  }.  str
b1c0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20  Printf(&sql, "  
b1d0: 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 2c 20  FROM main.%s A, 
b1e0: 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49 64  aux.%s B\n", zId
b1f0: 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d  , zId);.  zSep =
b200: 20 22 20 57 48 45 52 45 22 3b 0a 20 20 66 6f 72   " WHERE";.  for
b210: 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  (i=0; i<nPk; i++
b220: 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  ){.    strPrintf
b230: 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d  (&sql, "%s A.%s=
b240: 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b  B.%s", zSep, az[
b250: 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  i], az[i]);.    
b260: 7a 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20  zSep = " AND";. 
b270: 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26   }.  strPrintf(&
b280: 73 71 6c 2c 20 22 20 55 4e 49 4f 4e 20 41 4c 4c  sql, " UNION ALL
b290: 5c 6e 22 29 3b 0a 20 20 73 74 72 50 72 69 6e 74  \n");.  strPrint
b2a0: 66 28 26 73 71 6c 2c 20 22 53 45 4c 45 43 54 20  f(&sql, "SELECT 
b2b0: 32 2c 20 63 6f 75 6e 74 28 2a 29 2c 20 30 5c 6e  2, count(*), 0\n
b2c0: 22 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28  ");.  strPrintf(
b2d0: 26 73 71 6c 2c 20 22 20 20 46 52 4f 4d 20 6d 61  &sql, "  FROM ma
b2e0: 69 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a 49 64 29  in.%s A\n", zId)
b2f0: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  ;.  strPrintf(&s
b300: 71 6c 2c 20 22 20 57 48 45 52 45 20 4e 4f 54 20  ql, " WHERE NOT 
b310: 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20  EXISTS(SELECT 1 
b320: 46 52 4f 4d 20 61 75 78 2e 25 73 20 42 20 22 2c  FROM aux.%s B ",
b330: 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20   zId);.  zSep = 
b340: 22 57 48 45 52 45 22 3b 0a 20 20 66 6f 72 28 69  "WHERE";.  for(i
b350: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
b360: 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26  .    strPrintf(&
b370: 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e  sql, "%s A.%s=B.
b380: 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d  %s", zSep, az[i]
b390: 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a 53  , az[i]);.    zS
b3a0: 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20 7d  ep = " AND";.  }
b3b0: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
b3c0: 6c 2c 20 22 29 5c 6e 22 29 3b 0a 20 20 73 74 72  l, ")\n");.  str
b3d0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 55  Printf(&sql, " U
b3e0: 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b 0a 20 20  NION ALL\n");.  
b3f0: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
b400: 22 53 45 4c 45 43 54 20 33 2c 20 63 6f 75 6e 74  "SELECT 3, count
b410: 28 2a 29 2c 20 30 5c 6e 22 29 3b 0a 20 20 73 74  (*), 0\n");.  st
b420: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20  rPrintf(&sql, " 
b430: 20 46 52 4f 4d 20 61 75 78 2e 25 73 20 42 5c 6e   FROM aux.%s B\n
b440: 22 2c 20 7a 49 64 29 3b 0a 20 20 73 74 72 50 72  ", zId);.  strPr
b450: 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 57 48 45  intf(&sql, " WHE
b460: 52 45 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45  RE NOT EXISTS(SE
b470: 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d 61 69 6e  LECT 1 FROM main
b480: 2e 25 73 20 41 20 22 2c 20 7a 49 64 29 3b 0a 20  .%s A ", zId);. 
b490: 20 7a 53 65 70 20 3d 20 22 57 48 45 52 45 22 3b   zSep = "WHERE";
b4a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
b4b0: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  k; i++){.    str
b4c0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73  Printf(&sql, "%s
b4d0: 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53 65   A.%s=B.%s", zSe
b4e0: 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29  p, az[i], az[i])
b4f0: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41  ;.    zSep = " A
b500: 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72  ND";.  }.  strPr
b510: 69 6e 74 66 28 26 73 71 6c 2c 20 22 29 5c 6e 20  intf(&sql, ")\n 
b520: 4f 52 44 45 52 20 42 59 20 31 3b 5c 6e 22 29 3b  ORDER BY 1;\n");
b530: 0a 0a 20 20 69 66 28 20 28 67 2e 66 44 65 62 75  ..  if( (g.fDebu
b540: 67 20 26 20 44 45 42 55 47 5f 44 49 46 46 5f 53  g & DEBUG_DIFF_S
b550: 51 4c 29 21 3d 30 20 29 7b 20 0a 20 20 20 20 70  QL)!=0 ){ .    p
b560: 72 69 6e 74 66 28 22 53 51 4c 20 66 6f 72 20 25  rintf("SQL for %
b570: 73 3a 5c 6e 25 73 5c 6e 22 2c 20 7a 49 64 2c 20  s:\n%s\n", zId, 
b580: 73 71 6c 2e 7a 29 3b 0a 20 20 20 20 67 6f 74 6f  sql.z);.    goto
b590: 20 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f   end_summarize_o
b5a0: 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  ne_table;.  }.. 
b5b0: 20 2f 2a 20 52 75 6e 20 74 68 65 20 71 75 65 72   /* Run the quer
b5c0: 79 20 61 6e 64 20 6f 75 74 70 75 74 20 64 69 66  y and output dif
b5d0: 66 65 72 65 6e 63 65 20 73 75 6d 6d 61 72 79 20  ference summary 
b5e0: 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f  */.  pStmt = db_
b5f0: 70 72 65 70 61 72 65 28 73 71 6c 2e 7a 29 3b 0a  prepare(sql.z);.
b600: 20 20 6e 55 70 64 61 74 65 20 3d 20 30 3b 0a 20    nUpdate = 0;. 
b610: 20 6e 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20   nInsert = 0;.  
b620: 6e 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 6e  nDelete = 0;.  n
b630: 55 6e 63 68 61 6e 67 65 64 20 3d 20 30 3b 0a 20  Unchanged = 0;. 
b640: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
b650: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
b660: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 73  (pStmt) ){.    s
b670: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
b680: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
b690: 30 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  0) ){.      case
b6a0: 20 31 3a 0a 20 20 20 20 20 20 20 20 6e 55 70 64   1:.        nUpd
b6b0: 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ate = sqlite3_co
b6c0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
b6d0: 2c 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 55 6e  ,2);.        nUn
b6e0: 63 68 61 6e 67 65 64 20 3d 20 73 71 6c 69 74 65  changed = sqlite
b6f0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
b700: 53 74 6d 74 2c 31 29 20 2d 20 6e 55 70 64 61 74  Stmt,1) - nUpdat
b710: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
b720: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 0a  ;.      case 2:.
b730: 20 20 20 20 20 20 20 20 6e 44 65 6c 65 74 65 20          nDelete 
b740: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
b750: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 31 29 3b  _int64(pStmt,1);
b760: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b770: 20 20 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20        case 3:.  
b780: 20 20 20 20 20 20 6e 49 6e 73 65 72 74 20 3d 20        nInsert = 
b790: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
b7a0: 6e 74 36 34 28 70 53 74 6d 74 2c 31 29 3b 0a 20  nt64(pStmt,1);. 
b7b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b7c0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
b7d0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
b7e0: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
b7f0: 2c 20 22 25 73 3a 20 25 6c 6c 64 20 63 68 61 6e  , "%s: %lld chan
b800: 67 65 73 2c 20 25 6c 6c 64 20 69 6e 73 65 72 74  ges, %lld insert
b810: 73 2c 20 25 6c 6c 64 20 64 65 6c 65 74 65 73 2c  s, %lld deletes,
b820: 20 25 6c 6c 64 20 75 6e 63 68 61 6e 67 65 64 5c   %lld unchanged\
b830: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 54  n",.          zT
b840: 61 62 2c 20 6e 55 70 64 61 74 65 2c 20 6e 49 6e  ab, nUpdate, nIn
b850: 73 65 72 74 2c 20 6e 44 65 6c 65 74 65 2c 20 6e  sert, nDelete, n
b860: 55 6e 63 68 61 6e 67 65 64 29 3b 0a 0a 65 6e 64  Unchanged);..end
b870: 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e 65 5f 74  _summarize_one_t
b880: 61 62 6c 65 3a 0a 20 20 73 74 72 46 72 65 65 28  able:.  strFree(
b890: 26 73 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  &sql);.  sqlite3
b8a0: 5f 66 72 65 65 28 7a 49 64 29 3b 0a 20 20 6e 61  _free(zId);.  na
b8b0: 6d 65 6c 69 73 74 46 72 65 65 28 61 7a 29 3b 0a  melistFree(az);.
b8c0: 20 20 6e 61 6d 65 6c 69 73 74 46 72 65 65 28 61    namelistFree(a
b8d0: 7a 32 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  z2);.  return;.}
b8e0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b8f0: 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
b900: 74 65 67 65 72 20 61 73 20 61 20 76 61 72 69 6e  teger as a varin
b910: 74 20 6f 6e 74 6f 20 6f 75 74 0a 2a 2f 0a 73 74  t onto out.*/.st
b920: 61 74 69 63 20 76 6f 69 64 20 70 75 74 73 56 61  atic void putsVa
b930: 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20  rint(FILE *out, 
b940: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 76  sqlite3_uint64 v
b950: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
b960: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
b970: 5b 31 32 5d 3b 0a 20 20 69 66 28 20 76 20 26 20  [12];.  if( v & 
b980: 28 28 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  (((sqlite3_uint6
b990: 34 29 30 78 66 66 30 30 30 30 30 30 29 3c 3c 33  4)0xff000000)<<3
b9a0: 32 29 20 29 7b 0a 20 20 20 20 70 5b 38 5d 20 3d  2) ){.    p[8] =
b9b0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
b9c0: 76 3b 0a 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  v;.    v >>= 8;.
b9d0: 20 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 3e 3d      for(i=7; i>=
b9e0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
b9f0: 5b 69 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  [i] = (unsigned 
ba00: 63 68 61 72 29 28 28 76 20 26 20 30 78 37 66 29  char)((v & 0x7f)
ba10: 20 7c 20 30 78 38 30 29 3b 0a 20 20 20 20 20 20   | 0x80);.      
ba20: 76 20 3e 3e 3d 20 37 3b 0a 20 20 20 20 7d 0a 20  v >>= 7;.    }. 
ba30: 20 20 20 66 77 72 69 74 65 28 70 2c 20 38 2c 20     fwrite(p, 8, 
ba40: 31 2c 20 6f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  1, out);.  }else
ba50: 7b 0a 20 20 20 20 6e 20 3d 20 39 3b 0a 20 20 20  {.    n = 9;.   
ba60: 20 64 6f 7b 0a 20 20 20 20 20 20 70 5b 6e 2d 2d   do{.      p[n--
ba70: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
ba80: 61 72 29 28 28 76 20 26 20 30 78 37 66 29 20 7c  ar)((v & 0x7f) |
ba90: 20 30 78 38 30 29 3b 0a 20 20 20 20 20 20 76 20   0x80);.      v 
baa0: 3e 3e 3d 20 37 3b 0a 20 20 20 20 7d 77 68 69 6c  >>= 7;.    }whil
bab0: 65 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 70  e( v!=0 );.    p
bac0: 5b 39 5d 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  [9] &= 0x7f;.   
bad0: 20 66 77 72 69 74 65 28 70 2b 6e 2b 31 2c 20 39   fwrite(p+n+1, 9
bae0: 2d 6e 2c 20 31 2c 20 6f 75 74 29 3b 0a 20 20 7d  -n, 1, out);.  }
baf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
bb00: 61 6e 20 53 51 4c 69 74 65 20 76 61 6c 75 65 20  an SQLite value 
bb10: 6f 6e 74 6f 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61  onto out..*/.sta
bb20: 74 69 63 20 76 6f 69 64 20 70 75 74 56 61 6c 75  tic void putValu
bb30: 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 71 6c  e(FILE *out, sql
bb40: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
bb50: 29 7b 0a 20 20 69 6e 74 20 69 44 54 79 70 65 20  ){.  int iDType 
bb60: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
bb70: 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 73 71  type(pVal);.  sq
bb80: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 58 3b 0a  lite3_int64 iX;.
bb90: 20 20 64 6f 75 62 6c 65 20 72 58 3b 0a 20 20 73    double rX;.  s
bba0: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 58  qlite3_uint64 uX
bbb0: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 70 75  ;.  int j;..  pu
bbc0: 74 63 28 69 44 54 79 70 65 2c 20 6f 75 74 29 3b  tc(iDType, out);
bbd0: 0a 20 20 73 77 69 74 63 68 28 20 69 44 54 79 70  .  switch( iDTyp
bbe0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
bbf0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20  LITE_INTEGER:.  
bc00: 20 20 20 20 69 58 20 3d 20 73 71 6c 69 74 65 33      iX = sqlite3
bc10: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61  _value_int64(pVa
bc20: 6c 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  l);.      memcpy
bc30: 28 26 75 58 2c 20 26 69 58 2c 20 38 29 3b 0a 20  (&uX, &iX, 8);. 
bc40: 20 20 20 20 20 66 6f 72 28 6a 3d 35 36 3b 20 6a       for(j=56; j
bc50: 3e 3d 30 3b 20 6a 2d 3d 38 29 20 70 75 74 63 28  >=0; j-=8) putc(
bc60: 28 75 58 3e 3e 6a 29 26 30 78 66 66 2c 20 6f 75  (uX>>j)&0xff, ou
bc70: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
bc80: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
bc90: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 72 58  _FLOAT:.      rX
bca0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
bcb0: 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20  _double(pVal);. 
bcc0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75 58 2c       memcpy(&uX,
bcd0: 20 26 72 58 2c 20 38 29 3b 0a 20 20 20 20 20 20   &rX, 8);.      
bce0: 66 6f 72 28 6a 3d 35 36 3b 20 6a 3e 3d 30 3b 20  for(j=56; j>=0; 
bcf0: 6a 2d 3d 38 29 20 70 75 74 63 28 28 75 58 3e 3e  j-=8) putc((uX>>
bd00: 6a 29 26 30 78 66 66 2c 20 6f 75 74 29 3b 0a 20  j)&0xff, out);. 
bd10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bd20: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
bd30: 3a 0a 20 20 20 20 20 20 69 58 20 3d 20 73 71 6c  :.      iX = sql
bd40: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
bd50: 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 75  (pVal);.      pu
bd60: 74 73 56 61 72 69 6e 74 28 6f 75 74 2c 20 28 73  tsVarint(out, (s
bd70: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 69 58  qlite3_uint64)iX
bd80: 29 3b 0a 20 20 20 20 20 20 66 77 72 69 74 65 28  );.      fwrite(
bd90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
bda0: 78 74 28 70 56 61 6c 29 2c 31 2c 28 73 69 7a 65  xt(pVal),1,(size
bdb0: 5f 74 29 69 58 2c 6f 75 74 29 3b 0a 20 20 20 20  _t)iX,out);.    
bdc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
bdd0: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
bde0: 20 20 20 20 20 69 58 20 3d 20 73 71 6c 69 74 65       iX = sqlite
bdf0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
be00: 61 6c 29 3b 0a 20 20 20 20 20 20 70 75 74 73 56  al);.      putsV
be10: 61 72 69 6e 74 28 6f 75 74 2c 20 28 73 71 6c 69  arint(out, (sqli
be20: 74 65 33 5f 75 69 6e 74 36 34 29 69 58 29 3b 0a  te3_uint64)iX);.
be30: 20 20 20 20 20 20 66 77 72 69 74 65 28 73 71 6c        fwrite(sql
be40: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
be50: 70 56 61 6c 29 2c 31 2c 28 73 69 7a 65 5f 74 29  pVal),1,(size_t)
be60: 69 58 2c 6f 75 74 29 3b 0a 20 20 20 20 20 20 62  iX,out);.      b
be70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
be80: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20  QLITE_NULL:.    
be90: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a    break;.  }.}..
bea0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
beb0: 20 43 48 41 4e 47 45 53 45 54 20 66 6f 72 20 61   CHANGESET for a
bec0: 6c 6c 20 64 69 66 66 65 72 65 6e 63 65 73 20 66  ll differences f
bed0: 72 6f 6d 20 6d 61 69 6e 2e 7a 54 61 62 20 74 6f  rom main.zTab to
bee0: 20 61 75 78 2e 7a 54 61 62 2e 0a 2a 2f 0a 73 74   aux.zTab..*/.st
bef0: 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65  atic void change
bf00: 73 65 74 5f 6f 6e 65 5f 74 61 62 6c 65 28 63 6f  set_one_table(co
bf10: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20  nst char *zTab, 
bf20: 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 73 71  FILE *out){.  sq
bf30: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
bf40: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
bf50: 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20  QL statment */. 
bf60: 20 63 68 61 72 20 2a 7a 49 64 20 3d 20 73 61 66   char *zId = saf
bf70: 65 49 64 28 7a 54 61 62 29 3b 20 20 20 20 20 2f  eId(zTab);     /
bf80: 2a 20 45 73 63 61 70 65 64 20 6e 61 6d 65 20 6f  * Escaped name o
bf90: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
bfa0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20   char **azCol = 
bfb0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
bfc0: 2a 20 4c 69 73 74 20 6f 66 20 65 73 63 61 70 65  * List of escape
bfd0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  d column names *
bfe0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30  /.  int nCol = 0
bff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c000: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c010: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
c020: 2a 61 69 46 6c 67 20 3d 20 30 3b 20 20 20 20 20  *aiFlg = 0;     
c030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 69            /* 0 i
c040: 66 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  f column is not 
c050: 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
c060: 69 6e 74 20 2a 61 69 50 6b 20 3d 20 30 3b 20 20  int *aiPk = 0;  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c080: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20   Column numbers 
c090: 66 6f 72 20 65 61 63 68 20 50 4b 20 63 6f 6c 75  for each PK colu
c0a0: 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 20  mn */.  int nPk 
c0b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c0c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c0d0: 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  of PRIMARY KEY c
c0e0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 74 72 20  olumns */.  Str 
c0f0: 73 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  sql;            
c100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
c110: 20 66 6f 72 20 74 68 65 20 64 69 66 66 20 71 75   for the diff qu
c120: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ery */.  int i, 
c130: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
c140: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c150: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6e  ounters */.  con
c160: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20  st char *zSep;  
c170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
c180: 73 74 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a  st separator */.
c190: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
c1a0: 20 74 68 65 20 73 63 68 65 6d 61 73 20 6f 66 20   the schemas of 
c1b0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 6d  the two tables m
c1c0: 61 74 63 68 2e 20 45 78 69 74 20 65 61 72 6c 79  atch. Exit early
c1d0: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20   otherwise. */. 
c1e0: 20 63 68 65 63 6b 53 63 68 65 6d 61 73 4d 61 74   checkSchemasMat
c1f0: 63 68 28 7a 54 61 62 29 3b 0a 0a 20 20 70 53 74  ch(zTab);..  pSt
c200: 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28  mt = db_prepare(
c210: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 74 61 62  "PRAGMA main.tab
c220: 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61  le_info=%Q", zTa
c230: 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c  b);.  while( SQL
c240: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
c250: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
c260: 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
c270: 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f  azCol = sqlite3_
c280: 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 73  realloc(azCol, s
c290: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
c2a0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f  l);.    if( azCo
c2b0: 6c 3d 3d 30 20 29 20 72 75 6e 74 69 6d 65 45 72  l==0 ) runtimeEr
c2c0: 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror("out of memo
c2d0: 72 79 22 29 3b 0a 20 20 20 20 61 69 46 6c 67 20  ry");.    aiFlg 
c2e0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
c2f0: 63 28 61 69 46 6c 67 2c 20 73 69 7a 65 6f 66 28  c(aiFlg, sizeof(
c300: 69 6e 74 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  int)*nCol);.    
c310: 69 66 28 20 61 69 46 6c 67 3d 3d 30 20 29 20 72  if( aiFlg==0 ) r
c320: 75 6e 74 69 6d 65 45 72 72 6f 72 28 22 6f 75 74  untimeError("out
c330: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
c340: 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2d 31 5d 20    azCol[nCol-1] 
c350: 3d 20 73 61 66 65 49 64 28 28 63 6f 6e 73 74 20  = safeId((const 
c360: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
c370: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
c380: 31 29 29 3b 0a 20 20 20 20 61 69 46 6c 67 5b 6e  1));.    aiFlg[n
c390: 43 6f 6c 2d 31 5d 20 3d 20 69 20 3d 20 73 71 6c  Col-1] = i = sql
c3a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
c3b0: 70 53 74 6d 74 2c 35 29 3b 0a 20 20 20 20 69 66  pStmt,5);.    if
c3c0: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ( i>0 ){.      i
c3d0: 66 28 20 69 3e 6e 50 6b 20 29 7b 0a 20 20 20 20  f( i>nPk ){.    
c3e0: 20 20 20 20 6e 50 6b 20 3d 20 69 3b 0a 20 20 20      nPk = i;.   
c3f0: 20 20 20 20 20 61 69 50 6b 20 3d 20 73 71 6c 69       aiPk = sqli
c400: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 69 50 6b  te3_realloc(aiPk
c410: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 50  , sizeof(int)*nP
c420: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
c430: 61 69 50 6b 3d 3d 30 20 29 20 72 75 6e 74 69 6d  aiPk==0 ) runtim
c440: 65 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d  eError("out of m
c450: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 7d  emory");.      }
c460: 0a 20 20 20 20 20 20 61 69 50 6b 5b 69 2d 31 5d  .      aiPk[i-1]
c470: 20 3d 20 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d   = nCol-1;.    }
c480: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
c490: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
c4a0: 20 20 69 66 28 20 6e 50 6b 3d 3d 30 20 29 20 67    if( nPk==0 ) g
c4b0: 6f 74 6f 20 65 6e 64 5f 63 68 61 6e 67 65 73 65  oto end_changese
c4c0: 74 5f 6f 6e 65 5f 74 61 62 6c 65 3b 20 0a 20 20  t_one_table; .  
c4d0: 73 74 72 49 6e 69 74 28 26 73 71 6c 29 3b 0a 20  strInit(&sql);. 
c4e0: 20 69 66 28 20 6e 43 6f 6c 3e 6e 50 6b 20 29 7b   if( nCol>nPk ){
c4f0: 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26  .    strPrintf(&
c500: 73 71 6c 2c 20 22 53 45 4c 45 43 54 20 25 64 22  sql, "SELECT %d"
c510: 2c 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 29  , SQLITE_UPDATE)
c520: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
c530: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
c540: 20 20 20 69 66 28 20 61 69 46 6c 67 5b 69 5d 20     if( aiFlg[i] 
c550: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 50 72  ){.        strPr
c560: 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c 5c 6e 20  intf(&sql, ",\n 
c570: 20 20 20 20 20 20 41 2e 25 73 22 2c 20 61 7a 43        A.%s", azC
c580: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ol[i]);.      }e
c590: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
c5a0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c 5c  Printf(&sql, ",\
c5b0: 6e 20 20 20 20 20 20 20 41 2e 25 73 20 49 53 20  n       A.%s IS 
c5c0: 4e 4f 54 20 42 2e 25 73 2c 20 41 2e 25 73 2c 20  NOT B.%s, A.%s, 
c5d0: 42 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  B.%s",.         
c5e0: 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69           azCol[i
c5f0: 5d 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 61 7a 43  ], azCol[i], azC
c600: 6f 6c 5b 69 5d 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ol[i], azCol[i])
c610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c620: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
c630: 71 6c 2c 22 5c 6e 20 20 46 52 4f 4d 20 6d 61 69  ql,"\n  FROM mai
c640: 6e 2e 25 73 20 41 2c 20 61 75 78 2e 25 73 20 42  n.%s A, aux.%s B
c650: 5c 6e 22 2c 20 7a 49 64 2c 20 7a 49 64 29 3b 0a  \n", zId, zId);.
c660: 20 20 20 20 7a 53 65 70 20 3d 20 22 20 57 48 45      zSep = " WHE
c670: 52 45 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  RE";.    for(i=0
c680: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
c690: 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26       strPrintf(&
c6a0: 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e  sql, "%s A.%s=B.
c6b0: 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 43 6f 6c  %s", zSep, azCol
c6c0: 5b 61 69 50 6b 5b 69 5d 5d 2c 20 61 7a 43 6f 6c  [aiPk[i]], azCol
c6d0: 5b 61 69 50 6b 5b 69 5d 5d 29 3b 0a 20 20 20 20  [aiPk[i]]);.    
c6e0: 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 22 3b    zSep = " AND";
c6f0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 70 20  .    }.    zSep 
c700: 3d 20 22 5c 6e 20 20 20 41 4e 44 20 28 22 3b 0a  = "\n   AND (";.
c710: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c720: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
c730: 20 69 66 28 20 61 69 46 6c 67 5b 69 5d 20 29 20   if( aiFlg[i] ) 
c740: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c750: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
c760: 22 25 73 41 2e 25 73 20 49 53 20 4e 4f 54 20 42  "%sA.%s IS NOT B
c770: 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 43 6f  .%s", zSep, azCo
c780: 6c 5b 69 5d 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  l[i], azCol[i]);
c790: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20  .      zSep = " 
c7a0: 4f 52 5c 6e 20 20 20 20 20 20 20 20 22 3b 0a 20  OR\n        ";. 
c7b0: 20 20 20 7d 0a 20 20 20 20 73 74 72 50 72 69 6e     }.    strPrin
c7c0: 74 66 28 26 73 71 6c 2c 22 29 5c 6e 20 55 4e 49  tf(&sql,")\n UNI
c7d0: 4f 4e 20 41 4c 4c 5c 6e 22 29 3b 0a 20 20 7d 0a  ON ALL\n");.  }.
c7e0: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
c7f0: 2c 20 22 53 45 4c 45 43 54 20 25 64 22 2c 20 53  , "SELECT %d", S
c800: 51 4c 49 54 45 5f 44 45 4c 45 54 45 29 3b 0a 20  QLITE_DELETE);. 
c810: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
c820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
c830: 61 69 46 6c 67 5b 69 5d 20 29 7b 0a 20 20 20 20  aiFlg[i] ){.    
c840: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
c850: 2c 20 22 2c 5c 6e 20 20 20 20 20 20 20 41 2e 25  , ",\n       A.%
c860: 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  s", azCol[i]);. 
c870: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c880: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
c890: 22 2c 5c 6e 20 20 20 20 20 20 20 31 2c 20 41 2e  ",\n       1, A.
c8a0: 25 73 2c 20 4e 55 4c 4c 22 2c 20 61 7a 43 6f 6c  %s, NULL", azCol
c8b0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [i]);.    }.  }.
c8c0: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
c8d0: 2c 20 22 5c 6e 20 20 46 52 4f 4d 20 6d 61 69 6e  , "\n  FROM main
c8e0: 2e 25 73 20 41 5c 6e 22 2c 20 7a 49 64 29 3b 0a  .%s A\n", zId);.
c8f0: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
c900: 2c 20 22 20 57 48 45 52 45 20 4e 4f 54 20 45 58  , " WHERE NOT EX
c910: 49 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52  ISTS(SELECT 1 FR
c920: 4f 4d 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20  OM aux.%s B\n", 
c930: 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20 20  zId);.  zSep =  
c940: 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
c950: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
c960: 45 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  E";.  for(i=0; i
c970: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
c980: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
c990: 22 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20  "%s A.%s=B.%s", 
c9a0: 7a 53 65 70 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b  zSep, azCol[aiPk
c9b0: 5b 69 5d 5d 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b  [i]], azCol[aiPk
c9c0: 5b 69 5d 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  [i]]);.    zSep 
c9d0: 3d 20 22 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20  = " AND";.  }.  
c9e0: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
c9f0: 22 29 5c 6e 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e  ")\n UNION ALL\n
ca00: 22 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28  ");.  strPrintf(
ca10: 26 73 71 6c 2c 20 22 53 45 4c 45 43 54 20 25 64  &sql, "SELECT %d
ca20: 22 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  ", SQLITE_INSERT
ca30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
ca40: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
ca50: 69 66 28 20 61 69 46 6c 67 5b 69 5d 20 29 7b 0a  if( aiFlg[i] ){.
ca60: 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28        strPrintf(
ca70: 26 73 71 6c 2c 20 22 2c 5c 6e 20 20 20 20 20 20  &sql, ",\n      
ca80: 20 42 2e 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d   B.%s", azCol[i]
ca90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
caa0: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
cab0: 71 6c 2c 20 22 2c 5c 6e 20 20 20 20 20 20 20 31  ql, ",\n       1
cac0: 2c 20 4e 55 4c 4c 2c 20 42 2e 25 73 22 2c 20 61  , NULL, B.%s", a
cad0: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zCol[i]);.    }.
cae0: 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28    }.  strPrintf(
caf0: 26 73 71 6c 2c 20 22 5c 6e 20 20 46 52 4f 4d 20  &sql, "\n  FROM 
cb00: 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49 64  aux.%s B\n", zId
cb10: 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26  );.  strPrintf(&
cb20: 73 71 6c 2c 20 22 20 57 48 45 52 45 20 4e 4f 54  sql, " WHERE NOT
cb30: 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31   EXISTS(SELECT 1
cb40: 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 5c   FROM main.%s A\
cb50: 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70  n", zId);.  zSep
cb60: 20 3d 20 20 20 20 20 20 20 20 20 20 22 20 20 20   =          "   
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb80: 57 48 45 52 45 22 3b 0a 20 20 66 6f 72 28 69 3d  WHERE";.  for(i=
cb90: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
cba0: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
cbb0: 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e 25  ql, "%s A.%s=B.%
cbc0: 73 22 2c 20 7a 53 65 70 2c 20 61 7a 43 6f 6c 5b  s", zSep, azCol[
cbd0: 61 69 50 6b 5b 69 5d 5d 2c 20 61 7a 43 6f 6c 5b  aiPk[i]], azCol[
cbe0: 61 69 50 6b 5b 69 5d 5d 29 3b 0a 20 20 20 20 7a  aiPk[i]]);.    z
cbf0: 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20  Sep = " AND";.  
cc00: 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  }.  strPrintf(&s
cc10: 71 6c 2c 20 22 29 5c 6e 22 29 3b 0a 20 20 73 74  ql, ")\n");.  st
cc20: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20  rPrintf(&sql, " 
cc30: 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 7a 53  ORDER BY");.  zS
cc40: 65 70 20 3d 20 22 20 22 3b 0a 20 20 66 6f 72 28  ep = " ";.  for(
cc50: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
cc60: 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28  {.    strPrintf(
cc70: 26 73 71 6c 2c 20 22 25 73 20 25 64 22 2c 20 7a  &sql, "%s %d", z
cc80: 53 65 70 2c 20 61 69 50 6b 5b 69 5d 2b 32 29 3b  Sep, aiPk[i]+2);
cc90: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b  .    zSep = ",";
cca0: 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66  .  }.  strPrintf
ccb0: 28 26 73 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 0a  (&sql, ";\n");..
ccc0: 20 20 69 66 28 20 67 2e 66 44 65 62 75 67 20 26    if( g.fDebug &
ccd0: 20 44 45 42 55 47 5f 44 49 46 46 5f 53 51 4c 20   DEBUG_DIFF_SQL 
cce0: 29 7b 20 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ){ .    printf("
ccf0: 53 51 4c 20 66 6f 72 20 25 73 3a 5c 6e 25 73 5c  SQL for %s:\n%s\
cd00: 6e 22 2c 20 7a 49 64 2c 20 73 71 6c 2e 7a 29 3b  n", zId, sql.z);
cd10: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 68  .    goto end_ch
cd20: 61 6e 67 65 73 65 74 5f 6f 6e 65 5f 74 61 62 6c  angeset_one_tabl
cd30: 65 3b 0a 20 20 7d 0a 0a 20 20 70 75 74 63 28 27  e;.  }..  putc('
cd40: 54 27 2c 20 6f 75 74 29 3b 0a 20 20 70 75 74 73  T', out);.  puts
cd50: 56 61 72 69 6e 74 28 6f 75 74 2c 20 28 73 71 6c  Varint(out, (sql
cd60: 69 74 65 33 5f 75 69 6e 74 36 34 29 6e 43 6f 6c  ite3_uint64)nCol
cd70: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
cd80: 6e 43 6f 6c 3b 20 69 2b 2b 29 20 70 75 74 63 28  nCol; i++) putc(
cd90: 61 69 46 6c 67 5b 69 5d 21 3d 30 2c 20 6f 75 74  aiFlg[i]!=0, out
cda0: 29 3b 0a 20 20 66 77 72 69 74 65 28 7a 54 61 62  );.  fwrite(zTab
cdb0: 2c 20 31 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62  , 1, strlen(zTab
cdc0: 29 2c 20 6f 75 74 29 3b 0a 20 20 70 75 74 63 28  ), out);.  putc(
cdd0: 30 2c 20 6f 75 74 29 3b 0a 0a 20 20 70 53 74 6d  0, out);..  pStm
cde0: 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28 22  t = db_prepare("
cdf0: 25 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20 77  %s", sql.z);.  w
ce00: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
ce10: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
ce20: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  Stmt) ){.    int
ce30: 20 69 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   iType = sqlite3
ce40: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
ce50: 74 2c 30 29 3b 0a 20 20 20 20 70 75 74 63 28 69  t,0);.    putc(i
ce60: 54 79 70 65 2c 20 6f 75 74 29 3b 0a 20 20 20 20  Type, out);.    
ce70: 70 75 74 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20  putc(0, out);.  
ce80: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
ce90: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
cea0: 6d 74 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 63  mt,0) ){.      c
ceb0: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
cec0: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  E: {.        for
ced0: 28 6b 3d 31 2c 20 69 3d 30 3b 20 69 3c 6e 43 6f  (k=1, i=0; i<nCo
cee0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
cef0: 20 20 20 69 66 28 20 61 69 46 6c 67 5b 69 5d 20     if( aiFlg[i] 
cf00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
cf10: 75 74 56 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c  utValue(out, sql
cf20: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
cf30: 65 28 70 53 74 6d 74 2c 6b 29 29 3b 0a 20 20 20  e(pStmt,k));.   
cf40: 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20           k++;.  
cf50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
cf60: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
cf70: 5f 69 6e 74 28 70 53 74 6d 74 2c 6b 29 20 29 7b  _int(pStmt,k) ){
cf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
cf90: 56 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69 74  Value(out, sqlit
cfa0: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
cfb0: 70 53 74 6d 74 2c 6b 2b 31 29 29 3b 0a 20 20 20  pStmt,k+1));.   
cfc0: 20 20 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b           k += 3;
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
cfe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
cff0: 74 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(0, out);.    
d000: 20 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a          k += 3;.
d010: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d020: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
d030: 72 28 6b 3d 31 2c 20 69 3d 30 3b 20 69 3c 6e 43  r(k=1, i=0; i<nC
d040: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
d050: 20 20 20 20 69 66 28 20 61 69 46 6c 67 5b 69 5d      if( aiFlg[i]
d060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d070: 70 75 74 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20  putc(0, out);.  
d080: 20 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20            k++;. 
d090: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
d0a0: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
d0b0: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 6b 29 20 29  n_int(pStmt,k) )
d0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
d0d0: 74 56 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69  tValue(out, sqli
d0e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
d0f0: 28 70 53 74 6d 74 2c 6b 2b 32 29 29 3b 0a 20 20  (pStmt,k+2));.  
d100: 20 20 20 20 20 20 20 20 20 20 6b 20 2b 3d 20 33            k += 3
d110: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
d120: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
d130: 75 74 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(0, out);.   
d140: 20 20 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b           k += 3;
d150: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
d170: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d180: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d190: 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20  INSERT: {.      
d1a0: 20 20 66 6f 72 28 6b 3d 31 2c 20 69 3d 30 3b 20    for(k=1, i=0; 
d1b0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
d1c0: 20 20 20 20 20 20 20 20 69 66 28 20 61 69 46 6c          if( aiFl
d1d0: 67 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  g[i] ){.        
d1e0: 20 20 20 20 70 75 74 56 61 6c 75 65 28 6f 75 74      putValue(out
d1f0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
d200: 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 6b 29 29  _value(pStmt,k))
d210: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 2b  ;.            k+
d220: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
d230: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
d240: 70 75 74 56 61 6c 75 65 28 6f 75 74 2c 20 73 71  putValue(out, sq
d250: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
d260: 75 65 28 70 53 74 6d 74 2c 6b 2b 32 29 29 3b 0a  ue(pStmt,k+2));.
d270: 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 2b 3d              k +=
d280: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   3;.          }.
d290: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d2a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d2b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
d2c0: 54 45 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20  TE_DELETE: {.   
d2d0: 20 20 20 20 20 66 6f 72 28 6b 3d 31 2c 20 69 3d       for(k=1, i=
d2e0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
d2f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
d300: 69 46 6c 67 5b 69 5d 20 29 7b 0a 20 20 20 20 20  iFlg[i] ){.     
d310: 20 20 20 20 20 20 20 70 75 74 56 61 6c 75 65 28         putValue(
d320: 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  out, sqlite3_col
d330: 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c  umn_value(pStmt,
d340: 6b 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  k));.           
d350: 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   k++;.          
d360: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d370: 20 20 20 70 75 74 56 61 6c 75 65 28 6f 75 74 2c     putValue(out,
d380: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d390: 76 61 6c 75 65 28 70 53 74 6d 74 2c 6b 2b 31 29  value(pStmt,k+1)
d3a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  );.            k
d3b0: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
d3c0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d3d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d3e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d3f0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
d400: 28 70 53 74 6d 74 29 3b 0a 20 20 0a 65 6e 64 5f  (pStmt);.  .end_
d410: 63 68 61 6e 67 65 73 65 74 5f 6f 6e 65 5f 74 61  changeset_one_ta
d420: 62 6c 65 3a 0a 20 20 77 68 69 6c 65 28 20 6e 43  ble:.  while( nC
d430: 6f 6c 3e 30 20 29 20 73 71 6c 69 74 65 33 5f 66  ol>0 ) sqlite3_f
d440: 72 65 65 28 61 7a 43 6f 6c 5b 2d 2d 6e 43 6f 6c  ree(azCol[--nCol
d450: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ]);.  sqlite3_fr
d460: 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c  ee(azCol);.  sql
d470: 69 74 65 33 5f 66 72 65 65 28 61 69 50 6b 29 3b  ite3_free(aiPk);
d480: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
d490: 7a 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  zId);.}../*.** P
d4a0: 72 69 6e 74 20 73 6b 65 74 63 68 79 20 64 6f 63  rint sketchy doc
d4b0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  umentation for t
d4c0: 68 69 73 20 75 74 69 6c 69 74 79 20 70 72 6f 67  his utility prog
d4d0: 72 61 6d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ram.*/.static vo
d4e0: 69 64 20 73 68 6f 77 48 65 6c 70 28 76 6f 69 64  id showHelp(void
d4f0: 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 55 73 61  ){.  printf("Usa
d500: 67 65 3a 20 25 73 20 5b 6f 70 74 69 6f 6e 73 5d  ge: %s [options]
d510: 20 44 42 31 20 44 42 32 5c 6e 22 2c 20 67 2e 7a   DB1 DB2\n", g.z
d520: 41 72 67 76 30 29 3b 0a 20 20 70 72 69 6e 74 66  Argv0);.  printf
d530: 28 0a 22 4f 75 74 70 75 74 20 53 51 4c 20 74 65  (."Output SQL te
d540: 78 74 20 74 68 61 74 20 77 6f 75 6c 64 20 74 72  xt that would tr
d550: 61 6e 73 66 6f 72 6d 20 44 42 31 20 69 6e 74 6f  ansform DB1 into
d560: 20 44 42 32 2e 5c 6e 22 0a 22 4f 70 74 69 6f 6e   DB2.\n"."Option
d570: 73 3a 5c 6e 22 0a 22 20 20 2d 2d 63 68 61 6e 67  s:\n"."  --chang
d580: 65 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 57  eset FILE      W
d590: 72 69 74 65 20 61 20 43 48 41 4e 47 45 53 45 54  rite a CHANGESET
d5a0: 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 22 20   into FILE\n"." 
d5b0: 20 2d 4c 7c 2d 2d 6c 69 62 20 4c 49 42 52 41 52   -L|--lib LIBRAR
d5c0: 59 20 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 53  Y      Load an S
d5d0: 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e 20  QLite extension 
d5e0: 6c 69 62 72 61 72 79 5c 6e 22 0a 22 20 20 2d 2d  library\n"."  --
d5f0: 70 72 69 6d 61 72 79 6b 65 79 20 20 20 20 20 20  primarykey      
d600: 20 20 20 20 55 73 65 20 73 63 68 65 6d 61 2d 64      Use schema-d
d610: 65 66 69 6e 65 64 20 50 52 49 4d 41 52 59 20 4b  efined PRIMARY K
d620: 45 59 73 5c 6e 22 0a 22 20 20 2d 2d 72 62 75 20  EYs\n"."  --rbu 
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 4f 75 74 70 75 74 20 53 51 4c 20 74 6f 20 63 72  Output SQL to cr
d650: 65 61 74 65 2f 70 6f 70 75 6c 61 74 65 20 52 42  eate/populate RB
d660: 55 20 74 61 62 6c 65 28 73 29 5c 6e 22 0a 22 20  U table(s)\n"." 
d670: 20 2d 2d 73 63 68 65 6d 61 20 20 20 20 20 20 20   --schema       
d680: 20 20 20 20 20 20 20 53 68 6f 77 20 6f 6e 6c 79         Show only
d690: 20 64 69 66 66 65 72 65 6e 63 65 73 20 69 6e 20   differences in 
d6a0: 74 68 65 20 73 63 68 65 6d 61 5c 6e 22 0a 22 20  the schema\n"." 
d6b0: 20 2d 2d 73 75 6d 6d 61 72 79 20 20 20 20 20 20   --summary      
d6c0: 20 20 20 20 20 20 20 53 68 6f 77 20 6f 6e 6c 79         Show only
d6d0: 20 61 20 73 75 6d 6d 61 72 79 20 6f 66 20 74 68   a summary of th
d6e0: 65 20 64 69 66 66 65 72 65 6e 63 65 73 5c 6e 22  e differences\n"
d6f0: 0a 22 20 20 2d 2d 74 61 62 6c 65 20 54 41 42 20  ."  --table TAB 
d700: 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6f            Show o
d710: 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 73 20  nly differences 
d720: 69 6e 20 74 61 62 6c 65 20 54 41 42 5c 6e 22 0a  in table TAB\n".
d730: 20 20 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e    );.}..int main
d740: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
d750: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
d760: 20 63 68 61 72 20 2a 7a 44 62 31 20 3d 20 30 3b   char *zDb1 = 0;
d770: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d780: 44 62 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Db2 = 0;.  int i
d790: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
d7a0: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
d7b0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
d7c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
d7d0: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 54  Stmt;.  char *zT
d7e0: 61 62 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a  ab = 0;.  FILE *
d7f0: 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  out = stdout;.  
d800: 76 6f 69 64 20 28 2a 78 44 69 66 66 29 28 63 6f  void (*xDiff)(co
d810: 6e 73 74 20 63 68 61 72 2a 2c 46 49 4c 45 2a 29  nst char*,FILE*)
d820: 20 3d 20 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c   = diff_one_tabl
d830: 65 3b 0a 20 20 69 6e 74 20 6e 45 78 74 20 3d 20  e;.  int nExt = 
d840: 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 45 78  0;.  char **azEx
d850: 74 20 3d 20 30 3b 0a 0a 20 20 67 2e 7a 41 72 67  t = 0;..  g.zArg
d860: 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
d870: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
d880: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
d890: 47 4c 45 54 48 52 45 41 44 29 3b 0a 20 20 66 6f  GLETHREAD);.  fo
d8a0: 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=1; i<argc; i
d8b0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
d8c0: 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d  har *z = argv[i]
d8d0: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
d8e0: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 7a 2b 2b  '-' ){.      z++
d8f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  ;.      if( z[0]
d900: 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
d910: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
d920: 22 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20  "changeset")==0 
d930: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
d940: 3d 3d 61 72 67 63 2d 31 20 29 20 63 6d 64 6c 69  ==argc-1 ) cmdli
d950: 6e 65 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  neError("missing
d960: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 22   argument to %s"
d970: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
d980: 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28      out = fopen(
d990: 61 72 67 76 5b 2b 2b 69 5d 2c 20 22 77 62 22 29  argv[++i], "wb")
d9a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 75  ;.        if( ou
d9b0: 74 3d 3d 30 20 29 20 63 6d 64 6c 69 6e 65 45 72  t==0 ) cmdlineEr
d9c0: 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror("cannot open
d9d0: 3a 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b  : %s", argv[i]);
d9e0: 0a 20 20 20 20 20 20 20 20 78 44 69 66 66 20 3d  .        xDiff =
d9f0: 20 63 68 61 6e 67 65 73 65 74 5f 6f 6e 65 5f 74   changeset_one_t
da00: 61 62 6c 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  able;.      }els
da10: 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  e.      if( strc
da20: 6d 70 28 7a 2c 22 64 65 62 75 67 22 29 3d 3d 30  mp(z,"debug")==0
da30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
da40: 69 3d 3d 61 72 67 63 2d 31 20 29 20 63 6d 64 6c  i==argc-1 ) cmdl
da50: 69 6e 65 45 72 72 6f 72 28 22 6d 69 73 73 69 6e  ineError("missin
da60: 67 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 73  g argument to %s
da70: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
da80: 20 20 20 20 20 67 2e 66 44 65 62 75 67 20 3d 20       g.fDebug = 
da90: 73 74 72 74 6f 6c 28 61 72 67 76 5b 2b 2b 69 5d  strtol(argv[++i]
daa0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
dab0: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
dac0: 74 72 63 6d 70 28 7a 2c 22 68 65 6c 70 22 29 3d  trcmp(z,"help")=
dad0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 68  =0 ){.        sh
dae0: 6f 77 48 65 6c 70 28 29 3b 0a 20 20 20 20 20 20  owHelp();.      
daf0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
db00: 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20    }else.#ifndef 
db10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
db20: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
db30: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6c   if( strcmp(z,"l
db40: 69 62 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  ib")==0 || strcm
db50: 70 28 7a 2c 22 4c 22 29 3d 3d 30 20 29 7b 0a 20  p(z,"L")==0 ){. 
db60: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 61 72         if( i==ar
db70: 67 63 2d 31 20 29 20 63 6d 64 6c 69 6e 65 45 72  gc-1 ) cmdlineEr
db80: 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67  ror("missing arg
db90: 75 6d 65 6e 74 20 74 6f 20 25 73 22 2c 20 61 72  ument to %s", ar
dba0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  gv[i]);.        
dbb0: 61 7a 45 78 74 20 3d 20 72 65 61 6c 6c 6f 63 28  azExt = realloc(
dbc0: 61 7a 45 78 74 2c 20 73 69 7a 65 6f 66 28 61 7a  azExt, sizeof(az
dbd0: 45 78 74 5b 30 5d 29 2a 28 6e 45 78 74 2b 31 29  Ext[0])*(nExt+1)
dbe0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
dbf0: 7a 45 78 74 3d 3d 30 20 29 20 63 6d 64 6c 69 6e  zExt==0 ) cmdlin
dc00: 65 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d  eError("out of m
dc10: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20  emory");.       
dc20: 20 61 7a 45 78 74 5b 6e 45 78 74 2b 2b 5d 20 3d   azExt[nExt++] =
dc30: 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20   argv[++i];.    
dc40: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
dc50: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
dc60: 7a 2c 22 70 72 69 6d 61 72 79 6b 65 79 22 29 3d  z,"primarykey")=
dc70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 67 2e  =0 ){.        g.
dc80: 62 53 63 68 65 6d 61 50 4b 20 3d 20 31 3b 0a 20  bSchemaPK = 1;. 
dc90: 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
dca0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 72   if( strcmp(z,"r
dcb0: 62 75 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bu")==0 ){.     
dcc0: 20 20 20 78 44 69 66 66 20 3d 20 72 62 75 64 69     xDiff = rbudi
dcd0: 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20  ff_one_table;.  
dce0: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
dcf0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 63  if( strcmp(z,"sc
dd00: 68 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20  hema")==0 ){.   
dd10: 20 20 20 20 20 67 2e 62 53 63 68 65 6d 61 4f 6e       g.bSchemaOn
dd20: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ly = 1;.      }e
dd30: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
dd40: 72 63 6d 70 28 7a 2c 22 73 75 6d 6d 61 72 79 22  rcmp(z,"summary"
dd50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
dd60: 78 44 69 66 66 20 3d 20 73 75 6d 6d 61 72 69 7a  xDiff = summariz
dd70: 65 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 20  e_one_table;.   
dd80: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
dd90: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 74 61 62  f( strcmp(z,"tab
dda0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
ddb0: 20 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31     if( i==argc-1
ddc0: 20 29 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28   ) cmdlineError(
ddd0: 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  "missing argumen
dde0: 74 20 74 6f 20 25 73 22 2c 20 61 72 67 76 5b 69  t to %s", argv[i
ddf0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 54 61 62  ]);.        zTab
de00: 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20   = argv[++i];.  
de10: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
de20: 7b 0a 20 20 20 20 20 20 20 20 63 6d 64 6c 69 6e  {.        cmdlin
de30: 65 45 72 72 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20  eError("unknown 
de40: 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 61 72 67  option: %s", arg
de50: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[i]);.      }. 
de60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62     }else if( zDb
de70: 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44  1==0 ){.      zD
de80: 62 31 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  b1 = argv[i];.  
de90: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 32    }else if( zDb2
dea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  ==0 ){.      zDb
deb0: 32 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  2 = argv[i];.   
dec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6d   }else{.      cm
ded0: 64 6c 69 6e 65 45 72 72 6f 72 28 22 75 6e 6b 6e  dlineError("unkn
dee0: 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73  own argument: %s
def0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
df00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44 62   }.  }.  if( zDb
df10: 32 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6d 64 6c  2==0 ){.    cmdl
df20: 69 6e 65 45 72 72 6f 72 28 22 74 77 6f 20 64 61  ineError("two da
df30: 74 61 62 61 73 65 20 61 72 67 75 6d 65 6e 74 73  tabase arguments
df40: 20 72 65 71 75 69 72 65 64 22 29 3b 0a 20 20 7d   required");.  }
df50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
df60: 6f 70 65 6e 28 7a 44 62 31 2c 20 26 67 2e 64 62  open(zDb1, &g.db
df70: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
df80: 20 20 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28     cmdlineError(
df90: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 64 61 74  "cannot open dat
dfa0: 61 62 61 73 65 20 66 69 6c 65 20 5c 22 25 73 5c  abase file \"%s\
dfb0: 22 22 2c 20 7a 44 62 31 29 3b 0a 20 20 7d 0a 20  "", zDb1);.  }. 
dfc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
dfd0: 65 63 28 67 2e 64 62 2c 20 22 53 45 4c 45 43 54  ec(g.db, "SELECT
dfe0: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
dff0: 61 73 74 65 72 22 2c 20 30 2c 20 30 2c 20 26 7a  aster", 0, 0, &z
e000: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
e010: 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a  c || zErrMsg ){.
e020: 20 20 20 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72      cmdlineError
e030: 28 22 5c 22 25 73 5c 22 20 64 6f 65 73 20 6e 6f  ("\"%s\" does no
e040: 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61  t appear to be a
e050: 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
e060: 74 61 62 61 73 65 22 2c 20 7a 44 62 31 29 3b 0a  tabase", zDb1);.
e070: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
e080: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
e090: 45 4e 53 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  ENSION.  sqlite3
e0a0: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
e0b0: 65 6e 73 69 6f 6e 28 67 2e 64 62 2c 20 31 29 3b  ension(g.db, 1);
e0c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
e0d0: 78 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  xt; i++){.    rc
e0e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f   = sqlite3_load_
e0f0: 65 78 74 65 6e 73 69 6f 6e 28 67 2e 64 62 2c 20  extension(g.db, 
e100: 61 7a 45 78 74 5b 69 5d 2c 20 30 2c 20 26 7a 45  azExt[i], 0, &zE
e110: 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
e120: 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b  rc || zErrMsg ){
e130: 0a 20 20 20 20 20 20 63 6d 64 6c 69 6e 65 45 72  .      cmdlineEr
e140: 72 6f 72 28 22 65 72 72 6f 72 20 6c 6f 61 64 69  ror("error loadi
e150: 6e 67 20 25 73 3a 20 25 73 22 2c 20 61 7a 45 78  ng %s: %s", azEx
e160: 74 5b 69 5d 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  t[i], zErrMsg);.
e170: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
e180: 0a 20 20 66 72 65 65 28 61 7a 45 78 74 29 3b 0a  .  free(azExt);.
e190: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
e1a0: 5f 6d 70 72 69 6e 74 66 28 22 41 54 54 41 43 48  _mprintf("ATTACH
e1b0: 20 25 51 20 61 73 20 61 75 78 3b 22 2c 20 7a 44   %Q as aux;", zD
e1c0: 62 32 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  b2);.  rc = sqli
e1d0: 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a  te3_exec(g.db, z
e1e0: 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
e1f0: 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63 20 7c  Msg);.  if( rc |
e200: 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
e210: 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 63   cmdlineError("c
e220: 61 6e 6e 6f 74 20 61 74 74 61 63 68 20 64 61 74  annot attach dat
e230: 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c 20 7a  abase \"%s\"", z
e240: 44 62 32 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  Db2);.  }.  rc =
e250: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e   sqlite3_exec(g.
e260: 64 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52  db, "SELECT * FR
e270: 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61  OM aux.sqlite_ma
e280: 73 74 65 72 22 2c 20 30 2c 20 30 2c 20 26 7a 45  ster", 0, 0, &zE
e290: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
e2a0: 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20   || zErrMsg ){. 
e2b0: 20 20 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28     cmdlineError(
e2c0: 22 5c 22 25 73 5c 22 20 64 6f 65 73 20 6e 6f 74  "\"%s\" does not
e2d0: 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 20   appear to be a 
e2e0: 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74  valid SQLite dat
e2f0: 61 62 61 73 65 22 2c 20 7a 44 62 32 29 3b 0a 20  abase", zDb2);. 
e300: 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 62 20 29   }..  if( zTab )
e310: 7b 0a 20 20 20 20 78 44 69 66 66 28 7a 54 61 62  {.    xDiff(zTab
e320: 2c 20 6f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  , out);.  }else{
e330: 0a 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74  .    /* Handle t
e340: 61 62 6c 65 73 20 6f 6e 65 20 62 79 20 6f 6e 65  ables one by one
e350: 20 2a 2f 0a 20 20 20 20 70 53 74 6d 74 20 3d 20   */.    pStmt = 
e360: 64 62 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20  db_prepare(.    
e370: 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46    "SELECT name F
e380: 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  ROM main.sqlite_
e390: 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20 20 20  master\n".      
e3a0: 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61  " WHERE type='ta
e3b0: 62 6c 65 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54  ble' AND sql NOT
e3c0: 20 4c 49 4b 45 20 27 43 52 45 41 54 45 20 56 49   LIKE 'CREATE VI
e3d0: 52 54 55 41 4c 25 25 27 5c 6e 22 0a 20 20 20 20  RTUAL%%'\n".    
e3e0: 20 20 22 20 55 4e 49 4f 4e 5c 6e 22 0a 20 20 20    " UNION\n".   
e3f0: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
e400: 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f  FROM aux.sqlite_
e410: 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20 20 20  master\n".      
e420: 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61  " WHERE type='ta
e430: 62 6c 65 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54  ble' AND sql NOT
e440: 20 4c 49 4b 45 20 27 43 52 45 41 54 45 20 56 49   LIKE 'CREATE VI
e450: 52 54 55 41 4c 25 25 27 5c 6e 22 0a 20 20 20 20  RTUAL%%'\n".    
e460: 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d    " ORDER BY nam
e470: 65 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68  e".    );.    wh
e480: 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
e490: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
e4a0: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 78 44  tmt) ){.      xD
e4b0: 69 66 66 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  iff((const char*
e4c0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
e4d0: 74 65 78 74 28 70 53 74 6d 74 2c 30 29 2c 20 6f  text(pStmt,0), o
e4e0: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ut);.    }.    s
e4f0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
e500: 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pStmt);.  }..  /
e510: 2a 20 54 42 44 3a 20 48 61 6e 64 6c 65 20 74 72  * TBD: Handle tr
e520: 69 67 67 65 72 20 64 69 66 66 65 72 65 6e 63 65  igger difference
e530: 73 20 2a 2f 0a 20 20 2f 2a 20 54 42 44 3a 20 48  s */.  /* TBD: H
e540: 61 6e 64 6c 65 20 76 69 65 77 20 64 69 66 66 65  andle view diffe
e550: 72 65 6e 63 65 73 20 2a 2f 0a 20 20 73 71 6c 69  rences */.  sqli
e560: 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b  te3_close(g.db);
e570: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a     .  return 0;.}.