/ Hex Artifact Content
Login

Artifact 4fe09e784cf2ec8b8e6ff7357b17f890ff9c78b4:


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 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  z[n]; n++){.    
4450: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
4460: 72 69 63 6d 70 28 61 7a 5b 6e 5d 2c 61 7a 32 5b  ricmp(az[n],az2[
4470: 6e 5d 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  n])!=0 ) break;.
4480: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4490: 61 7a 3d 3d 30 0a 20 20 20 7c 7c 20 61 7a 32 3d  az==0.   || az2=
44a0: 3d 30 0a 20 20 20 7c 7c 20 6e 50 6b 21 3d 6e 50  =0.   || nPk!=nP
44b0: 6b 32 0a 20 20 20 7c 7c 20 61 7a 5b 6e 5d 0a 20  k2.   || az[n]. 
44c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 63 68 65 6d   ){.    /* Schem
44d0: 61 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20  a mismatch */.  
44e0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
44f0: 44 52 4f 50 20 54 41 42 4c 45 20 25 73 3b 5c 6e  DROP TABLE %s;\n
4500: 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 64 75 6d  ", zId);.    dum
4510: 70 5f 74 61 62 6c 65 28 7a 54 61 62 2c 20 6f 75  p_table(zTab, ou
4520: 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  t);.    goto end
4530: 5f 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b  _diff_one_table;
4540: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64  .  }..  /* Build
4550: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
4560: 71 75 65 72 79 20 2a 2f 0a 20 20 66 6f 72 28 6e  query */.  for(n
4570: 32 3d 6e 3b 20 61 7a 5b 6e 32 5d 3b 20 6e 32 2b  2=n; az[n2]; n2+
4580: 2b 29 7b 7d 0a 20 20 6e 51 20 3d 20 6e 50 6b 32  +){}.  nQ = nPk2
4590: 2b 31 2b 32 2a 28 6e 32 2d 6e 50 6b 32 29 3b 0a  +1+2*(n2-nPk2);.
45a0: 20 20 69 66 28 20 6e 32 3e 6e 50 6b 32 20 29 7b    if( n2>nPk2 ){
45b0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 53 45 4c  .    zSep = "SEL
45c0: 45 43 54 20 22 3b 0a 20 20 20 20 66 6f 72 28 69  ECT ";.    for(i
45d0: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
45e0: 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66  .      strPrintf
45f0: 28 26 73 71 6c 2c 20 22 25 73 42 2e 25 73 22 2c  (&sql, "%sB.%s",
4600: 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 29 3b 0a 20   zSep, az[i]);. 
4610: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
4620: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72 50  ;.    }.    strP
4630: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c 20 31  rintf(&sql, ", 1
4640: 25 73 20 2d 2d 20 63 68 61 6e 67 65 64 20 72 6f  %s -- changed ro
4650: 77 5c 6e 22 2c 20 6e 50 6b 3d 3d 6e 20 3f 20 22  w\n", nPk==n ? "
4660: 22 20 3a 20 22 2c 22 29 3b 0a 20 20 20 20 77 68  " : ",");.    wh
4670: 69 6c 65 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20  ile( az[i] ){.  
4680: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
4690: 71 6c 2c 20 22 20 20 20 20 20 20 20 41 2e 25 73  ql, "       A.%s
46a0: 20 49 53 20 4e 4f 54 20 42 2e 25 73 2c 20 42 2e   IS NOT B.%s, B.
46b0: 25 73 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s%s\n",.       
46c0: 20 20 20 20 20 20 20 20 20 61 7a 5b 69 5d 2c 20           az[i], 
46d0: 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 2c 20 69 3d  az[i], az[i], i=
46e0: 3d 6e 32 2d 31 20 3f 20 22 22 20 3a 20 22 2c 22  =n2-1 ? "" : ","
46f0: 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  );.      i++;.  
4700: 20 20 7d 0a 20 20 20 20 73 74 72 50 72 69 6e 74    }.    strPrint
4710: 66 28 26 73 71 6c 2c 20 22 20 20 46 52 4f 4d 20  f(&sql, "  FROM 
4720: 6d 61 69 6e 2e 25 73 20 41 2c 20 61 75 78 2e 25  main.%s A, aux.%
4730: 73 20 42 5c 6e 22 2c 20 7a 49 64 2c 20 7a 49 64  s B\n", zId, zId
4740: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 20  );.    zSep = " 
4750: 57 48 45 52 45 22 3b 0a 20 20 20 20 66 6f 72 28  WHERE";.    for(
4760: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
4770: 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74  {.      strPrint
4780: 66 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73  f(&sql, "%s A.%s
4790: 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a  =B.%s", zSep, az
47a0: 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20  [i], az[i]);.   
47b0: 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 22     zSep = " AND"
47c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 70  ;.    }.    zSep
47d0: 20 3d 20 22 5c 6e 20 20 20 41 4e 44 20 28 22 3b   = "\n   AND (";
47e0: 0a 20 20 20 20 77 68 69 6c 65 28 20 61 7a 5b 69  .    while( az[i
47f0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72  ] ){.      strPr
4800: 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 41 2e  intf(&sql, "%sA.
4810: 25 73 20 49 53 20 4e 4f 54 20 42 2e 25 73 25 73  %s IS NOT B.%s%s
4820: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
4830: 20 20 20 20 20 7a 53 65 70 2c 20 61 7a 5b 69 5d       zSep, az[i]
4840: 2c 20 61 7a 5b 69 5d 2c 20 69 3d 3d 6e 32 2d 31  , az[i], i==n2-1
4850: 20 3f 20 22 29 22 20 3a 20 22 22 29 3b 0a 20 20   ? ")" : "");.  
4860: 20 20 20 20 7a 53 65 70 20 3d 20 22 20 20 20 20      zSep = "    
4870: 20 20 20 20 4f 52 20 22 3b 0a 20 20 20 20 20 20      OR ";.      
4880: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i++;.    }.    s
4890: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
48a0: 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b 0a   UNION ALL\n");.
48b0: 20 20 7d 0a 20 20 7a 53 65 70 20 3d 20 22 53 45    }.  zSep = "SE
48c0: 4c 45 43 54 20 22 3b 0a 20 20 66 6f 72 28 69 3d  LECT ";.  for(i=
48d0: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
48e0: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
48f0: 71 6c 2c 20 22 25 73 41 2e 25 73 22 2c 20 7a 53  ql, "%sA.%s", zS
4900: 65 70 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  ep, az[i]);.    
4910: 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 7d  zSep = ", ";.  }
4920: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
4930: 6c 2c 20 22 2c 20 32 25 73 20 2d 2d 20 64 65 6c  l, ", 2%s -- del
4940: 65 74 65 64 20 72 6f 77 5c 6e 22 2c 20 6e 50 6b  eted row\n", nPk
4950: 3d 3d 6e 20 3f 20 22 22 20 3a 20 22 2c 22 29 3b  ==n ? "" : ",");
4960: 0a 20 20 77 68 69 6c 65 28 20 61 7a 5b 69 5d 20  .  while( az[i] 
4970: 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  ){.    strPrintf
4980: 28 26 73 71 6c 2c 20 22 20 20 20 20 20 20 20 4e  (&sql, "       N
4990: 55 4c 4c 2c 20 4e 55 4c 4c 25 73 5c 6e 22 2c 20  ULL, NULL%s\n", 
49a0: 69 3d 3d 6e 32 2d 31 20 3f 20 22 22 20 3a 20 22  i==n2-1 ? "" : "
49b0: 2c 22 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  ,");.    i++;.  
49c0: 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  }.  strPrintf(&s
49d0: 71 6c 2c 20 22 20 20 46 52 4f 4d 20 6d 61 69 6e  ql, "  FROM main
49e0: 2e 25 73 20 41 5c 6e 22 2c 20 7a 49 64 29 3b 0a  .%s A\n", zId);.
49f0: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
4a00: 2c 20 22 20 57 48 45 52 45 20 4e 4f 54 20 45 58  , " WHERE NOT EX
4a10: 49 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52  ISTS(SELECT 1 FR
4a20: 4f 4d 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20  OM aux.%s B\n", 
4a30: 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20 20  zId);.  zSep =  
4a40: 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
4a60: 45 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  E";.  for(i=0; i
4a70: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
4a80: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
4a90: 22 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20  "%s A.%s=B.%s", 
4aa0: 7a 53 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b  zSep, az[i], az[
4ab0: 69 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  i]);.    zSep = 
4ac0: 22 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74  " AND";.  }.  st
4ad0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 29  rPrintf(&sql, ")
4ae0: 5c 6e 22 29 3b 0a 20 20 7a 53 65 70 20 3d 20 22  \n");.  zSep = "
4af0: 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 53 45 4c 45   UNION ALL\nSELE
4b00: 43 54 20 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  CT ";.  for(i=0;
4b10: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
4b20: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
4b30: 2c 20 22 25 73 42 2e 25 73 22 2c 20 7a 53 65 70  , "%sB.%s", zSep
4b40: 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a 53  , az[i]);.    zS
4b50: 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20  ep = ", ";.  }. 
4b60: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
4b70: 20 22 2c 20 33 25 73 20 2d 2d 20 69 6e 73 65 72   ", 3%s -- inser
4b80: 74 65 64 20 72 6f 77 5c 6e 22 2c 20 6e 50 6b 3d  ted row\n", nPk=
4b90: 3d 6e 20 3f 20 22 22 20 3a 20 22 2c 22 29 3b 0a  =n ? "" : ",");.
4ba0: 20 20 77 68 69 6c 65 28 20 61 7a 32 5b 69 5d 20    while( az2[i] 
4bb0: 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  ){.    strPrintf
4bc0: 28 26 73 71 6c 2c 20 22 20 20 20 20 20 20 20 31  (&sql, "       1
4bd0: 2c 20 42 2e 25 73 25 73 5c 6e 22 2c 20 61 7a 5b  , B.%s%s\n", az[
4be0: 69 5d 2c 20 69 3d 3d 6e 32 2d 31 20 3f 20 22 22  i], i==n2-1 ? ""
4bf0: 20 3a 20 22 2c 22 29 3b 0a 20 20 20 20 69 2b 2b   : ",");.    i++
4c00: 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74  ;.  }.  strPrint
4c10: 66 28 26 73 71 6c 2c 20 22 20 20 46 52 4f 4d 20  f(&sql, "  FROM 
4c20: 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49 64  aux.%s B\n", zId
4c30: 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26  );.  strPrintf(&
4c40: 73 71 6c 2c 20 22 20 57 48 45 52 45 20 4e 4f 54  sql, " WHERE NOT
4c50: 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31   EXISTS(SELECT 1
4c60: 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 5c   FROM main.%s A\
4c70: 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70  n", zId);.  zSep
4c80: 20 3d 20 20 20 20 20 20 20 20 20 20 22 20 20 20   =          "   
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 57 48 45 52 45 22 3b 0a 20 20 66 6f 72 28 69 3d  WHERE";.  for(i=
4cb0: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
4cc0: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
4cd0: 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e 25  ql, "%s A.%s=B.%
4ce0: 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 2c  s", zSep, az[i],
4cf0: 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a 53 65   az[i]);.    zSe
4d00: 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20 7d 0a  p = " AND";.  }.
4d10: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
4d20: 2c 20 22 29 5c 6e 20 4f 52 44 45 52 20 42 59 22  , ")\n ORDER BY"
4d30: 29 3b 0a 20 20 7a 53 65 70 20 3d 20 22 20 22 3b  );.  zSep = " ";
4d40: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e  .  for(i=1; i<=n
4d50: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Pk; i++){.    st
4d60: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
4d70: 73 25 64 22 2c 20 7a 53 65 70 2c 20 69 29 3b 0a  s%d", zSep, i);.
4d80: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b      zSep = ", ";
4d90: 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66  .  }.  strPrintf
4da0: 28 26 73 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 0a  (&sql, ";\n");..
4db0: 20 20 69 66 28 20 67 2e 66 44 65 62 75 67 20 26    if( g.fDebug &
4dc0: 20 44 45 42 55 47 5f 44 49 46 46 5f 53 51 4c 20   DEBUG_DIFF_SQL 
4dd0: 29 7b 20 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ){ .    printf("
4de0: 53 51 4c 20 66 6f 72 20 25 73 3a 5c 6e 25 73 5c  SQL for %s:\n%s\
4df0: 6e 22 2c 20 7a 49 64 2c 20 73 71 6c 2e 7a 29 3b  n", zId, sql.z);
4e00: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 69  .    goto end_di
4e10: 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20  ff_one_table;.  
4e20: 7d 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 69 6e 64  }..  /* Drop ind
4e30: 65 78 65 73 20 74 68 61 74 20 61 72 65 20 6d 69  exes that are mi
4e40: 73 73 69 6e 67 20 69 6e 20 74 68 65 20 64 65 73  ssing in the des
4e50: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 70 53  tination */.  pS
4e60: 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65  tmt = db_prepare
4e70: 28 0a 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61  (.    "SELECT na
4e80: 6d 65 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c  me FROM main.sql
4e90: 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
4ea0: 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e  " WHERE type='in
4eb0: 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d  dex' AND tbl_nam
4ec0: 65 3d 25 51 22 0a 20 20 20 20 22 20 20 20 41 4e  e=%Q".    "   AN
4ed0: 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c  D sql IS NOT NUL
4ee0: 4c 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20 73  L".    "   AND s
4ef0: 71 6c 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43  ql NOT IN (SELEC
4f00: 54 20 73 71 6c 20 46 52 4f 4d 20 61 75 78 2e 73  T sql FROM aux.s
4f10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
4f20: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
4f30: 20 20 20 20 20 20 20 57 48 45 52 45 20 74 79 70         WHERE typ
4f40: 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
4f50: 6c 5f 6e 61 6d 65 3d 25 51 22 0a 20 20 20 20 22  l_name=%Q".    "
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 20 20 20 20 41 4e 44 20 73 71 6c 20 49 53        AND sql IS
4f80: 20 4e 4f 54 20 4e 55 4c 4c 29 22 2c 0a 20 20 20   NOT NULL)",.   
4f90: 20 7a 54 61 62 2c 20 7a 54 61 62 29 3b 0a 20 20   zTab, zTab);.  
4fa0: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
4fb0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
4fc0: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 68  pStmt) ){.    ch
4fd0: 61 72 20 2a 7a 20 3d 20 73 61 66 65 49 64 28 28  ar *z = safeId((
4fe0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
4ff0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
5000: 70 53 74 6d 74 2c 30 29 29 3b 0a 20 20 20 20 66  pStmt,0));.    f
5010: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 44 52 4f  printf(out, "DRO
5020: 50 20 49 4e 44 45 58 20 25 73 3b 5c 6e 22 2c 20  P INDEX %s;\n", 
5030: 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
5040: 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73  free(z);.  }.  s
5050: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
5060: 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 52 75  pStmt);..  /* Ru
5070: 6e 20 74 68 65 20 71 75 65 72 79 20 61 6e 64 20  n the query and 
5080: 6f 75 74 70 75 74 20 64 69 66 66 65 72 65 6e 63  output differenc
5090: 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 67 2e 62  es */.  if( !g.b
50a0: 53 63 68 65 6d 61 4f 6e 6c 79 20 29 7b 0a 20 20  SchemaOnly ){.  
50b0: 20 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65    pStmt = db_pre
50c0: 70 61 72 65 28 73 71 6c 2e 7a 29 3b 0a 20 20 20  pare(sql.z);.   
50d0: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
50e0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
50f0: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
5100: 20 69 6e 74 20 69 54 79 70 65 20 3d 20 73 71 6c   int iType = sql
5110: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
5120: 70 53 74 6d 74 2c 20 6e 50 6b 29 3b 0a 20 20 20  pStmt, nPk);.   
5130: 20 20 20 69 66 28 20 69 54 79 70 65 3d 3d 31 20     if( iType==1 
5140: 7c 7c 20 69 54 79 70 65 3d 3d 32 20 29 7b 0a 20  || iType==2 ){. 
5150: 20 20 20 20 20 20 20 69 66 28 20 69 54 79 70 65         if( iType
5160: 3d 3d 31 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  ==1 ){       /* 
5170: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  Change the conte
5180: 6e 74 20 6f 66 20 61 20 72 6f 77 20 2a 2f 0a 20  nt of a row */. 
5190: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
51a0: 28 6f 75 74 2c 20 22 55 50 44 41 54 45 20 25 73  (out, "UPDATE %s
51b0: 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
51c0: 20 20 20 7a 53 65 70 20 3d 20 22 20 53 45 54 22     zSep = " SET"
51d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
51e0: 69 3d 6e 50 6b 2b 31 3b 20 69 3c 6e 51 3b 20 69  i=nPk+1; i<nQ; i
51f0: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +=2){.          
5200: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
5210: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 69  lumn_int(pStmt,i
5220: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
5230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
5240: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 20 25 73  intf(out, "%s %s
5250: 3d 22 2c 20 7a 53 65 70 2c 20 61 7a 32 5b 28 69  =", zSep, az2[(i
5260: 2b 6e 50 6b 2d 31 29 2f 32 5d 29 3b 0a 20 20 20  +nPk-1)/2]);.   
5270: 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20           zSep = 
5280: 22 2c 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ",";.           
5290: 20 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75 74   printQuoted(out
52a0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
52b0: 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 69 2b 31  _value(pStmt,i+1
52c0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
52d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 20          }else{  
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
52f0: 20 44 65 6c 65 74 65 20 61 20 72 6f 77 20 2a 2f   Delete a row */
5300: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
5310: 74 66 28 6f 75 74 2c 20 22 44 45 4c 45 54 45 20  tf(out, "DELETE 
5320: 46 52 4f 4d 20 25 73 22 2c 20 7a 49 64 29 3b 0a  FROM %s", zId);.
5330: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5340: 20 20 7a 53 65 70 20 3d 20 22 20 57 48 45 52 45    zSep = " WHERE
5350: 22 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ";.        for(i
5360: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
5370: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
5380: 74 66 28 6f 75 74 2c 20 22 25 73 20 25 73 3d 22  tf(out, "%s %s="
5390: 2c 20 7a 53 65 70 2c 20 61 7a 32 5b 69 5d 29 3b  , zSep, az2[i]);
53a0: 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
53b0: 51 75 6f 74 65 64 28 6f 75 74 2c 20 73 71 6c 69  Quoted(out, sqli
53c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
53d0: 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20  (pStmt,i));.    
53e0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22        zSep = ","
53f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5400: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
5410: 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d   ";\n");.      }
5420: 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
5430: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
5440: 20 61 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20   a row */.      
5450: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
5460: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 28 25  INSERT INTO %s(%
5470: 73 22 2c 20 7a 49 64 2c 20 61 7a 32 5b 30 5d 29  s", zId, az2[0])
5480: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
5490: 31 3b 20 61 7a 32 5b 69 5d 3b 20 69 2b 2b 29 20  1; az2[i]; i++) 
54a0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 25  fprintf(out, ",%
54b0: 73 22 2c 20 61 7a 32 5b 69 5d 29 3b 0a 20 20 20  s", az2[i]);.   
54c0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
54d0: 2c 20 22 29 20 56 41 4c 55 45 53 22 29 3b 0a 20  , ") VALUES");. 
54e0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 28         zSep = "(
54f0: 22 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ";.        for(i
5500: 3d 30 3b 20 69 3c 6e 50 6b 32 3b 20 69 2b 2b 29  =0; i<nPk2; i++)
5510: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
5520: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
5530: 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sep);.          
5540: 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20  zSep = ",";.    
5550: 20 20 20 20 20 20 70 72 69 6e 74 51 75 6f 74 65        printQuote
5560: 64 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63  d(out, sqlite3_c
5570: 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d  olumn_value(pStm
5580: 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  t,i));.        }
5590: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6e  .        for(i=n
55a0: 50 6b 32 2b 32 3b 20 69 3c 6e 51 3b 20 69 2b 3d  Pk2+2; i<nQ; i+=
55b0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  2){.          fp
55c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 22 29 3b  rintf(out, ",");
55d0: 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
55e0: 51 75 6f 74 65 64 28 6f 75 74 2c 20 73 71 6c 69  Quoted(out, sqli
55f0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
5600: 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20  (pStmt,i));.    
5610: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70      }.        fp
5620: 72 69 6e 74 66 28 6f 75 74 2c 20 22 29 3b 5c 6e  rintf(out, ");\n
5630: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
5640: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
5650: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
5660: 20 7d 20 2f 2a 20 65 6e 64 69 66 20 21 67 2e 62   } /* endif !g.b
5670: 53 63 68 65 6d 61 4f 6e 6c 79 20 2a 2f 0a 0a 20  SchemaOnly */.. 
5680: 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 64 65 78   /* Create index
5690: 65 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73  es that are miss
56a0: 69 6e 67 20 69 6e 20 74 68 65 20 73 6f 75 72 63  ing in the sourc
56b0: 65 20 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20 64  e */.  pStmt = d
56c0: 62 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20 22  b_prepare(.    "
56d0: 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
56e0: 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  aux.sqlite_maste
56f0: 72 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 74  r".    " WHERE t
5700: 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20  ype='index' AND 
5710: 74 62 6c 5f 6e 61 6d 65 3d 25 51 22 0a 20 20 20  tbl_name=%Q".   
5720: 20 22 20 20 20 41 4e 44 20 73 71 6c 20 49 53 20   "   AND sql IS 
5730: 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 22 20  NOT NULL".    " 
5740: 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 49 4e    AND sql NOT IN
5750: 20 28 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   (SELECT sql FRO
5760: 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  M main.sqlite_ma
5770: 73 74 65 72 22 0a 20 20 20 20 22 20 20 20 20 20  ster".    "     
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
5790: 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
57a0: 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 3d 25  ' AND tbl_name=%
57b0: 51 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  Q".    "        
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4e                AN
57d0: 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c  D sql IS NOT NUL
57e0: 4c 29 22 2c 0a 20 20 20 20 7a 54 61 62 2c 20 7a  L)",.    zTab, z
57f0: 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 53  Tab);.  while( S
5800: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
5810: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
5820: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
5830: 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 73 71 6c 69  t, "%s;\n", sqli
5840: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
5850: 70 53 74 6d 74 2c 30 29 29 3b 0a 20 20 7d 0a 20  pStmt,0));.  }. 
5860: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
5870: 65 28 70 53 74 6d 74 29 3b 0a 0a 65 6e 64 5f 64  e(pStmt);..end_d
5880: 69 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3a 0a 20  iff_one_table:. 
5890: 20 73 74 72 46 72 65 65 28 26 73 71 6c 29 3b 0a   strFree(&sql);.
58a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
58b0: 49 64 29 3b 0a 20 20 6e 61 6d 65 6c 69 73 74 46  Id);.  namelistF
58c0: 72 65 65 28 61 7a 29 3b 0a 20 20 6e 61 6d 65 6c  ree(az);.  namel
58d0: 69 73 74 46 72 65 65 28 61 7a 32 29 3b 0a 20 20  istFree(az2);.  
58e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
58f0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 61 62 6c   Check that tabl
5900: 65 20 7a 54 61 62 20 65 78 69 73 74 73 20 61 6e  e zTab exists an
5910: 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  d has the same s
5920: 63 68 65 6d 61 20 69 6e 20 62 6f 74 68 20 74 68  chema in both th
5930: 65 20 22 6d 61 69 6e 22 0a 2a 2a 20 61 6e 64 20  e "main".** and 
5940: 22 61 75 78 22 20 64 61 74 61 62 61 73 65 73 20  "aux" databases 
5950: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 65 64  currently opened
5960: 20 62 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 64   by the global d
5970: 62 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65  b handle. If the
5980: 79 0a 2a 2a 20 64 6f 20 6e 6f 74 2c 20 6f 75 74  y.** do not, out
5990: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  put an error mes
59a0: 73 61 67 65 20 6f 6e 20 73 74 64 65 72 72 20 61  sage on stderr a
59b0: 6e 64 20 65 78 69 74 28 31 29 2e 20 4f 74 68 65  nd exit(1). Othe
59c0: 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 74 68 65  rwise, if.** the
59d0: 20 73 63 68 65 6d 61 73 20 64 6f 20 6d 61 74 63   schemas do matc
59e0: 68 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f  h, return contro
59f0: 6c 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  l to the caller.
5a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a10: 63 68 65 63 6b 53 63 68 65 6d 61 73 4d 61 74 63  checkSchemasMatc
5a20: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  h(const char *zT
5a30: 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ab){.  sqlite3_s
5a40: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 64 62 5f  tmt *pStmt = db_
5a50: 70 72 65 70 61 72 65 28 0a 20 20 20 20 20 20 22  prepare(.      "
5a60: 53 45 4c 45 43 54 20 41 2e 73 71 6c 3d 42 2e 73  SELECT A.sql=B.s
5a70: 71 6c 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c  ql FROM main.sql
5a80: 69 74 65 5f 6d 61 73 74 65 72 20 41 2c 20 61 75  ite_master A, au
5a90: 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  x.sqlite_master 
5aa0: 42 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45  B".      " WHERE
5ab0: 20 41 2e 6e 61 6d 65 3d 25 51 20 41 4e 44 20 42   A.name=%Q AND B
5ac0: 2e 6e 61 6d 65 3d 25 51 22 2c 20 7a 54 61 62 2c  .name=%Q", zTab,
5ad0: 20 7a 54 61 62 0a 20 20 29 3b 0a 20 20 69 66 28   zTab.  );.  if(
5ae0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
5af0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
5b00: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
5b10: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
5b20: 53 74 6d 74 2c 30 29 3d 3d 30 20 29 7b 0a 20 20  Stmt,0)==0 ){.  
5b30: 20 20 20 20 72 75 6e 74 69 6d 65 45 72 72 6f 72      runtimeError
5b40: 28 22 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  ("schema changes
5b50: 20 66 6f 72 20 74 61 62 6c 65 20 25 73 22 2c 20   for table %s", 
5b60: 73 61 66 65 49 64 28 7a 54 61 62 29 29 3b 0a 20  safeId(zTab));. 
5b70: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5b80: 20 20 72 75 6e 74 69 6d 65 45 72 72 6f 72 28 22    runtimeError("
5b90: 74 61 62 6c 65 20 25 73 20 6d 69 73 73 69 6e 67  table %s missing
5ba0: 20 66 72 6f 6d 20 6f 6e 65 20 6f 72 20 62 6f 74   from one or bot
5bb0: 68 20 64 61 74 61 62 61 73 65 73 22 2c 20 73 61  h databases", sa
5bc0: 66 65 49 64 28 7a 54 61 62 29 29 3b 0a 20 20 7d  feId(zTab));.  }
5bd0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
5be0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  ize(pStmt);.}../
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
5c40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
5c50: 20 69 73 20 63 6f 70 69 65 64 20 66 72 6f 6d 20   is copied from 
5c60: 66 6f 73 73 69 6c 2e 20 49 74 20 69 73 20 75 73  fossil. It is us
5c70: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74  ed to generate t
5c80: 68 65 0a 2a 2a 20 66 6f 73 73 69 6c 20 64 65 6c  he.** fossil del
5c90: 74 61 20 62 6c 6f 62 73 20 73 6f 6d 65 74 69 6d  ta blobs sometim
5ca0: 65 73 20 75 73 65 64 20 69 6e 20 52 42 55 20 75  es used in RBU u
5cb0: 70 64 61 74 65 20 72 65 63 6f 72 64 73 2e 0a 2a  pdate records..*
5cc0: 2f 0a 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  /..typedef unsig
5cd0: 6e 65 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74  ned short u16;.t
5ce0: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
5cf0: 69 6e 74 20 75 33 32 3b 0a 74 79 70 65 64 65 66  int u32;.typedef
5d00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
5d10: 38 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69  8;../*.** The wi
5d20: 64 74 68 20 6f 66 20 61 20 68 61 73 68 20 77 69  dth of a hash wi
5d30: 6e 64 6f 77 20 69 6e 20 62 79 74 65 73 2e 20 20  ndow in bytes.  
5d40: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  The algorithm on
5d50: 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 69 73  ly works if this
5d60: 0a 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f  .** is a power o
5d70: 66 20 32 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  f 2..*/.#define 
5d80: 4e 48 41 53 48 20 31 36 0a 0a 2f 2a 0a 2a 2a 20  NHASH 16../*.** 
5d90: 54 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  The current stat
5da0: 65 20 6f 66 20 74 68 65 20 72 6f 6c 6c 69 6e 67  e of the rolling
5db0: 20 68 61 73 68 2e 0a 2a 2a 0a 2a 2a 20 7a 5b 5d   hash..**.** z[]
5dc0: 20 68 6f 6c 64 73 20 74 68 65 20 76 61 6c 75 65   holds the value
5dd0: 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
5de0: 20 68 61 73 68 65 64 2e 20 20 7a 5b 5d 20 69 73   hashed.  z[] is
5df0: 20 61 20 63 69 72 63 75 6c 61 72 20 62 75 66 66   a circular buff
5e00: 65 72 2e 0a 2a 2a 20 7a 5b 69 5d 20 69 73 20 74  er..** z[i] is t
5e10: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 61  he first entry a
5e20: 6e 64 20 7a 5b 28 69 2b 4e 48 41 53 48 2d 31 29  nd z[(i+NHASH-1)
5e30: 25 4e 48 41 53 48 5d 20 69 73 20 74 68 65 20 6c  %NHASH] is the l
5e40: 61 73 74 20 65 6e 74 72 79 20 6f 66 0a 2a 2a 20  ast entry of.** 
5e50: 74 68 65 20 77 69 6e 64 6f 77 2e 0a 2a 2a 0a 2a  the window..**.*
5e60: 2a 20 48 61 73 68 2e 61 20 69 73 20 74 68 65 20  * Hash.a is the 
5e70: 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6c 65 6d 65  sum of all eleme
5e80: 6e 74 73 20 6f 66 20 68 61 73 68 2e 7a 5b 5d 2e  nts of hash.z[].
5e90: 20 20 48 61 73 68 2e 62 20 69 73 20 61 20 77 65    Hash.b is a we
5ea0: 69 67 68 74 65 64 0a 2a 2a 20 73 75 6d 2e 20 20  ighted.** sum.  
5eb0: 48 61 73 68 2e 62 20 69 73 20 7a 5b 69 5d 2a 4e  Hash.b is z[i]*N
5ec0: 48 41 53 48 20 2b 20 7a 5b 69 2b 31 5d 2a 28 4e  HASH + z[i+1]*(N
5ed0: 48 41 53 48 2d 31 29 20 2b 20 2e 2e 2e 20 2b 20  HASH-1) + ... + 
5ee0: 7a 5b 69 2b 4e 48 41 53 48 2d 31 5d 2a 31 2e 0a  z[i+NHASH-1]*1..
5ef0: 2a 2a 20 28 45 61 63 68 20 69 6e 64 65 78 20 66  ** (Each index f
5f00: 6f 72 20 7a 5b 5d 20 73 68 6f 75 6c 64 20 62 65  or z[] should be
5f10: 20 6d 6f 64 75 6c 65 20 4e 48 41 53 48 2c 20 6f   module NHASH, o
5f20: 66 20 63 6f 75 72 73 65 2e 20 20 54 68 65 20 25  f course.  The %
5f30: 4e 48 41 53 48 20 6f 70 65 72 61 74 6f 72 0a 2a  NHASH operator.*
5f40: 2a 20 69 73 20 6f 6d 69 74 74 65 64 20 69 6e 20  * is omitted in 
5f50: 74 68 65 20 70 72 69 6f 72 20 65 78 70 72 65 73  the prior expres
5f60: 73 69 6f 6e 20 66 6f 72 20 62 72 65 76 69 74 79  sion for brevity
5f70: 2e 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  .).*/.typedef st
5f80: 72 75 63 74 20 68 61 73 68 20 68 61 73 68 3b 0a  ruct hash hash;.
5f90: 73 74 72 75 63 74 20 68 61 73 68 20 7b 0a 20 20  struct hash {.  
5fa0: 75 31 36 20 61 2c 20 62 3b 20 20 20 20 20 20 20  u16 a, b;       
5fb0: 20 20 2f 2a 20 48 61 73 68 20 76 61 6c 75 65 73    /* Hash values
5fc0: 20 2a 2f 0a 20 20 75 31 36 20 69 3b 20 20 20 20   */.  u16 i;    
5fd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
5fe0: 20 6f 66 20 74 68 65 20 68 61 73 68 20 77 69 6e   of the hash win
5ff0: 64 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 7a 5b  dow */.  char z[
6000: 4e 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 54 68  NHASH];    /* Th
6010: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 68 61  e values that ha
6020: 76 65 20 62 65 65 6e 20 68 61 73 68 65 64 20 2a  ve been hashed *
6030: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  /.};../*.** Init
6040: 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 6c 6c 69  ialize the rolli
6050: 6e 67 20 68 61 73 68 20 75 73 69 6e 67 20 74 68  ng hash using th
6060: 65 20 66 69 72 73 74 20 4e 48 41 53 48 20 63 68  e first NHASH ch
6070: 61 72 61 63 74 65 72 73 20 6f 66 20 7a 5b 5d 0a  aracters of z[].
6080: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
6090: 61 73 68 5f 69 6e 69 74 28 68 61 73 68 20 2a 70  ash_init(hash *p
60a0: 48 61 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  Hash, const char
60b0: 20 2a 7a 29 7b 0a 20 20 75 31 36 20 61 2c 20 62   *z){.  u16 a, b
60c0: 2c 20 69 3b 0a 20 20 61 20 3d 20 62 20 3d 20 30  , i;.  a = b = 0
60d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e  ;.  for(i=0; i<N
60e0: 48 41 53 48 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  HASH; i++){.    
60f0: 61 20 2b 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 62  a += z[i];.    b
6100: 20 2b 3d 20 28 4e 48 41 53 48 2d 69 29 2a 7a 5b   += (NHASH-i)*z[
6110: 69 5d 3b 0a 20 20 20 20 70 48 61 73 68 2d 3e 7a  i];.    pHash->z
6120: 5b 69 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  [i] = z[i];.  }.
6130: 20 20 70 48 61 73 68 2d 3e 61 20 3d 20 61 20 26    pHash->a = a &
6140: 20 30 78 66 66 66 66 3b 0a 20 20 70 48 61 73 68   0xffff;.  pHash
6150: 2d 3e 62 20 3d 20 62 20 26 20 30 78 66 66 66 66  ->b = b & 0xffff
6160: 3b 0a 20 20 70 48 61 73 68 2d 3e 69 20 3d 20 30  ;.  pHash->i = 0
6170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
6180: 63 65 20 74 68 65 20 72 6f 6c 6c 69 6e 67 20 68  ce the rolling h
6190: 61 73 68 20 62 79 20 61 20 73 69 6e 67 6c 65 20  ash by a single 
61a0: 63 68 61 72 61 63 74 65 72 20 22 63 22 0a 2a 2f  character "c".*/
61b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 73  .static void has
61c0: 68 5f 6e 65 78 74 28 68 61 73 68 20 2a 70 48 61  h_next(hash *pHa
61d0: 73 68 2c 20 69 6e 74 20 63 29 7b 0a 20 20 75 31  sh, int c){.  u1
61e0: 36 20 6f 6c 64 20 3d 20 70 48 61 73 68 2d 3e 7a  6 old = pHash->z
61f0: 5b 70 48 61 73 68 2d 3e 69 5d 3b 0a 20 20 70 48  [pHash->i];.  pH
6200: 61 73 68 2d 3e 7a 5b 70 48 61 73 68 2d 3e 69 5d  ash->z[pHash->i]
6210: 20 3d 20 63 3b 0a 20 20 70 48 61 73 68 2d 3e 69   = c;.  pHash->i
6220: 20 3d 20 28 70 48 61 73 68 2d 3e 69 2b 31 29 26   = (pHash->i+1)&
6230: 28 4e 48 41 53 48 2d 31 29 3b 0a 20 20 70 48 61  (NHASH-1);.  pHa
6240: 73 68 2d 3e 61 20 3d 20 70 48 61 73 68 2d 3e 61  sh->a = pHash->a
6250: 20 2d 20 6f 6c 64 20 2b 20 63 3b 0a 20 20 70 48   - old + c;.  pH
6260: 61 73 68 2d 3e 62 20 3d 20 70 48 61 73 68 2d 3e  ash->b = pHash->
6270: 62 20 2d 20 4e 48 41 53 48 2a 6f 6c 64 20 2b 20  b - NHASH*old + 
6280: 70 48 61 73 68 2d 3e 61 3b 0a 7d 0a 0a 2f 2a 0a  pHash->a;.}../*.
6290: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
62a0: 69 74 20 68 61 73 68 20 76 61 6c 75 65 0a 2a 2f  it hash value.*/
62b0: 0a 73 74 61 74 69 63 20 75 33 32 20 68 61 73 68  .static u32 hash
62c0: 5f 33 32 62 69 74 28 68 61 73 68 20 2a 70 48 61  _32bit(hash *pHa
62d0: 73 68 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  sh){.  return (p
62e0: 48 61 73 68 2d 3e 61 20 26 20 30 78 66 66 66 66  Hash->a & 0xffff
62f0: 29 20 7c 20 28 28 28 75 33 32 29 28 70 48 61 73  ) | (((u32)(pHas
6300: 68 2d 3e 62 20 26 20 30 78 66 66 66 66 29 29 3c  h->b & 0xffff))<
6310: 3c 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  <16);.}../*.** W
6320: 72 69 74 65 20 61 6e 20 62 61 73 65 2d 36 34 20  rite an base-64 
6330: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
6340: 20 67 69 76 65 6e 20 62 75 66 66 65 72 2e 0a 2a   given buffer..*
6350: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
6360: 74 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 69 6e  tInt(unsigned in
6370: 74 20 76 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b  t v, char **pz){
6380: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
6390: 63 68 61 72 20 7a 44 69 67 69 74 73 5b 5d 20 3d  char zDigits[] =
63a0: 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
63b0: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
63c0: 51 52 53 54 55 56 57 58 59 5a 5f 61 62 63 64 65  QRSTUVWXYZ_abcde
63d0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
63e0: 76 77 78 79 7a 7e 22 3b 0a 20 20 2f 2a 20 20 31  vwxyz~";.  /*  1
63f0: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
6400: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
6410: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
6420: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a   123456789 123 *
6430: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
6440: 63 68 61 72 20 7a 42 75 66 5b 32 30 5d 3b 0a 20  char zBuf[20];. 
6450: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
6460: 20 2a 28 2a 70 7a 29 2b 2b 20 3d 20 27 30 27 3b   *(*pz)++ = '0';
6470: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6480: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 76 3e 30 3b  .  for(i=0; v>0;
6490: 20 69 2b 2b 2c 20 76 3e 3e 3d 36 29 7b 0a 20 20   i++, v>>=6){.  
64a0: 20 20 7a 42 75 66 5b 69 5d 20 3d 20 7a 44 69 67    zBuf[i] = zDig
64b0: 69 74 73 5b 76 26 30 78 33 66 5d 3b 0a 20 20 7d  its[v&0x3f];.  }
64c0: 0a 20 20 66 6f 72 28 6a 3d 69 2d 31 3b 20 6a 3e  .  for(j=i-1; j>
64d0: 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 2a 28  =0; j--){.    *(
64e0: 2a 70 7a 29 2b 2b 20 3d 20 7a 42 75 66 5b 6a 5d  *pz)++ = zBuf[j]
64f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
6500: 65 61 64 20 62 79 74 65 73 20 66 72 6f 6d 20 2a  ead bytes from *
6510: 70 7a 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  pz and convert t
6520: 68 65 6d 20 69 6e 74 6f 20 61 20 70 6f 73 69 74  hem into a posit
6530: 69 76 65 20 69 6e 74 65 67 65 72 2e 20 20 57 68  ive integer.  Wh
6540: 65 6e 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20  en.** finished, 
6550: 6c 65 61 76 65 20 2a 70 7a 20 70 6f 69 6e 74 69  leave *pz pointi
6560: 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
6570: 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20 74  character past t
6580: 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 74 68 65  he end of.** the
6590: 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 20 2a   integer.  The *
65a0: 70 4c 65 6e 20 70 61 72 61 6d 65 74 65 72 20 68  pLen parameter h
65b0: 6f 6c 64 73 20 74 68 65 20 6c 65 6e 67 74 68 20  olds the length 
65c0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  of the string.**
65d0: 20 69 6e 20 2a 70 7a 20 61 6e 64 20 69 73 20 64   in *pz and is d
65e0: 65 63 72 65 6d 65 6e 74 65 64 20 6f 6e 63 65 20  ecremented once 
65f0: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 74  for each charact
6600: 65 72 20 69 6e 20 74 68 65 20 69 6e 74 65 67 65  er in the intege
6610: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  r..*/.static uns
6620: 69 67 6e 65 64 20 69 6e 74 20 67 65 74 49 6e 74  igned int getInt
6630: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a  (const char **pz
6640: 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20  , int *pLen){.  
6650: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67  static const sig
6660: 6e 65 64 20 63 68 61 72 20 7a 56 61 6c 75 65 5b  ned char zValue[
6670: 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31  ] = {.    -1, -1
6680: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
6690: 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20  , -1, -1,   -1, 
66a0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
66b0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
66c0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
66d0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
66e0: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
66f0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
6700: 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,.    -1, -1, -1
6710: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
6720: 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20  , -1,   -1, -1, 
6730: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
6740: 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20  -1, -1,.     0, 
6750: 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
6760: 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 20 20 38   5,  6,  7,    8
6770: 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,  9, -1, -1, -1
6780: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20  , -1, -1, -1,.  
6790: 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31 32    -1, 10, 11, 12
67a0: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
67b0: 2c 20 20 20 31 37 2c 20 31 38 2c 20 31 39 2c 20  ,   17, 18, 19, 
67c0: 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20  20, 21, 22, 23, 
67d0: 32 34 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c 20  24,.    25, 26, 
67e0: 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20  27, 28, 29, 30, 
67f0: 33 31 2c 20 33 32 2c 20 20 20 33 33 2c 20 33 34  31, 32,   33, 34
6800: 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , 35, -1, -1, -1
6810: 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31  , -1, 36,.    -1
6820: 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30  , 37, 38, 39, 40
6830: 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 20 20  , 41, 42, 43,   
6840: 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20  44, 45, 46, 47, 
6850: 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a  48, 49, 50, 51,.
6860: 20 20 20 20 35 32 2c 20 35 33 2c 20 35 34 2c 20      52, 53, 54, 
6870: 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20  55, 56, 57, 58, 
6880: 35 39 2c 20 20 20 36 30 2c 20 36 31 2c 20 36 32  59,   60, 61, 62
6890: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33  , -1, -1, -1, 63
68a0: 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73  , -1,.  };.  uns
68b0: 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20 30 3b  igned int v = 0;
68c0: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69  .  int c;.  unsi
68d0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28  gned char *z = (
68e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 2a  unsigned char*)*
68f0: 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  pz;.  unsigned c
6900: 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b  har *zStart = z;
6910: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
6920: 56 61 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b  Value[0x7f&*(z++
6930: 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76  )])>=0 ){.     v
6940: 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20   = (v<<6) + c;. 
6950: 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65   }.  z--;.  *pLe
6960: 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b  n -= z - zStart;
6970: 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29  .  *pz = (char*)
6980: 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d  z;.  return v;.}
6990: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
69a0: 68 65 20 6e 75 6d 62 65 72 20 64 69 67 69 74 73  he number digits
69b0: 20 69 6e 20 74 68 65 20 62 61 73 65 2d 36 34 20   in the base-64 
69c0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
69d0: 66 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74  f a positive int
69e0: 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eger.*/.static i
69f0: 6e 74 20 64 69 67 69 74 5f 63 6f 75 6e 74 28 69  nt digit_count(i
6a00: 6e 74 20 76 29 7b 0a 20 20 75 6e 73 69 67 6e 65  nt v){.  unsigne
6a10: 64 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 66 6f  d int i, x;.  fo
6a20: 72 28 69 3d 31 2c 20 78 3d 36 34 3b 20 76 3e 3d  r(i=1, x=64; v>=
6a30: 78 3b 20 69 2b 2b 2c 20 78 20 3c 3c 3d 20 36 29  x; i++, x <<= 6)
6a40: 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  {}.  return i;.}
6a50: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
6a60: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
6a70: 6d 20 6f 6e 20 74 68 65 20 4e 2d 62 79 74 65 20  m on the N-byte 
6a80: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
6a90: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  the result..*/.s
6aa0: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
6ab0: 6e 74 20 63 68 65 63 6b 73 75 6d 28 63 6f 6e 73  nt checksum(cons
6ac0: 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 73 69 7a  t char *zIn, siz
6ad0: 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e 73 74 20  e_t N){.  const 
6ae0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
6af0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
6b00: 65 64 20 63 68 61 72 20 2a 29 7a 49 6e 3b 0a 20  ed char *)zIn;. 
6b10: 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 30 20 3d   unsigned sum0 =
6b20: 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73   0;.  unsigned s
6b30: 75 6d 31 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  um1 = 0;.  unsig
6b40: 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b 0a 20 20  ned sum2 = 0;.  
6b50: 75 6e 73 69 67 6e 65 64 20 73 75 6d 33 20 3d 20  unsigned sum3 = 
6b60: 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20  0;.  while(N >= 
6b70: 31 36 29 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d  16){.    sum0 +=
6b80: 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 30 5d   ((unsigned)z[0]
6b90: 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38 5d 20 2b   + z[4] + z[8] +
6ba0: 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20 73 75 6d   z[12]);.    sum
6bb0: 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29  1 += ((unsigned)
6bc0: 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b 20 7a 5b  z[1] + z[5] + z[
6bd0: 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a 20 20 20  9] + z[13]);.   
6be0: 20 73 75 6d 32 20 2b 3d 20 28 28 75 6e 73 69 67   sum2 += ((unsig
6bf0: 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b 36 5d 20  ned)z[2] + z[6] 
6c00: 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34 5d 29 3b  + z[10]+ z[14]);
6c10: 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20 28 28 75  .    sum3 += ((u
6c20: 6e 73 69 67 6e 65 64 29 7a 5b 33 5d 20 2b 20 7a  nsigned)z[3] + z
6c30: 5b 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20 7a 5b 31  [7] + z[11]+ z[1
6c40: 35 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d 20 31 36  5]);.    z += 16
6c50: 3b 0a 20 20 20 20 4e 20 2d 3d 20 31 36 3b 0a 20  ;.    N -= 16;. 
6c60: 20 7d 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20   }.  while(N >= 
6c70: 34 29 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20  4){.    sum0 += 
6c80: 7a 5b 30 5d 3b 0a 20 20 20 20 73 75 6d 31 20 2b  z[0];.    sum1 +
6c90: 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 73 75 6d 32  = z[1];.    sum2
6ca0: 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20 20 73 75   += z[2];.    su
6cb0: 6d 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20 20 20 20  m3 += z[3];.    
6cc0: 7a 20 2b 3d 20 34 3b 0a 20 20 20 20 4e 20 2d 3d  z += 4;.    N -=
6cd0: 20 34 3b 0a 20 20 7d 0a 20 20 73 75 6d 33 20 2b   4;.  }.  sum3 +
6ce0: 3d 20 28 73 75 6d 32 20 3c 3c 20 38 29 20 2b 20  = (sum2 << 8) + 
6cf0: 28 73 75 6d 31 20 3c 3c 20 31 36 29 20 2b 20 28  (sum1 << 16) + (
6d00: 73 75 6d 30 20 3c 3c 20 32 34 29 3b 0a 20 20 73  sum0 << 24);.  s
6d10: 77 69 74 63 68 28 4e 29 7b 0a 20 20 20 20 63 61  witch(N){.    ca
6d20: 73 65 20 33 3a 20 20 20 73 75 6d 33 20 2b 3d 20  se 3:   sum3 += 
6d30: 28 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a 20 20 20  (z[2] << 8);.   
6d40: 20 63 61 73 65 20 32 3a 20 20 20 73 75 6d 33 20   case 2:   sum3 
6d50: 2b 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31 36 29 3b  += (z[1] << 16);
6d60: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 73  .    case 1:   s
6d70: 75 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20 3c 3c 20  um3 += (z[0] << 
6d80: 32 34 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  24);.    default
6d90: 3a 20 20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  :  ;.  }.  retur
6da0: 6e 20 73 75 6d 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n sum3;.}../*.**
6db0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 65   Create a new de
6dc0: 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  lta..**.** The d
6dd0: 65 6c 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  elta is written 
6de0: 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
6df0: 74 65 64 20 62 75 66 66 65 72 2c 20 7a 44 65 6c  ted buffer, zDel
6e00: 74 61 2c 20 77 68 69 63 68 0a 2a 2a 20 73 68 6f  ta, which.** sho
6e10: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
6e20: 36 30 20 62 79 74 65 73 20 6c 6f 6e 67 65 72 20  60 bytes longer 
6e30: 74 68 61 6e 20 74 68 65 20 74 61 72 67 65 74 20  than the target 
6e40: 66 69 6c 65 2c 20 7a 4f 75 74 2e 0a 2a 2a 20 54  file, zOut..** T
6e50: 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20  he delta string 
6e60: 77 69 6c 6c 20 62 65 20 4e 55 4c 2d 74 65 72 6d  will be NUL-term
6e70: 69 6e 61 74 65 64 2c 20 62 75 74 20 69 74 20 6d  inated, but it m
6e80: 69 67 68 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69  ight also contai
6e90: 6e 0a 2a 2a 20 65 6d 62 65 64 64 65 64 20 4e 55  n.** embedded NU
6ea0: 4c 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  L characters if 
6eb0: 65 69 74 68 65 72 20 74 68 65 20 7a 53 72 63 20  either the zSrc 
6ec0: 6f 72 20 7a 4f 75 74 20 66 69 6c 65 73 20 61 72  or zOut files ar
6ed0: 65 0a 2a 2a 20 62 69 6e 61 72 79 2e 20 20 54 68  e.** binary.  Th
6ee0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
6ef0: 72 6e 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  rns the length o
6f00: 66 20 74 68 65 20 64 65 6c 74 61 20 73 74 72 69  f the delta stri
6f10: 6e 67 0a 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20  ng.** in bytes, 
6f20: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 66 69  excluding the fi
6f30: 6e 61 6c 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74  nal NUL terminat
6f40: 6f 72 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  or character..**
6f50: 0a 2a 2a 20 4f 75 74 70 75 74 20 46 6f 72 6d 61  .** Output Forma
6f60: 74 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 6c  t:.**.** The del
6f70: 74 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  ta begins with a
6f80: 20 62 61 73 65 36 34 20 6e 75 6d 62 65 72 20 66   base64 number f
6f90: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 6e 65 77  ollowed by a new
6fa0: 6c 69 6e 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6e  line.  This.** n
6fb0: 75 6d 62 65 72 20 69 73 20 74 68 65 20 6e 75 6d  umber is the num
6fc0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
6fd0: 74 68 65 20 54 41 52 47 45 54 20 66 69 6c 65 2e  the TARGET file.
6fe0: 20 20 54 68 75 73 2c 20 67 69 76 65 6e 20 61 0a    Thus, given a.
6ff0: 2a 2a 20 64 65 6c 74 61 20 66 69 6c 65 20 7a 2c  ** delta file z,
7000: 20 61 20 70 72 6f 67 72 61 6d 20 63 61 6e 20 63   a program can c
7010: 6f 6d 70 75 74 65 20 74 68 65 20 73 69 7a 65 20  ompute the size 
7020: 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  of the output fi
7030: 6c 65 0a 2a 2a 20 73 69 6d 70 6c 79 20 62 79 20  le.** simply by 
7040: 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
7050: 74 20 6c 69 6e 65 20 61 6e 64 20 64 65 63 6f 64  t line and decod
7060: 69 6e 67 20 74 68 65 20 62 61 73 65 2d 36 34 20  ing the base-64 
7070: 6e 75 6d 62 65 72 0a 2a 2a 20 66 6f 75 6e 64 20  number.** found 
7080: 74 68 65 72 65 2e 20 20 54 68 65 20 64 65 6c 74  there.  The delt
7090: 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28 29 20  a_output_size() 
70a0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 65 78 61  routine does exa
70b0: 63 74 6c 79 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a  ctly this..**.**
70c0: 20 41 66 74 65 72 20 74 68 65 20 69 6e 69 74 69   After the initi
70d0: 61 6c 20 73 69 7a 65 20 6e 75 6d 62 65 72 2c 20  al size number, 
70e0: 74 68 65 20 64 65 6c 74 61 20 63 6f 6e 73 69 73  the delta consis
70f0: 74 73 20 6f 66 20 61 20 73 65 72 69 65 73 20 6f  ts of a series o
7100: 66 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 65 78  f.** literal tex
7110: 74 20 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 63  t segments and c
7120: 6f 6d 6d 61 6e 64 73 20 74 6f 20 63 6f 70 79 20  ommands to copy 
7130: 66 72 6f 6d 20 74 68 65 20 53 4f 55 52 43 45 20  from the SOURCE 
7140: 66 69 6c 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20  file..** A copy 
7150: 63 6f 6d 6d 61 6e 64 20 6c 6f 6f 6b 73 20 6c 69  command looks li
7160: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
7170: 20 20 20 4e 4e 4e 40 4d 4d 4d 2c 0a 2a 2a 0a 2a     NNN@MMM,.**.*
7180: 2a 20 77 68 65 72 65 20 4e 4e 4e 20 69 73 20 74  * where NNN is t
7190: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
71a0: 65 73 20 74 6f 20 62 65 20 63 6f 70 69 65 64 20  es to be copied 
71b0: 61 6e 64 20 4d 4d 4d 20 69 73 20 74 68 65 20 6f  and MMM is the o
71c0: 66 66 73 65 74 0a 2a 2a 20 69 6e 74 6f 20 74 68  ffset.** into th
71d0: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6f 66  e source file of
71e0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
71f0: 28 62 6f 74 68 20 62 61 73 65 2d 36 34 29 2e 20  (both base-64). 
7200: 20 20 49 66 20 4e 4e 4e 20 69 73 20 30 0a 2a 2a    If NNN is 0.**
7210: 20 69 74 20 6d 65 61 6e 73 20 63 6f 70 79 20 74   it means copy t
7220: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
7230: 6e 70 75 74 20 66 69 6c 65 2e 20 20 4c 69 74 65  nput file.  Lite
7240: 72 61 6c 20 74 65 78 74 20 69 73 20 6c 69 6b 65  ral text is like
7250: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
7260: 20 4e 4e 4e 3a 54 54 54 54 54 0a 2a 2a 0a 2a 2a   NNN:TTTTT.**.**
7270: 20 77 68 65 72 65 20 4e 4e 4e 20 69 73 20 74 68   where NNN is th
7280: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
7290: 73 20 6f 66 20 74 65 78 74 20 28 62 61 73 65 2d  s of text (base-
72a0: 36 34 29 20 61 6e 64 20 54 54 54 54 54 20 69 73  64) and TTTTT is
72b0: 20 74 68 65 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a   the text..**.**
72c0: 20 54 68 65 20 6c 61 73 74 20 74 65 72 6d 20 69   The last term i
72d0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
72e0: 0a 2a 2a 20 20 20 20 20 4e 4e 4e 3b 0a 2a 2a 0a  .**     NNN;.**.
72f0: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
7300: 20 4e 4e 4e 20 69 73 20 61 20 33 32 2d 62 69 74   NNN is a 32-bit
7310: 20 62 69 67 65 6e 64 69 61 6e 20 63 68 65 63 6b   bigendian check
7320: 73 75 6d 20 6f 66 20 74 68 65 20 6f 75 74 70 75  sum of the outpu
7330: 74 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 63  t file.** that c
7340: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 76 65  an be used to ve
7350: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65  rify that the de
7360: 6c 74 61 20 61 70 70 6c 69 65 64 20 63 6f 72 72  lta applied corr
7370: 65 63 74 6c 79 2e 20 20 41 6c 6c 0a 2a 2a 20 6e  ectly.  All.** n
7380: 75 6d 62 65 72 73 20 61 72 65 20 69 6e 20 62 61  umbers are in ba
7390: 73 65 2d 36 34 2e 0a 2a 2a 0a 2a 2a 20 50 75 72  se-64..**.** Pur
73a0: 65 20 74 65 78 74 20 66 69 6c 65 73 20 67 65 6e  e text files gen
73b0: 65 72 61 74 65 20 61 20 70 75 72 65 20 74 65 78  erate a pure tex
73c0: 74 20 64 65 6c 74 61 2e 20 20 42 69 6e 61 72 79  t delta.  Binary
73d0: 20 66 69 6c 65 73 20 67 65 6e 65 72 61 74 65 20   files generate 
73e0: 61 0a 2a 2a 20 64 65 6c 74 61 20 74 68 61 74 20  a.** delta that 
73f0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
7400: 20 62 69 6e 61 72 79 20 64 61 74 61 2e 0a 2a 2a   binary data..**
7410: 0a 2a 2a 20 41 6c 67 6f 72 69 74 68 6d 3a 0a 2a  .** Algorithm:.*
7420: 2a 0a 2a 2a 20 54 68 65 20 65 6e 63 6f 64 65 72  *.** The encoder
7430: 20 66 69 72 73 74 20 62 75 69 6c 64 73 20 61 20   first builds a 
7440: 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 68 65  hash table to he
7450: 6c 70 20 69 74 20 66 69 6e 64 20 6d 61 74 63 68  lp it find match
7460: 69 6e 67 0a 2a 2a 20 70 61 74 74 65 72 6e 73 20  ing.** patterns 
7470: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 66 69  in the source fi
7480: 6c 65 2e 20 20 31 36 2d 62 79 74 65 20 63 68 75  le.  16-byte chu
7490: 6e 6b 73 20 6f 66 20 74 68 65 20 73 6f 75 72 63  nks of the sourc
74a0: 65 20 66 69 6c 65 0a 2a 2a 20 73 61 6d 70 6c 65  e file.** sample
74b0: 64 20 61 74 20 65 76 65 6e 6c 79 20 73 70 61 63  d at evenly spac
74c0: 65 64 20 69 6e 74 65 72 76 61 6c 73 20 61 72 65  ed intervals are
74d0: 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74   used to populat
74e0: 65 20 74 68 65 20 68 61 73 68 0a 2a 2a 20 74 61  e the hash.** ta
74f0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 65 78 74 20  ble..**.** Next 
7500: 77 65 20 62 65 67 69 6e 20 73 63 61 6e 6e 69 6e  we begin scannin
7510: 67 20 74 68 65 20 74 61 72 67 65 74 20 66 69 6c  g the target fil
7520: 65 20 75 73 69 6e 67 20 61 20 73 6c 69 64 69 6e  e using a slidin
7530: 67 20 31 36 2d 62 79 74 65 0a 2a 2a 20 77 69 6e  g 16-byte.** win
7540: 64 6f 77 2e 20 20 54 68 65 20 68 61 73 68 20 6f  dow.  The hash o
7550: 66 20 74 68 65 20 31 36 2d 62 79 74 65 20 77 69  f the 16-byte wi
7560: 6e 64 6f 77 20 69 6e 20 74 68 65 20 74 61 72 67  ndow in the targ
7570: 65 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  et is used to.**
7580: 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 6d 61   search for a ma
7590: 74 63 68 69 6e 67 20 73 65 63 74 69 6f 6e 20 69  tching section i
75a0: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c  n the source fil
75b0: 65 2e 20 20 57 68 65 6e 20 61 20 6d 61 74 63 68  e.  When a match
75c0: 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 2c 20 61 20  .** is found, a 
75d0: 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 69 73 20  copy command is 
75e0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 65 6c  added to the del
75f0: 74 61 2e 20 20 41 6e 20 65 66 66 6f 72 74 20 69  ta.  An effort i
7600: 73 0a 2a 2a 20 6d 61 64 65 20 74 6f 20 65 78 74  s.** made to ext
7610: 65 6e 64 20 74 68 65 20 6d 61 74 63 68 69 6e 67  end the matching
7620: 20 73 65 63 74 69 6f 6e 20 74 6f 20 72 65 67 69   section to regi
7630: 6f 6e 73 20 74 68 61 74 20 63 6f 6d 65 20 62 65  ons that come be
7640: 66 6f 72 65 0a 2a 2a 20 61 6e 64 20 61 66 74 65  fore.** and afte
7650: 72 20 74 68 65 20 31 36 2d 62 79 74 65 20 68 61  r the 16-byte ha
7660: 73 68 20 77 69 6e 64 6f 77 2e 20 20 41 20 63 6f  sh window.  A co
7670: 70 79 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6f 6e  py command is on
7680: 6c 79 20 69 73 73 75 65 64 0a 2a 2a 20 69 66 20  ly issued.** if 
7690: 74 68 65 20 72 65 73 75 6c 74 20 77 6f 75 6c 64  the result would
76a0: 20 75 73 65 20 6c 65 73 73 20 73 70 61 63 65 20   use less space 
76b0: 74 68 61 74 20 6a 75 73 74 20 71 75 6f 74 69 6e  that just quotin
76c0: 67 20 74 68 65 20 74 65 78 74 0a 2a 2a 20 6c 69  g the text.** li
76d0: 74 65 72 61 6c 6c 79 2e 20 4c 69 74 65 72 61 6c  terally. Literal
76e0: 20 74 65 78 74 20 69 73 20 61 64 64 65 64 20 74   text is added t
76f0: 6f 20 74 68 65 20 64 65 6c 74 61 20 66 6f 72 20  o the delta for 
7700: 73 65 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a  sections that.**
7710: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 6f 72   do not match or
7720: 20 77 68 69 63 68 20 63 61 6e 20 6e 6f 74 20 62   which can not b
7730: 65 20 65 6e 63 6f 64 65 64 20 65 66 66 69 63 69  e encoded effici
7740: 65 6e 74 6c 79 20 75 73 69 6e 67 20 63 6f 70 79  ently using copy
7750: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2f  .** commands..*/
7760: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 44  .static int rbuD
7770: 65 6c 74 61 43 72 65 61 74 65 28 0a 20 20 63 6f  eltaCreate(.  co
7780: 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 2c 20  nst char *zSrc, 
7790: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72       /* The sour
77a0: 63 65 20 6f 72 20 70 61 74 74 65 72 6e 20 66 69  ce or pattern fi
77b0: 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
77c0: 20 69 6e 74 20 6c 65 6e 53 72 63 2c 20 20 20 2f   int lenSrc,   /
77d0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
77e0: 73 6f 75 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20  source file */. 
77f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75   const char *zOu
7800: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  t,      /* The t
7810: 61 72 67 65 74 20 66 69 6c 65 20 2a 2f 0a 20 20  arget file */.  
7820: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e  unsigned int len
7830: 4f 75 74 2c 20 20 20 2f 2a 20 4c 65 6e 67 74 68  Out,   /* Length
7840: 20 6f 66 20 74 68 65 20 74 61 72 67 65 74 20 66   of the target f
7850: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
7860: 44 65 6c 74 61 20 20 20 20 20 20 20 20 20 20 20  Delta           
7870: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 65 6c  /* Write the del
7880: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  ta into this buf
7890: 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  fer */.){.  int 
78a0: 69 2c 20 62 61 73 65 3b 0a 20 20 63 68 61 72 20  i, base;.  char 
78b0: 2a 7a 4f 72 69 67 44 65 6c 74 61 20 3d 20 7a 44  *zOrigDelta = zD
78c0: 65 6c 74 61 3b 0a 20 20 68 61 73 68 20 68 3b 0a  elta;.  hash h;.
78d0: 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20    int nHash;    
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
78f0: 4e 75 6d 62 65 72 20 6f 66 20 68 61 73 68 20 74  Number of hash t
7900: 61 62 6c 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a  able entries */.
7910: 20 20 69 6e 74 20 2a 6c 61 6e 64 6d 61 72 6b 3b    int *landmark;
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7930: 50 72 69 6d 61 72 79 20 68 61 73 68 20 74 61 62  Primary hash tab
7940: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 63 6f 6c  le */.  int *col
7950: 6c 69 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  lide;           
7960: 20 20 20 2f 2a 20 43 6f 6c 6c 69 73 69 6f 6e 20     /* Collision 
7970: 63 68 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c  chain */.  int l
7980: 61 73 74 52 65 61 64 20 3d 20 2d 31 3b 20 20 20  astRead = -1;   
7990: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 62 79        /* Last by
79a0: 74 65 20 6f 66 20 7a 53 72 63 20 72 65 61 64 20  te of zSrc read 
79b0: 62 79 20 61 20 43 4f 50 59 20 63 6f 6d 6d 61 6e  by a COPY comman
79c0: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 64 20 74  d */..  /* Add t
79d0: 68 65 20 74 61 72 67 65 74 20 66 69 6c 65 20 73  he target file s
79e0: 69 7a 65 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ize to the begin
79f0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 65 6c 74  ning of the delt
7a00: 61 0a 20 20 2a 2f 0a 20 20 70 75 74 49 6e 74 28  a.  */.  putInt(
7a10: 6c 65 6e 4f 75 74 2c 20 26 7a 44 65 6c 74 61 29  lenOut, &zDelta)
7a20: 3b 0a 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20  ;.  *(zDelta++) 
7a30: 3d 20 27 5c 6e 27 3b 0a 0a 20 20 2f 2a 20 49 66  = '\n';..  /* If
7a40: 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65   the source file
7a50: 20 69 73 20 76 65 72 79 20 73 6d 61 6c 6c 2c 20   is very small, 
7a60: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
7a70: 20 68 61 76 65 20 6e 6f 0a 20 20 2a 2a 20 63 68   have no.  ** ch
7a80: 61 6e 63 65 20 6f 66 20 65 76 65 72 20 64 6f 69  ance of ever doi
7a90: 6e 67 20 61 20 63 6f 70 79 20 63 6f 6d 6d 61 6e  ng a copy comman
7aa0: 64 2e 20 20 4a 75 73 74 20 6f 75 74 70 75 74 20  d.  Just output 
7ab0: 61 20 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 6c 69  a single.  ** li
7ac0: 74 65 72 61 6c 20 73 65 67 6d 65 6e 74 20 66 6f  teral segment fo
7ad0: 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 72  r the entire tar
7ae0: 67 65 74 20 61 6e 64 20 65 78 69 74 2e 0a 20 20  get and exit..  
7af0: 2a 2f 0a 20 20 69 66 28 20 6c 65 6e 53 72 63 3c  */.  if( lenSrc<
7b00: 3d 4e 48 41 53 48 20 29 7b 0a 20 20 20 20 70 75  =NHASH ){.    pu
7b10: 74 49 6e 74 28 6c 65 6e 4f 75 74 2c 20 26 7a 44  tInt(lenOut, &zD
7b20: 65 6c 74 61 29 3b 0a 20 20 20 20 2a 28 7a 44 65  elta);.    *(zDe
7b30: 6c 74 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20 20  lta++) = ':';.  
7b40: 20 20 6d 65 6d 63 70 79 28 7a 44 65 6c 74 61 2c    memcpy(zDelta,
7b50: 20 7a 4f 75 74 2c 20 6c 65 6e 4f 75 74 29 3b 0a   zOut, lenOut);.
7b60: 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20 6c 65      zDelta += le
7b70: 6e 4f 75 74 3b 0a 20 20 20 20 70 75 74 49 6e 74  nOut;.    putInt
7b80: 28 63 68 65 63 6b 73 75 6d 28 7a 4f 75 74 2c 20  (checksum(zOut, 
7b90: 6c 65 6e 4f 75 74 29 2c 20 26 7a 44 65 6c 74 61  lenOut), &zDelta
7ba0: 29 3b 0a 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b  );.    *(zDelta+
7bb0: 2b 29 20 3d 20 27 3b 27 3b 0a 20 20 20 20 72 65  +) = ';';.    re
7bc0: 74 75 72 6e 20 7a 44 65 6c 74 61 20 2d 20 7a 4f  turn zDelta - zO
7bd0: 72 69 67 44 65 6c 74 61 3b 0a 20 20 7d 0a 0a 20  rigDelta;.  }.. 
7be0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
7bf0: 68 61 73 68 20 74 61 62 6c 65 20 75 73 65 64 20  hash table used 
7c00: 74 6f 20 6c 6f 63 61 74 65 20 6d 61 74 63 68 69  to locate matchi
7c10: 6e 67 20 73 65 63 74 69 6f 6e 73 20 69 6e 20 74  ng sections in t
7c20: 68 65 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66  he.  ** source f
7c30: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6e 48 61 73  ile..  */.  nHas
7c40: 68 20 3d 20 6c 65 6e 53 72 63 2f 4e 48 41 53 48  h = lenSrc/NHASH
7c50: 3b 0a 20 20 63 6f 6c 6c 69 64 65 20 3d 20 73 71  ;.  collide = sq
7c60: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 48  lite3_malloc( nH
7c70: 61 73 68 2a 32 2a 73 69 7a 65 6f 66 28 69 6e 74  ash*2*sizeof(int
7c80: 29 20 29 3b 0a 20 20 6c 61 6e 64 6d 61 72 6b 20  ) );.  landmark 
7c90: 3d 20 26 63 6f 6c 6c 69 64 65 5b 6e 48 61 73 68  = &collide[nHash
7ca0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 6c 61 6e 64  ];.  memset(land
7cb0: 6d 61 72 6b 2c 20 2d 31 2c 20 6e 48 61 73 68 2a  mark, -1, nHash*
7cc0: 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
7cd0: 6d 65 6d 73 65 74 28 63 6f 6c 6c 69 64 65 2c 20  memset(collide, 
7ce0: 2d 31 2c 20 6e 48 61 73 68 2a 73 69 7a 65 6f 66  -1, nHash*sizeof
7cf0: 28 69 6e 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d  (int));.  for(i=
7d00: 30 3b 20 69 3c 6c 65 6e 53 72 63 2d 4e 48 41 53  0; i<lenSrc-NHAS
7d10: 48 3b 20 69 2b 3d 4e 48 41 53 48 29 7b 0a 20 20  H; i+=NHASH){.  
7d20: 20 20 69 6e 74 20 68 76 3b 0a 20 20 20 20 68 61    int hv;.    ha
7d30: 73 68 5f 69 6e 69 74 28 26 68 2c 20 26 7a 53 72  sh_init(&h, &zSr
7d40: 63 5b 69 5d 29 3b 0a 20 20 20 20 68 76 20 3d 20  c[i]);.    hv = 
7d50: 68 61 73 68 5f 33 32 62 69 74 28 26 68 29 20 25  hash_32bit(&h) %
7d60: 20 6e 48 61 73 68 3b 0a 20 20 20 20 63 6f 6c 6c   nHash;.    coll
7d70: 69 64 65 5b 69 2f 4e 48 41 53 48 5d 20 3d 20 6c  ide[i/NHASH] = l
7d80: 61 6e 64 6d 61 72 6b 5b 68 76 5d 3b 0a 20 20 20  andmark[hv];.   
7d90: 20 6c 61 6e 64 6d 61 72 6b 5b 68 76 5d 20 3d 20   landmark[hv] = 
7da0: 69 2f 4e 48 41 53 48 3b 0a 20 20 7d 0a 0a 20 20  i/NHASH;.  }..  
7db0: 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e  /* Begin scannin
7dc0: 67 20 74 68 65 20 74 61 72 67 65 74 20 66 69 6c  g the target fil
7dd0: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 69 6e 67  e and generating
7de0: 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 73 20 61   copy commands a
7df0: 6e 64 0a 20 20 2a 2a 20 6c 69 74 65 72 61 6c 20  nd.  ** literal 
7e00: 73 65 63 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  sections of the 
7e10: 64 65 6c 74 61 2e 0a 20 20 2a 2f 0a 20 20 62 61  delta..  */.  ba
7e20: 73 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 57 65  se = 0;    /* We
7e30: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 67 65   have already ge
7e40: 6e 65 72 61 74 65 64 20 65 76 65 72 79 74 68 69  nerated everythi
7e50: 6e 67 20 62 65 66 6f 72 65 20 7a 4f 75 74 5b 62  ng before zOut[b
7e60: 61 73 65 5d 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ase] */.  while(
7e70: 20 62 61 73 65 2b 4e 48 41 53 48 3c 6c 65 6e 4f   base+NHASH<lenO
7e80: 75 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  ut ){.    int iS
7e90: 72 63 2c 20 69 42 6c 6f 63 6b 3b 0a 20 20 20 20  rc, iBlock;.    
7ea0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 62 65 73  unsigned int bes
7eb0: 74 43 6e 74 2c 20 62 65 73 74 4f 66 73 74 3d 30  tCnt, bestOfst=0
7ec0: 2c 20 62 65 73 74 4c 69 74 73 7a 3d 30 3b 0a 20  , bestLitsz=0;. 
7ed0: 20 20 20 68 61 73 68 5f 69 6e 69 74 28 26 68 2c     hash_init(&h,
7ee0: 20 26 7a 4f 75 74 5b 62 61 73 65 5d 29 3b 0a 20   &zOut[base]);. 
7ef0: 20 20 20 69 20 3d 20 30 3b 20 20 20 20 20 2f 2a     i = 0;     /*
7f00: 20 54 72 79 69 6e 67 20 74 6f 20 6d 61 74 63 68   Trying to match
7f10: 20 61 20 6c 61 6e 64 6d 61 72 6b 20 61 67 61 69   a landmark agai
7f20: 6e 73 74 20 7a 4f 75 74 5b 62 61 73 65 2b 69 5d  nst zOut[base+i]
7f30: 20 2a 2f 0a 20 20 20 20 62 65 73 74 43 6e 74 20   */.    bestCnt 
7f40: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
7f50: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 68  1 ){.      int h
7f60: 76 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  v;.      int lim
7f70: 69 74 20 3d 20 32 35 30 3b 0a 0a 20 20 20 20 20  it = 250;..     
7f80: 20 68 76 20 3d 20 68 61 73 68 5f 33 32 62 69 74   hv = hash_32bit
7f90: 28 26 68 29 20 25 20 6e 48 61 73 68 3b 0a 20 20  (&h) % nHash;.  
7fa0: 20 20 20 20 69 42 6c 6f 63 6b 20 3d 20 6c 61 6e      iBlock = lan
7fb0: 64 6d 61 72 6b 5b 68 76 5d 3b 0a 20 20 20 20 20  dmark[hv];.     
7fc0: 20 77 68 69 6c 65 28 20 69 42 6c 6f 63 6b 3e 3d   while( iBlock>=
7fd0: 30 20 26 26 20 28 6c 69 6d 69 74 2d 2d 29 3e 30  0 && (limit--)>0
7fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20   ){.        /*. 
7ff0: 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 68 61         ** The ha
8000: 73 68 20 77 69 6e 64 6f 77 20 68 61 73 20 69 64  sh window has id
8010: 65 6e 74 69 66 69 65 64 20 61 20 70 6f 74 65 6e  entified a poten
8020: 74 69 61 6c 20 6d 61 74 63 68 20 61 67 61 69 6e  tial match again
8030: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  st.        ** la
8040: 6e 64 6d 61 72 6b 20 62 6c 6f 63 6b 20 69 42 6c  ndmark block iBl
8050: 6f 63 6b 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ock.  But we nee
8060: 64 20 74 6f 20 69 6e 76 65 73 74 69 67 61 74 65  d to investigate
8070: 20 66 75 72 74 68 65 72 2e 0a 20 20 20 20 20 20   further..      
8080: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
8090: 4c 6f 6f 6b 20 66 6f 72 20 61 20 72 65 67 69 6f  Look for a regio
80a0: 6e 20 69 6e 20 7a 4f 75 74 20 74 68 61 74 20 6d  n in zOut that m
80b0: 61 74 63 68 65 73 20 7a 53 72 63 2e 20 41 6e 63  atches zSrc. Anc
80c0: 68 6f 72 20 74 68 65 20 73 65 61 72 63 68 0a 20  hor the search. 
80d0: 20 20 20 20 20 20 20 2a 2a 20 61 74 20 7a 53 72         ** at zSr
80e0: 63 5b 69 53 72 63 5d 20 61 6e 64 20 7a 4f 75 74  c[iSrc] and zOut
80f0: 5b 62 61 73 65 2b 69 5d 2e 20 20 44 6f 20 6e 6f  [base+i].  Do no
8100: 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 74 68 69  t include anythi
8110: 6e 67 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  ng prior to.    
8120: 20 20 20 20 2a 2a 20 7a 4f 75 74 5b 62 61 73 65      ** zOut[base
8130: 5d 20 6f 72 20 61 66 74 65 72 20 7a 4f 75 74 5b  ] or after zOut[
8140: 6f 75 74 4c 65 6e 5d 20 6e 6f 72 20 61 6e 79 74  outLen] nor anyt
8150: 68 69 6e 67 20 61 66 74 65 72 20 7a 53 72 63 5b  hing after zSrc[
8160: 73 72 63 4c 65 6e 5d 2e 0a 20 20 20 20 20 20 20  srcLen]..       
8170: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 53   **.        ** S
8180: 65 74 20 63 6e 74 20 65 71 75 61 6c 20 74 6f 20  et cnt equal to 
8190: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
81a0: 65 20 6d 61 74 63 68 20 61 6e 64 20 73 65 74 20  e match and set 
81b0: 6f 66 73 74 20 73 6f 20 74 68 61 74 0a 20 20 20  ofst so that.   
81c0: 20 20 20 20 20 2a 2a 20 7a 53 72 63 5b 6f 66 73       ** zSrc[ofs
81d0: 74 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  t] is the first 
81e0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
81f0: 61 74 63 68 2e 20 20 6c 69 74 73 7a 20 69 73 20  atch.  litsz is 
8200: 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
8210: 20 20 20 2a 2a 20 6f 66 20 63 68 61 72 61 63 74     ** of charact
8220: 65 72 73 20 62 65 74 77 65 65 6e 20 7a 4f 75 74  ers between zOut
8230: 5b 62 61 73 65 5d 20 61 6e 64 20 74 68 65 20 62  [base] and the b
8240: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
8250: 6d 61 74 63 68 2e 0a 20 20 20 20 20 20 20 20 2a  match..        *
8260: 2a 20 73 7a 20 77 69 6c 6c 20 62 65 20 74 68 65  * sz will be the
8270: 20 6f 76 65 72 68 65 61 64 20 28 69 6e 20 62 79   overhead (in by
8280: 74 65 73 29 20 6e 65 65 64 65 64 20 74 6f 20 65  tes) needed to e
8290: 6e 63 6f 64 65 20 74 68 65 20 63 6f 70 79 0a 20  ncode the copy. 
82a0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e         ** comman
82b0: 64 2e 20 20 4f 6e 6c 79 20 67 65 6e 65 72 61 74  d.  Only generat
82c0: 65 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 69  e copy command i
82d0: 66 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  f the overhead o
82e0: 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
82f0: 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 69 73   copy command is
8300: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 61   less than the a
8310: 6d 6f 75 6e 74 20 6f 66 20 6c 69 74 65 72 61 6c  mount of literal
8320: 20 74 65 78 74 20 74 6f 20 62 65 20 63 6f 70 69   text to be copi
8330: 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
8340: 20 20 20 20 20 20 20 69 6e 74 20 63 6e 74 2c 20         int cnt, 
8350: 6f 66 73 74 2c 20 6c 69 74 73 7a 3b 0a 20 20 20  ofst, litsz;.   
8360: 20 20 20 20 20 69 6e 74 20 6a 2c 20 6b 2c 20 78       int j, k, x
8370: 2c 20 79 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  , y;.        int
8380: 20 73 7a 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a   sz;..        /*
8390: 20 42 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   Beginning at iS
83a0: 72 63 2c 20 6d 61 74 63 68 20 66 6f 72 77 61 72  rc, match forwar
83b0: 64 73 20 61 73 20 66 61 72 20 61 73 20 77 65 20  ds as far as we 
83c0: 63 61 6e 2e 20 20 6a 20 63 6f 75 6e 74 73 0a 20  can.  j counts. 
83d0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 75         ** the nu
83e0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
83f0: 72 73 20 74 68 61 74 20 6d 61 74 63 68 20 2a 2f  rs that match */
8400: 0a 20 20 20 20 20 20 20 20 69 53 72 63 20 3d 20  .        iSrc = 
8410: 69 42 6c 6f 63 6b 2a 4e 48 41 53 48 3b 0a 20 20  iBlock*NHASH;.  
8420: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 78        for(j=0, x
8430: 3d 69 53 72 63 2c 20 79 3d 62 61 73 65 2b 69 3b  =iSrc, y=base+i;
8440: 20 78 3c 6c 65 6e 53 72 63 20 26 26 20 79 3c 6c   x<lenSrc && y<l
8450: 65 6e 4f 75 74 3b 20 6a 2b 2b 2c 20 78 2b 2b 2c  enOut; j++, x++,
8460: 20 79 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   y++){.         
8470: 20 69 66 28 20 7a 53 72 63 5b 78 5d 21 3d 7a 4f   if( zSrc[x]!=zO
8480: 75 74 5b 79 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ut[y] ) break;. 
8490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
84a0: 20 6a 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20 2f   j--;..        /
84b0: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  * Beginning at i
84c0: 53 72 63 2d 31 2c 20 6d 61 74 63 68 20 62 61 63  Src-1, match bac
84d0: 6b 77 61 72 64 73 20 61 73 20 66 61 72 20 61 73  kwards as far as
84e0: 20 77 65 20 63 61 6e 2e 20 20 6b 20 63 6f 75 6e   we can.  k coun
84f0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ts.        ** th
8500: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
8510: 61 63 74 65 72 73 20 74 68 61 74 20 6d 61 74 63  acters that matc
8520: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  h */.        for
8530: 28 6b 3d 31 3b 20 6b 3c 69 53 72 63 20 26 26 20  (k=1; k<iSrc && 
8540: 6b 3c 3d 69 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  k<=i; k++){.    
8550: 20 20 20 20 20 20 69 66 28 20 7a 53 72 63 5b 69        if( zSrc[i
8560: 53 72 63 2d 6b 5d 21 3d 7a 4f 75 74 5b 62 61 73  Src-k]!=zOut[bas
8570: 65 2b 69 2d 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  e+i-k] ) break;.
8580: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8590: 20 20 6b 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20    k--;..        
85a0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6f  /* Compute the o
85b0: 66 66 73 65 74 20 61 6e 64 20 73 69 7a 65 20 6f  ffset and size o
85c0: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 72  f the matching r
85d0: 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  egion */.       
85e0: 20 6f 66 73 74 20 3d 20 69 53 72 63 2d 6b 3b 0a   ofst = iSrc-k;.
85f0: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 6a 2b          cnt = j+
8600: 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 6c 69 74  k+1;.        lit
8610: 73 7a 20 3d 20 69 2d 6b 3b 20 20 2f 2a 20 4e 75  sz = i-k;  /* Nu
8620: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
8630: 20 6c 69 74 65 72 61 6c 20 74 65 78 74 20 62 65   literal text be
8640: 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20 2a 2f  fore the copy */
8650: 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 20 77  .        /* sz w
8660: 69 6c 6c 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d  ill hold the num
8670: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6e 65 65  ber of bytes nee
8680: 64 65 64 20 74 6f 20 65 6e 63 6f 64 65 20 74 68  ded to encode th
8690: 65 20 22 69 6e 73 65 72 74 22 0a 20 20 20 20 20  e "insert".     
86a0: 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 20 61 6e     ** command an
86b0: 64 20 74 68 65 20 63 6f 70 79 20 63 6f 6d 6d 61  d the copy comma
86c0: 6e 64 2c 20 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  nd, not counting
86d0: 20 74 68 65 20 22 69 6e 73 65 72 74 22 20 74 65   the "insert" te
86e0: 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 7a  xt */.        sz
86f0: 20 3d 20 64 69 67 69 74 5f 63 6f 75 6e 74 28 69   = digit_count(i
8700: 2d 6b 29 2b 64 69 67 69 74 5f 63 6f 75 6e 74 28  -k)+digit_count(
8710: 63 6e 74 29 2b 64 69 67 69 74 5f 63 6f 75 6e 74  cnt)+digit_count
8720: 28 6f 66 73 74 29 2b 33 3b 0a 20 20 20 20 20 20  (ofst)+3;.      
8730: 20 20 69 66 28 20 63 6e 74 3e 3d 73 7a 20 26 26    if( cnt>=sz &&
8740: 20 63 6e 74 3e 62 65 73 74 43 6e 74 20 29 7b 0a   cnt>bestCnt ){.
8750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
8760: 65 6d 62 65 72 20 74 68 69 73 20 6d 61 74 63 68  ember this match
8770: 20 6f 6e 6c 79 20 69 66 20 69 74 20 69 73 20 74   only if it is t
8780: 68 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 61  he best so far a
8790: 6e 64 20 69 74 0a 20 20 20 20 20 20 20 20 20 20  nd it.          
87a0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 72  ** does not incr
87b0: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
87c0: 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
87d0: 62 65 73 74 43 6e 74 20 3d 20 63 6e 74 3b 0a 20  bestCnt = cnt;. 
87e0: 20 20 20 20 20 20 20 20 20 62 65 73 74 4f 66 73           bestOfs
87f0: 74 20 3d 20 69 53 72 63 2d 6b 3b 0a 20 20 20 20  t = iSrc-k;.    
8800: 20 20 20 20 20 20 62 65 73 74 4c 69 74 73 7a 20        bestLitsz 
8810: 3d 20 6c 69 74 73 7a 3b 0a 20 20 20 20 20 20 20  = litsz;.       
8820: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
8830: 68 65 63 6b 20 74 68 65 20 6e 65 78 74 20 6d 61  heck the next ma
8840: 74 63 68 69 6e 67 20 62 6c 6f 63 6b 20 2a 2f 0a  tching block */.
8850: 20 20 20 20 20 20 20 20 69 42 6c 6f 63 6b 20 3d          iBlock =
8860: 20 63 6f 6c 6c 69 64 65 5b 69 42 6c 6f 63 6b 5d   collide[iBlock]
8870: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
8880: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 63 6f   /* We have a co
8890: 70 79 20 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20  py command that 
88a0: 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 74  does not cause t
88b0: 68 65 20 64 65 6c 74 61 20 74 6f 20 62 65 20 6c  he delta to be l
88c0: 61 72 67 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  arger.      ** t
88d0: 68 61 6e 20 61 20 6c 69 74 65 72 61 6c 20 69 6e  han a literal in
88e0: 73 65 72 74 2e 20 20 53 6f 20 61 64 64 20 74 68  sert.  So add th
88f0: 65 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 74  e copy command t
8900: 6f 20 74 68 65 20 64 65 6c 74 61 2e 0a 20 20 20  o the delta..   
8910: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
8920: 62 65 73 74 43 6e 74 3e 30 20 29 7b 0a 20 20 20  bestCnt>0 ){.   
8930: 20 20 20 20 20 69 66 28 20 62 65 73 74 4c 69 74       if( bestLit
8940: 73 7a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  sz>0 ){.        
8950: 20 20 2f 2a 20 41 64 64 20 61 6e 20 69 6e 73 65    /* Add an inse
8960: 72 74 20 63 6f 6d 6d 61 6e 64 20 62 65 66 6f 72  rt command befor
8970: 65 20 74 68 65 20 63 6f 70 79 20 2a 2f 0a 20 20  e the copy */.  
8980: 20 20 20 20 20 20 20 20 70 75 74 49 6e 74 28 62          putInt(b
8990: 65 73 74 4c 69 74 73 7a 2c 26 7a 44 65 6c 74 61  estLitsz,&zDelta
89a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a  );.          *(z
89b0: 44 65 6c 74 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a  Delta++) = ':';.
89c0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
89d0: 28 7a 44 65 6c 74 61 2c 20 26 7a 4f 75 74 5b 62  (zDelta, &zOut[b
89e0: 61 73 65 5d 2c 20 62 65 73 74 4c 69 74 73 7a 29  ase], bestLitsz)
89f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 44 65 6c  ;.          zDel
8a00: 74 61 20 2b 3d 20 62 65 73 74 4c 69 74 73 7a 3b  ta += bestLitsz;
8a10: 0a 20 20 20 20 20 20 20 20 20 20 62 61 73 65 20  .          base 
8a20: 2b 3d 20 62 65 73 74 4c 69 74 73 7a 3b 0a 20 20  += bestLitsz;.  
8a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8a40: 62 61 73 65 20 2b 3d 20 62 65 73 74 43 6e 74 3b  base += bestCnt;
8a50: 0a 20 20 20 20 20 20 20 20 70 75 74 49 6e 74 28  .        putInt(
8a60: 62 65 73 74 43 6e 74 2c 20 26 7a 44 65 6c 74 61  bestCnt, &zDelta
8a70: 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 7a 44 65  );.        *(zDe
8a80: 6c 74 61 2b 2b 29 20 3d 20 27 40 27 3b 0a 20 20  lta++) = '@';.  
8a90: 20 20 20 20 20 20 70 75 74 49 6e 74 28 62 65 73        putInt(bes
8aa0: 74 4f 66 73 74 2c 20 26 7a 44 65 6c 74 61 29 3b  tOfst, &zDelta);
8ab0: 0a 20 20 20 20 20 20 20 20 2a 28 7a 44 65 6c 74  .        *(zDelt
8ac0: 61 2b 2b 29 20 3d 20 27 2c 27 3b 0a 20 20 20 20  a++) = ',';.    
8ad0: 20 20 20 20 69 66 28 20 62 65 73 74 4f 66 73 74      if( bestOfst
8ae0: 20 2b 20 62 65 73 74 43 6e 74 20 2d 31 20 3e 20   + bestCnt -1 > 
8af0: 6c 61 73 74 52 65 61 64 20 29 7b 0a 20 20 20 20  lastRead ){.    
8b00: 20 20 20 20 20 20 6c 61 73 74 52 65 61 64 20 3d        lastRead =
8b10: 20 62 65 73 74 4f 66 73 74 20 2b 20 62 65 73 74   bestOfst + best
8b20: 43 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  Cnt - 1;.       
8b30: 20 7d 0a 20 20 20 20 20 20 20 20 62 65 73 74 43   }.        bestC
8b40: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nt = 0;.        
8b50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
8b60: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
8b70: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
8b80: 20 69 74 20 6d 65 61 6e 73 20 6e 6f 20 6d 61 74   it means no mat
8b90: 63 68 20 69 73 20 66 6f 75 6e 64 20 73 6f 20 66  ch is found so f
8ba0: 61 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ar */.      if( 
8bb0: 62 61 73 65 2b 69 2b 4e 48 41 53 48 3e 3d 6c 65  base+i+NHASH>=le
8bc0: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
8bd0: 2f 2a 20 57 65 20 68 61 76 65 20 72 65 61 63 68  /* We have reach
8be0: 65 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ed the end of th
8bf0: 65 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  e file and have 
8c00: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 79 0a 20 20  not found any.  
8c10: 20 20 20 20 20 20 2a 2a 20 6d 61 74 63 68 65 73        ** matches
8c20: 2e 20 20 44 6f 20 61 6e 20 22 69 6e 73 65 72 74  .  Do an "insert
8c30: 22 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  " for everything
8c40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
8c50: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
8c60: 70 75 74 49 6e 74 28 6c 65 6e 4f 75 74 2d 62 61  putInt(lenOut-ba
8c70: 73 65 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20  se, &zDelta);.  
8c80: 20 20 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b        *(zDelta++
8c90: 29 20 3d 20 27 3a 27 3b 0a 20 20 20 20 20 20 20  ) = ':';.       
8ca0: 20 6d 65 6d 63 70 79 28 7a 44 65 6c 74 61 2c 20   memcpy(zDelta, 
8cb0: 26 7a 4f 75 74 5b 62 61 73 65 5d 2c 20 6c 65 6e  &zOut[base], len
8cc0: 4f 75 74 2d 62 61 73 65 29 3b 0a 20 20 20 20 20  Out-base);.     
8cd0: 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20 6c 65 6e     zDelta += len
8ce0: 4f 75 74 2d 62 61 73 65 3b 0a 20 20 20 20 20 20  Out-base;.      
8cf0: 20 20 62 61 73 65 20 3d 20 6c 65 6e 4f 75 74 3b    base = lenOut;
8d00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8d10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
8d20: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 68 61  * Advance the ha
8d30: 73 68 20 62 79 20 6f 6e 65 20 63 68 61 72 61 63  sh by one charac
8d40: 74 65 72 2e 20 20 4b 65 65 70 20 6c 6f 6f 6b 69  ter.  Keep looki
8d50: 6e 67 20 66 6f 72 20 61 20 6d 61 74 63 68 20 2a  ng for a match *
8d60: 2f 0a 20 20 20 20 20 20 68 61 73 68 5f 6e 65 78  /.      hash_nex
8d70: 74 28 26 68 2c 20 7a 4f 75 74 5b 62 61 73 65 2b  t(&h, zOut[base+
8d80: 69 2b 4e 48 41 53 48 5d 29 3b 0a 20 20 20 20 20  i+NHASH]);.     
8d90: 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i++;.    }.  }.
8da0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 61 20 66 69    /* Output a fi
8db0: 6e 61 6c 20 22 69 6e 73 65 72 74 22 20 72 65 63  nal "insert" rec
8dc0: 6f 72 64 20 74 6f 20 67 65 74 20 61 6c 6c 20 74  ord to get all t
8dd0: 68 65 20 74 65 78 74 20 61 74 20 74 68 65 20 65  he text at the e
8de0: 6e 64 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66  nd of.  ** the f
8df0: 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ile that does no
8e00: 74 20 6d 61 74 63 68 20 61 6e 79 74 68 69 6e 67  t match anything
8e10: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 66   in the source f
8e20: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
8e30: 62 61 73 65 3c 6c 65 6e 4f 75 74 20 29 7b 0a 20  base<lenOut ){. 
8e40: 20 20 20 70 75 74 49 6e 74 28 6c 65 6e 4f 75 74     putInt(lenOut
8e50: 2d 62 61 73 65 2c 20 26 7a 44 65 6c 74 61 29 3b  -base, &zDelta);
8e60: 0a 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29  .    *(zDelta++)
8e70: 20 3d 20 27 3a 27 3b 0a 20 20 20 20 6d 65 6d 63   = ':';.    memc
8e80: 70 79 28 7a 44 65 6c 74 61 2c 20 26 7a 4f 75 74  py(zDelta, &zOut
8e90: 5b 62 61 73 65 5d 2c 20 6c 65 6e 4f 75 74 2d 62  [base], lenOut-b
8ea0: 61 73 65 29 3b 0a 20 20 20 20 7a 44 65 6c 74 61  ase);.    zDelta
8eb0: 20 2b 3d 20 6c 65 6e 4f 75 74 2d 62 61 73 65 3b   += lenOut-base;
8ec0: 0a 20 20 7d 0a 20 20 2f 2a 20 4f 75 74 70 75 74  .  }.  /* Output
8ed0: 20 74 68 65 20 66 69 6e 61 6c 20 63 68 65 63 6b   the final check
8ee0: 73 75 6d 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20  sum record. */. 
8ef0: 20 70 75 74 49 6e 74 28 63 68 65 63 6b 73 75 6d   putInt(checksum
8f00: 28 7a 4f 75 74 2c 20 6c 65 6e 4f 75 74 29 2c 20  (zOut, lenOut), 
8f10: 26 7a 44 65 6c 74 61 29 3b 0a 20 20 2a 28 7a 44  &zDelta);.  *(zD
8f20: 65 6c 74 61 2b 2b 29 20 3d 20 27 3b 27 3b 0a 20  elta++) = ';';. 
8f30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
8f40: 6c 6c 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  llide);.  return
8f50: 20 7a 44 65 6c 74 61 20 2d 20 7a 4f 72 69 67 44   zDelta - zOrigD
8f60: 65 6c 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  elta;.}../*.** E
8f70: 6e 64 20 6f 66 20 63 6f 64 65 20 63 6f 70 69 65  nd of code copie
8f80: 64 20 66 72 6f 6d 20 66 6f 73 73 69 6c 2e 0a 2a  d from fossil..*
8f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74  *********/..stat
8fe0: 69 63 20 76 6f 69 64 20 73 74 72 50 72 69 6e 74  ic void strPrint
8ff0: 66 41 72 72 61 79 28 0a 20 20 53 74 72 20 2a 70  fArray(.  Str *p
9000: 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
9010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
9020: 69 6e 67 20 6f 62 6a 65 63 74 20 74 6f 20 61 70  ing object to ap
9030: 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e  pend to */.  con
9040: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 20  st char *zSep,  
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9060: 53 65 70 61 72 61 74 6f 72 20 73 74 72 69 6e 67  Separator string
9070: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9080: 20 2a 7a 46 6d 74 2c 20 20 20 20 20 20 20 20 20   *zFmt,         
9090: 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20        /* Format 
90a0: 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79 20 2a  for each entry *
90b0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 2c 20 69  /.  char **az, i
90c0: 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
90d0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
90e0: 73 74 72 69 6e 67 73 20 26 20 69 74 73 20 73 69  strings & its si
90f0: 7a 65 20 28 6f 72 20 2d 31 29 20 2a 2f 0a 29 7b  ze (or -1) */.){
9100: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
9110: 69 3d 30 3b 20 61 7a 5b 69 5d 20 26 26 20 28 69  i=0; az[i] && (i
9120: 3c 6e 20 7c 7c 20 6e 3c 30 29 3b 20 69 2b 2b 29  <n || n<0); i++)
9130: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 30 20 29  {.    if( i!=0 )
9140: 20 73 74 72 50 72 69 6e 74 66 28 70 53 74 72 2c   strPrintf(pStr,
9150: 20 22 25 73 22 2c 20 7a 53 65 70 29 3b 0a 20 20   "%s", zSep);.  
9160: 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 74 72    strPrintf(pStr
9170: 2c 20 7a 46 6d 74 2c 20 61 7a 5b 69 5d 2c 20 61  , zFmt, az[i], a
9180: 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20  z[i], az[i]);.  
9190: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
91a0: 20 67 65 74 52 62 75 64 69 66 66 51 75 65 72 79   getRbudiffQuery
91b0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
91c0: 7a 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 61  zTab,.  char **a
91d0: 7a 43 6f 6c 2c 0a 20 20 69 6e 74 20 6e 50 4b 2c  zCol,.  int nPK,
91e0: 0a 20 20 69 6e 74 20 62 4f 74 61 52 6f 77 69 64  .  int bOtaRowid
91f0: 2c 0a 20 20 53 74 72 20 2a 70 53 71 6c 0a 29 7b  ,.  Str *pSql.){
9200: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
9210: 46 69 72 73 74 20 74 68 65 20 6e 65 77 6c 79 20  First the newly 
9220: 69 6e 73 65 72 74 65 64 20 72 6f 77 73 3a 20 2a  inserted rows: *
9230: 2a 2f 20 0a 20 20 73 74 72 50 72 69 6e 74 66 28  */ .  strPrintf(
9240: 70 53 71 6c 2c 20 22 53 45 4c 45 43 54 20 22 29  pSql, "SELECT ")
9250: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 41 72 72  ;.  strPrintfArr
9260: 61 79 28 70 53 71 6c 2c 20 22 2c 20 22 2c 20 22  ay(pSql, ", ", "
9270: 25 73 22 2c 20 61 7a 43 6f 6c 2c 20 2d 31 29 3b  %s", azCol, -1);
9280: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71  .  strPrintf(pSq
9290: 6c 2c 20 22 2c 20 30 2c 20 22 29 3b 20 20 20 20  l, ", 0, ");    
92a0: 20 20 20 2f 2a 20 53 65 74 20 6f 74 61 5f 63 6f     /* Set ota_co
92b0: 6e 74 72 6f 6c 20 74 6f 20 30 20 66 6f 72 20 61  ntrol to 0 for a
92c0: 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 73 74  n insert */.  st
92d0: 72 50 72 69 6e 74 66 41 72 72 61 79 28 70 53 71  rPrintfArray(pSq
92e0: 6c 2c 20 22 2c 20 22 2c 20 22 4e 55 4c 4c 22 2c  l, ", ", "NULL",
92f0: 20 61 7a 43 6f 6c 2c 20 2d 31 29 3b 0a 20 20 73   azCol, -1);.  s
9300: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
9310: 20 46 52 4f 4d 20 61 75 78 2e 25 51 20 41 53 20   FROM aux.%Q AS 
9320: 6e 20 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53  n WHERE NOT EXIS
9330: 54 53 20 28 5c 6e 22 2c 20 7a 54 61 62 29 3b 0a  TS (\n", zTab);.
9340: 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c    strPrintf(pSql
9350: 2c 20 22 20 20 20 20 53 45 4c 45 43 54 20 31 20  , "    SELECT 1 
9360: 46 52 4f 4d 20 22 2c 20 7a 54 61 62 29 3b 0a 20  FROM ", zTab);. 
9370: 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c   strPrintf(pSql,
9380: 20 22 20 6d 61 69 6e 2e 25 51 20 41 53 20 6f 20   " main.%Q AS o 
9390: 57 48 45 52 45 20 22 2c 20 7a 54 61 62 29 3b 0a  WHERE ", zTab);.
93a0: 20 20 73 74 72 50 72 69 6e 74 66 41 72 72 61 79    strPrintfArray
93b0: 28 70 53 71 6c 2c 20 22 20 41 4e 44 20 22 2c 20  (pSql, " AND ", 
93c0: 22 28 6e 2e 25 51 20 49 53 20 6f 2e 25 51 29 22  "(n.%Q IS o.%Q)"
93d0: 2c 20 61 7a 43 6f 6c 2c 20 6e 50 4b 29 3b 0a 20  , azCol, nPK);. 
93e0: 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c   strPrintf(pSql,
93f0: 20 22 5c 6e 29 22 29 3b 0a 0a 20 20 2f 2a 20 44   "\n)");..  /* D
9400: 65 6c 65 74 65 64 20 72 6f 77 73 3a 20 2a 2f 0a  eleted rows: */.
9410: 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c    strPrintf(pSql
9420: 2c 20 22 5c 6e 55 4e 49 4f 4e 20 41 4c 4c 5c 6e  , "\nUNION ALL\n
9430: 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 73 74 72  SELECT ");.  str
9440: 50 72 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c  PrintfArray(pSql
9450: 2c 20 22 2c 20 22 2c 20 22 25 73 22 2c 20 61 7a  , ", ", "%s", az
9460: 43 6f 6c 2c 20 6e 50 4b 29 3b 0a 20 20 69 66 28  Col, nPK);.  if(
9470: 20 61 7a 43 6f 6c 5b 6e 50 4b 5d 20 29 7b 0a 20   azCol[nPK] ){. 
9480: 20 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71     strPrintf(pSq
9490: 6c 2c 20 22 2c 20 22 29 3b 0a 20 20 20 20 73 74  l, ", ");.    st
94a0: 72 50 72 69 6e 74 66 41 72 72 61 79 28 70 53 71  rPrintfArray(pSq
94b0: 6c 2c 20 22 2c 20 22 2c 20 22 4e 55 4c 4c 22 2c  l, ", ", "NULL",
94c0: 20 26 61 7a 43 6f 6c 5b 6e 50 4b 5d 2c 20 2d 31   &azCol[nPK], -1
94d0: 29 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e  );.  }.  strPrin
94e0: 74 66 28 70 53 71 6c 2c 20 22 2c 20 31 2c 20 22  tf(pSql, ", 1, "
94f0: 29 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  );       /* Set 
9500: 6f 74 61 5f 63 6f 6e 74 72 6f 6c 20 74 6f 20 31  ota_control to 1
9510: 20 66 6f 72 20 61 20 64 65 6c 65 74 65 20 2a 2f   for a delete */
9520: 0a 20 20 73 74 72 50 72 69 6e 74 66 41 72 72 61  .  strPrintfArra
9530: 79 28 70 53 71 6c 2c 20 22 2c 20 22 2c 20 22 4e  y(pSql, ", ", "N
9540: 55 4c 4c 22 2c 20 61 7a 43 6f 6c 2c 20 2d 31 29  ULL", azCol, -1)
9550: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53  ;.  strPrintf(pS
9560: 71 6c 2c 20 22 20 46 52 4f 4d 20 6d 61 69 6e 2e  ql, " FROM main.
9570: 25 51 20 41 53 20 6e 20 57 48 45 52 45 20 4e 4f  %Q AS n WHERE NO
9580: 54 20 45 58 49 53 54 53 20 28 5c 6e 22 2c 20 7a  T EXISTS (\n", z
9590: 54 61 62 29 3b 0a 20 20 73 74 72 50 72 69 6e 74  Tab);.  strPrint
95a0: 66 28 70 53 71 6c 2c 20 22 20 20 20 20 53 45 4c  f(pSql, "    SEL
95b0: 45 43 54 20 31 20 46 52 4f 4d 20 22 2c 20 7a 54  ECT 1 FROM ", zT
95c0: 61 62 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66  ab);.  strPrintf
95d0: 28 70 53 71 6c 2c 20 22 20 61 75 78 2e 25 51 20  (pSql, " aux.%Q 
95e0: 41 53 20 6f 20 57 48 45 52 45 20 22 2c 20 7a 54  AS o WHERE ", zT
95f0: 61 62 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66  ab);.  strPrintf
9600: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 20 41 4e  Array(pSql, " AN
9610: 44 20 22 2c 20 22 28 6e 2e 25 51 20 49 53 20 6f  D ", "(n.%Q IS o
9620: 2e 25 51 29 22 2c 20 61 7a 43 6f 6c 2c 20 6e 50  .%Q)", azCol, nP
9630: 4b 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28  K);.  strPrintf(
9640: 70 53 71 6c 2c 20 22 5c 6e 29 20 22 29 3b 0a 0a  pSql, "\n) ");..
9650: 20 20 2f 2a 20 55 70 64 61 74 65 64 20 72 6f 77    /* Updated row
9660: 73 2e 20 49 66 20 61 6c 6c 20 74 61 62 6c 65 20  s. If all table 
9670: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74  columns are part
9680: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
9690: 6b 65 79 2c 20 74 68 65 72 65 20 0a 20 20 2a 2a  key, there .  **
96a0: 20 63 61 6e 20 62 65 20 6e 6f 20 75 70 64 61 74   can be no updat
96b0: 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  es. In this case
96c0: 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
96d0: 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
96e0: 54 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 6f 6d  T can.  ** be om
96f0: 69 74 74 65 64 20 61 6c 74 6f 67 65 74 68 65 72  itted altogether
9700: 2e 20 2a 2f 0a 20 20 69 66 28 20 61 7a 43 6f 6c  . */.  if( azCol
9710: 5b 6e 50 4b 5d 20 29 7b 0a 20 20 20 20 73 74 72  [nPK] ){.    str
9720: 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 5c 6e  Printf(pSql, "\n
9730: 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 53 45 4c 45 43  UNION ALL\nSELEC
9740: 54 20 22 29 3b 0a 20 20 20 20 73 74 72 50 72 69  T ");.    strPri
9750: 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22  ntfArray(pSql, "
9760: 2c 20 22 2c 20 22 6e 2e 25 73 22 2c 20 61 7a 43  , ", "n.%s", azC
9770: 6f 6c 2c 20 6e 50 4b 29 3b 0a 20 20 20 20 73 74  ol, nPK);.    st
9780: 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 2c  rPrintf(pSql, ",
9790: 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 50 72 69  \n");.    strPri
97a0: 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22  ntfArray(pSql, "
97b0: 20 2c 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20   ,\n", .        
97c0: 22 20 20 20 20 43 41 53 45 20 57 48 45 4e 20 6e  "    CASE WHEN n
97d0: 2e 25 73 20 49 53 20 6f 2e 25 73 20 54 48 45 4e  .%s IS o.%s THEN
97e0: 20 4e 55 4c 4c 20 45 4c 53 45 20 6e 2e 25 73 20   NULL ELSE n.%s 
97f0: 45 4e 44 22 2c 20 26 61 7a 43 6f 6c 5b 6e 50 4b  END", &azCol[nPK
9800: 5d 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20  ], -1.    );..  
9810: 20 20 69 66 28 20 62 4f 74 61 52 6f 77 69 64 3d    if( bOtaRowid=
9820: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 50  =0 ){.      strP
9830: 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 2c 20 27  rintf(pSql, ", '
9840: 22 29 3b 0a 20 20 20 20 20 20 73 74 72 50 72 69  ");.      strPri
9850: 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22  ntfArray(pSql, "
9860: 22 2c 20 22 2e 22 2c 20 61 7a 43 6f 6c 2c 20 6e  ", ".", azCol, n
9870: 50 4b 29 3b 0a 20 20 20 20 20 20 73 74 72 50 72  PK);.      strPr
9880: 69 6e 74 66 28 70 53 71 6c 2c 20 22 27 20 7c 7c  intf(pSql, "' ||
9890: 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  \n");.    }else{
98a0: 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66  .      strPrintf
98b0: 28 70 53 71 6c 2c 20 22 2c 5c 6e 22 29 3b 0a 20  (pSql, ",\n");. 
98c0: 20 20 20 7d 0a 20 20 20 20 73 74 72 50 72 69 6e     }.    strPrin
98d0: 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22 20  tfArray(pSql, " 
98e0: 7c 7c 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  ||\n", .        
98f0: 22 20 20 20 20 43 41 53 45 20 57 48 45 4e 20 6e  "    CASE WHEN n
9900: 2e 25 73 20 49 53 20 6f 2e 25 73 20 54 48 45 4e  .%s IS o.%s THEN
9910: 20 27 2e 27 20 45 4c 53 45 20 27 78 27 20 45 4e   '.' ELSE 'x' EN
9920: 44 22 2c 20 26 61 7a 43 6f 6c 5b 6e 50 4b 5d 2c  D", &azCol[nPK],
9930: 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 73   -1.    );.    s
9940: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
9950: 5c 6e 41 53 20 6f 74 61 5f 63 6f 6e 74 72 6f 6c  \nAS ota_control
9960: 2c 20 22 29 3b 0a 20 20 20 20 73 74 72 50 72 69  , ");.    strPri
9970: 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22  ntfArray(pSql, "
9980: 2c 20 22 2c 20 22 4e 55 4c 4c 22 2c 20 61 7a 43  , ", "NULL", azC
9990: 6f 6c 2c 20 6e 50 4b 29 3b 0a 20 20 20 20 73 74  ol, nPK);.    st
99a0: 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 2c  rPrintf(pSql, ",
99b0: 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 50 72 69  \n");.    strPri
99c0: 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22  ntfArray(pSql, "
99d0: 20 2c 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20   ,\n", .        
99e0: 22 20 20 20 20 43 41 53 45 20 57 48 45 4e 20 6e  "    CASE WHEN n
99f0: 2e 25 73 20 49 53 20 6f 2e 25 73 20 54 48 45 4e  .%s IS o.%s THEN
9a00: 20 4e 55 4c 4c 20 45 4c 53 45 20 6f 2e 25 73 20   NULL ELSE o.%s 
9a10: 45 4e 44 22 2c 20 26 61 7a 43 6f 6c 5b 6e 50 4b  END", &azCol[nPK
9a20: 5d 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20  ], -1.    );..  
9a30: 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c    strPrintf(pSql
9a40: 2c 20 22 5c 6e 46 52 4f 4d 20 6d 61 69 6e 2e 25  , "\nFROM main.%
9a50: 51 20 41 53 20 6f 2c 20 61 75 78 2e 25 51 20 41  Q AS o, aux.%Q A
9a60: 53 20 6e 5c 6e 57 48 45 52 45 20 22 2c 20 7a 54  S n\nWHERE ", zT
9a70: 61 62 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 73  ab, zTab);.    s
9a80: 74 72 50 72 69 6e 74 66 41 72 72 61 79 28 70 53  trPrintfArray(pS
9a90: 71 6c 2c 20 22 20 41 4e 44 20 22 2c 20 22 28 6e  ql, " AND ", "(n
9aa0: 2e 25 51 20 49 53 20 6f 2e 25 51 29 22 2c 20 61  .%Q IS o.%Q)", a
9ab0: 7a 43 6f 6c 2c 20 6e 50 4b 29 3b 0a 20 20 20 20  zCol, nPK);.    
9ac0: 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20  strPrintf(pSql, 
9ad0: 22 20 41 4e 44 20 6f 74 61 5f 63 6f 6e 74 72 6f  " AND ota_contro
9ae0: 6c 20 4c 49 4b 45 20 27 25 25 78 25 25 27 22 29  l LIKE '%%x%%'")
9af0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
9b00: 61 64 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20  add an ORDER BY 
9b10: 63 6c 61 75 73 65 20 74 6f 20 73 6f 72 74 20 65  clause to sort e
9b20: 76 65 72 79 74 68 69 6e 67 20 62 79 20 50 4b 2e  verything by PK.
9b30: 20 2a 2f 0a 20 20 73 74 72 50 72 69 6e 74 66 28   */.  strPrintf(
9b40: 70 53 71 6c 2c 20 22 5c 6e 4f 52 44 45 52 20 42  pSql, "\nORDER B
9b50: 59 20 22 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Y ");.  for(i=1;
9b60: 20 69 3c 3d 6e 50 4b 3b 20 69 2b 2b 29 20 73 74   i<=nPK; i++) st
9b70: 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 25  rPrintf(pSql, "%
9b80: 73 25 64 22 2c 20 28 28 69 3e 31 29 3f 22 2c 20  s%d", ((i>1)?", 
9b90: 22 3a 22 22 29 2c 20 69 29 3b 0a 7d 0a 0a 73 74  ":""), i);.}..st
9ba0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 64 69 66  atic void rbudif
9bb0: 66 5f 6f 6e 65 5f 74 61 62 6c 65 28 63 6f 6e 73  f_one_table(cons
9bc0: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 46 49  t char *zTab, FI
9bd0: 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 69 6e 74 20  LE *out){.  int 
9be0: 62 4f 74 61 52 6f 77 69 64 3b 20 20 20 20 20 20  bOtaRowid;      
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9c00: 72 75 65 20 74 6f 20 75 73 65 20 61 6e 20 6f 74  rue to use an ot
9c10: 61 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 2a  a_rowid column *
9c20: 2f 0a 20 20 69 6e 74 20 6e 50 4b 3b 20 20 20 20  /.  int nPK;    
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9c50: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
9c60: 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f  umns in table */
9c70: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b  .  char **azCol;
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c90: 20 20 20 2f 2a 20 4e 55 4c 4c 20 74 65 72 6d 69     /* NULL termi
9ca0: 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66 20 63  nated array of c
9cb0: 6f 6c 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  ol names */.  in
9cc0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
9cd0: 0a 20 20 53 74 72 20 63 74 20 3d 20 7b 30 2c 20  .  Str ct = {0, 
9ce0: 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20  0, 0};          
9cf0: 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54     /* The "CREAT
9d00: 45 20 54 41 42 4c 45 20 64 61 74 61 5f 78 78 78  E TABLE data_xxx
9d10: 22 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  " statement */. 
9d20: 20 53 74 72 20 73 71 6c 20 3d 20 7b 30 2c 20 30   Str sql = {0, 0
9d30: 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20  , 0};           
9d40: 20 2f 2a 20 51 75 65 72 79 20 74 6f 20 66 69 6e   /* Query to fin
9d50: 64 20 64 69 66 66 65 72 65 6e 63 65 73 20 2a 2f  d differences */
9d60: 0a 20 20 53 74 72 20 69 6e 73 65 72 74 20 3d 20  .  Str insert = 
9d70: 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20 20 20  {0, 0, 0};      
9d80: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
9d90: 20 6f 66 20 6f 75 74 70 75 74 20 49 4e 53 45 52   of output INSER
9da0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
9db0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
9dc0: 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Stmt = 0;..  /* 
9dd0: 2d 2d 72 62 75 20 6d 6f 64 65 20 6d 75 73 74 20  --rbu mode must 
9de0: 75 73 65 20 72 65 61 6c 20 70 72 69 6d 61 72 79  use real primary
9df0: 20 6b 65 79 73 2e 20 2a 2f 0a 20 20 67 2e 62 53   keys. */.  g.bS
9e00: 63 68 65 6d 61 50 4b 20 3d 20 31 3b 0a 0a 20 20  chemaPK = 1;..  
9e10: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
9e20: 65 20 73 63 68 65 6d 61 73 20 6f 66 20 74 68 65  e schemas of the
9e30: 20 74 77 6f 20 74 61 62 6c 65 73 20 6d 61 74 63   two tables matc
9e40: 68 2e 20 45 78 69 74 20 65 61 72 6c 79 20 6f 74  h. Exit early ot
9e50: 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 63 68  herwise. */.  ch
9e60: 65 63 6b 53 63 68 65 6d 61 73 4d 61 74 63 68 28  eckSchemasMatch(
9e70: 7a 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 47 72 61  zTab);..  /* Gra
9e80: 62 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  b the column nam
9e90: 65 73 20 61 6e 64 20 50 4b 20 64 65 74 61 69 6c  es and PK detail
9ea0: 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 28  s for the table(
9eb0: 73 29 2e 20 49 66 20 6e 6f 20 75 73 61 62 6c 65  s). If no usable
9ec0: 20 50 4b 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73   PK.  ** columns
9ed0: 20 61 72 65 20 66 6f 75 6e 64 2c 20 62 61 69 6c   are found, bail
9ee0: 20 6f 75 74 20 65 61 72 6c 79 2e 20 20 2a 2f 0a   out early.  */.
9ef0: 20 20 61 7a 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e    azCol = column
9f00: 4e 61 6d 65 73 28 22 6d 61 69 6e 22 2c 20 7a 54  Names("main", zT
9f10: 61 62 2c 20 26 6e 50 4b 2c 20 26 62 4f 74 61 52  ab, &nPK, &bOtaR
9f20: 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 61 7a 43  owid);.  if( azC
9f30: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 75 6e  ol==0 ){.    run
9f40: 74 69 6d 65 45 72 72 6f 72 28 22 74 61 62 6c 65  timeError("table
9f50: 20 25 73 20 68 61 73 20 6e 6f 20 75 73 61 62 6c   %s has no usabl
9f60: 65 20 50 4b 20 63 6f 6c 75 6d 6e 73 22 2c 20 7a  e PK columns", z
9f70: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Tab);.  }.  for(
9f80: 6e 43 6f 6c 3d 30 3b 20 61 7a 43 6f 6c 5b 6e 43  nCol=0; azCol[nC
9f90: 6f 6c 5d 3b 20 6e 43 6f 6c 2b 2b 29 3b 0a 0a 20  ol]; nCol++);.. 
9fa0: 20 2f 2a 20 42 75 69 6c 64 20 61 6e 64 20 6f 75   /* Build and ou
9fb0: 74 70 75 74 20 74 68 65 20 43 52 45 41 54 45 20  tput the CREATE 
9fc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
9fd0: 66 6f 72 20 74 68 65 20 64 61 74 61 5f 78 78 78  for the data_xxx
9fe0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 74 72 50   table */.  strP
9ff0: 72 69 6e 74 66 28 26 63 74 2c 20 22 43 52 45 41  rintf(&ct, "CREA
a000: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
a010: 45 58 49 53 54 53 20 27 64 61 74 61 5f 25 71 27  EXISTS 'data_%q'
a020: 28 22 2c 20 7a 54 61 62 29 3b 0a 20 20 69 66 28  (", zTab);.  if(
a030: 20 62 4f 74 61 52 6f 77 69 64 20 29 20 73 74 72   bOtaRowid ) str
a040: 50 72 69 6e 74 66 28 26 63 74 2c 20 22 72 62 75  Printf(&ct, "rbu
a050: 5f 72 6f 77 69 64 2c 20 22 29 3b 0a 20 20 73 74  _rowid, ");.  st
a060: 72 50 72 69 6e 74 66 41 72 72 61 79 28 26 63 74  rPrintfArray(&ct
a070: 2c 20 22 2c 20 22 2c 20 22 25 73 22 2c 20 26 61  , ", ", "%s", &a
a080: 7a 43 6f 6c 5b 62 4f 74 61 52 6f 77 69 64 5d 2c  zCol[bOtaRowid],
a090: 20 2d 31 29 3b 0a 20 20 73 74 72 50 72 69 6e 74   -1);.  strPrint
a0a0: 66 28 26 63 74 2c 20 22 2c 20 72 62 75 5f 63 6f  f(&ct, ", rbu_co
a0b0: 6e 74 72 6f 6c 29 3b 22 29 3b 0a 0a 20 20 2f 2a  ntrol);");..  /*
a0c0: 20 47 65 74 20 74 68 65 20 53 51 4c 20 66 6f 72   Get the SQL for
a0d0: 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 72 65   the query to re
a0e0: 74 72 69 65 76 65 20 64 61 74 61 20 66 72 6f 6d  trieve data from
a0f0: 20 74 68 65 20 74 77 6f 20 64 61 74 61 62 61 73   the two databas
a100: 65 73 20 2a 2f 0a 20 20 67 65 74 52 62 75 64 69  es */.  getRbudi
a110: 66 66 51 75 65 72 79 28 7a 54 61 62 2c 20 61 7a  ffQuery(zTab, az
a120: 43 6f 6c 2c 20 6e 50 4b 2c 20 62 4f 74 61 52 6f  Col, nPK, bOtaRo
a130: 77 69 64 2c 20 26 73 71 6c 29 3b 0a 0a 20 20 2f  wid, &sql);..  /
a140: 2a 20 42 75 69 6c 64 20 74 68 65 20 66 69 72 73  * Build the firs
a150: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 49 4e  t part of the IN
a160: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  SERT statement o
a170: 75 74 70 75 74 20 66 6f 72 20 65 61 63 68 20 72  utput for each r
a180: 6f 77 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64  ow.  ** in the d
a190: 61 74 61 5f 78 78 78 20 74 61 62 6c 65 2e 20 2a  ata_xxx table. *
a1a0: 2f 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 69  /.  strPrintf(&i
a1b0: 6e 73 65 72 74 2c 20 22 49 4e 53 45 52 54 20 49  nsert, "INSERT I
a1c0: 4e 54 4f 20 27 64 61 74 61 5f 25 71 27 20 28 22  NTO 'data_%q' ("
a1d0: 2c 20 7a 54 61 62 29 3b 0a 20 20 69 66 28 20 62  , zTab);.  if( b
a1e0: 4f 74 61 52 6f 77 69 64 20 29 20 73 74 72 50 72  OtaRowid ) strPr
a1f0: 69 6e 74 66 28 26 69 6e 73 65 72 74 2c 20 22 72  intf(&insert, "r
a200: 62 75 5f 72 6f 77 69 64 2c 20 22 29 3b 0a 20 20  bu_rowid, ");.  
a210: 73 74 72 50 72 69 6e 74 66 41 72 72 61 79 28 26  strPrintfArray(&
a220: 69 6e 73 65 72 74 2c 20 22 2c 20 22 2c 20 22 25  insert, ", ", "%
a230: 73 22 2c 20 26 61 7a 43 6f 6c 5b 62 4f 74 61 52  s", &azCol[bOtaR
a240: 6f 77 69 64 5d 2c 20 2d 31 29 3b 0a 20 20 73 74  owid], -1);.  st
a250: 72 50 72 69 6e 74 66 28 26 69 6e 73 65 72 74 2c  rPrintf(&insert,
a260: 20 22 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 29   ", rbu_control)
a270: 20 56 41 4c 55 45 53 28 22 29 3b 0a 0a 20 20 70   VALUES(");..  p
a280: 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72  Stmt = db_prepar
a290: 65 28 22 25 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a  e("%s", sql.z);.
a2a0: 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
a2b0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
a2c0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
a2d0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
a2e0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 6f   is the first ro
a2f0: 77 20 6f 75 74 70 75 74 2c 20 70 72 69 6e 74 20  w output, print 
a300: 6f 75 74 20 74 68 65 20 43 52 45 41 54 45 20 54  out the CREATE T
a310: 41 42 4c 45 20 0a 20 20 20 20 2a 2a 20 73 74 61  ABLE .    ** sta
a320: 74 65 6d 65 6e 74 20 66 69 72 73 74 2e 20 41 6e  tement first. An
a330: 64 20 74 68 65 6e 20 73 65 74 20 63 74 2e 7a 20  d then set ct.z 
a340: 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 61 74 20  to NULL so that 
a350: 69 74 20 69 73 20 6e 6f 74 20 0a 20 20 20 20 2a  it is not .    *
a360: 2a 20 70 72 69 6e 74 65 64 20 61 67 61 69 6e 2e  * printed again.
a370: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 74 2e    */.    if( ct.
a380: 7a 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  z ){.      fprin
a390: 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
a3a0: 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20 73 74 72  ct.z);.      str
a3b0: 46 72 65 65 28 26 63 74 29 3b 0a 20 20 20 20 7d  Free(&ct);.    }
a3c0: 0a 0a 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  ..    /* Output 
a3d0: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f  the first part o
a3e0: 66 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61  f the INSERT sta
a3f0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 66 70  tement */.    fp
a400: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
a410: 20 69 6e 73 65 72 74 2e 7a 29 3b 0a 0a 20 20 20   insert.z);..   
a420: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
a430: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
a440: 6e 43 6f 6c 29 3d 3d 53 51 4c 49 54 45 5f 49 4e  nCol)==SQLITE_IN
a450: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 66  TEGER ){.      f
a460: 6f 72 28 69 3d 30 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=0; i<=nCol;
a470: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
a480: 66 28 20 69 3e 30 20 29 20 66 70 72 69 6e 74 66  f( i>0 ) fprintf
a490: 28 6f 75 74 2c 20 22 2c 20 22 29 3b 0a 20 20 20  (out, ", ");.   
a4a0: 20 20 20 20 20 70 72 69 6e 74 51 75 6f 74 65 64       printQuoted
a4b0: 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f  (out, sqlite3_co
a4c0: 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74  lumn_value(pStmt
a4d0: 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , i));.      }. 
a4e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a4f0: 63 68 61 72 20 2a 7a 4f 74 61 43 6f 6e 74 72 6f  char *zOtaContro
a500: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 74  l;.      int nOt
a510: 61 43 6f 6e 74 72 6f 6c 20 3d 20 73 71 6c 69 74  aControl = sqlit
a520: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
a530: 70 53 74 6d 74 2c 20 6e 43 6f 6c 29 3b 0a 0a 20  pStmt, nCol);.. 
a540: 20 20 20 20 20 7a 4f 74 61 43 6f 6e 74 72 6f 6c       zOtaControl
a550: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
a560: 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 74 61 43 6f 6e  3_malloc(nOtaCon
a570: 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 6d 65 6d  trol);.      mem
a580: 63 70 79 28 7a 4f 74 61 43 6f 6e 74 72 6f 6c 2c  cpy(zOtaControl,
a590: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a5a0: 74 65 78 74 28 70 53 74 6d 74 2c 20 6e 43 6f 6c  text(pStmt, nCol
a5b0: 29 2c 20 6e 4f 74 61 43 6f 6e 74 72 6f 6c 2b 31  ), nOtaControl+1
a5c0: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  );..      for(i=
a5d0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
a5e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 6f  .        int bDo
a5f0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ne = 0;.        
a600: 69 66 28 20 69 3e 3d 6e 50 4b 20 0a 20 20 20 20  if( i>=nPK .    
a610: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
a620: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
a630: 53 74 6d 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45  Stmt, i)==SQLITE
a640: 5f 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 20 20  _BLOB.          
a650: 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
a660: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
a670: 6e 43 6f 6c 2b 31 2b 69 29 3d 3d 53 51 4c 49 54  nCol+1+i)==SQLIT
a680: 45 5f 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 29  E_BLOB.        )
a690: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
a6a0: 74 20 63 68 61 72 20 2a 61 53 72 63 20 3d 20 73  t char *aSrc = s
a6b0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
a6c0: 6f 62 28 70 53 74 6d 74 2c 20 6e 43 6f 6c 2b 31  ob(pStmt, nCol+1
a6d0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +i);.          i
a6e0: 6e 74 20 6e 53 72 63 20 3d 20 73 71 6c 69 74 65  nt nSrc = sqlite
a6f0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
a700: 53 74 6d 74 2c 20 6e 43 6f 6c 2b 31 2b 69 29 3b  Stmt, nCol+1+i);
a710: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
a720: 20 63 68 61 72 20 2a 61 46 69 6e 61 6c 20 3d 20   char *aFinal = 
a730: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
a740: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  lob(pStmt, i);. 
a750: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69           int nFi
a760: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  nal = sqlite3_co
a770: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
a780: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
a790: 63 68 61 72 20 2a 61 44 65 6c 74 61 3b 0a 20 20  char *aDelta;.  
a7a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 65 6c          int nDel
a7b0: 74 61 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 61  ta;..          a
a7c0: 44 65 6c 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  Delta = sqlite3_
a7d0: 6d 61 6c 6c 6f 63 28 6e 46 69 6e 61 6c 20 2b 20  malloc(nFinal + 
a7e0: 36 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  60);.          n
a7f0: 44 65 6c 74 61 20 3d 20 72 62 75 44 65 6c 74 61  Delta = rbuDelta
a800: 43 72 65 61 74 65 28 61 53 72 63 2c 20 6e 53 72  Create(aSrc, nSr
a810: 63 2c 20 61 46 69 6e 61 6c 2c 20 6e 46 69 6e 61  c, aFinal, nFina
a820: 6c 2c 20 61 44 65 6c 74 61 29 3b 0a 20 20 20 20  l, aDelta);.    
a830: 20 20 20 20 20 20 69 66 28 20 6e 44 65 6c 74 61        if( nDelta
a840: 3c 6e 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20  <nFinal ){.     
a850: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
a860: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
a870: 66 28 6f 75 74 2c 20 22 78 27 22 29 3b 0a 20 20  f(out, "x'");.  
a880: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
a890: 30 3b 20 6a 3c 6e 44 65 6c 74 61 3b 20 6a 2b 2b  0; j<nDelta; j++
a8a0: 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
a8b0: 25 30 32 78 22 2c 20 28 75 38 29 61 44 65 6c 74  %02x", (u8)aDelt
a8c0: 61 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[j]);.         
a8d0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
a8e0: 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  "'");.          
a8f0: 20 20 7a 4f 74 61 43 6f 6e 74 72 6f 6c 5b 69 2d    zOtaControl[i-
a900: 62 4f 74 61 52 6f 77 69 64 5d 20 3d 20 27 66 27  bOtaRowid] = 'f'
a910: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 44  ;.            bD
a920: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  one = 1;.       
a930: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
a940: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 44 65 6c  qlite3_free(aDel
a950: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ta);.        }..
a960: 20 20 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e          if( bDon
a970: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
a980: 20 20 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75    printQuoted(ou
a990: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t, sqlite3_colum
a9a0: 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69  n_value(pStmt, i
a9b0: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
a9c0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
a9d0: 74 2c 20 22 2c 20 22 29 3b 0a 20 20 20 20 20 20  t, ", ");.      
a9e0: 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
a9f0: 6f 75 74 2c 20 22 27 25 73 27 22 2c 20 7a 4f 74  out, "'%s'", zOt
aa00: 61 43 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20  aControl);.     
aa10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
aa20: 74 61 43 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20  taControl);.    
aa30: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6e 64 20 74 68  }..    /* And th
aa40: 65 20 63 6c 6f 73 69 6e 67 20 62 72 61 63 6b 65  e closing bracke
aa50: 74 20 6f 66 20 74 68 65 20 69 6e 73 65 72 74 20  t of the insert 
aa60: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
aa70: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 29   fprintf(out, ")
aa80: 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ;\n");.  }..  sq
aa90: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
aaa0: 53 74 6d 74 29 3b 0a 0a 20 20 73 74 72 46 72 65  Stmt);..  strFre
aab0: 65 28 26 63 74 29 3b 0a 20 20 73 74 72 46 72 65  e(&ct);.  strFre
aac0: 65 28 26 73 71 6c 29 3b 0a 20 20 73 74 72 46 72  e(&sql);.  strFr
aad0: 65 65 28 26 69 6e 73 65 72 74 29 3b 0a 7d 0a 0a  ee(&insert);.}..
aae0: 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20  /*.** Display a 
aaf0: 73 75 6d 6d 61 72 79 20 6f 66 20 64 69 66 66 65  summary of diffe
ab00: 72 65 6e 63 65 73 20 62 65 74 77 65 65 6e 20 74  rences between t
ab10: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
ab20: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 61 62 6c 65  he same.** table
ab30: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   table..**.**   
ab40: 2a 20 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  *  Number of row
ab50: 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 20 20 2a  s changed.**   *
ab60: 20 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73    Number of rows
ab70: 20 61 64 64 65 64 0a 2a 2a 20 20 20 2a 20 20 4e   added.**   *  N
ab80: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65  umber of rows de
ab90: 6c 65 74 65 64 0a 2a 2a 20 20 20 2a 20 20 4e 75  leted.**   *  Nu
aba0: 6d 62 65 72 20 6f 66 20 69 64 65 6e 74 69 63 61  mber of identica
abb0: 6c 20 72 6f 77 73 0a 2a 2f 0a 73 74 61 74 69 63  l rows.*/.static
abc0: 20 76 6f 69 64 20 73 75 6d 6d 61 72 69 7a 65 5f   void summarize_
abd0: 6f 6e 65 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20  one_table(const 
abe0: 63 68 61 72 20 2a 7a 54 61 62 2c 20 46 49 4c 45  char *zTab, FILE
abf0: 20 2a 6f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a   *out){.  char *
ac00: 7a 49 64 20 3d 20 73 61 66 65 49 64 28 7a 54 61  zId = safeId(zTa
ac10: 62 29 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  b); /* Name of t
ac20: 61 62 6c 65 20 28 74 72 61 6e 73 6c 61 74 65 64  able (translated
ac30: 20 66 6f 72 20 75 73 20 69 6e 20 53 51 4c 29 20   for us in SQL) 
ac40: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 20 3d  */.  char **az =
ac50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
ac60: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61 69  * Columns in mai
ac70: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  n */.  char **az
ac80: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
ac90: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 61   /* Columns in a
aca0: 75 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 3b  ux */.  int nPk;
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65 79    /* Primary key
acd0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61 69 6e   columns in main
ace0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 32 3b 20   */.  int nPk2; 
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad00: 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65 79 20 63  /* Primary key c
ad10: 6f 6c 75 6d 6e 73 20 69 6e 20 61 75 78 20 2a 2f  olumns in aux */
ad20: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 20 20 20  .  int n = 0;   
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad40: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
ad50: 73 20 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20 69  s in main */.  i
ad60: 6e 74 20 6e 32 3b 20 20 20 20 20 20 20 20 20 20  nt n2;          
ad70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ad80: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
ad90: 20 61 75 78 20 2a 2f 0a 20 20 69 6e 74 20 69 3b   aux */.  int i;
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
adc0: 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ter */.  const c
add0: 68 61 72 20 2a 7a 53 65 70 3b 20 20 20 20 20 20  har *zSep;      
ade0: 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20     /* Separator 
adf0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 53 74 72 20  string */.  Str 
ae00: 73 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  sql;            
ae10: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
ae20: 73 6f 6e 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  son query */.  s
ae30: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
ae40: 6d 74 3b 20 20 20 20 20 20 2f 2a 20 51 75 65 72  mt;      /* Quer
ae50: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64  y statement to d
ae60: 6f 20 74 68 65 20 64 69 66 66 20 2a 2f 0a 20 20  o the diff */.  
ae70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 55  sqlite3_int64 nU
ae80: 70 64 61 74 65 3b 20 20 20 20 2f 2a 20 4e 75 6d  pdate;    /* Num
ae90: 62 65 72 20 6f 66 20 75 70 64 61 74 65 64 20 72  ber of updated r
aea0: 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ows */.  sqlite3
aeb0: 5f 69 6e 74 36 34 20 6e 55 6e 63 68 61 6e 67 65  _int64 nUnchange
aec0: 64 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  d; /* Number of 
aed0: 75 6e 6d 6f 64 69 66 69 65 64 20 72 6f 77 73 20  unmodified rows 
aee0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
aef0: 36 34 20 6e 44 65 6c 65 74 65 3b 20 20 20 20 2f  64 nDelete;    /
af00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 65 6c 65  * Number of dele
af10: 74 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ted rows */.  sq
af20: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 49 6e 73  lite3_int64 nIns
af30: 65 72 74 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ert;    /* Numbe
af40: 72 20 6f 66 20 69 6e 73 65 72 74 65 64 20 72 6f  r of inserted ro
af50: 77 73 20 2a 2f 0a 0a 20 20 73 74 72 49 6e 69 74  ws */..  strInit
af60: 28 26 73 71 6c 29 3b 0a 20 20 69 66 28 20 73 71  (&sql);.  if( sq
af70: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
af80: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 67 2e 64 62  mn_metadata(g.db
af90: 2c 22 61 75 78 22 2c 7a 54 61 62 2c 30 2c 30 2c  ,"aux",zTab,0,0,
afa0: 30 2c 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  0,0,0,0) ){.    
afb0: 69 66 28 20 21 73 71 6c 69 74 65 33 5f 74 61 62  if( !sqlite3_tab
afc0: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
afd0: 74 61 28 67 2e 64 62 2c 22 6d 61 69 6e 22 2c 7a  ta(g.db,"main",z
afe0: 54 61 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29  Tab,0,0,0,0,0,0)
aff0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 61 62   ){.      /* Tab
b000: 6c 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  le missing from 
b010: 73 65 63 6f 6e 64 20 64 61 74 61 62 61 73 65 2e  second database.
b020: 20 2a 2f 0a 20 20 20 20 20 20 66 70 72 69 6e 74   */.      fprint
b030: 66 28 6f 75 74 2c 20 22 25 73 3a 20 6d 69 73 73  f(out, "%s: miss
b040: 69 6e 67 20 66 72 6f 6d 20 73 65 63 6f 6e 64 20  ing from second 
b050: 64 61 74 61 62 61 73 65 5c 6e 22 2c 20 7a 54 61  database\n", zTa
b060: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  b);.    }.    go
b070: 74 6f 20 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65  to end_summarize
b080: 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  _one_table;.  }.
b090: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
b0a0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
b0b0: 64 61 74 61 28 67 2e 64 62 2c 22 6d 61 69 6e 22  data(g.db,"main"
b0c0: 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c  ,zTab,0,0,0,0,0,
b0d0: 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 62  0) ){.    /* Tab
b0e0: 6c 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  le missing from 
b0f0: 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 66 70  source */.    fp
b100: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3a 20  rintf(out, "%s: 
b110: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 66 69 72  missing from fir
b120: 73 74 20 64 61 74 61 62 61 73 65 5c 6e 22 2c 20  st database\n", 
b130: 7a 54 61 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20  zTab);.    goto 
b140: 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e  end_summarize_on
b150: 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  e_table;.  }..  
b160: 61 7a 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73  az = columnNames
b170: 28 22 6d 61 69 6e 22 2c 20 7a 54 61 62 2c 20 26  ("main", zTab, &
b180: 6e 50 6b 2c 20 30 29 3b 0a 20 20 61 7a 32 20 3d  nPk, 0);.  az2 =
b190: 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22 61 75   columnNames("au
b1a0: 78 22 2c 20 7a 54 61 62 2c 20 26 6e 50 6b 32 2c  x", zTab, &nPk2,
b1b0: 20 30 29 3b 0a 20 20 69 66 28 20 61 7a 20 26 26   0);.  if( az &&
b1c0: 20 61 7a 32 20 29 7b 0a 20 20 20 20 66 6f 72 28   az2 ){.    for(
b1d0: 6e 3d 30 3b 20 61 7a 5b 6e 5d 3b 20 6e 2b 2b 29  n=0; az[n]; n++)
b1e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
b1f0: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 5b 6e  te3_stricmp(az[n
b200: 5d 2c 61 7a 32 5b 6e 5d 29 21 3d 30 20 29 20 62  ],az2[n])!=0 ) b
b210: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
b220: 20 20 69 66 28 20 61 7a 3d 3d 30 0a 20 20 20 7c    if( az==0.   |
b230: 7c 20 61 7a 32 3d 3d 30 0a 20 20 20 7c 7c 20 6e  | az2==0.   || n
b240: 50 6b 21 3d 6e 50 6b 32 0a 20 20 20 7c 7c 20 61  Pk!=nPk2.   || a
b250: 7a 5b 6e 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  z[n].  ){.    /*
b260: 20 53 63 68 65 6d 61 20 6d 69 73 6d 61 74 63 68   Schema mismatch
b270: 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
b280: 6f 75 74 2c 20 22 25 73 3a 20 69 6e 63 6f 6d 70  out, "%s: incomp
b290: 61 74 69 62 6c 65 20 73 63 68 65 6d 61 5c 6e 22  atible schema\n"
b2a0: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 67 6f 74  , zTab);.    got
b2b0: 6f 20 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f  o end_summarize_
b2c0: 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  one_table;.  }..
b2d0: 20 20 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63    /* Build the c
b2e0: 6f 6d 70 61 72 69 73 6f 6e 20 71 75 65 72 79 20  omparison query 
b2f0: 2a 2f 0a 20 20 66 6f 72 28 6e 32 3d 6e 3b 20 61  */.  for(n2=n; a
b300: 7a 5b 6e 32 5d 3b 20 6e 32 2b 2b 29 7b 7d 0a 20  z[n2]; n2++){}. 
b310: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
b320: 20 22 53 45 4c 45 43 54 20 31 2c 20 63 6f 75 6e   "SELECT 1, coun
b330: 74 28 2a 29 22 29 3b 0a 20 20 69 66 28 20 6e 32  t(*)");.  if( n2
b340: 3d 3d 6e 50 6b 32 20 29 7b 0a 20 20 20 20 73 74  ==nPk2 ){.    st
b350: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c  rPrintf(&sql, ",
b360: 20 30 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b   0\n");.  }else{
b370: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 73  .    zSep = ", s
b380: 75 6d 28 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  um(";.    for(i=
b390: 6e 50 6b 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29  nPk; az[i]; i++)
b3a0: 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74  {.      strPrint
b3b0: 66 28 26 73 71 6c 2c 20 22 25 73 41 2e 25 73 20  f(&sql, "%sA.%s 
b3c0: 49 53 20 4e 4f 54 20 42 2e 25 73 22 2c 20 7a 53  IS NOT B.%s", zS
b3d0: 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d  ep, az[i], az[i]
b3e0: 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  );.      zSep = 
b3f0: 22 20 4f 52 20 22 3b 0a 20 20 20 20 7d 0a 20 20  " OR ";.    }.  
b400: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
b410: 2c 20 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  , ")\n");.  }.  
b420: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
b430: 22 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20  "  FROM main.%s 
b440: 41 2c 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20  A, aux.%s B\n", 
b450: 7a 49 64 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65  zId, zId);.  zSe
b460: 70 20 3d 20 22 20 57 48 45 52 45 22 3b 0a 20 20  p = " WHERE";.  
b470: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20  for(i=0; i<nPk; 
b480: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69  i++){.    strPri
b490: 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 20 41 2e  ntf(&sql, "%s A.
b4a0: 25 73 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20  %s=B.%s", zSep, 
b4b0: 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20  az[i], az[i]);. 
b4c0: 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 22     zSep = " AND"
b4d0: 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74  ;.  }.  strPrint
b4e0: 66 28 26 73 71 6c 2c 20 22 20 55 4e 49 4f 4e 20  f(&sql, " UNION 
b4f0: 41 4c 4c 5c 6e 22 29 3b 0a 20 20 73 74 72 50 72  ALL\n");.  strPr
b500: 69 6e 74 66 28 26 73 71 6c 2c 20 22 53 45 4c 45  intf(&sql, "SELE
b510: 43 54 20 32 2c 20 63 6f 75 6e 74 28 2a 29 2c 20  CT 2, count(*), 
b520: 30 5c 6e 22 29 3b 0a 20 20 73 74 72 50 72 69 6e  0\n");.  strPrin
b530: 74 66 28 26 73 71 6c 2c 20 22 20 20 46 52 4f 4d  tf(&sql, "  FROM
b540: 20 6d 61 69 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a   main.%s A\n", z
b550: 49 64 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66  Id);.  strPrintf
b560: 28 26 73 71 6c 2c 20 22 20 57 48 45 52 45 20 4e  (&sql, " WHERE N
b570: 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 54  OT EXISTS(SELECT
b580: 20 31 20 46 52 4f 4d 20 61 75 78 2e 25 73 20 42   1 FROM aux.%s B
b590: 20 22 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70   ", zId);.  zSep
b5a0: 20 3d 20 22 57 48 45 52 45 22 3b 0a 20 20 66 6f   = "WHERE";.  fo
b5b0: 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  r(i=0; i<nPk; i+
b5c0: 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74  +){.    strPrint
b5d0: 66 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73  f(&sql, "%s A.%s
b5e0: 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a  =B.%s", zSep, az
b5f0: 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20  [i], az[i]);.   
b600: 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a   zSep = " AND";.
b610: 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28    }.  strPrintf(
b620: 26 73 71 6c 2c 20 22 29 5c 6e 22 29 3b 0a 20 20  &sql, ")\n");.  
b630: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
b640: 22 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b  " UNION ALL\n");
b650: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
b660: 6c 2c 20 22 53 45 4c 45 43 54 20 33 2c 20 63 6f  l, "SELECT 3, co
b670: 75 6e 74 28 2a 29 2c 20 30 5c 6e 22 29 3b 0a 20  unt(*), 0\n");. 
b680: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
b690: 20 22 20 20 46 52 4f 4d 20 61 75 78 2e 25 73 20   "  FROM aux.%s 
b6a0: 42 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 73 74  B\n", zId);.  st
b6b0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20  rPrintf(&sql, " 
b6c0: 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53  WHERE NOT EXISTS
b6d0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d  (SELECT 1 FROM m
b6e0: 61 69 6e 2e 25 73 20 41 20 22 2c 20 7a 49 64 29  ain.%s A ", zId)
b6f0: 3b 0a 20 20 7a 53 65 70 20 3d 20 22 57 48 45 52  ;.  zSep = "WHER
b700: 45 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  E";.  for(i=0; i
b710: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
b720: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
b730: 22 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20  "%s A.%s=B.%s", 
b740: 7a 53 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b  zSep, az[i], az[
b750: 69 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  i]);.    zSep = 
b760: 22 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74  " AND";.  }.  st
b770: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 29  rPrintf(&sql, ")
b780: 5c 6e 20 4f 52 44 45 52 20 42 59 20 31 3b 5c 6e  \n ORDER BY 1;\n
b790: 22 29 3b 0a 0a 20 20 69 66 28 20 28 67 2e 66 44  ");..  if( (g.fD
b7a0: 65 62 75 67 20 26 20 44 45 42 55 47 5f 44 49 46  ebug & DEBUG_DIF
b7b0: 46 5f 53 51 4c 29 21 3d 30 20 29 7b 20 0a 20 20  F_SQL)!=0 ){ .  
b7c0: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 20 66 6f    printf("SQL fo
b7d0: 72 20 25 73 3a 5c 6e 25 73 5c 6e 22 2c 20 7a 49  r %s:\n%s\n", zI
b7e0: 64 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20 20 20 67  d, sql.z);.    g
b7f0: 6f 74 6f 20 65 6e 64 5f 73 75 6d 6d 61 72 69 7a  oto end_summariz
b800: 65 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d  e_one_table;.  }
b810: 0a 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 71  ..  /* Run the q
b820: 75 65 72 79 20 61 6e 64 20 6f 75 74 70 75 74 20  uery and output 
b830: 64 69 66 66 65 72 65 6e 63 65 20 73 75 6d 6d 61  difference summa
b840: 72 79 20 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20  ry */.  pStmt = 
b850: 64 62 5f 70 72 65 70 61 72 65 28 73 71 6c 2e 7a  db_prepare(sql.z
b860: 29 3b 0a 20 20 6e 55 70 64 61 74 65 20 3d 20 30  );.  nUpdate = 0
b870: 3b 0a 20 20 6e 49 6e 73 65 72 74 20 3d 20 30 3b  ;.  nInsert = 0;
b880: 0a 20 20 6e 44 65 6c 65 74 65 20 3d 20 30 3b 0a  .  nDelete = 0;.
b890: 20 20 6e 55 6e 63 68 61 6e 67 65 64 20 3d 20 30    nUnchanged = 0
b8a0: 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  ;.  while( SQLIT
b8b0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
b8c0: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
b8d0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
b8e0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
b8f0: 6d 74 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 63  mt,0) ){.      c
b900: 61 73 65 20 31 3a 0a 20 20 20 20 20 20 20 20 6e  ase 1:.        n
b910: 55 70 64 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Update = sqlite3
b920: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
b930: 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20 20 20  tmt,2);.        
b940: 6e 55 6e 63 68 61 6e 67 65 64 20 3d 20 73 71 6c  nUnchanged = sql
b950: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
b960: 34 28 70 53 74 6d 74 2c 31 29 20 2d 20 6e 55 70  4(pStmt,1) - nUp
b970: 64 61 74 65 3b 0a 20 20 20 20 20 20 20 20 62 72  date;.        br
b980: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b990: 32 3a 0a 20 20 20 20 20 20 20 20 6e 44 65 6c 65  2:.        nDele
b9a0: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  te = sqlite3_col
b9b0: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
b9c0: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
b9d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 33 3a  k;.      case 3:
b9e0: 0a 20 20 20 20 20 20 20 20 6e 49 6e 73 65 72 74  .        nInsert
b9f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ba00: 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 31 29  n_int64(pStmt,1)
ba10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ba20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
ba30: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
ba40: 74 6d 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  tmt);.  fprintf(
ba50: 6f 75 74 2c 20 22 25 73 3a 20 25 6c 6c 64 20 63  out, "%s: %lld c
ba60: 68 61 6e 67 65 73 2c 20 25 6c 6c 64 20 69 6e 73  hanges, %lld ins
ba70: 65 72 74 73 2c 20 25 6c 6c 64 20 64 65 6c 65 74  erts, %lld delet
ba80: 65 73 2c 20 25 6c 6c 64 20 75 6e 63 68 61 6e 67  es, %lld unchang
ba90: 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ed\n",.         
baa0: 20 7a 54 61 62 2c 20 6e 55 70 64 61 74 65 2c 20   zTab, nUpdate, 
bab0: 6e 49 6e 73 65 72 74 2c 20 6e 44 65 6c 65 74 65  nInsert, nDelete
bac0: 2c 20 6e 55 6e 63 68 61 6e 67 65 64 29 3b 0a 0a  , nUnchanged);..
bad0: 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e  end_summarize_on
bae0: 65 5f 74 61 62 6c 65 3a 0a 20 20 73 74 72 46 72  e_table:.  strFr
baf0: 65 65 28 26 73 71 6c 29 3b 0a 20 20 73 71 6c 69  ee(&sql);.  sqli
bb00: 74 65 33 5f 66 72 65 65 28 7a 49 64 29 3b 0a 20  te3_free(zId);. 
bb10: 20 6e 61 6d 65 6c 69 73 74 46 72 65 65 28 61 7a   namelistFree(az
bb20: 29 3b 0a 20 20 6e 61 6d 65 6c 69 73 74 46 72 65  );.  namelistFre
bb30: 65 28 61 7a 32 29 3b 0a 20 20 72 65 74 75 72 6e  e(az2);.  return
bb40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
bb50: 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
bb60: 20 69 6e 74 65 67 65 72 20 61 73 20 61 20 76 61   integer as a va
bb70: 72 69 6e 74 20 6f 6e 74 6f 20 6f 75 74 0a 2a 2f  rint onto out.*/
bb80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74  .static void put
bb90: 73 56 61 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75  sVarint(FILE *ou
bba0: 74 2c 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  t, sqlite3_uint6
bbb0: 34 20 76 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  4 v){.  int i, n
bbc0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
bbd0: 72 20 70 5b 31 32 5d 3b 0a 20 20 69 66 28 20 76  r p[12];.  if( v
bbe0: 20 26 20 28 28 28 73 71 6c 69 74 65 33 5f 75 69   & (((sqlite3_ui
bbf0: 6e 74 36 34 29 30 78 66 66 30 30 30 30 30 30 29  nt64)0xff000000)
bc00: 3c 3c 33 32 29 20 29 7b 0a 20 20 20 20 70 5b 38  <<32) ){.    p[8
bc10: 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ] = (unsigned ch
bc20: 61 72 29 76 3b 0a 20 20 20 20 76 20 3e 3e 3d 20  ar)v;.    v >>= 
bc30: 38 3b 0a 20 20 20 20 66 6f 72 28 69 3d 37 3b 20  8;.    for(i=7; 
bc40: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
bc50: 20 20 70 5b 69 5d 20 3d 20 28 75 6e 73 69 67 6e    p[i] = (unsign
bc60: 65 64 20 63 68 61 72 29 28 28 76 20 26 20 30 78  ed char)((v & 0x
bc70: 37 66 29 20 7c 20 30 78 38 30 29 3b 0a 20 20 20  7f) | 0x80);.   
bc80: 20 20 20 76 20 3e 3e 3d 20 37 3b 0a 20 20 20 20     v >>= 7;.    
bc90: 7d 0a 20 20 20 20 66 77 72 69 74 65 28 70 2c 20  }.    fwrite(p, 
bca0: 38 2c 20 31 2c 20 6f 75 74 29 3b 0a 20 20 7d 65  8, 1, out);.  }e
bcb0: 6c 73 65 7b 0a 20 20 20 20 6e 20 3d 20 39 3b 0a  lse{.    n = 9;.
bcc0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 70 5b      do{.      p[
bcd0: 6e 2d 2d 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64  n--] = (unsigned
bce0: 20 63 68 61 72 29 28 28 76 20 26 20 30 78 37 66   char)((v & 0x7f
bcf0: 29 20 7c 20 30 78 38 30 29 3b 0a 20 20 20 20 20  ) | 0x80);.     
bd00: 20 76 20 3e 3e 3d 20 37 3b 0a 20 20 20 20 7d 77   v >>= 7;.    }w
bd10: 68 69 6c 65 28 20 76 21 3d 30 20 29 3b 0a 20 20  hile( v!=0 );.  
bd20: 20 20 70 5b 39 5d 20 26 3d 20 30 78 37 66 3b 0a    p[9] &= 0x7f;.
bd30: 20 20 20 20 66 77 72 69 74 65 28 70 2b 6e 2b 31      fwrite(p+n+1
bd40: 2c 20 39 2d 6e 2c 20 31 2c 20 6f 75 74 29 3b 0a  , 9-n, 1, out);.
bd50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69    }.}../*.** Wri
bd60: 74 65 20 61 6e 20 53 51 4c 69 74 65 20 76 61 6c  te an SQLite val
bd70: 75 65 20 6f 6e 74 6f 20 6f 75 74 2e 0a 2a 2f 0a  ue onto out..*/.
bd80: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74 56  static void putV
bd90: 61 6c 75 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20  alue(FILE *out, 
bda0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
bdb0: 56 61 6c 29 7b 0a 20 20 69 6e 74 20 69 44 54 79  Val){.  int iDTy
bdc0: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
bdd0: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20  ue_type(pVal);. 
bde0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
bdf0: 58 3b 0a 20 20 64 6f 75 62 6c 65 20 72 58 3b 0a  X;.  double rX;.
be00: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
be10: 20 75 58 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20   uX;.  int j;.. 
be20: 20 70 75 74 63 28 69 44 54 79 70 65 2c 20 6f 75   putc(iDType, ou
be30: 74 29 3b 0a 20 20 73 77 69 74 63 68 28 20 69 44  t);.  switch( iD
be40: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
be50: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
be60: 0a 20 20 20 20 20 20 69 58 20 3d 20 73 71 6c 69  .      iX = sqli
be70: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
be80: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 6d 65 6d  pVal);.      mem
be90: 63 70 79 28 26 75 58 2c 20 26 69 58 2c 20 38 29  cpy(&uX, &iX, 8)
bea0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 35 36  ;.      for(j=56
beb0: 3b 20 6a 3e 3d 30 3b 20 6a 2d 3d 38 29 20 70 75  ; j>=0; j-=8) pu
bec0: 74 63 28 28 75 58 3e 3e 6a 29 26 30 78 66 66 2c  tc((uX>>j)&0xff,
bed0: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 62 72 65   out);.      bre
bee0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
bef0: 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20  ITE_FLOAT:.     
bf00: 20 72 58 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   rX = sqlite3_va
bf10: 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29  lue_double(pVal)
bf20: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
bf30: 75 58 2c 20 26 72 58 2c 20 38 29 3b 0a 20 20 20  uX, &rX, 8);.   
bf40: 20 20 20 66 6f 72 28 6a 3d 35 36 3b 20 6a 3e 3d     for(j=56; j>=
bf50: 30 3b 20 6a 2d 3d 38 29 20 70 75 74 63 28 28 75  0; j-=8) putc((u
bf60: 58 3e 3e 6a 29 26 30 78 66 66 2c 20 6f 75 74 29  X>>j)&0xff, out)
bf70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bf80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
bf90: 45 58 54 3a 0a 20 20 20 20 20 20 69 58 20 3d 20  EXT:.      iX = 
bfa0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
bfb0: 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  tes(pVal);.     
bfc0: 20 70 75 74 73 56 61 72 69 6e 74 28 6f 75 74 2c   putsVarint(out,
bfd0: 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34   (sqlite3_uint64
bfe0: 29 69 58 29 3b 0a 20 20 20 20 20 20 66 77 72 69  )iX);.      fwri
bff0: 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  te(sqlite3_value
c000: 5f 74 65 78 74 28 70 56 61 6c 29 2c 31 2c 28 73  _text(pVal),1,(s
c010: 69 7a 65 5f 74 29 69 58 2c 6f 75 74 29 3b 0a 20  ize_t)iX,out);. 
c020: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c030: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
c040: 3a 0a 20 20 20 20 20 20 69 58 20 3d 20 73 71 6c  :.      iX = sql
c050: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
c060: 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 75  (pVal);.      pu
c070: 74 73 56 61 72 69 6e 74 28 6f 75 74 2c 20 28 73  tsVarint(out, (s
c080: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 69 58  qlite3_uint64)iX
c090: 29 3b 0a 20 20 20 20 20 20 66 77 72 69 74 65 28  );.      fwrite(
c0a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
c0b0: 6f 62 28 70 56 61 6c 29 2c 31 2c 28 73 69 7a 65  ob(pVal),1,(size
c0c0: 5f 74 29 69 58 2c 6f 75 74 29 3b 0a 20 20 20 20  _t)iX,out);.    
c0d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
c0e0: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20  e SQLITE_NULL:. 
c0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
c100: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c110: 65 20 61 20 43 48 41 4e 47 45 53 45 54 20 66 6f  e a CHANGESET fo
c120: 72 20 61 6c 6c 20 64 69 66 66 65 72 65 6e 63 65  r all difference
c130: 73 20 66 72 6f 6d 20 6d 61 69 6e 2e 7a 54 61 62  s from main.zTab
c140: 20 74 6f 20 61 75 78 2e 7a 54 61 62 2e 0a 2a 2f   to aux.zTab..*/
c150: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61  .static void cha
c160: 6e 67 65 73 65 74 5f 6f 6e 65 5f 74 61 62 6c 65  ngeset_one_table
c170: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61  (const char *zTa
c180: 62 2c 20 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20  b, FILE *out){. 
c190: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
c1a0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Stmt;          /
c1b0: 2a 20 53 51 4c 20 73 74 61 74 6d 65 6e 74 20 2a  * SQL statment *
c1c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 49 64 20 3d 20  /.  char *zId = 
c1d0: 73 61 66 65 49 64 28 7a 54 61 62 29 3b 20 20 20  safeId(zTab);   
c1e0: 20 20 2f 2a 20 45 73 63 61 70 65 64 20 6e 61 6d    /* Escaped nam
c1f0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
c200: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  /.  char **azCol
c210: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c220: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 73 63    /* List of esc
c230: 61 70 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  aped column name
c240: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  s */.  int nCol 
c250: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c260: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c270: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  f columns */.  i
c280: 6e 74 20 2a 61 69 46 6c 67 20 3d 20 30 3b 20 20  nt *aiFlg = 0;  
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c2a0: 30 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 6e  0 if column is n
c2b0: 6f 74 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  ot part of PK */
c2c0: 0a 20 20 69 6e 74 20 2a 61 69 50 6b 20 3d 20 30  .  int *aiPk = 0
c2d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c2e0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
c2f0: 72 73 20 66 6f 72 20 65 61 63 68 20 50 4b 20 63  rs for each PK c
c300: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  olumn */.  int n
c310: 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pk = 0;         
c320: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c330: 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45  er of PRIMARY KE
c340: 59 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53  Y columns */.  S
c350: 74 72 20 73 71 6c 3b 20 20 20 20 20 20 20 20 20  tr sql;         
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c370: 53 51 4c 20 66 6f 72 20 74 68 65 20 64 69 66 66  SQL for the diff
c380: 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
c390: 69 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  i, k;           
c3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c3b0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
c3c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
c3d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c3e0: 20 4c 69 73 74 20 73 65 70 61 72 61 74 6f 72 20   List separator 
c3f0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
c400: 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 73 20  hat the schemas 
c410: 6f 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  of the two table
c420: 73 20 6d 61 74 63 68 2e 20 45 78 69 74 20 65 61  s match. Exit ea
c430: 72 6c 79 20 6f 74 68 65 72 77 69 73 65 2e 20 2a  rly otherwise. *
c440: 2f 0a 20 20 63 68 65 63 6b 53 63 68 65 6d 61 73  /.  checkSchemas
c450: 4d 61 74 63 68 28 7a 54 61 62 29 3b 0a 0a 20 20  Match(zTab);..  
c460: 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61  pStmt = db_prepa
c470: 72 65 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  re("PRAGMA main.
c480: 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20  table_info=%Q", 
c490: 7a 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  zTab);.  while( 
c4a0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
c4b0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
c4c0: 29 7b 0a 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20  ){.    nCol++;. 
c4d0: 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74     azCol = sqlit
c4e0: 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c  e3_realloc(azCol
c4f0: 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  , sizeof(char*)*
c500: 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 61  nCol);.    if( a
c510: 7a 43 6f 6c 3d 3d 30 20 29 20 72 75 6e 74 69 6d  zCol==0 ) runtim
c520: 65 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d  eError("out of m
c530: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 61 69 46  emory");.    aiF
c540: 6c 67 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  lg = sqlite3_rea
c550: 6c 6c 6f 63 28 61 69 46 6c 67 2c 20 73 69 7a 65  lloc(aiFlg, size
c560: 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 29 3b 0a 20  of(int)*nCol);. 
c570: 20 20 20 69 66 28 20 61 69 46 6c 67 3d 3d 30 20     if( aiFlg==0 
c580: 29 20 72 75 6e 74 69 6d 65 45 72 72 6f 72 28 22  ) runtimeError("
c590: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
c5a0: 0a 20 20 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2d  .    azCol[nCol-
c5b0: 31 5d 20 3d 20 73 61 66 65 49 64 28 28 63 6f 6e  1] = safeId((con
c5c0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
c5d0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
c5e0: 6d 74 2c 31 29 29 3b 0a 20 20 20 20 61 69 46 6c  mt,1));.    aiFl
c5f0: 67 5b 6e 43 6f 6c 2d 31 5d 20 3d 20 69 20 3d 20  g[nCol-1] = i = 
c600: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
c610: 6e 74 28 70 53 74 6d 74 2c 35 29 3b 0a 20 20 20  nt(pStmt,5);.   
c620: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
c630: 20 20 69 66 28 20 69 3e 6e 50 6b 20 29 7b 0a 20    if( i>nPk ){. 
c640: 20 20 20 20 20 20 20 6e 50 6b 20 3d 20 69 3b 0a         nPk = i;.
c650: 20 20 20 20 20 20 20 20 61 69 50 6b 20 3d 20 73          aiPk = s
c660: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
c670: 69 50 6b 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  iPk, sizeof(int)
c680: 2a 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  *nPk);.        i
c690: 66 28 20 61 69 50 6b 3d 3d 30 20 29 20 72 75 6e  f( aiPk==0 ) run
c6a0: 74 69 6d 65 45 72 72 6f 72 28 22 6f 75 74 20 6f  timeError("out o
c6b0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
c6c0: 20 20 7d 0a 20 20 20 20 20 20 61 69 50 6b 5b 69    }.      aiPk[i
c6d0: 2d 31 5d 20 3d 20 6e 43 6f 6c 2d 31 3b 0a 20 20  -1] = nCol-1;.  
c6e0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
c6f0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
c700: 29 3b 0a 20 20 69 66 28 20 6e 50 6b 3d 3d 30 20  );.  if( nPk==0 
c710: 29 20 67 6f 74 6f 20 65 6e 64 5f 63 68 61 6e 67  ) goto end_chang
c720: 65 73 65 74 5f 6f 6e 65 5f 74 61 62 6c 65 3b 20  eset_one_table; 
c730: 0a 20 20 73 74 72 49 6e 69 74 28 26 73 71 6c 29  .  strInit(&sql)
c740: 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 3e 6e 50 6b  ;.  if( nCol>nPk
c750: 20 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74   ){.    strPrint
c760: 66 28 26 73 71 6c 2c 20 22 53 45 4c 45 43 54 20  f(&sql, "SELECT 
c770: 25 64 22 2c 20 53 51 4c 49 54 45 5f 55 50 44 41  %d", SQLITE_UPDA
c780: 54 45 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  TE);.    for(i=0
c790: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
c7a0: 20 20 20 20 20 20 69 66 28 20 61 69 46 6c 67 5b        if( aiFlg[
c7b0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i] ){.        st
c7c0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c  rPrintf(&sql, ",
c7d0: 5c 6e 20 20 20 20 20 20 20 41 2e 25 73 22 2c 20  \n       A.%s", 
c7e0: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
c7f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c800: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
c810: 22 2c 5c 6e 20 20 20 20 20 20 20 41 2e 25 73 20  ",\n       A.%s 
c820: 49 53 20 4e 4f 54 20 42 2e 25 73 2c 20 41 2e 25  IS NOT B.%s, A.%
c830: 73 2c 20 42 2e 25 73 22 2c 0a 20 20 20 20 20 20  s, B.%s",.      
c840: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f              azCo
c850: 6c 5b 69 5d 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20  l[i], azCol[i], 
c860: 61 7a 43 6f 6c 5b 69 5d 2c 20 61 7a 43 6f 6c 5b  azCol[i], azCol[
c870: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
c880: 20 7d 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66   }.    strPrintf
c890: 28 26 73 71 6c 2c 22 5c 6e 20 20 46 52 4f 4d 20  (&sql,"\n  FROM 
c8a0: 6d 61 69 6e 2e 25 73 20 41 2c 20 61 75 78 2e 25  main.%s A, aux.%
c8b0: 73 20 42 5c 6e 22 2c 20 7a 49 64 2c 20 7a 49 64  s B\n", zId, zId
c8c0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 20  );.    zSep = " 
c8d0: 57 48 45 52 45 22 3b 0a 20 20 20 20 66 6f 72 28  WHERE";.    for(
c8e0: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
c8f0: 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74  {.      strPrint
c900: 66 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73  f(&sql, "%s A.%s
c910: 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a  =B.%s", zSep, az
c920: 43 6f 6c 5b 61 69 50 6b 5b 69 5d 5d 2c 20 61 7a  Col[aiPk[i]], az
c930: 43 6f 6c 5b 61 69 50 6b 5b 69 5d 5d 29 3b 0a 20  Col[aiPk[i]]);. 
c940: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e       zSep = " AN
c950: 44 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  D";.    }.    zS
c960: 65 70 20 3d 20 22 5c 6e 20 20 20 41 4e 44 20 28  ep = "\n   AND (
c970: 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
c980: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
c990: 20 20 20 20 69 66 28 20 61 69 46 6c 67 5b 69 5d      if( aiFlg[i]
c9a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c9b0: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
c9c0: 6c 2c 20 22 25 73 41 2e 25 73 20 49 53 20 4e 4f  l, "%sA.%s IS NO
c9d0: 54 20 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61  T B.%s", zSep, a
c9e0: 7a 43 6f 6c 5b 69 5d 2c 20 61 7a 43 6f 6c 5b 69  zCol[i], azCol[i
c9f0: 5d 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d  ]);.      zSep =
ca00: 20 22 20 4f 52 5c 6e 20 20 20 20 20 20 20 20 22   " OR\n        "
ca10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72 50  ;.    }.    strP
ca20: 72 69 6e 74 66 28 26 73 71 6c 2c 22 29 5c 6e 20  rintf(&sql,")\n 
ca30: 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b 0a 20  UNION ALL\n");. 
ca40: 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26   }.  strPrintf(&
ca50: 73 71 6c 2c 20 22 53 45 4c 45 43 54 20 25 64 22  sql, "SELECT %d"
ca60: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 29  , SQLITE_DELETE)
ca70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
ca80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
ca90: 66 28 20 61 69 46 6c 67 5b 69 5d 20 29 7b 0a 20  f( aiFlg[i] ){. 
caa0: 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26       strPrintf(&
cab0: 73 71 6c 2c 20 22 2c 5c 6e 20 20 20 20 20 20 20  sql, ",\n       
cac0: 41 2e 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29  A.%s", azCol[i])
cad0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cae0: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
caf0: 6c 2c 20 22 2c 5c 6e 20 20 20 20 20 20 20 31 2c  l, ",\n       1,
cb00: 20 41 2e 25 73 2c 20 4e 55 4c 4c 22 2c 20 61 7a   A.%s, NULL", az
cb10: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Col[i]);.    }. 
cb20: 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26   }.  strPrintf(&
cb30: 73 71 6c 2c 20 22 5c 6e 20 20 46 52 4f 4d 20 6d  sql, "\n  FROM m
cb40: 61 69 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a 49 64  ain.%s A\n", zId
cb50: 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26  );.  strPrintf(&
cb60: 73 71 6c 2c 20 22 20 57 48 45 52 45 20 4e 4f 54  sql, " WHERE NOT
cb70: 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31   EXISTS(SELECT 1
cb80: 20 46 52 4f 4d 20 61 75 78 2e 25 73 20 42 5c 6e   FROM aux.%s B\n
cb90: 22 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20  ", zId);.  zSep 
cba0: 3d 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20  =          "    
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
cbc0: 48 45 52 45 22 3b 0a 20 20 66 6f 72 28 69 3d 30  HERE";.  for(i=0
cbd0: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
cbe0: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
cbf0: 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e 25 73  l, "%s A.%s=B.%s
cc00: 22 2c 20 7a 53 65 70 2c 20 61 7a 43 6f 6c 5b 61  ", zSep, azCol[a
cc10: 69 50 6b 5b 69 5d 5d 2c 20 61 7a 43 6f 6c 5b 61  iPk[i]], azCol[a
cc20: 69 50 6b 5b 69 5d 5d 29 3b 0a 20 20 20 20 7a 53  iPk[i]]);.    zS
cc30: 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20 7d  ep = " AND";.  }
cc40: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
cc50: 6c 2c 20 22 29 5c 6e 20 55 4e 49 4f 4e 20 41 4c  l, ")\n UNION AL
cc60: 4c 5c 6e 22 29 3b 0a 20 20 73 74 72 50 72 69 6e  L\n");.  strPrin
cc70: 74 66 28 26 73 71 6c 2c 20 22 53 45 4c 45 43 54  tf(&sql, "SELECT
cc80: 20 25 64 22 2c 20 53 51 4c 49 54 45 5f 49 4e 53   %d", SQLITE_INS
cc90: 45 52 54 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ERT);.  for(i=0;
cca0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
ccb0: 20 20 20 69 66 28 20 61 69 46 6c 67 5b 69 5d 20     if( aiFlg[i] 
ccc0: 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e  ){.      strPrin
ccd0: 74 66 28 26 73 71 6c 2c 20 22 2c 5c 6e 20 20 20  tf(&sql, ",\n   
cce0: 20 20 20 20 42 2e 25 73 22 2c 20 61 7a 43 6f 6c      B.%s", azCol
ccf0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [i]);.    }else{
cd00: 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66  .      strPrintf
cd10: 28 26 73 71 6c 2c 20 22 2c 5c 6e 20 20 20 20 20  (&sql, ",\n     
cd20: 20 20 31 2c 20 4e 55 4c 4c 2c 20 42 2e 25 73 22    1, NULL, B.%s"
cd30: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
cd40: 20 7d 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e   }.  }.  strPrin
cd50: 74 66 28 26 73 71 6c 2c 20 22 5c 6e 20 20 46 52  tf(&sql, "\n  FR
cd60: 4f 4d 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20  OM aux.%s B\n", 
cd70: 7a 49 64 29 3b 0a 20 20 73 74 72 50 72 69 6e 74  zId);.  strPrint
cd80: 66 28 26 73 71 6c 2c 20 22 20 57 48 45 52 45 20  f(&sql, " WHERE 
cd90: 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43  NOT EXISTS(SELEC
cda0: 54 20 31 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73  T 1 FROM main.%s
cdb0: 20 41 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 7a   A\n", zId);.  z
cdc0: 53 65 70 20 3d 20 20 20 20 20 20 20 20 20 20 22  Sep =          "
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 20 57 48 45 52 45 22 3b 0a 20 20 66 6f 72     WHERE";.  for
cdf0: 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  (i=0; i<nPk; i++
ce00: 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  ){.    strPrintf
ce10: 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d  (&sql, "%s A.%s=
ce20: 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 43  B.%s", zSep, azC
ce30: 6f 6c 5b 61 69 50 6b 5b 69 5d 5d 2c 20 61 7a 43  ol[aiPk[i]], azC
ce40: 6f 6c 5b 61 69 50 6b 5b 69 5d 5d 29 3b 0a 20 20  ol[aiPk[i]]);.  
ce50: 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 22 3b    zSep = " AND";
ce60: 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66  .  }.  strPrintf
ce70: 28 26 73 71 6c 2c 20 22 29 5c 6e 22 29 3b 0a 20  (&sql, ")\n");. 
ce80: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
ce90: 20 22 20 4f 52 44 45 52 20 42 59 22 29 3b 0a 20   " ORDER BY");. 
cea0: 20 7a 53 65 70 20 3d 20 22 20 22 3b 0a 20 20 66   zSep = " ";.  f
ceb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  or(i=0; i<nPk; i
cec0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e  ++){.    strPrin
ced0: 74 66 28 26 73 71 6c 2c 20 22 25 73 20 25 64 22  tf(&sql, "%s %d"
cee0: 2c 20 7a 53 65 70 2c 20 61 69 50 6b 5b 69 5d 2b  , zSep, aiPk[i]+
cef0: 32 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  2);.    zSep = "
cf00: 2c 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69  ,";.  }.  strPri
cf10: 6e 74 66 28 26 73 71 6c 2c 20 22 3b 5c 6e 22 29  ntf(&sql, ";\n")
cf20: 3b 0a 0a 20 20 69 66 28 20 67 2e 66 44 65 62 75  ;..  if( g.fDebu
cf30: 67 20 26 20 44 45 42 55 47 5f 44 49 46 46 5f 53  g & DEBUG_DIFF_S
cf40: 51 4c 20 29 7b 20 0a 20 20 20 20 70 72 69 6e 74  QL ){ .    print
cf50: 66 28 22 53 51 4c 20 66 6f 72 20 25 73 3a 5c 6e  f("SQL for %s:\n
cf60: 25 73 5c 6e 22 2c 20 7a 49 64 2c 20 73 71 6c 2e  %s\n", zId, sql.
cf70: 7a 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  z);.    goto end
cf80: 5f 63 68 61 6e 67 65 73 65 74 5f 6f 6e 65 5f 74  _changeset_one_t
cf90: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 70 75 74  able;.  }..  put
cfa0: 63 28 27 54 27 2c 20 6f 75 74 29 3b 0a 20 20 70  c('T', out);.  p
cfb0: 75 74 73 56 61 72 69 6e 74 28 6f 75 74 2c 20 28  utsVarint(out, (
cfc0: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6e  sqlite3_uint64)n
cfd0: 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Col);.  for(i=0;
cfe0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 20 70 75   i<nCol; i++) pu
cff0: 74 63 28 61 69 46 6c 67 5b 69 5d 21 3d 30 2c 20  tc(aiFlg[i]!=0, 
d000: 6f 75 74 29 3b 0a 20 20 66 77 72 69 74 65 28 7a  out);.  fwrite(z
d010: 54 61 62 2c 20 31 2c 20 73 74 72 6c 65 6e 28 7a  Tab, 1, strlen(z
d020: 54 61 62 29 2c 20 6f 75 74 29 3b 0a 20 20 70 75  Tab), out);.  pu
d030: 74 63 28 30 2c 20 6f 75 74 29 3b 0a 0a 20 20 70  tc(0, out);..  p
d040: 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72  Stmt = db_prepar
d050: 65 28 22 25 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a  e("%s", sql.z);.
d060: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
d070: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
d080: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
d090: 69 6e 74 20 69 54 79 70 65 20 3d 20 73 71 6c 69  int iType = sqli
d0a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
d0b0: 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20 70 75 74  Stmt,0);.    put
d0c0: 63 28 69 54 79 70 65 2c 20 6f 75 74 29 3b 0a 20  c(iType, out);. 
d0d0: 20 20 20 70 75 74 63 28 30 2c 20 6f 75 74 29 3b     putc(0, out);
d0e0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c  .    switch( sql
d0f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
d100: 70 53 74 6d 74 2c 30 29 20 29 7b 0a 20 20 20 20  pStmt,0) ){.    
d110: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50    case SQLITE_UP
d120: 44 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  DATE: {.        
d130: 66 6f 72 28 6b 3d 31 2c 20 69 3d 30 3b 20 69 3c  for(k=1, i=0; i<
d140: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
d150: 20 20 20 20 20 20 69 66 28 20 61 69 46 6c 67 5b        if( aiFlg[
d160: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
d170: 20 20 70 75 74 56 61 6c 75 65 28 6f 75 74 2c 20    putValue(out, 
d180: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
d190: 61 6c 75 65 28 70 53 74 6d 74 2c 6b 29 29 3b 0a  alue(pStmt,k));.
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b              k++;
d1b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
d1c0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
d1d0: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 6b 29  umn_int(pStmt,k)
d1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d1f0: 70 75 74 56 61 6c 75 65 28 6f 75 74 2c 20 73 71  putValue(out, sq
d200: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
d210: 75 65 28 70 53 74 6d 74 2c 6b 2b 31 29 29 3b 0a  ue(pStmt,k+1));.
d220: 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 2b 3d              k +=
d230: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   3;.          }e
d240: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d250: 20 70 75 74 63 28 30 2c 20 6f 75 74 29 3b 0a 20   putc(0, out);. 
d260: 20 20 20 20 20 20 20 20 20 20 20 6b 20 2b 3d 20             k += 
d270: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  3;.          }. 
d280: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d290: 20 66 6f 72 28 6b 3d 31 2c 20 69 3d 30 3b 20 69   for(k=1, i=0; i
d2a0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
d2b0: 20 20 20 20 20 20 20 69 66 28 20 61 69 46 6c 67         if( aiFlg
d2c0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [i] ){.         
d2d0: 20 20 20 70 75 74 63 28 30 2c 20 6f 75 74 29 3b     putc(0, out);
d2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 2b 2b  .            k++
d2f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
d300: 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f  e if( sqlite3_co
d310: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 6b  lumn_int(pStmt,k
d320: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d330: 20 70 75 74 56 61 6c 75 65 28 6f 75 74 2c 20 73   putValue(out, s
d340: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
d350: 6c 75 65 28 70 53 74 6d 74 2c 6b 2b 32 29 29 3b  lue(pStmt,k+2));
d360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 2b  .            k +
d370: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
d380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d390: 20 20 70 75 74 63 28 30 2c 20 6f 75 74 29 3b 0a    putc(0, out);.
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 2b 3d              k +=
d3b0: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   3;.          }.
d3c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d3d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d3e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
d3f0: 54 45 5f 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20  TE_INSERT: {.   
d400: 20 20 20 20 20 66 6f 72 28 6b 3d 31 2c 20 69 3d       for(k=1, i=
d410: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
d420: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
d430: 69 46 6c 67 5b 69 5d 20 29 7b 0a 20 20 20 20 20  iFlg[i] ){.     
d440: 20 20 20 20 20 20 20 70 75 74 56 61 6c 75 65 28         putValue(
d450: 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  out, sqlite3_col
d460: 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c  umn_value(pStmt,
d470: 6b 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  k));.           
d480: 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   k++;.          
d490: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d4a0: 20 20 20 70 75 74 56 61 6c 75 65 28 6f 75 74 2c     putValue(out,
d4b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d4c0: 76 61 6c 75 65 28 70 53 74 6d 74 2c 6b 2b 32 29  value(pStmt,k+2)
d4d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  );.            k
d4e0: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
d4f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d510: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
d520: 51 4c 49 54 45 5f 44 45 4c 45 54 45 3a 20 7b 0a  QLITE_DELETE: {.
d530: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 2c          for(k=1,
d540: 20 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b   i=0; i<nCol; i+
d550: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
d560: 28 20 61 69 46 6c 67 5b 69 5d 20 29 7b 0a 20 20  ( aiFlg[i] ){.  
d570: 20 20 20 20 20 20 20 20 20 20 70 75 74 56 61 6c            putVal
d580: 75 65 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f  ue(out, sqlite3_
d590: 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74  column_value(pSt
d5a0: 6d 74 2c 6b 29 29 3b 0a 20 20 20 20 20 20 20 20  mt,k));.        
d5b0: 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 20      k++;.       
d5c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5d0: 20 20 20 20 20 20 70 75 74 56 61 6c 75 65 28 6f        putValue(o
d5e0: 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ut, sqlite3_colu
d5f0: 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 6b  mn_value(pStmt,k
d600: 2b 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1));.          
d610: 20 20 6b 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20    k += 3;.      
d620: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d630: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d640: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d650: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
d660: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 0a 65  ize(pStmt);.  .e
d670: 6e 64 5f 63 68 61 6e 67 65 73 65 74 5f 6f 6e 65  nd_changeset_one
d680: 5f 74 61 62 6c 65 3a 0a 20 20 77 68 69 6c 65 28  _table:.  while(
d690: 20 6e 43 6f 6c 3e 30 20 29 20 73 71 6c 69 74 65   nCol>0 ) sqlite
d6a0: 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 2d 2d 6e  3_free(azCol[--n
d6b0: 43 6f 6c 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  Col]);.  sqlite3
d6c0: 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20  _free(azCol);.  
d6d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 69 50  sqlite3_free(aiP
d6e0: 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  k);.  sqlite3_fr
d6f0: 65 65 28 7a 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee(zId);.}../*.*
d700: 2a 20 50 72 69 6e 74 20 73 6b 65 74 63 68 79 20  * Print sketchy 
d710: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
d720: 72 20 74 68 69 73 20 75 74 69 6c 69 74 79 20 70  r this utility p
d730: 72 6f 67 72 61 6d 0a 2a 2f 0a 73 74 61 74 69 63  rogram.*/.static
d740: 20 76 6f 69 64 20 73 68 6f 77 48 65 6c 70 28 76   void showHelp(v
d750: 6f 69 64 29 7b 0a 20 20 70 72 69 6e 74 66 28 22  oid){.  printf("
d760: 55 73 61 67 65 3a 20 25 73 20 5b 6f 70 74 69 6f  Usage: %s [optio
d770: 6e 73 5d 20 44 42 31 20 44 42 32 5c 6e 22 2c 20  ns] DB1 DB2\n", 
d780: 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 70 72 69  g.zArgv0);.  pri
d790: 6e 74 66 28 0a 22 4f 75 74 70 75 74 20 53 51 4c  ntf(."Output SQL
d7a0: 20 74 65 78 74 20 74 68 61 74 20 77 6f 75 6c 64   text that would
d7b0: 20 74 72 61 6e 73 66 6f 72 6d 20 44 42 31 20 69   transform DB1 i
d7c0: 6e 74 6f 20 44 42 32 2e 5c 6e 22 0a 22 4f 70 74  nto DB2.\n"."Opt
d7d0: 69 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d 2d 63 68  ions:\n"."  --ch
d7e0: 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20 20  angeset FILE    
d7f0: 20 20 57 72 69 74 65 20 61 20 43 48 41 4e 47 45    Write a CHANGE
d800: 53 45 54 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22  SET into FILE\n"
d810: 0a 22 20 20 2d 4c 7c 2d 2d 6c 69 62 20 4c 49 42  ."  -L|--lib LIB
d820: 52 41 52 59 20 20 20 20 20 20 4c 6f 61 64 20 61  RARY      Load a
d830: 6e 20 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69  n SQLite extensi
d840: 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22 0a 22 20  on library\n"." 
d850: 20 2d 2d 70 72 69 6d 61 72 79 6b 65 79 20 20 20   --primarykey   
d860: 20 20 20 20 20 20 20 55 73 65 20 73 63 68 65 6d         Use schem
d870: 61 2d 64 65 66 69 6e 65 64 20 50 52 49 4d 41 52  a-defined PRIMAR
d880: 59 20 4b 45 59 73 5c 6e 22 0a 22 20 20 2d 2d 72  Y KEYs\n"."  --r
d890: 62 75 20 20 20 20 20 20 20 20 20 20 20 20 20 20  bu              
d8a0: 20 20 20 4f 75 74 70 75 74 20 53 51 4c 20 74 6f     Output SQL to
d8b0: 20 63 72 65 61 74 65 2f 70 6f 70 75 6c 61 74 65   create/populate
d8c0: 20 52 42 55 20 74 61 62 6c 65 28 73 29 5c 6e 22   RBU table(s)\n"
d8d0: 0a 22 20 20 2d 2d 73 63 68 65 6d 61 20 20 20 20  ."  --schema    
d8e0: 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6f            Show o
d8f0: 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 73 20  nly differences 
d900: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 5c 6e 22  in the schema\n"
d910: 0a 22 20 20 2d 2d 73 75 6d 6d 61 72 79 20 20 20  ."  --summary   
d920: 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6f            Show o
d930: 6e 6c 79 20 61 20 73 75 6d 6d 61 72 79 20 6f 66  nly a summary of
d940: 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 73   the differences
d950: 5c 6e 22 0a 22 20 20 2d 2d 74 61 62 6c 65 20 54  \n"."  --table T
d960: 41 42 20 20 20 20 20 20 20 20 20 20 20 53 68 6f  AB           Sho
d970: 77 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63  w only differenc
d980: 65 73 20 69 6e 20 74 61 62 6c 65 20 54 41 42 5c  es in table TAB\
d990: 6e 22 0a 20 20 29 3b 0a 7d 0a 0a 69 6e 74 20 6d  n".  );.}..int m
d9a0: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
d9b0: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f  ar **argv){.  co
d9c0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 31 20 3d  nst char *zDb1 =
d9d0: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
d9e0: 20 2a 7a 44 62 32 20 3d 20 30 3b 0a 20 20 69 6e   *zDb2 = 0;.  in
d9f0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  t i;.  int rc;. 
da00: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
da10: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
da20: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
da30: 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *pStmt;.  char 
da40: 2a 7a 54 61 62 20 3d 20 30 3b 0a 20 20 46 49 4c  *zTab = 0;.  FIL
da50: 45 20 2a 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  E *out = stdout;
da60: 0a 20 20 76 6f 69 64 20 28 2a 78 44 69 66 66 29  .  void (*xDiff)
da70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 46 49 4c  (const char*,FIL
da80: 45 2a 29 20 3d 20 64 69 66 66 5f 6f 6e 65 5f 74  E*) = diff_one_t
da90: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 45 78 74  able;.  int nExt
daa0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61   = 0;.  char **a
dab0: 7a 45 78 74 20 3d 20 30 3b 0a 0a 20 20 67 2e 7a  zExt = 0;..  g.z
dac0: 41 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b  Argv0 = argv[0];
dad0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
dae0: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
daf0: 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a 20  SINGLETHREAD);. 
db00: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
db10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
db20: 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76  t char *z = argv
db30: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [i];.    if( z[0
db40: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
db50: 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  z++;.      if( z
db60: 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [0]=='-' ) z++;.
db70: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
db80: 28 7a 2c 22 63 68 61 6e 67 65 73 65 74 22 29 3d  (z,"changeset")=
db90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
dba0: 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 63 6d  ( i==argc-1 ) cm
dbb0: 64 6c 69 6e 65 45 72 72 6f 72 28 22 6d 69 73 73  dlineError("miss
dbc0: 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ing argument to 
dbd0: 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  %s", argv[i]);. 
dbe0: 20 20 20 20 20 20 20 6f 75 74 20 3d 20 66 6f 70         out = fop
dbf0: 65 6e 28 61 72 67 76 5b 2b 2b 69 5d 2c 20 22 77  en(argv[++i], "w
dc00: 62 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b");.        if(
dc10: 20 6f 75 74 3d 3d 30 20 29 20 63 6d 64 6c 69 6e   out==0 ) cmdlin
dc20: 65 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f  eError("cannot o
dc30: 70 65 6e 3a 20 25 73 22 2c 20 61 72 67 76 5b 69  pen: %s", argv[i
dc40: 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 44 69 66  ]);.        xDif
dc50: 66 20 3d 20 63 68 61 6e 67 65 73 65 74 5f 6f 6e  f = changeset_on
dc60: 65 5f 74 61 62 6c 65 3b 0a 20 20 20 20 20 20 7d  e_table;.      }
dc70: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
dc80: 74 72 63 6d 70 28 7a 2c 22 64 65 62 75 67 22 29  trcmp(z,"debug")
dc90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
dca0: 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 63  f( i==argc-1 ) c
dcb0: 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 6d 69 73  mdlineError("mis
dcc0: 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 74 6f  sing argument to
dcd0: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
dce0: 20 20 20 20 20 20 20 20 67 2e 66 44 65 62 75 67          g.fDebug
dcf0: 20 3d 20 73 74 72 74 6f 6c 28 61 72 67 76 5b 2b   = strtol(argv[+
dd00: 2b 69 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  +i], 0, 0);.    
dd10: 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
dd20: 28 20 73 74 72 63 6d 70 28 7a 2c 22 68 65 6c 70  ( strcmp(z,"help
dd30: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
dd40: 20 73 68 6f 77 48 65 6c 70 28 29 3b 0a 20 20 20   showHelp();.   
dd50: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
dd60: 20 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64       }else.#ifnd
dd70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
dd80: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
dd90: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
dda0: 2c 22 6c 69 62 22 29 3d 3d 30 20 7c 7c 20 73 74  ,"lib")==0 || st
ddb0: 72 63 6d 70 28 7a 2c 22 4c 22 29 3d 3d 30 20 29  rcmp(z,"L")==0 )
ddc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
ddd0: 3d 61 72 67 63 2d 31 20 29 20 63 6d 64 6c 69 6e  =argc-1 ) cmdlin
dde0: 65 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20  eError("missing 
ddf0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 22 2c  argument to %s",
de00: 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20   argv[i]);.     
de10: 20 20 20 61 7a 45 78 74 20 3d 20 72 65 61 6c 6c     azExt = reall
de20: 6f 63 28 61 7a 45 78 74 2c 20 73 69 7a 65 6f 66  oc(azExt, sizeof
de30: 28 61 7a 45 78 74 5b 30 5d 29 2a 28 6e 45 78 74  (azExt[0])*(nExt
de40: 2b 31 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +1));.        if
de50: 28 20 61 7a 45 78 74 3d 3d 30 20 29 20 63 6d 64  ( azExt==0 ) cmd
de60: 6c 69 6e 65 45 72 72 6f 72 28 22 6f 75 74 20 6f  lineError("out o
de70: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
de80: 20 20 20 20 61 7a 45 78 74 5b 6e 45 78 74 2b 2b      azExt[nExt++
de90: 5d 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20  ] = argv[++i];. 
dea0: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
deb0: 66 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  f.      if( strc
dec0: 6d 70 28 7a 2c 22 70 72 69 6d 61 72 79 6b 65 79  mp(z,"primarykey
ded0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
dee0: 20 67 2e 62 53 63 68 65 6d 61 50 4b 20 3d 20 31   g.bSchemaPK = 1
def0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
df00: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
df10: 2c 22 72 62 75 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"rbu")==0 ){.  
df20: 20 20 20 20 20 20 78 44 69 66 66 20 3d 20 72 62        xDiff = rb
df30: 75 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b  udiff_one_table;
df40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
df50: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
df60: 22 73 63 68 65 6d 61 22 29 3d 3d 30 20 29 7b 0a  "schema")==0 ){.
df70: 20 20 20 20 20 20 20 20 67 2e 62 53 63 68 65 6d          g.bSchem
df80: 61 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  aOnly = 1;.     
df90: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
dfa0: 20 73 74 72 63 6d 70 28 7a 2c 22 73 75 6d 6d 61   strcmp(z,"summa
dfb0: 72 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ry")==0 ){.     
dfc0: 20 20 20 78 44 69 66 66 20 3d 20 73 75 6d 6d 61     xDiff = summa
dfd0: 72 69 7a 65 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a  rize_one_table;.
dfe0: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
dff0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
e000: 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  table")==0 ){.  
e010: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 61 72 67        if( i==arg
e020: 63 2d 31 20 29 20 63 6d 64 6c 69 6e 65 45 72 72  c-1 ) cmdlineErr
e030: 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75  or("missing argu
e040: 6d 65 6e 74 20 74 6f 20 25 73 22 2c 20 61 72 67  ment to %s", arg
e050: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a  v[i]);.        z
e060: 54 61 62 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b  Tab = argv[++i];
e070: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
e080: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6d 64     {.        cmd
e090: 6c 69 6e 65 45 72 72 6f 72 28 22 75 6e 6b 6e 6f  lineError("unkno
e0a0: 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20  wn option: %s", 
e0b0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
e0c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
e0d0: 7a 44 62 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zDb1==0 ){.     
e0e0: 20 7a 44 62 31 20 3d 20 61 72 67 76 5b 69 5d 3b   zDb1 = argv[i];
e0f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
e100: 44 62 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db2==0 ){.      
e110: 7a 44 62 32 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  zDb2 = argv[i];.
e120: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e130: 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 75   cmdlineError("u
e140: 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a  nknown argument:
e150: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
e160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e170: 7a 44 62 32 3d 3d 30 20 29 7b 0a 20 20 20 20 63  zDb2==0 ){.    c
e180: 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 74 77 6f  mdlineError("two
e190: 20 64 61 74 61 62 61 73 65 20 61 72 67 75 6d 65   database argume
e1a0: 6e 74 73 20 72 65 71 75 69 72 65 64 22 29 3b 0a  nts required");.
e1b0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
e1c0: 65 33 5f 6f 70 65 6e 28 7a 44 62 31 2c 20 26 67  e3_open(zDb1, &g
e1d0: 2e 64 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29  .db);.  if( rc )
e1e0: 7b 0a 20 20 20 20 63 6d 64 6c 69 6e 65 45 72 72  {.    cmdlineErr
e1f0: 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or("cannot open 
e200: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
e210: 25 73 5c 22 22 2c 20 7a 44 62 31 29 3b 0a 20 20  %s\"", zDb1);.  
e220: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
e230: 5f 65 78 65 63 28 67 2e 64 62 2c 20 22 53 45 4c  _exec(g.db, "SEL
e240: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
e250: 65 5f 6d 61 73 74 65 72 22 2c 20 30 2c 20 30 2c  e_master", 0, 0,
e260: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
e270: 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20  ( rc || zErrMsg 
e280: 29 7b 0a 20 20 20 20 63 6d 64 6c 69 6e 65 45 72  ){.    cmdlineEr
e290: 72 6f 72 28 22 5c 22 25 73 5c 22 20 64 6f 65 73  ror("\"%s\" does
e2a0: 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62   not appear to b
e2b0: 65 20 61 20 76 61 6c 69 64 20 53 51 4c 69 74 65  e a valid SQLite
e2c0: 20 64 61 74 61 62 61 73 65 22 2c 20 7a 44 62 31   database", zDb1
e2d0: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
e2e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
e2f0: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 73 71 6c 69  EXTENSION.  sqli
e300: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
e310: 65 78 74 65 6e 73 69 6f 6e 28 67 2e 64 62 2c 20  extension(g.db, 
e320: 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1);.  for(i=0; i
e330: 3c 6e 45 78 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nExt; i++){.   
e340: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f   rc = sqlite3_lo
e350: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 67 2e 64  ad_extension(g.d
e360: 62 2c 20 61 7a 45 78 74 5b 69 5d 2c 20 30 2c 20  b, azExt[i], 0, 
e370: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69  &zErrMsg);.    i
e380: 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67  f( rc || zErrMsg
e390: 20 29 7b 0a 20 20 20 20 20 20 63 6d 64 6c 69 6e   ){.      cmdlin
e3a0: 65 45 72 72 6f 72 28 22 65 72 72 6f 72 20 6c 6f  eError("error lo
e3b0: 61 64 69 6e 67 20 25 73 3a 20 25 73 22 2c 20 61  ading %s: %s", a
e3c0: 7a 45 78 74 5b 69 5d 2c 20 7a 45 72 72 4d 73 67  zExt[i], zErrMsg
e3d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
e3e0: 64 69 66 0a 20 20 66 72 65 65 28 61 7a 45 78 74  dif.  free(azExt
e3f0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
e400: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 41 54 54  te3_mprintf("ATT
e410: 41 43 48 20 25 51 20 61 73 20 61 75 78 3b 22 2c  ACH %Q as aux;",
e420: 20 7a 44 62 32 29 3b 0a 20 20 72 63 20 3d 20 73   zDb2);.  rc = s
e430: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62  qlite3_exec(g.db
e440: 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a  , zSql, 0, 0, &z
e450: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
e460: 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a  c || zErrMsg ){.
e470: 20 20 20 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72      cmdlineError
e480: 28 22 63 61 6e 6e 6f 74 20 61 74 74 61 63 68 20  ("cannot attach 
e490: 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22  database \"%s\""
e4a0: 2c 20 7a 44 62 32 29 3b 0a 20 20 7d 0a 20 20 72  , zDb2);.  }.  r
e4b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
e4c0: 28 67 2e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  (g.db, "SELECT *
e4d0: 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65   FROM aux.sqlite
e4e0: 5f 6d 61 73 74 65 72 22 2c 20 30 2c 20 30 2c 20  _master", 0, 0, 
e4f0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
e500: 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29   rc || zErrMsg )
e510: 7b 0a 20 20 20 20 63 6d 64 6c 69 6e 65 45 72 72  {.    cmdlineErr
e520: 6f 72 28 22 5c 22 25 73 5c 22 20 64 6f 65 73 20  or("\"%s\" does 
e530: 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62 65  not appear to be
e540: 20 61 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20   a valid SQLite 
e550: 64 61 74 61 62 61 73 65 22 2c 20 7a 44 62 32 29  database", zDb2)
e560: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61  ;.  }..  if( zTa
e570: 62 20 29 7b 0a 20 20 20 20 78 44 69 66 66 28 7a  b ){.    xDiff(z
e580: 54 61 62 2c 20 6f 75 74 29 3b 0a 20 20 7d 65 6c  Tab, out);.  }el
e590: 73 65 7b 0a 20 20 20 20 2f 2a 20 48 61 6e 64 6c  se{.    /* Handl
e5a0: 65 20 74 61 62 6c 65 73 20 6f 6e 65 20 62 79 20  e tables one by 
e5b0: 6f 6e 65 20 2a 2f 0a 20 20 20 20 70 53 74 6d 74  one */.    pStmt
e5c0: 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28 0a 20   = db_prepare(. 
e5d0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
e5e0: 65 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69  e FROM main.sqli
e5f0: 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20  te_master\n".   
e600: 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d     " WHERE type=
e610: 27 74 61 62 6c 65 27 20 41 4e 44 20 73 71 6c 20  'table' AND sql 
e620: 4e 4f 54 20 4c 49 4b 45 20 27 43 52 45 41 54 45  NOT LIKE 'CREATE
e630: 20 56 49 52 54 55 41 4c 25 25 27 5c 6e 22 0a 20   VIRTUAL%%'\n". 
e640: 20 20 20 20 20 22 20 55 4e 49 4f 4e 5c 6e 22 0a       " UNION\n".
e650: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
e660: 6d 65 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69  me FROM aux.sqli
e670: 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20  te_master\n".   
e680: 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d     " WHERE type=
e690: 27 74 61 62 6c 65 27 20 41 4e 44 20 73 71 6c 20  'table' AND sql 
e6a0: 4e 4f 54 20 4c 49 4b 45 20 27 43 52 45 41 54 45  NOT LIKE 'CREATE
e6b0: 20 56 49 52 54 55 41 4c 25 25 27 5c 6e 22 0a 20   VIRTUAL%%'\n". 
e6c0: 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20       " ORDER BY 
e6d0: 6e 61 6d 65 22 0a 20 20 20 20 29 3b 0a 20 20 20  name".    );.   
e6e0: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
e6f0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
e700: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
e710: 20 78 44 69 66 66 28 28 63 6f 6e 73 74 20 63 68   xDiff((const ch
e720: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
e730: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29  mn_text(pStmt,0)
e740: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  , out);.    }.  
e750: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
e760: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a  ze(pStmt);.  }..
e770: 20 20 2f 2a 20 54 42 44 3a 20 48 61 6e 64 6c 65    /* TBD: Handle
e780: 20 74 72 69 67 67 65 72 20 64 69 66 66 65 72 65   trigger differe
e790: 6e 63 65 73 20 2a 2f 0a 20 20 2f 2a 20 54 42 44  nces */.  /* TBD
e7a0: 3a 20 48 61 6e 64 6c 65 20 76 69 65 77 20 64 69  : Handle view di
e7b0: 66 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 73  fferences */.  s
e7c0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64  qlite3_close(g.d
e7d0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  b);.  return 0;.
e7e0: 7d 0a                                            }.