/ Hex Artifact Content
Login

Artifact 4478f0d30230de6adde90bdb0bfe60f68c5ab782:


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 69 6e 74 20 62  ue PK */.  int b
0410: 48 61 6e 64 6c 65 56 74 61 62 3b 20 20 20 20 20  HandleVtab;     
0420: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
0430: 74 73 33 2c 20 66 74 73 34 2c 20 66 74 73 35 20  ts3, fts4, fts5 
0440: 61 6e 64 20 72 74 72 65 65 20 76 74 61 62 73 20  and rtree vtabs 
0450: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 44  */.  unsigned fD
0460: 65 62 75 67 3b 20 20 20 20 20 20 20 20 20 20 2f  ebug;          /
0470: 2a 20 44 65 62 75 67 20 66 6c 61 67 73 20 2a 2f  * Debug flags */
0480: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
04a0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
04b0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 7d 20 67 3b 0a  nection */.} g;.
04c0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
04d0: 61 6c 75 65 73 20 66 6f 72 20 67 2e 66 44 65 62  alues for g.fDeb
04e0: 75 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 45  ug.*/.#define DE
04f0: 42 55 47 5f 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 53  BUG_COLUMN_NAMES
0500: 20 20 30 78 30 30 30 30 30 31 0a 23 64 65 66 69    0x000001.#defi
0510: 6e 65 20 44 45 42 55 47 5f 44 49 46 46 5f 53 51  ne DEBUG_DIFF_SQ
0520: 4c 20 20 20 20 20 20 30 78 30 30 30 30 30 32 0a  L      0x000002.
0530: 0a 2f 2a 0a 2a 2a 20 44 79 6e 61 6d 69 63 20 73  ./*.** Dynamic s
0540: 74 72 69 6e 67 20 6f 62 6a 65 63 74 0a 2a 2f 0a  tring object.*/.
0550: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0560: 74 72 20 53 74 72 3b 0a 73 74 72 75 63 74 20 53  tr Str;.struct S
0570: 74 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20  tr {.  char *z; 
0580: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
0590: 66 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a  f the string */.
05a0: 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20    int nAlloc;   
05b0: 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 6c 6f 63    /* Bytes alloc
05c0: 61 74 65 64 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20  ated in z[] */. 
05d0: 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20 20 20   int nUsed;     
05e0: 20 2f 2a 20 42 79 74 65 73 20 61 63 74 75 61 6c   /* Bytes actual
05f0: 6c 79 20 75 73 65 64 20 69 6e 20 7a 5b 5d 20 2a  ly used in z[] *
0600: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  /.};../*.** Init
0610: 69 61 6c 69 7a 65 20 61 20 53 74 72 20 6f 62 6a  ialize a Str obj
0620: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
0630: 69 64 20 73 74 72 49 6e 69 74 28 53 74 72 20 2a  id strInit(Str *
0640: 70 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 30 3b 0a  p){.  p->z = 0;.
0650: 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b    p->nAlloc = 0;
0660: 0a 20 20 70 2d 3e 6e 55 73 65 64 20 3d 20 30 3b  .  p->nUsed = 0;
0670: 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  .}.  ./*.** Prin
0680: 74 20 61 6e 20 65 72 72 6f 72 20 72 65 73 75 6c  t an error resul
0690: 74 69 6e 67 20 66 72 6f 6d 20 66 61 75 6c 74 69  ting from faulti
06a0: 6e 67 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ng command-line 
06b0: 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 0a 2a 2a  arguments and.**
06c0: 20 61 62 6f 72 74 20 74 68 65 20 70 72 6f 67 72   abort the progr
06d0: 61 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  am..*/.static vo
06e0: 69 64 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28  id cmdlineError(
06f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0700: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0710: 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e  list ap;.  fprin
0720: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20  tf(stderr, "%s: 
0730: 22 2c 20 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20  ", g.zArgv0);.  
0740: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
0750: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
0760: 66 28 73 74 64 65 72 72 2c 20 7a 46 6f 72 6d 61  f(stderr, zForma
0770: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
0780: 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  (ap);.  fprintf(
0790: 73 74 64 65 72 72 2c 20 22 5c 6e 5c 22 25 73 20  stderr, "\n\"%s 
07a0: 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d 6f 72  --help\" for mor
07b0: 65 20 68 65 6c 70 5c 6e 22 2c 20 67 2e 7a 41 72  e help\n", g.zAr
07c0: 67 76 30 29 3b 0a 20 20 65 78 69 74 28 31 29 3b  gv0);.  exit(1);
07d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
07e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
07f0: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 74 68   for an error th
0800: 61 74 20 6f 63 63 75 72 73 20 61 74 20 72 75 6e  at occurs at run
0810: 74 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20 61 62  time, then.** ab
0820: 6f 72 74 20 74 68 65 20 70 72 6f 67 72 61 6d 2e  ort the program.
0830: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0840: 72 75 6e 74 69 6d 65 45 72 72 6f 72 28 63 6f 6e  runtimeError(con
0850: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0860: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
0870: 74 20 61 70 3b 0a 20 20 66 70 72 69 6e 74 66 28  t ap;.  fprintf(
0880: 73 74 64 65 72 72 2c 20 22 25 73 3a 20 22 2c 20  stderr, "%s: ", 
0890: 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 76 61 5f  g.zArgv0);.  va_
08a0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
08b0: 74 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 73  t);.  vfprintf(s
08c0: 74 64 65 72 72 2c 20 7a 46 6f 72 6d 61 74 2c 20  tderr, zFormat, 
08d0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
08e0: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  );.  fprintf(std
08f0: 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 20 20 65 78  err, "\n");.  ex
0900: 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(1);.}../*.** 
0910: 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
0920: 68 65 6c 64 20 62 79 20 61 20 53 74 72 20 6f 62  held by a Str ob
0930: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
0940: 6f 69 64 20 73 74 72 46 72 65 65 28 53 74 72 20  oid strFree(Str 
0950: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  *p){.  sqlite3_f
0960: 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 73 74 72  ree(p->z);.  str
0970: 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
0980: 2a 20 41 64 64 20 66 6f 72 6d 61 74 74 65 64 20  * Add formatted 
0990: 74 65 78 74 20 74 6f 20 74 68 65 20 65 6e 64 20  text to the end 
09a0: 6f 66 20 61 20 53 74 72 20 6f 62 6a 65 63 74 0a  of a Str object.
09b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
09c0: 74 72 50 72 69 6e 74 66 28 53 74 72 20 2a 70 2c  trPrintf(Str *p,
09d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
09e0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e  rmat, ...){.  in
09f0: 74 20 6e 4e 65 77 3b 0a 20 20 66 6f 72 28 3b 3b  t nNew;.  for(;;
0a00: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 20  ){.    if( p->z 
0a10: 29 7b 0a 20 20 20 20 20 20 76 61 5f 6c 69 73 74  ){.      va_list
0a20: 20 61 70 3b 0a 20 20 20 20 20 20 76 61 5f 73 74   ap;.      va_st
0a30: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
0a40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
0a50: 76 73 6e 70 72 69 6e 74 66 28 70 2d 3e 6e 41 6c  vsnprintf(p->nAl
0a60: 6c 6f 63 2d 70 2d 3e 6e 55 73 65 64 2c 20 70 2d  loc-p->nUsed, p-
0a70: 3e 7a 2b 70 2d 3e 6e 55 73 65 64 2c 20 7a 46 6f  >z+p->nUsed, zFo
0a80: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 20  rmat, ap);.     
0a90: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20   va_end(ap);.   
0aa0: 20 20 20 6e 4e 65 77 20 3d 20 28 69 6e 74 29 73     nNew = (int)s
0ab0: 74 72 6c 65 6e 28 70 2d 3e 7a 20 2b 20 70 2d 3e  trlen(p->z + p->
0ac0: 6e 55 73 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73  nUsed);.    }els
0ad0: 65 7b 0a 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  e{.      nNew = 
0ae0: 70 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 7d  p->nAlloc;.    }
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 55 73 65  .    if( p->nUse
0b00: 64 2b 6e 4e 65 77 20 3c 20 70 2d 3e 6e 41 6c 6c  d+nNew < p->nAll
0b10: 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 70 2d  oc-1 ){.      p-
0b20: 3e 6e 55 73 65 64 20 2b 3d 20 6e 4e 65 77 3b 0a  >nUsed += nNew;.
0b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0b40: 20 7d 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63   }.    p->nAlloc
0b50: 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b   = p->nAlloc*2 +
0b60: 20 31 30 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20   1000;.    p->z 
0b70: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
0b80: 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f  c(p->z, p->nAllo
0b90: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  c);.    if( p->z
0ba0: 3d 3d 30 20 29 20 72 75 6e 74 69 6d 65 45 72 72  ==0 ) runtimeErr
0bb0: 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or("out of memor
0bc0: 79 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a  y");.  }.}..../*
0bd0: 20 53 61 66 65 6c 79 20 71 75 6f 74 65 20 61 6e   Safely quote an
0be0: 20 53 51 4c 20 69 64 65 6e 74 69 66 69 65 72 2e   SQL identifier.
0bf0: 20 20 55 73 65 20 74 68 65 20 6d 69 6e 69 6d 75    Use the minimu
0c00: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 74 72 61 6e  m amount of tran
0c10: 73 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6e 65  sformation.** ne
0c20: 63 65 73 73 61 72 79 20 74 6f 20 61 6c 6c 6f 77  cessary to allow
0c30: 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62   the string to b
0c40: 65 20 75 73 65 64 20 77 69 74 68 20 25 73 2e 0a  e used with %s..
0c50: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
0c60: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
0c70: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
0c80: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
0c90: 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 0a  _malloc().  The.
0ca0: 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  ** caller is res
0cb0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
0cc0: 75 72 69 6e 67 20 74 68 69 73 20 73 70 61 63 65  uring this space
0cd0: 20 69 73 20 66 72 65 65 64 20 77 68 65 6e 20 6e   is freed when n
0ce0: 6f 20 6c 6f 6e 67 65 72 0a 2a 2a 20 6e 65 65 64  o longer.** need
0cf0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
0d00: 61 72 20 2a 73 61 66 65 49 64 28 63 6f 6e 73 74  ar *safeId(const
0d10: 20 63 68 61 72 20 2a 7a 49 64 29 7b 0a 20 20 2f   char *zId){.  /
0d20: 2a 20 41 6c 6c 20 53 51 4c 69 74 65 20 6b 65 79  * All SQLite key
0d30: 77 6f 72 64 73 2c 20 69 6e 20 61 6c 70 68 61 62  words, in alphab
0d40: 65 74 69 63 61 6c 20 6f 72 64 65 72 20 2a 2f 0a  etical order */.
0d50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
0d60: 68 61 72 20 2a 61 7a 4b 65 79 77 6f 72 64 73 5b  har *azKeywords[
0d70: 5d 20 3d 20 7b 0a 20 20 20 20 22 41 42 4f 52 54  ] = {.    "ABORT
0d80: 22 2c 20 22 41 43 54 49 4f 4e 22 2c 20 22 41 44  ", "ACTION", "AD
0d90: 44 22 2c 20 22 41 46 54 45 52 22 2c 20 22 41 4c  D", "AFTER", "AL
0da0: 4c 22 2c 20 22 41 4c 54 45 52 22 2c 20 22 41 4e  L", "ALTER", "AN
0db0: 41 4c 59 5a 45 22 2c 20 22 41 4e 44 22 2c 20 22  ALYZE", "AND", "
0dc0: 41 53 22 2c 0a 20 20 20 20 22 41 53 43 22 2c 20  AS",.    "ASC", 
0dd0: 22 41 54 54 41 43 48 22 2c 20 22 41 55 54 4f 49  "ATTACH", "AUTOI
0de0: 4e 43 52 45 4d 45 4e 54 22 2c 20 22 42 45 46 4f  NCREMENT", "BEFO
0df0: 52 45 22 2c 20 22 42 45 47 49 4e 22 2c 20 22 42  RE", "BEGIN", "B
0e00: 45 54 57 45 45 4e 22 2c 20 22 42 59 22 2c 0a 20  ETWEEN", "BY",. 
0e10: 20 20 20 22 43 41 53 43 41 44 45 22 2c 20 22 43     "CASCADE", "C
0e20: 41 53 45 22 2c 20 22 43 41 53 54 22 2c 20 22 43  ASE", "CAST", "C
0e30: 48 45 43 4b 22 2c 20 22 43 4f 4c 4c 41 54 45 22  HECK", "COLLATE"
0e40: 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20 22 43 4f 4d  , "COLUMN", "COM
0e50: 4d 49 54 22 2c 0a 20 20 20 20 22 43 4f 4e 46 4c  MIT",.    "CONFL
0e60: 49 43 54 22 2c 20 22 43 4f 4e 53 54 52 41 49 4e  ICT", "CONSTRAIN
0e70: 54 22 2c 20 22 43 52 45 41 54 45 22 2c 20 22 43  T", "CREATE", "C
0e80: 52 4f 53 53 22 2c 20 22 43 55 52 52 45 4e 54 5f  ROSS", "CURRENT_
0e90: 44 41 54 45 22 2c 0a 20 20 20 20 22 43 55 52 52  DATE",.    "CURR
0ea0: 45 4e 54 5f 54 49 4d 45 22 2c 20 22 43 55 52 52  ENT_TIME", "CURR
0eb0: 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 22 2c 20  ENT_TIMESTAMP", 
0ec0: 22 44 41 54 41 42 41 53 45 22 2c 20 22 44 45 46  "DATABASE", "DEF
0ed0: 41 55 4c 54 22 2c 20 22 44 45 46 45 52 52 41 42  AULT", "DEFERRAB
0ee0: 4c 45 22 2c 0a 20 20 20 20 22 44 45 46 45 52 52  LE",.    "DEFERR
0ef0: 45 44 22 2c 20 22 44 45 4c 45 54 45 22 2c 20 22  ED", "DELETE", "
0f00: 44 45 53 43 22 2c 20 22 44 45 54 41 43 48 22 2c  DESC", "DETACH",
0f10: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 44 52   "DISTINCT", "DR
0f20: 4f 50 22 2c 20 22 45 41 43 48 22 2c 0a 20 20 20  OP", "EACH",.   
0f30: 20 22 45 4c 53 45 22 2c 20 22 45 4e 44 22 2c 20   "ELSE", "END", 
0f40: 22 45 53 43 41 50 45 22 2c 20 22 45 58 43 45 50  "ESCAPE", "EXCEP
0f50: 54 22 2c 20 22 45 58 43 4c 55 53 49 56 45 22 2c  T", "EXCLUSIVE",
0f60: 20 22 45 58 49 53 54 53 22 2c 20 22 45 58 50 4c   "EXISTS", "EXPL
0f70: 41 49 4e 22 2c 0a 20 20 20 20 22 46 41 49 4c 22  AIN",.    "FAIL"
0f80: 2c 20 22 46 4f 52 22 2c 20 22 46 4f 52 45 49 47  , "FOR", "FOREIG
0f90: 4e 22 2c 20 22 46 52 4f 4d 22 2c 20 22 46 55 4c  N", "FROM", "FUL
0fa0: 4c 22 2c 20 22 47 4c 4f 42 22 2c 20 22 47 52 4f  L", "GLOB", "GRO
0fb0: 55 50 22 2c 20 22 48 41 56 49 4e 47 22 2c 20 22  UP", "HAVING", "
0fc0: 49 46 22 2c 0a 20 20 20 20 22 49 47 4e 4f 52 45  IF",.    "IGNORE
0fd0: 22 2c 20 22 49 4d 4d 45 44 49 41 54 45 22 2c 20  ", "IMMEDIATE", 
0fe0: 22 49 4e 22 2c 20 22 49 4e 44 45 58 22 2c 20 22  "IN", "INDEX", "
0ff0: 49 4e 44 45 58 45 44 22 2c 20 22 49 4e 49 54 49  INDEXED", "INITI
1000: 41 4c 4c 59 22 2c 20 22 49 4e 4e 45 52 22 2c 0a  ALLY", "INNER",.
1010: 20 20 20 20 22 49 4e 53 45 52 54 22 2c 20 22 49      "INSERT", "I
1020: 4e 53 54 45 41 44 22 2c 20 22 49 4e 54 45 52 53  NSTEAD", "INTERS
1030: 45 43 54 22 2c 20 22 49 4e 54 4f 22 2c 20 22 49  ECT", "INTO", "I
1040: 53 22 2c 20 22 49 53 4e 55 4c 4c 22 2c 20 22 4a  S", "ISNULL", "J
1050: 4f 49 4e 22 2c 20 22 4b 45 59 22 2c 0a 20 20 20  OIN", "KEY",.   
1060: 20 22 4c 45 46 54 22 2c 20 22 4c 49 4b 45 22 2c   "LEFT", "LIKE",
1070: 20 22 4c 49 4d 49 54 22 2c 20 22 4d 41 54 43 48   "LIMIT", "MATCH
1080: 22 2c 20 22 4e 41 54 55 52 41 4c 22 2c 20 22 4e  ", "NATURAL", "N
1090: 4f 22 2c 20 22 4e 4f 54 22 2c 20 22 4e 4f 54 4e  O", "NOT", "NOTN
10a0: 55 4c 4c 22 2c 0a 20 20 20 20 22 4e 55 4c 4c 22  ULL",.    "NULL"
10b0: 2c 20 22 4f 46 22 2c 20 22 4f 46 46 53 45 54 22  , "OF", "OFFSET"
10c0: 2c 20 22 4f 4e 22 2c 20 22 4f 52 22 2c 20 22 4f  , "ON", "OR", "O
10d0: 52 44 45 52 22 2c 20 22 4f 55 54 45 52 22 2c 20  RDER", "OUTER", 
10e0: 22 50 4c 41 4e 22 2c 20 22 50 52 41 47 4d 41 22  "PLAN", "PRAGMA"
10f0: 2c 0a 20 20 20 20 22 50 52 49 4d 41 52 59 22 2c  ,.    "PRIMARY",
1100: 20 22 51 55 45 52 59 22 2c 20 22 52 41 49 53 45   "QUERY", "RAISE
1110: 22 2c 20 22 52 45 43 55 52 53 49 56 45 22 2c 20  ", "RECURSIVE", 
1120: 22 52 45 46 45 52 45 4e 43 45 53 22 2c 20 22 52  "REFERENCES", "R
1130: 45 47 45 58 50 22 2c 0a 20 20 20 20 22 52 45 49  EGEXP",.    "REI
1140: 4e 44 45 58 22 2c 20 22 52 45 4c 45 41 53 45 22  NDEX", "RELEASE"
1150: 2c 20 22 52 45 4e 41 4d 45 22 2c 20 22 52 45 50  , "RENAME", "REP
1160: 4c 41 43 45 22 2c 20 22 52 45 53 54 52 49 43 54  LACE", "RESTRICT
1170: 22 2c 20 22 52 49 47 48 54 22 2c 0a 20 20 20 20  ", "RIGHT",.    
1180: 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 22 52 4f 57  "ROLLBACK", "ROW
1190: 22 2c 20 22 53 41 56 45 50 4f 49 4e 54 22 2c 20  ", "SAVEPOINT", 
11a0: 22 53 45 4c 45 43 54 22 2c 20 22 53 45 54 22 2c  "SELECT", "SET",
11b0: 20 22 54 41 42 4c 45 22 2c 20 22 54 45 4d 50 22   "TABLE", "TEMP"
11c0: 2c 0a 20 20 20 20 22 54 45 4d 50 4f 52 41 52 59  ,.    "TEMPORARY
11d0: 22 2c 20 22 54 48 45 4e 22 2c 20 22 54 4f 22 2c  ", "THEN", "TO",
11e0: 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20   "TRANSACTION", 
11f0: 22 54 52 49 47 47 45 52 22 2c 20 22 55 4e 49 4f  "TRIGGER", "UNIO
1200: 4e 22 2c 20 22 55 4e 49 51 55 45 22 2c 0a 20 20  N", "UNIQUE",.  
1210: 20 20 22 55 50 44 41 54 45 22 2c 20 22 55 53 49    "UPDATE", "USI
1220: 4e 47 22 2c 20 22 56 41 43 55 55 4d 22 2c 20 22  NG", "VACUUM", "
1230: 56 41 4c 55 45 53 22 2c 20 22 56 49 45 57 22 2c  VALUES", "VIEW",
1240: 20 22 56 49 52 54 55 41 4c 22 2c 20 22 57 48 45   "VIRTUAL", "WHE
1250: 4e 22 2c 20 22 57 48 45 52 45 22 2c 0a 20 20 20  N", "WHERE",.   
1260: 20 22 57 49 54 48 22 2c 20 22 57 49 54 48 4f 55   "WITH", "WITHOU
1270: 54 22 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6c  T",.  };.  int l
1280: 77 72 2c 20 75 70 72 2c 20 6d 69 64 2c 20 63 2c  wr, upr, mid, c,
1290: 20 69 2c 20 78 3b 0a 20 20 69 66 28 20 7a 49 64   i, x;.  if( zId
12a0: 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [0]==0 ) return 
12b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12c0: 22 5c 22 5c 22 22 29 3b 0a 20 20 66 6f 72 28 69  "\"\"");.  for(i
12d0: 3d 78 3d 30 3b 20 28 63 20 3d 20 7a 49 64 5b 69  =x=0; (c = zId[i
12e0: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
12f0: 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 63 29   if( !isalpha(c)
1300: 20 26 26 20 63 21 3d 27 5f 27 20 29 7b 0a 20 20   && c!='_' ){.  
1310: 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 69      if( i>0 && i
1320: 73 64 69 67 69 74 28 63 29 20 29 7b 0a 20 20 20  sdigit(c) ){.   
1330: 20 20 20 20 20 78 2b 2b 3b 0a 20 20 20 20 20 20       x++;.      
1340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1350: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70  eturn sqlite3_mp
1360: 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20  rintf("\"%w\"", 
1370: 7a 49 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zId);.      }.  
1380: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 20    }.  }.  if( x 
1390: 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  ) return sqlite3
13a0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
13b0: 49 64 29 3b 0a 20 20 6c 77 72 20 3d 20 30 3b 0a  Id);.  lwr = 0;.
13c0: 20 20 75 70 72 20 3d 20 73 69 7a 65 6f 66 28 61    upr = sizeof(a
13d0: 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  zKeywords)/sizeo
13e0: 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30 5d 29  f(azKeywords[0])
13f0: 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c   - 1;.  while( l
1400: 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d  wr<=upr ){.    m
1410: 69 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  id = (lwr+upr)/2
1420: 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
1430: 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65 79 77  3_stricmp(azKeyw
1440: 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 49 64 29 3b  ords[mid], zId);
1450: 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20  .    if( c==0 ) 
1460: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
1470: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
1480: 20 7a 49 64 29 3b 0a 20 20 20 20 69 66 28 20 63   zId);.    if( c
1490: 3c 30 20 29 7b 0a 20 20 20 20 20 20 6c 77 72 20  <0 ){.      lwr 
14a0: 3d 20 6d 69 64 2b 31 3b 0a 20 20 20 20 7d 65 6c  = mid+1;.    }el
14b0: 73 65 7b 0a 20 20 20 20 20 20 75 70 72 20 3d 20  se{.      upr = 
14c0: 6d 69 64 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  mid-1;.    }.  }
14d0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
14e0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
14f0: 7a 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  zId);.}../*.** P
1500: 72 65 70 61 72 65 20 61 20 6e 65 77 20 53 51 4c  repare a new SQL
1510: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
1520: 6e 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20  nt an error and 
1530: 61 62 6f 72 74 20 69 66 20 61 6e 79 74 68 69 6e  abort if anythin
1540: 67 0a 2a 2a 20 67 6f 65 73 20 77 72 6f 6e 67 2e  g.** goes wrong.
1550: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
1560: 65 33 5f 73 74 6d 74 20 2a 64 62 5f 76 70 72 65  e3_stmt *db_vpre
1570: 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20  pare(const char 
1580: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73  *zFormat, va_lis
1590: 74 20 61 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t ap){.  char *z
15a0: 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Sql;.  int rc;. 
15b0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15c0: 53 74 6d 74 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  Stmt;..  zSql = 
15d0: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
15e0: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
15f0: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
1600: 75 6e 74 69 6d 65 45 72 72 6f 72 28 22 6f 75 74  untimeError("out
1610: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
1620: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1630: 70 61 72 65 5f 76 32 28 67 2e 64 62 2c 20 7a 53  pare_v2(g.db, zS
1640: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
1650: 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
1660: 20 20 20 20 72 75 6e 74 69 6d 65 45 72 72 6f 72      runtimeError
1670: 28 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  ("SQL statement 
1680: 65 72 72 6f 72 3a 20 25 73 5c 6e 5c 22 25 73 5c  error: %s\n\"%s\
1690: 22 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  "", sqlite3_errm
16a0: 73 67 28 67 2e 64 62 29 2c 0a 20 20 20 20 20 20  sg(g.db),.      
16b0: 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 29             zSql)
16c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
16d0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65  free(zSql);.  re
16e0: 74 75 72 6e 20 70 53 74 6d 74 3b 0a 7d 0a 73 74  turn pStmt;.}.st
16f0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
1700: 74 20 2a 64 62 5f 70 72 65 70 61 72 65 28 63 6f  t *db_prepare(co
1710: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1720: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
1730: 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33  st ap;.  sqlite3
1740: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1750: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
1760: 72 6d 61 74 29 3b 0a 20 20 70 53 74 6d 74 20 3d  rmat);.  pStmt =
1770: 20 64 62 5f 76 70 72 65 70 61 72 65 28 7a 46 6f   db_vprepare(zFo
1780: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1790: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
17a0: 6e 20 70 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pStmt;.}../*.*
17b0: 2a 20 46 72 65 65 20 61 20 6c 69 73 74 20 6f 66  * Free a list of
17c0: 20 73 74 72 69 6e 67 73 0a 2a 2f 0a 73 74 61 74   strings.*/.stat
17d0: 69 63 20 76 6f 69 64 20 6e 61 6d 65 6c 69 73 74  ic void namelist
17e0: 46 72 65 65 28 63 68 61 72 20 2a 2a 61 7a 29 7b  Free(char **az){
17f0: 0a 20 20 69 66 28 20 61 7a 20 29 7b 0a 20 20 20  .  if( az ){.   
1800: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1810: 69 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29  i=0; az[i]; i++)
1820: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
1830: 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [i]);.    sqlite
1840: 33 5f 66 72 65 65 28 61 7a 29 3b 0a 20 20 7d 0a  3_free(az);.  }.
1850: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1860: 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
1870: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65 20 74   names for the t
1880: 61 62 6c 65 20 7a 44 62 2e 7a 54 61 62 2e 20 20  able zDb.zTab.  
1890: 53 70 61 63 65 20 74 6f 0a 2a 2a 20 68 6f 6c 64  Space to.** hold
18a0: 20 74 68 65 20 6c 69 73 74 20 69 73 20 6f 62 74   the list is obt
18b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
18c0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18d0: 73 68 6f 75 6c 64 20 72 65 6c 65 61 73 65 64 0a  should released.
18e0: 2a 2a 20 75 73 69 6e 67 20 6e 61 6d 65 6c 69 73  ** using namelis
18f0: 74 46 72 65 65 28 29 20 77 68 65 6e 20 6e 6f 20  tFree() when no 
1900: 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a  longer needed..*
1910: 2a 0a 2a 2a 20 50 72 69 6d 61 72 79 20 6b 65 79  *.** Primary key
1920: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 69 73   columns are lis
1930: 74 65 64 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  ted first, follo
1940: 77 65 64 20 62 79 20 64 61 74 61 20 63 6f 6c 75  wed by data colu
1950: 6d 6e 73 2e 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  mns..** The numb
1960: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
1970: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
1980: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20   is returned in 
1990: 2a 70 6e 50 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 4e  *pnPkey..**.** N
19a0: 6f 72 6d 61 6c 6c 79 2c 20 74 68 65 20 22 70 72  ormally, the "pr
19b0: 69 6d 61 72 79 20 6b 65 79 22 20 69 6e 20 74 68  imary key" in th
19c0: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
19d0: 6e 63 65 20 69 73 20 74 68 65 20 74 72 75 65 0a  nce is the true.
19e0: 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2d  ** primary key -
19f0: 20 74 68 65 20 72 6f 77 69 64 20 6f 72 20 49 4e   the rowid or IN
1a00: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1a10: 59 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  Y for ordinary t
1a20: 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 74 68 65 20  ables.** or the 
1a30: 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59  declared PRIMARY
1a40: 20 4b 45 59 20 66 6f 72 20 57 49 54 48 4f 55 54   KEY for WITHOUT
1a50: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 20 20   ROWID tables.  
1a60: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 74  However, if.** t
1a70: 68 65 20 67 2e 62 53 63 68 65 6d 61 50 4b 20 66  he g.bSchemaPK f
1a80: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
1a90: 20 74 68 65 20 73 63 68 65 6d 61 2d 64 65 66 69   the schema-defi
1aa0: 6e 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20  ned PRIMARY KEY 
1ab0: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 61 6c  is.** used in al
1ac0: 6c 20 63 61 73 65 73 2e 20 20 49 6e 20 74 68 61  l cases.  In tha
1ad0: 74 20 63 61 73 65 2c 20 65 6e 74 72 69 65 73 20  t case, entries 
1ae0: 74 68 61 74 20 68 61 76 65 20 4e 55 4c 4c 20 76  that have NULL v
1af0: 61 6c 75 65 73 20 69 6e 0a 2a 2a 20 61 6e 79 20  alues in.** any 
1b00: 6f 66 20 74 68 65 69 72 20 70 72 69 6d 61 72 79  of their primary
1b10: 20 6b 65 79 20 66 69 65 6c 64 73 20 77 69 6c 6c   key fields will
1b20: 20 62 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f   be excluded fro
1b30: 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a  m the analysis..
1b40: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 69  **.** If the pri
1b50: 6d 61 72 79 20 6b 65 79 20 66 6f 72 20 61 20 74  mary key for a t
1b60: 61 62 6c 65 20 69 73 20 74 68 65 20 72 6f 77 69  able is the rowi
1b70: 64 20 62 75 74 20 72 6f 77 69 64 20 69 73 20 69  d but rowid is i
1b80: 6e 61 63 63 65 73 73 69 62 6c 65 2c 0a 2a 2a 20  naccessible,.** 
1b90: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1ba0: 65 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c  e returns a NULL
1bb0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
1bc0: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 20 20 20 20  Examples:.**    
1bd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1be0: 61 20 49 4e 54 20 55 4e 49 51 55 45 2c 20 62 20  a INT UNIQUE, b 
1bf0: 49 4e 54 45 47 45 52 2c 20 63 20 54 45 58 54 2c  INTEGER, c TEXT,
1c00: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 63 29 29   PRIMARY KEY(c))
1c10: 3b 0a 2a 2a 20 20 20 20 2a 70 6e 50 4b 65 79 20  ;.**    *pnPKey 
1c20: 3d 20 31 3b 0a 2a 2a 20 20 20 20 61 7a 20 3d 20  = 1;.**    az = 
1c30: 7b 20 22 72 6f 77 69 64 22 2c 20 22 61 22 2c 20  { "rowid", "a", 
1c40: 22 62 22 2c 20 22 63 22 2c 20 30 20 7d 20 20 2f  "b", "c", 0 }  /
1c50: 2f 20 4e 6f 72 6d 61 6c 20 63 61 73 65 0a 2a 2a  / Normal case.**
1c60: 20 20 20 20 61 7a 20 3d 20 7b 20 22 63 22 2c 20      az = { "c", 
1c70: 22 61 22 2c 20 22 62 22 2c 20 30 20 7d 20 20 20  "a", "b", 0 }   
1c80: 20 20 20 20 20 20 20 20 2f 2f 20 67 2e 62 53 63          // g.bSc
1c90: 68 65 6d 61 50 4b 3d 3d 31 0a 2a 2a 0a 2a 2a 20  hemaPK==1.**.** 
1ca0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1cb0: 74 32 28 61 20 49 4e 54 20 55 4e 49 51 55 45 2c  t2(a INT UNIQUE,
1cc0: 20 62 20 49 4e 54 45 47 45 52 2c 20 63 20 54 45   b INTEGER, c TE
1cd0: 58 54 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28  XT, PRIMARY KEY(
1ce0: 62 29 29 3b 0a 2a 2a 20 20 20 20 2a 70 6e 50 4b  b));.**    *pnPK
1cf0: 65 79 20 3d 20 31 3b 0a 2a 2a 20 20 20 20 61 7a  ey = 1;.**    az
1d00: 20 3d 20 7b 20 22 62 22 2c 20 22 61 22 2c 20 22   = { "b", "a", "
1d10: 63 22 2c 20 30 20 7d 0a 2a 2a 0a 2a 2a 20 20 20  c", 0 }.**.**   
1d20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
1d30: 28 78 2c 79 2c 7a 2c 50 52 49 4d 41 52 59 20 4b  (x,y,z,PRIMARY K
1d40: 45 59 28 79 2c 7a 29 29 3b 0a 2a 2a 20 20 20 20  EY(y,z));.**    
1d50: 2a 70 6e 50 4b 65 79 20 3d 20 31 20 20 20 20 20  *pnPKey = 1     
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 2f 2f 20 4e 6f 72 6d 61 6c 20 63 61      // Normal ca
1d80: 73 65 0a 2a 2a 20 20 20 20 61 7a 20 3d 20 7b 20  se.**    az = { 
1d90: 22 72 6f 77 69 64 22 2c 20 22 78 22 2c 20 22 79  "rowid", "x", "y
1da0: 22 2c 20 22 7a 22 2c 20 30 20 7d 20 20 2f 2f 20  ", "z", 0 }  // 
1db0: 4e 6f 72 6d 61 6c 20 63 61 73 65 0a 2a 2a 20 20  Normal case.**  
1dc0: 20 20 2a 70 6e 50 4b 65 79 20 3d 20 32 20 20 20    *pnPKey = 2   
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 20 20 2f 2f 20 67 2e 62 53 63 68 65        // g.bSche
1df0: 6d 61 50 4b 3d 3d 31 0a 2a 2a 20 20 20 20 61 7a  maPK==1.**    az
1e00: 20 3d 20 7b 20 22 79 22 2c 20 22 78 22 2c 20 22   = { "y", "x", "
1e10: 7a 22 2c 20 30 20 7d 20 20 20 20 20 20 20 20 20  z", 0 }         
1e20: 20 20 2f 2f 20 67 2e 62 53 63 68 65 6d 61 50 4b    // g.bSchemaPK
1e30: 3d 3d 31 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  ==1.**.**    CRE
1e40: 41 54 45 20 54 41 42 4c 45 20 74 34 28 78 2c 79  ATE TABLE t4(x,y
1e50: 2c 7a 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 79  ,z,PRIMARY KEY(y
1e60: 2c 7a 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57  ,z)) WITHOUT ROW
1e70: 49 44 3b 0a 2a 2a 20 20 20 20 2a 70 6e 50 4b 65  ID;.**    *pnPKe
1e80: 79 20 3d 20 32 0a 2a 2a 20 20 20 20 61 7a 20 3d  y = 2.**    az =
1e90: 20 7b 20 22 79 22 2c 20 22 7a 22 2c 20 22 78 22   { "y", "z", "x"
1ea0: 2c 20 30 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 43  , 0 }.**.**    C
1eb0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 72  REATE TABLE t5(r
1ec0: 6f 77 69 64 2c 5f 72 6f 77 69 64 5f 2c 6f 69 64  owid,_rowid_,oid
1ed0: 29 3b 0a 2a 2a 20 20 20 20 61 7a 20 3d 20 30 20  );.**    az = 0 
1ee0: 20 20 20 20 2f 2f 20 54 68 65 20 72 6f 77 69 64      // The rowid
1ef0: 20 69 73 20 6e 6f 74 20 61 63 63 65 73 73 69 62   is not accessib
1f00: 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  le.*/.static cha
1f10: 72 20 2a 2a 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28  r **columnNames(
1f20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f30: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
1f40: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 28     /* Database (
1f50: 22 6d 61 69 6e 22 20 6f 72 20 22 61 75 78 22 29  "main" or "aux")
1f60: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63   to query */.  c
1f70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c  onst char *zTab,
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f90: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
1fa0: 74 6f 20 72 65 74 75 72 6e 20 64 65 74 61 69 6c  to return detail
1fb0: 73 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  s of */.  int *p
1fc0: 6e 50 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  nPKey,          
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1fe0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63  : Number of PK c
1ff0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
2000: 2a 70 62 52 6f 77 69 64 20 20 20 20 20 20 20 20  *pbRowid        
2010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2020: 55 54 3a 20 54 72 75 65 20 69 66 20 50 4b 20 69  UT: True if PK i
2030: 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f  s an implicit ro
2040: 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  wid */.){.  char
2050: 20 2a 2a 61 7a 20 3d 20 30 3b 20 20 20 20 20 20   **az = 0;      
2060: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
2070: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 6f 20  column names to 
2080: 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20  be returned */. 
2090: 20 69 6e 74 20 6e 61 7a 20 3d 20 30 3b 20 20 20   int naz = 0;   
20a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20b0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
20c0: 6e 20 61 7a 5b 5d 20 2a 2f 0a 20 20 73 71 6c 69  n az[] */.  sqli
20d0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
20e0: 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
20f0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 75 6e 20  ement being run 
2100: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 6b 49 64  */.  char *zPkId
2110: 78 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  xName = 0;    /*
2120: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 50 52 49   Name of the PRI
2130: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 2a  MARY KEY index *
2140: 2f 0a 20 20 69 6e 74 20 74 72 75 65 50 6b 20 3d  /.  int truePk =
2150: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
2160: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
2170: 6f 20 69 6e 64 65 6e 74 69 66 69 65 73 20 74 68  o indentifies th
2180: 65 20 50 4b 20 74 6f 20 75 73 65 20 2a 2f 0a 20  e PK to use */. 
2190: 20 69 6e 74 20 6e 50 4b 20 3d 20 30 3b 20 20 20   int nPK = 0;   
21a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21b0: 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b  ber of PRIMARY K
21c0: 45 59 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  EY columns */.  
21d0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
21e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21f0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 0a 20 20   counters */..  
2200: 69 66 28 20 67 2e 62 53 63 68 65 6d 61 50 4b 3d  if( g.bSchemaPK=
2210: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 72  =0 ){.    /* Nor
2220: 6d 61 6c 20 63 61 73 65 3a 20 20 46 69 67 75 72  mal case:  Figur
2230: 65 20 6f 75 74 20 77 68 61 74 20 74 68 65 20 74  e out what the t
2240: 72 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  rue primary key 
2250: 69 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  is for the table
2260: 2e 0a 20 20 20 20 2a 2a 20 20 20 2a 20 20 46 6f  ..    **   *  Fo
2270: 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
2280: 74 61 62 6c 65 73 2c 20 74 68 65 20 74 72 75 65  tables, the true
2290: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
22a0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 20 20  the same as.    
22b0: 2a 2a 20 20 20 20 20 20 74 68 65 20 73 63 68 65  **      the sche
22c0: 6d 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ma PRIMARY KEY, 
22d0: 77 68 69 63 68 20 69 73 20 67 75 61 72 61 6e 74  which is guarant
22e0: 65 65 64 20 74 6f 20 62 65 20 70 72 65 73 65 6e  eed to be presen
22f0: 74 2e 0a 20 20 20 20 2a 2a 20 20 20 2a 20 20 46  t..    **   *  F
2300: 6f 72 20 72 6f 77 69 64 20 74 61 62 6c 65 73 20  or rowid tables 
2310: 77 69 74 68 20 61 6e 20 49 4e 54 45 47 45 52 20  with an INTEGER 
2320: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
2330: 20 74 72 75 65 20 70 72 69 6d 61 72 79 0a 20 20   true primary.  
2340: 20 20 2a 2a 20 20 20 20 20 20 6b 65 79 20 69 73    **      key is
2350: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
2360: 4d 41 52 59 20 4b 45 59 2e 0a 20 20 20 20 2a 2a  MARY KEY..    **
2370: 20 20 20 2a 20 20 46 6f 72 20 61 6c 6c 20 6f 74     *  For all ot
2380: 68 65 72 20 72 6f 77 69 64 20 74 61 62 6c 65 73  her rowid tables
2390: 2c 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 74  , the rowid is t
23a0: 68 65 20 74 72 75 65 20 70 72 69 6d 61 72 79 20  he true primary 
23b0: 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
23c0: 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61  pStmt = db_prepa
23d0: 72 65 28 22 50 52 41 47 4d 41 20 25 73 2e 69 6e  re("PRAGMA %s.in
23e0: 64 65 78 5f 6c 69 73 74 3d 25 51 22 2c 20 7a 44  dex_list=%Q", zD
23f0: 62 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 77 68  b, zTab);.    wh
2400: 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
2410: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
2420: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tmt) ){.      if
2430: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
2440: 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  p((const char*)s
2450: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2460: 78 74 28 70 53 74 6d 74 2c 33 29 2c 22 70 6b 22  xt(pStmt,3),"pk"
2470: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2480: 7a 50 6b 49 64 78 4e 61 6d 65 20 3d 20 73 71 6c  zPkIdxName = sql
2490: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
24a0: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
24b0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
24c0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
24d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
24f0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2500: 20 69 66 28 20 7a 50 6b 49 64 78 4e 61 6d 65 20   if( zPkIdxName 
2510: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  ){.      int nKe
2520: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  y = 0;.      int
2530: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20   nCol = 0;.     
2540: 20 74 72 75 65 50 6b 20 3d 20 30 3b 0a 20 20 20   truePk = 0;.   
2550: 20 20 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72     pStmt = db_pr
2560: 65 70 61 72 65 28 22 50 52 41 47 4d 41 20 25 73  epare("PRAGMA %s
2570: 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 25 51 22  .index_xinfo=%Q"
2580: 2c 20 7a 44 62 2c 20 7a 50 6b 49 64 78 4e 61 6d  , zDb, zPkIdxNam
2590: 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  e);.      while(
25a0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
25b0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
25c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c   ){.        nCol
25d0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
25e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
25f0: 6e 74 28 70 53 74 6d 74 2c 35 29 20 29 7b 20 6e  nt(pStmt,5) ){ n
2600: 4b 65 79 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b  Key++; continue;
2610: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
2620: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2630: 74 28 70 53 74 6d 74 2c 31 29 3e 3d 30 20 29 20  t(pStmt,1)>=0 ) 
2640: 74 72 75 65 50 6b 20 3d 20 31 3b 0a 20 20 20 20  truePk = 1;.    
2650: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 43    }.      if( nC
2660: 6f 6c 3d 3d 6e 4b 65 79 20 29 20 74 72 75 65 50  ol==nKey ) trueP
2670: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  k = 1;.      if(
2680: 20 74 72 75 65 50 6b 20 29 7b 0a 20 20 20 20 20   truePk ){.     
2690: 20 20 20 6e 50 4b 20 3d 20 6e 4b 65 79 3b 0a 20     nPK = nKey;. 
26a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26b0: 20 20 20 20 6e 50 4b 20 3d 20 31 3b 0a 20 20 20      nPK = 1;.   
26c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
26d0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
26e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
26f0: 33 5f 66 72 65 65 28 7a 50 6b 49 64 78 4e 61 6d  3_free(zPkIdxNam
2700: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
2710: 20 20 20 20 20 74 72 75 65 50 6b 20 3d 20 31 3b       truePk = 1;
2720: 0a 20 20 20 20 20 20 6e 50 4b 20 3d 20 31 3b 0a  .      nPK = 1;.
2730: 20 20 20 20 7d 0a 20 20 20 20 70 53 74 6d 74 20      }.    pStmt 
2740: 3d 20 64 62 5f 70 72 65 70 61 72 65 28 22 50 52  = db_prepare("PR
2750: 41 47 4d 41 20 25 73 2e 74 61 62 6c 65 5f 69 6e  AGMA %s.table_in
2760: 66 6f 3d 25 51 22 2c 20 7a 44 62 2c 20 7a 54 61  fo=%Q", zDb, zTa
2770: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
2780: 20 2f 2a 20 54 68 65 20 67 2e 62 53 63 68 65 6d   /* The g.bSchem
2790: 61 50 4b 3d 3d 31 20 63 61 73 65 3a 20 20 55 73  aPK==1 case:  Us
27a0: 65 20 77 68 61 74 65 76 65 72 20 70 72 69 6d 61  e whatever prima
27b0: 72 79 20 6b 65 79 20 69 73 20 64 65 63 6c 61 72  ry key is declar
27c0: 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ed.    ** in the
27d0: 20 73 63 68 65 6d 61 2e 20 20 54 68 65 20 22 72   schema.  The "r
27e0: 6f 77 69 64 22 20 77 69 6c 6c 20 73 74 69 6c 6c  owid" will still
27f0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
2800: 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 20 20  primary key.    
2810: 2a 2a 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ** if the table 
2820: 64 65 66 69 6e 69 74 69 6f 6e 20 64 6f 65 73 20  definition does 
2830: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 50 52  not contain a PR
2840: 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 20 20 2a  IMARY KEY..    *
2850: 2f 0a 20 20 20 20 6e 50 4b 20 3d 20 30 3b 0a 20  /.    nPK = 0;. 
2860: 20 20 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72     pStmt = db_pr
2870: 65 70 61 72 65 28 22 50 52 41 47 4d 41 20 25 73  epare("PRAGMA %s
2880: 2e 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c  .table_info=%Q",
2890: 20 7a 44 62 2c 20 7a 54 61 62 29 3b 0a 20 20 20   zDb, zTab);.   
28a0: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
28b0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
28c0: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
28d0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
28e0: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 35 29  umn_int(pStmt,5)
28f0: 3e 30 20 29 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20  >0 ) nPK++;.    
2900: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
2910: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
2920: 69 66 28 20 6e 50 4b 3d 3d 30 20 29 20 6e 50 4b  if( nPK==0 ) nPK
2930: 20 3d 20 31 3b 0a 20 20 20 20 74 72 75 65 50 6b   = 1;.    truePk
2940: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2a 70 6e 50   = 1;.  }.  *pnP
2950: 4b 65 79 20 3d 20 6e 50 4b 3b 0a 20 20 6e 61 7a  Key = nPK;.  naz
2960: 20 3d 20 6e 50 4b 3b 0a 20 20 61 7a 20 3d 20 73   = nPK;.  az = s
2970: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
2980: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 28 6e 50  izeof(char*)*(nP
2990: 4b 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 61 7a  K+1) );.  if( az
29a0: 3d 3d 30 20 29 20 72 75 6e 74 69 6d 65 45 72 72  ==0 ) runtimeErr
29b0: 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or("out of memor
29c0: 79 22 29 3b 0a 20 20 6d 65 6d 73 65 74 28 61 7a  y");.  memset(az
29d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  , 0, sizeof(char
29e0: 2a 29 2a 28 6e 50 4b 2b 31 29 29 3b 0a 20 20 77  *)*(nPK+1));.  w
29f0: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
2a00: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2a10: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  Stmt) ){.    int
2a20: 20 69 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20   iPKey;.    if( 
2a30: 74 72 75 65 50 6b 20 26 26 20 28 69 50 4b 65 79  truePk && (iPKey
2a40: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2a50: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 35 29 29 3e  n_int(pStmt,5))>
2a60: 30 20 29 7b 0a 20 20 20 20 20 20 61 7a 5b 69 50  0 ){.      az[iP
2a70: 4b 65 79 2d 31 5d 20 3d 20 73 61 66 65 49 64 28  Key-1] = safeId(
2a80: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63  (char*)sqlite3_c
2a90: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2aa0: 2c 31 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ,1));.    }else{
2ab0: 0a 20 20 20 20 20 20 61 7a 20 3d 20 73 71 6c 69  .      az = sqli
2ac0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 2c 20  te3_realloc(az, 
2ad0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 28 6e  sizeof(char*)*(n
2ae0: 61 7a 2b 32 29 20 29 3b 0a 20 20 20 20 20 20 69  az+2) );.      i
2af0: 66 28 20 61 7a 3d 3d 30 20 29 20 72 75 6e 74 69  f( az==0 ) runti
2b00: 6d 65 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20  meError("out of 
2b10: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  memory");.      
2b20: 61 7a 5b 6e 61 7a 2b 2b 5d 20 3d 20 73 61 66 65  az[naz++] = safe
2b30: 49 64 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  Id((char*)sqlite
2b40: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2b50: 74 6d 74 2c 31 29 29 3b 0a 20 20 20 20 7d 0a 20  tmt,1));.    }. 
2b60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
2b70: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2b80: 69 66 28 20 61 7a 20 29 20 61 7a 5b 6e 61 7a 5d  if( az ) az[naz]
2b90: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 69   = 0;..  /* If i
2ba0: 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 73  t is non-NULL, s
2bb0: 65 74 20 2a 70 62 52 6f 77 69 64 20 74 6f 20 69  et *pbRowid to i
2bc0: 6e 64 69 63 61 74 65 20 77 68 65 74 68 65 72 20  ndicate whether 
2bd0: 6f 72 20 6e 6f 74 20 74 68 65 20 50 4b 20 6f 66  or not the PK of
2be0: 20 0a 20 20 2a 2a 20 74 68 69 73 20 74 61 62 6c   .  ** this tabl
2bf0: 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 63 69 74  e is an implicit
2c00: 20 72 6f 77 69 64 20 28 2a 70 62 52 6f 77 69 64   rowid (*pbRowid
2c10: 3d 3d 31 29 20 6f 72 20 6e 6f 74 20 28 2a 70 62  ==1) or not (*pb
2c20: 52 6f 77 69 64 3d 3d 30 29 2e 20 20 2a 2f 0a 20  Rowid==0).  */. 
2c30: 20 69 66 28 20 70 62 52 6f 77 69 64 20 29 20 2a   if( pbRowid ) *
2c40: 70 62 52 6f 77 69 64 20 3d 20 28 61 7a 5b 30 5d  pbRowid = (az[0]
2c50: 3d 3d 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ==0);..  /* If t
2c60: 68 69 73 20 74 61 62 6c 65 20 68 61 73 20 61 6e  his table has an
2c70: 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 20   implicit rowid 
2c80: 66 6f 72 20 61 20 50 4b 2c 20 66 69 67 75 72 65  for a PK, figure
2c90: 20 6f 75 74 20 68 6f 77 20 74 6f 20 72 65 66 65   out how to refe
2ca0: 72 0a 20 20 2a 2a 20 74 6f 20 69 74 2e 20 54 68  r.  ** to it. Th
2cb0: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6f 70  ere are three op
2cc0: 74 69 6f 6e 73 20 2d 20 22 72 6f 77 69 64 22 2c  tions - "rowid",
2cd0: 20 22 5f 72 6f 77 69 64 5f 22 20 61 6e 64 20 22   "_rowid_" and "
2ce0: 6f 69 64 22 2e 20 41 6e 79 0a 20 20 2a 2a 20 6f  oid". Any.  ** o
2cf0: 66 20 74 68 65 73 65 20 77 69 6c 6c 20 77 6f 72  f these will wor
2d00: 6b 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 74 61  k, unless the ta
2d10: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69  ble has an expli
2d20: 63 69 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  cit column of th
2d30: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 6e 61 6d 65  e.  ** same name
2d40: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 61 7a 5b 30  .  */.  if( az[0
2d50: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  ]==0 ){.    cons
2d60: 74 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  t char *azRowid[
2d70: 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
2d80: 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
2d90: 7d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  };.    for(i=0; 
2da0: 69 3c 73 69 7a 65 6f 66 28 61 7a 52 6f 77 69 64  i<sizeof(azRowid
2db0: 29 2f 73 69 7a 65 6f 66 28 61 7a 52 6f 77 69 64  )/sizeof(azRowid
2dc0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
2dd0: 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 61 7a    for(j=1; j<naz
2de0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2df0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2e00: 63 6d 70 28 61 7a 5b 6a 5d 2c 20 61 7a 52 6f 77  cmp(az[j], azRow
2e10: 69 64 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61  id[i])==0 ) brea
2e20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2e30: 20 69 66 28 20 6a 3e 3d 6e 61 7a 20 29 7b 0a 20   if( j>=naz ){. 
2e40: 20 20 20 20 20 20 20 61 7a 5b 30 5d 20 3d 20 73         az[0] = s
2e50: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2e60: 25 73 22 2c 20 61 7a 52 6f 77 69 64 5b 69 5d 29  %s", azRowid[i])
2e70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2e80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e90: 20 20 20 69 66 28 20 61 7a 5b 30 5d 3d 3d 30 20     if( az[0]==0 
2ea0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  ){.      for(i=1
2eb0: 3b 20 69 3c 6e 61 7a 3b 20 69 2b 2b 29 20 73 71  ; i<naz; i++) sq
2ec0: 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 5b 69 5d  lite3_free(az[i]
2ed0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ee0: 5f 66 72 65 65 28 61 7a 29 3b 0a 20 20 20 20 20  _free(az);.     
2ef0: 20 61 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   az = 0;.    }. 
2f00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 3b 0a   }.  return az;.
2f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
2f20: 68 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  he sqlite3_value
2f30: 20 58 20 61 73 20 61 6e 20 53 51 4c 20 6c 69 74   X as an SQL lit
2f40: 65 72 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eral..*/.static 
2f50: 76 6f 69 64 20 70 72 69 6e 74 51 75 6f 74 65 64  void printQuoted
2f60: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 71 6c 69  (FILE *out, sqli
2f70: 74 65 33 5f 76 61 6c 75 65 20 2a 58 29 7b 0a 20  te3_value *X){. 
2f80: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
2f90: 5f 76 61 6c 75 65 5f 74 79 70 65 28 58 29 20 29  _value_type(X) )
2fa0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
2fb0: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
2fc0: 20 64 6f 75 62 6c 65 20 72 31 3b 0a 20 20 20 20   double r1;.    
2fd0: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
2fe0: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
2ff0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
3000: 28 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (X);.      sqlit
3010: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3020: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
3030: 22 25 21 2e 31 35 67 22 2c 20 72 31 29 3b 0a 20  "%!.15g", r1);. 
3040: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
3050: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
3060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3070: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3080: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
3090: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
30a0: 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33 5f  "%lld", sqlite3_
30b0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 58 29 29 3b  value_int64(X));
30c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
30d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
30e0: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
30f0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
3100: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73   char *zBlob = s
3110: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
3120: 62 28 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  b(X);.      int 
3130: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
3140: 76 61 6c 75 65 5f 62 79 74 65 73 28 58 29 3b 0a  value_bytes(X);.
3150: 20 20 20 20 20 20 69 66 28 20 7a 42 6c 6f 62 20        if( zBlob 
3160: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
3170: 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
3180: 66 28 6f 75 74 2c 20 22 78 27 22 29 3b 0a 20 20  f(out, "x'");.  
3190: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
31a0: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20  <nBlob; i++){.  
31b0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
31c0: 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 7a 42 6c  out, "%02x", zBl
31d0: 6f 62 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ob[i]);.        
31e0: 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  }.        fprint
31f0: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
3200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3210: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3220: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 0a  NULL");.      }.
3230: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3240: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3250: 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20  TE_TEXT: {.     
3260: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3270: 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 73 71 6c  char *zArg = sql
3280: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
3290: 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  X);.      int i,
32a0: 20 6a 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 7a   j;..      if( z
32b0: 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
32c0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
32d0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65  NULL");.      }e
32e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
32f0: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
3300: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d          for(i=j=
3310: 30 3b 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29  0; zArg[i]; i++)
3320: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3330: 7a 41 72 67 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  zArg[i]=='\'' ){
3340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
3350: 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 27  intf(out, "%.*s'
3360: 22 2c 20 69 2d 6a 2b 31 2c 20 26 7a 41 72 67 5b  ", i-j+1, &zArg[
3370: 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  j]);.           
3380: 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20   j = i+1;.      
3390: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
33a0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
33b0: 6f 75 74 2c 20 22 25 73 27 22 2c 20 26 7a 41 72  out, "%s'", &zAr
33c0: 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g[j]);.      }. 
33d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
33e0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
33f0: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
3400: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 4e 55  fprintf(out, "NU
3410: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  LL");.      brea
3420: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
3430: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 53 51 4c  /*.** Output SQL
3440: 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 72 65   that will recre
3450: 61 74 65 20 74 68 65 20 61 75 78 2e 7a 54 61 62  ate the aux.zTab
3460: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
3470: 63 20 76 6f 69 64 20 64 75 6d 70 5f 74 61 62 6c  c void dump_tabl
3480: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
3490: 61 62 2c 20 46 49 4c 45 20 2a 6f 75 74 29 7b 0a  ab, FILE *out){.
34a0: 20 20 63 68 61 72 20 2a 7a 49 64 20 3d 20 73 61    char *zId = sa
34b0: 66 65 49 64 28 7a 54 61 62 29 3b 20 2f 2a 20 4e  feId(zTab); /* N
34c0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
34d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 20   */.  char **az 
34e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
34f0: 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
3500: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 3b  ns */.  int nPk;
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
3530: 72 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  rue primary key 
3540: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
3550: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
3560: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3570: 20 6f 66 20 64 61 74 61 20 63 6f 6c 75 6d 6e 73   of data columns
3580: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
35b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
35c0: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 2f  t *pStmt;      /
35d0: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
35e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
35f0: 2a 7a 53 65 70 3b 20 20 20 20 20 20 20 20 20 2f  *zSep;         /
3600: 2a 20 53 65 70 61 72 61 74 6f 72 20 73 74 72 69  * Separator stri
3610: 6e 67 20 2a 2f 0a 20 20 53 74 72 20 69 6e 73 3b  ng */.  Str ins;
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3630: 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f    /* Beginning o
3640: 66 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61  f the INSERT sta
3650: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 70 53 74  tement */..  pSt
3660: 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28  mt = db_prepare(
3670: 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
3680: 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74   aux.sqlite_mast
3690: 65 72 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  er WHERE name=%Q
36a0: 22 2c 20 7a 54 61 62 29 3b 0a 20 20 69 66 28 20  ", zTab);.  if( 
36b0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
36c0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
36d0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
36e0: 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 73 71 6c  ut, "%s;\n", sql
36f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
3700: 28 70 53 74 6d 74 2c 30 29 29 3b 0a 20 20 7d 0a  (pStmt,0));.  }.
3710: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
3720: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
3730: 20 21 67 2e 62 53 63 68 65 6d 61 4f 6e 6c 79 20   !g.bSchemaOnly 
3740: 29 7b 0a 20 20 20 20 61 7a 20 3d 20 63 6f 6c 75  ){.    az = colu
3750: 6d 6e 4e 61 6d 65 73 28 22 61 75 78 22 2c 20 7a  mnNames("aux", z
3760: 54 61 62 2c 20 26 6e 50 6b 2c 20 30 29 3b 0a 20  Tab, &nPk, 0);. 
3770: 20 20 20 73 74 72 49 6e 69 74 28 26 69 6e 73 29     strInit(&ins)
3780: 3b 0a 20 20 20 20 69 66 28 20 61 7a 3d 3d 30 20  ;.    if( az==0 
3790: 29 7b 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d  ){.      pStmt =
37a0: 20 64 62 5f 70 72 65 70 61 72 65 28 22 53 45 4c   db_prepare("SEL
37b0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 75 78 2e 25  ECT * FROM aux.%
37c0: 73 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  s", zId);.      
37d0: 73 74 72 50 72 69 6e 74 66 28 26 69 6e 73 2c 22  strPrintf(&ins,"
37e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 20 56  INSERT INTO %s V
37f0: 41 4c 55 45 53 22 2c 20 7a 49 64 29 3b 0a 20 20  ALUES", zId);.  
3800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53    }else{.      S
3810: 74 72 20 73 71 6c 3b 0a 20 20 20 20 20 20 73 74  tr sql;.      st
3820: 72 49 6e 69 74 28 26 73 71 6c 29 3b 0a 20 20 20  rInit(&sql);.   
3830: 20 20 20 7a 53 65 70 20 3d 20 20 22 53 45 4c 45     zSep =  "SELE
3840: 43 54 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  CT";.      for(i
3850: 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  =0; az[i]; i++){
3860: 0a 20 20 20 20 20 20 20 20 73 74 72 50 72 69 6e  .        strPrin
3870: 74 66 28 26 73 71 6c 2c 20 22 25 73 20 25 73 22  tf(&sql, "%s %s"
3880: 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 29 3b 0a  , zSep, az[i]);.
3890: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
38a0: 2c 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ,";.      }.    
38b0: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
38c0: 2c 22 20 46 52 4f 4d 20 61 75 78 2e 25 73 22 2c  ," FROM aux.%s",
38d0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 7a 53 65   zId);.      zSe
38e0: 70 20 3d 20 22 20 4f 52 44 45 52 20 42 59 22 3b  p = " ORDER BY";
38f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
3900: 69 3c 3d 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20  i<=nPk; i++){.  
3910: 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28        strPrintf(
3920: 26 73 71 6c 2c 20 22 25 73 20 25 64 22 2c 20 7a  &sql, "%s %d", z
3930: 53 65 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  Sep, i);.       
3940: 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20   zSep = ",";.   
3950: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 74 6d 74     }.      pStmt
3960: 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28 22 25   = db_prepare("%
3970: 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20 20 20  s", sql.z);.    
3980: 20 20 73 74 72 46 72 65 65 28 26 73 71 6c 29 3b    strFree(&sql);
3990: 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66  .      strPrintf
39a0: 28 26 69 6e 73 2c 20 22 49 4e 53 45 52 54 20 49  (&ins, "INSERT I
39b0: 4e 54 4f 20 25 73 22 2c 20 7a 49 64 29 3b 0a 20  NTO %s", zId);. 
39c0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 28 22 3b       zSep = "(";
39d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
39e0: 61 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  az[i]; i++){.   
39f0: 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26       strPrintf(&
3a00: 69 6e 73 2c 20 22 25 73 25 73 22 2c 20 7a 53 65  ins, "%s%s", zSe
3a10: 70 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  p, az[i]);.     
3a20: 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20     zSep = ",";. 
3a30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 72       }.      str
3a40: 50 72 69 6e 74 66 28 26 69 6e 73 2c 22 29 20 56  Printf(&ins,") V
3a50: 41 4c 55 45 53 22 29 3b 0a 20 20 20 20 20 20 6e  ALUES");.      n
3a60: 61 6d 65 6c 69 73 74 46 72 65 65 28 61 7a 29 3b  amelistFree(az);
3a70: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
3a80: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
3a90: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
3aa0: 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
3ab0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
3ac0: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
3ad0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
3ae0: 22 25 73 22 2c 69 6e 73 2e 7a 29 3b 0a 20 20 20  "%s",ins.z);.   
3af0: 20 20 20 7a 53 65 70 20 3d 20 22 28 22 3b 0a 20     zSep = "(";. 
3b00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
3b10: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
3b20: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
3b30: 20 22 25 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20   "%s",zSep);.   
3b40: 20 20 20 20 20 70 72 69 6e 74 51 75 6f 74 65 64       printQuoted
3b50: 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f  (out, sqlite3_co
3b60: 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74  lumn_value(pStmt
3b70: 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7a 53  ,i));.        zS
3b80: 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20  ep = ",";.      
3b90: 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
3ba0: 6f 75 74 2c 20 22 29 3b 5c 6e 22 29 3b 0a 20 20  out, ");\n");.  
3bb0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
3bc0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
3bd0: 0a 20 20 20 20 73 74 72 46 72 65 65 28 26 69 6e  .    strFree(&in
3be0: 73 29 3b 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66  s);.  } /* endif
3bf0: 20 21 67 2e 62 53 63 68 65 6d 61 4f 6e 6c 79 20   !g.bSchemaOnly 
3c00: 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f  */.  pStmt = db_
3c10: 70 72 65 70 61 72 65 28 22 53 45 4c 45 43 54 20  prepare("SELECT 
3c20: 73 71 6c 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c  sql FROM aux.sql
3c30: 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 69   " WHERE type='i
3c60: 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61  ndex' AND tbl_na
3c70: 6d 65 3d 25 51 20 41 4e 44 20 73 71 6c 20 49 53  me=%Q AND sql IS
3c80: 20 4e 4f 54 20 4e 55 4c 4c 22 2c 0a 20 20 20 20   NOT NULL",.    
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 7a 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   zTab);.  while(
3cb0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
3cc0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
3cd0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
3ce0: 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 73 71  out, "%s;\n", sq
3cf0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
3d00: 74 28 70 53 74 6d 74 2c 30 29 29 3b 0a 20 20 7d  t(pStmt,0));.  }
3d10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
3d20: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 0a  ize(pStmt);.}...
3d30: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6c  /*.** Compute al
3d40: 6c 20 64 69 66 66 65 72 65 6e 63 65 73 20 66 6f  l differences fo
3d50: 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  r a single table
3d60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3d70: 20 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 28   diff_one_table(
3d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
3d90: 2c 20 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20  , FILE *out){.  
3da0: 63 68 61 72 20 2a 7a 49 64 20 3d 20 73 61 66 65  char *zId = safe
3db0: 49 64 28 7a 54 61 62 29 3b 20 2f 2a 20 4e 61 6d  Id(zTab); /* Nam
3dc0: 65 20 6f 66 20 74 61 62 6c 65 20 28 74 72 61 6e  e of table (tran
3dd0: 73 6c 61 74 65 64 20 66 6f 72 20 75 73 20 69 6e  slated for us in
3de0: 20 53 51 4c 29 20 2a 2f 0a 20 20 63 68 61 72 20   SQL) */.  char 
3df0: 2a 2a 61 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  **az = 0;       
3e00: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
3e10: 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20 63 68 61  in main */.  cha
3e20: 72 20 2a 2a 61 7a 32 20 3d 20 30 3b 20 20 20 20  r **az2 = 0;    
3e30: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
3e40: 73 20 69 6e 20 61 75 78 20 2a 2f 0a 20 20 69 6e  s in aux */.  in
3e50: 74 20 6e 50 6b 3b 20 20 20 20 20 20 20 20 20 20  t nPk;          
3e60: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61          /* Prima
3e70: 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  ry key columns i
3e80: 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  n main */.  int 
3e90: 6e 50 6b 32 3b 20 20 20 20 20 20 20 20 20 20 20  nPk2;           
3ea0: 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79        /* Primary
3eb0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
3ec0: 61 75 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 3d  aux */.  int n =
3ed0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
3ee0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3ef0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61 69 6e 20  columns in main 
3f00: 2a 2f 0a 20 20 69 6e 74 20 6e 32 3b 20 20 20 20  */.  int n2;    
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
3f30: 6d 6e 73 20 69 6e 20 61 75 78 20 2a 2f 0a 20 20  mns in aux */.  
3f40: 69 6e 74 20 6e 51 3b 20 20 20 20 20 20 20 20 20  int nQ;         
3f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3f60: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
3f70: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 69 66  lumns in the dif
3f80: 66 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  f query */.  int
3f90: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
3fa0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
3fb0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  ounter */.  cons
3fc0: 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20  t char *zSep;   
3fd0: 20 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74        /* Separat
3fe0: 6f 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 53  or string */.  S
3ff0: 74 72 20 73 71 6c 3b 20 20 20 20 20 20 20 20 20  tr sql;         
4000: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
4010: 61 72 69 73 6f 6e 20 71 75 65 72 79 20 2a 2f 0a  arison query */.
4020: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4030: 70 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 51  pStmt;      /* Q
4040: 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74  uery statement t
4050: 6f 20 64 6f 20 74 68 65 20 64 69 66 66 20 2a 2f  o do the diff */
4060: 0a 0a 20 20 73 74 72 49 6e 69 74 28 26 73 71 6c  ..  strInit(&sql
4070: 29 3b 0a 20 20 69 66 28 20 67 2e 66 44 65 62 75  );.  if( g.fDebu
4080: 67 3d 3d 44 45 42 55 47 5f 43 4f 4c 55 4d 4e 5f  g==DEBUG_COLUMN_
4090: 4e 41 4d 45 53 20 29 7b 0a 20 20 20 20 2f 2a 20  NAMES ){.    /* 
40a0: 53 69 6d 70 6c 79 20 72 75 6e 20 63 6f 6c 75 6d  Simply run colum
40b0: 6e 4e 61 6d 65 73 28 29 20 6f 6e 20 61 6c 6c 20  nNames() on all 
40c0: 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6f 72  tables of the or
40d0: 69 67 69 6e 0a 20 20 20 20 2a 2a 20 64 61 74 61  igin.    ** data
40e0: 62 61 73 65 20 61 6e 64 20 73 68 6f 77 20 74 68  base and show th
40f0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
4100: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
4110: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ting.    ** and 
4120: 64 65 62 75 67 67 69 6e 67 20 6f 66 20 74 68 65  debugging of the
4130: 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 66   columnNames() f
4140: 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
4150: 20 20 20 20 61 7a 20 3d 20 63 6f 6c 75 6d 6e 4e      az = columnN
4160: 61 6d 65 73 28 22 61 75 78 22 2c 7a 54 61 62 2c  ames("aux",zTab,
4170: 20 26 6e 50 6b 2c 20 30 29 3b 0a 20 20 20 20 69   &nPk, 0);.    i
4180: 66 28 20 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  f( az==0 ){.    
4190: 20 20 70 72 69 6e 74 66 28 22 52 6f 77 69 64 20    printf("Rowid 
41a0: 6e 6f 74 20 61 63 63 65 73 73 69 62 6c 65 20 66  not accessible f
41b0: 6f 72 20 25 73 5c 6e 22 2c 20 7a 49 64 29 3b 0a  or %s\n", zId);.
41c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
41d0: 20 70 72 69 6e 74 66 28 22 25 73 3a 22 2c 20 7a   printf("%s:", z
41e0: 49 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Id);.      for(i
41f0: 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  =0; az[i]; i++){
4200: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
4210: 22 20 25 73 22 2c 20 61 7a 5b 69 5d 29 3b 0a 20  " %s", az[i]);. 
4220: 20 20 20 20 20 20 20 69 66 28 20 69 2b 31 3d 3d         if( i+1==
4230: 6e 50 6b 20 29 20 70 72 69 6e 74 66 28 22 20 2a  nPk ) printf(" *
4240: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
4250: 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
4260: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65      }.    goto e
4270: 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c  nd_diff_one_tabl
4280: 65 3b 0a 20 20 7d 0a 20 20 20 20 0a 0a 20 20 69  e;.  }.    ..  i
4290: 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  f( sqlite3_table
42a0: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
42b0: 28 67 2e 64 62 2c 22 61 75 78 22 2c 7a 54 61 62  (g.db,"aux",zTab
42c0: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 20 29 7b  ,0,0,0,0,0,0) ){
42d0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
42e0: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
42f0: 65 74 61 64 61 74 61 28 67 2e 64 62 2c 22 6d 61  etadata(g.db,"ma
4300: 69 6e 22 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c 30  in",zTab,0,0,0,0
4310: 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  ,0,0) ){.      /
4320: 2a 20 54 61 62 6c 65 20 6d 69 73 73 69 6e 67 20  * Table missing 
4330: 66 72 6f 6d 20 73 65 63 6f 6e 64 20 64 61 74 61  from second data
4340: 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 66  base. */.      f
4350: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 44 52 4f  printf(out, "DRO
4360: 50 20 54 41 42 4c 45 20 25 73 3b 5c 6e 22 2c 20  P TABLE %s;\n", 
4370: 7a 49 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zId);.    }.    
4380: 67 6f 74 6f 20 65 6e 64 5f 64 69 66 66 5f 6f 6e  goto end_diff_on
4390: 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  e_table;.  }..  
43a0: 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  if( sqlite3_tabl
43b0: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
43c0: 61 28 67 2e 64 62 2c 22 6d 61 69 6e 22 2c 7a 54  a(g.db,"main",zT
43d0: 61 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 20  ab,0,0,0,0,0,0) 
43e0: 29 7b 0a 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ){.    /* Table 
43f0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 75  missing from sou
4400: 72 63 65 20 2a 2f 0a 20 20 20 20 64 75 6d 70 5f  rce */.    dump_
4410: 74 61 62 6c 65 28 7a 54 61 62 2c 20 6f 75 74 29  table(zTab, out)
4420: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64  ;.    goto end_d
4430: 69 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20  iff_one_table;. 
4440: 20 7d 0a 0a 20 20 61 7a 20 3d 20 63 6f 6c 75 6d   }..  az = colum
4450: 6e 4e 61 6d 65 73 28 22 6d 61 69 6e 22 2c 20 7a  nNames("main", z
4460: 54 61 62 2c 20 26 6e 50 6b 2c 20 30 29 3b 0a 20  Tab, &nPk, 0);. 
4470: 20 61 7a 32 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d   az2 = columnNam
4480: 65 73 28 22 61 75 78 22 2c 20 7a 54 61 62 2c 20  es("aux", zTab, 
4490: 26 6e 50 6b 32 2c 20 30 29 3b 0a 20 20 69 66 28  &nPk2, 0);.  if(
44a0: 20 61 7a 20 26 26 20 61 7a 32 20 29 7b 0a 20 20   az && az2 ){.  
44b0: 20 20 66 6f 72 28 6e 3d 30 3b 20 61 7a 5b 6e 5d    for(n=0; az[n]
44c0: 20 26 26 20 61 7a 32 5b 6e 5d 3b 20 6e 2b 2b 29   && az2[n]; n++)
44d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
44e0: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 5b 6e  te3_stricmp(az[n
44f0: 5d 2c 61 7a 32 5b 6e 5d 29 21 3d 30 20 29 20 62  ],az2[n])!=0 ) b
4500: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4510: 20 20 69 66 28 20 61 7a 3d 3d 30 0a 20 20 20 7c    if( az==0.   |
4520: 7c 20 61 7a 32 3d 3d 30 0a 20 20 20 7c 7c 20 6e  | az2==0.   || n
4530: 50 6b 21 3d 6e 50 6b 32 0a 20 20 20 7c 7c 20 61  Pk!=nPk2.   || a
4540: 7a 5b 6e 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  z[n].  ){.    /*
4550: 20 53 63 68 65 6d 61 20 6d 69 73 6d 61 74 63 68   Schema mismatch
4560: 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
4570: 6f 75 74 2c 20 22 44 52 4f 50 20 54 41 42 4c 45  out, "DROP TABLE
4580: 20 25 73 3b 20 2d 2d 20 64 75 65 20 74 6f 20 73   %s; -- due to s
4590: 63 68 65 6d 61 20 6d 69 73 6d 61 74 63 68 5c 6e  chema mismatch\n
45a0: 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 64 75 6d  ", zId);.    dum
45b0: 70 5f 74 61 62 6c 65 28 7a 54 61 62 2c 20 6f 75  p_table(zTab, ou
45c0: 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  t);.    goto end
45d0: 5f 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b  _diff_one_table;
45e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64  .  }..  /* Build
45f0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
4600: 71 75 65 72 79 20 2a 2f 0a 20 20 66 6f 72 28 6e  query */.  for(n
4610: 32 3d 6e 3b 20 61 7a 32 5b 6e 32 5d 3b 20 6e 32  2=n; az2[n2]; n2
4620: 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  ++){.    fprintf
4630: 28 6f 75 74 2c 20 22 41 4c 54 45 52 20 54 41 42  (out, "ALTER TAB
4640: 4c 45 20 25 73 20 41 44 44 20 43 4f 4c 55 4d 4e  LE %s ADD COLUMN
4650: 20 25 73 3b 5c 6e 22 2c 20 7a 49 64 2c 20 73 61   %s;\n", zId, sa
4660: 66 65 49 64 28 61 7a 32 5b 6e 32 5d 29 29 3b 0a  feId(az2[n2]));.
4670: 20 20 7d 0a 20 20 6e 51 20 3d 20 6e 50 6b 32 2b    }.  nQ = nPk2+
4680: 31 2b 32 2a 28 6e 32 2d 6e 50 6b 32 29 3b 0a 20  1+2*(n2-nPk2);. 
4690: 20 69 66 28 20 6e 32 3e 6e 50 6b 32 20 29 7b 0a   if( n2>nPk2 ){.
46a0: 20 20 20 20 7a 53 65 70 20 3d 20 22 53 45 4c 45      zSep = "SELE
46b0: 43 54 20 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  CT ";.    for(i=
46c0: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
46d0: 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28        strPrintf(
46e0: 26 73 71 6c 2c 20 22 25 73 42 2e 25 73 22 2c 20  &sql, "%sB.%s", 
46f0: 7a 53 65 70 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20  zSep, az[i]);.  
4700: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b      zSep = ", ";
4710: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72 50 72  .    }.    strPr
4720: 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c 20 31 25  intf(&sql, ", 1%
4730: 73 20 2d 2d 20 63 68 61 6e 67 65 64 20 72 6f 77  s -- changed row
4740: 5c 6e 22 2c 20 6e 50 6b 3d 3d 6e 20 3f 20 22 22  \n", nPk==n ? ""
4750: 20 3a 20 22 2c 22 29 3b 0a 20 20 20 20 77 68 69   : ",");.    whi
4760: 6c 65 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20  le( az[i] ){.   
4770: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
4780: 6c 2c 20 22 20 20 20 20 20 20 20 41 2e 25 73 20  l, "       A.%s 
4790: 49 53 20 4e 4f 54 20 42 2e 25 73 2c 20 42 2e 25  IS NOT B.%s, B.%
47a0: 73 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s%s\n",.        
47b0: 20 20 20 20 20 20 20 20 61 7a 5b 69 5d 2c 20 61          az[i], a
47c0: 7a 32 5b 69 5d 2c 20 61 7a 32 5b 69 5d 2c 20 61  z2[i], az2[i], a
47d0: 7a 32 5b 69 2b 31 5d 3d 3d 30 20 3f 20 22 22 20  z2[i+1]==0 ? "" 
47e0: 3a 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 2b  : ",");.      i+
47f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  +;.    }.    whi
4800: 6c 65 28 20 61 7a 32 5b 69 5d 20 29 7b 0a 20 20  le( az2[i] ){.  
4810: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
4820: 71 6c 2c 20 22 20 20 20 20 20 20 20 42 2e 25 73  ql, "       B.%s
4830: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 2c 20 42 2e   IS NOT NULL, B.
4840: 25 73 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s%s\n",.       
4850: 20 20 20 20 20 20 20 20 20 61 7a 32 5b 69 5d 2c           az2[i],
4860: 20 61 7a 32 5b 69 5d 2c 20 61 7a 32 5b 69 2b 31   az2[i], az2[i+1
4870: 5d 3d 3d 30 20 3f 20 22 22 20 3a 20 22 2c 22 29  ]==0 ? "" : ",")
4880: 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  ;.      i++;.   
4890: 20 7d 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66   }.    strPrintf
48a0: 28 26 73 71 6c 2c 20 22 20 20 46 52 4f 4d 20 6d  (&sql, "  FROM m
48b0: 61 69 6e 2e 25 73 20 41 2c 20 61 75 78 2e 25 73  ain.%s A, aux.%s
48c0: 20 42 5c 6e 22 2c 20 7a 49 64 2c 20 7a 49 64 29   B\n", zId, zId)
48d0: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 20 57  ;.    zSep = " W
48e0: 48 45 52 45 22 3b 0a 20 20 20 20 66 6f 72 28 69  HERE";.    for(i
48f0: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
4900: 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66  .      strPrintf
4910: 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d  (&sql, "%s A.%s=
4920: 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b  B.%s", zSep, az[
4930: 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  i], az[i]);.    
4940: 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 22 3b    zSep = " AND";
4950: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 70 20  .    }.    zSep 
4960: 3d 20 22 5c 6e 20 20 20 41 4e 44 20 28 22 3b 0a  = "\n   AND (";.
4970: 20 20 20 20 77 68 69 6c 65 28 20 61 7a 5b 69 5d      while( az[i]
4980: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69   ){.      strPri
4990: 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 41 2e 25  ntf(&sql, "%sA.%
49a0: 73 20 49 53 20 4e 4f 54 20 42 2e 25 73 25 73 5c  s IS NOT B.%s%s\
49b0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
49c0: 20 20 20 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 2c      zSep, az[i],
49d0: 20 61 7a 32 5b 69 5d 2c 20 61 7a 32 5b 69 2b 31   az2[i], az2[i+1
49e0: 5d 3d 3d 30 20 3f 20 22 29 22 20 3a 20 22 22 29  ]==0 ? ")" : "")
49f0: 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  ;.      zSep = "
4a00: 20 20 20 20 20 20 20 20 4f 52 20 22 3b 0a 20 20          OR ";.  
4a10: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
4a20: 20 20 20 77 68 69 6c 65 28 20 61 7a 32 5b 69 5d     while( az2[i]
4a30: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69   ){.      strPri
4a40: 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 42 2e 25  ntf(&sql, "%sB.%
4a50: 73 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 25 73 5c  s IS NOT NULL%s\
4a60: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
4a70: 20 20 20 20 7a 53 65 70 2c 20 61 7a 32 5b 69 5d      zSep, az2[i]
4a80: 2c 20 61 7a 32 5b 69 2b 31 5d 3d 3d 30 20 3f 20  , az2[i+1]==0 ? 
4a90: 22 29 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  ")" : "");.     
4aa0: 20 7a 53 65 70 20 3d 20 22 20 20 20 20 20 20 20   zSep = "       
4ab0: 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 69 2b 2b   OR ";.      i++
4ac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72 50  ;.    }.    strP
4ad0: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 55 4e  rintf(&sql, " UN
4ae0: 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b 0a 20 20 7d  ION ALL\n");.  }
4af0: 0a 20 20 7a 53 65 70 20 3d 20 22 53 45 4c 45 43  .  zSep = "SELEC
4b00: 54 20 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  T ";.  for(i=0; 
4b10: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
4b20: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
4b30: 20 22 25 73 41 2e 25 73 22 2c 20 7a 53 65 70 2c   "%sA.%s", zSep,
4b40: 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a 53 65   az[i]);.    zSe
4b50: 70 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20 20  p = ", ";.  }.  
4b60: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
4b70: 22 2c 20 32 25 73 20 2d 2d 20 64 65 6c 65 74 65  ", 2%s -- delete
4b80: 64 20 72 6f 77 5c 6e 22 2c 20 6e 50 6b 3d 3d 6e  d row\n", nPk==n
4b90: 20 3f 20 22 22 20 3a 20 22 2c 22 29 3b 0a 20 20   ? "" : ",");.  
4ba0: 77 68 69 6c 65 28 20 61 7a 32 5b 69 5d 20 29 7b  while( az2[i] ){
4bb0: 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26  .    strPrintf(&
4bc0: 73 71 6c 2c 20 22 20 20 20 20 20 20 20 4e 55 4c  sql, "       NUL
4bd0: 4c 2c 20 4e 55 4c 4c 25 73 5c 6e 22 2c 20 69 3d  L, NULL%s\n", i=
4be0: 3d 6e 32 2d 31 20 3f 20 22 22 20 3a 20 22 2c 22  =n2-1 ? "" : ","
4bf0: 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  );.    i++;.  }.
4c00: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
4c10: 2c 20 22 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 25  , "  FROM main.%
4c20: 73 20 41 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20  s A\n", zId);.  
4c30: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
4c40: 22 20 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53  " WHERE NOT EXIS
4c50: 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  TS(SELECT 1 FROM
4c60: 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49   aux.%s B\n", zI
4c70: 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20 20 20 20  d);.  zSep =    
4c80: 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20        "         
4c90: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 22            WHERE"
4ca0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
4cb0: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Pk; i++){.    st
4cc0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
4cd0: 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53  s A.%s=B.%s", zS
4ce0: 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d  ep, az[i], az[i]
4cf0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 20  );.    zSep = " 
4d00: 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50  AND";.  }.  strP
4d10: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 29 5c 6e  rintf(&sql, ")\n
4d20: 22 29 3b 0a 20 20 7a 53 65 70 20 3d 20 22 20 55  ");.  zSep = " U
4d30: 4e 49 4f 4e 20 41 4c 4c 5c 6e 53 45 4c 45 43 54  NION ALL\nSELECT
4d40: 20 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   ";.  for(i=0; i
4d50: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
4d60: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
4d70: 22 25 73 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20  "%sB.%s", zSep, 
4d80: 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a 53 65 70  az[i]);.    zSep
4d90: 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20 20 73   = ", ";.  }.  s
4da0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
4db0: 2c 20 33 25 73 20 2d 2d 20 69 6e 73 65 72 74 65  , 3%s -- inserte
4dc0: 64 20 72 6f 77 5c 6e 22 2c 20 6e 50 6b 3d 3d 6e  d row\n", nPk==n
4dd0: 20 3f 20 22 22 20 3a 20 22 2c 22 29 3b 0a 20 20   ? "" : ",");.  
4de0: 77 68 69 6c 65 28 20 61 7a 32 5b 69 5d 20 29 7b  while( az2[i] ){
4df0: 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26  .    strPrintf(&
4e00: 73 71 6c 2c 20 22 20 20 20 20 20 20 20 31 2c 20  sql, "       1, 
4e10: 42 2e 25 73 25 73 5c 6e 22 2c 20 61 7a 32 5b 69  B.%s%s\n", az2[i
4e20: 5d 2c 20 61 7a 32 5b 69 2b 31 5d 3d 3d 30 20 3f  ], az2[i+1]==0 ?
4e30: 20 22 22 20 3a 20 22 2c 22 29 3b 0a 20 20 20 20   "" : ",");.    
4e40: 69 2b 2b 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72  i++;.  }.  strPr
4e50: 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20 46 52  intf(&sql, "  FR
4e60: 4f 4d 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20  OM aux.%s B\n", 
4e70: 7a 49 64 29 3b 0a 20 20 73 74 72 50 72 69 6e 74  zId);.  strPrint
4e80: 66 28 26 73 71 6c 2c 20 22 20 57 48 45 52 45 20  f(&sql, " WHERE 
4e90: 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43  NOT EXISTS(SELEC
4ea0: 54 20 31 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73  T 1 FROM main.%s
4eb0: 20 41 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 7a   A\n", zId);.  z
4ec0: 53 65 70 20 3d 20 20 20 20 20 20 20 20 20 20 22  Sep =          "
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 20 20 20 57 48 45 52 45 22 3b 0a 20 20 66 6f 72     WHERE";.  for
4ef0: 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  (i=0; i<nPk; i++
4f00: 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  ){.    strPrintf
4f10: 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d  (&sql, "%s A.%s=
4f20: 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b  B.%s", zSep, az[
4f30: 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  i], az[i]);.    
4f40: 7a 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20  zSep = " AND";. 
4f50: 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26   }.  strPrintf(&
4f60: 73 71 6c 2c 20 22 29 5c 6e 20 4f 52 44 45 52 20  sql, ")\n ORDER 
4f70: 42 59 22 29 3b 0a 20 20 7a 53 65 70 20 3d 20 22  BY");.  zSep = "
4f80: 20 22 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   ";.  for(i=1; i
4f90: 3c 3d 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  <=nPk; i++){.   
4fa0: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
4fb0: 20 22 25 73 25 64 22 2c 20 7a 53 65 70 2c 20 69   "%s%d", zSep, i
4fc0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c  );.    zSep = ",
4fd0: 20 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69   ";.  }.  strPri
4fe0: 6e 74 66 28 26 73 71 6c 2c 20 22 3b 5c 6e 22 29  ntf(&sql, ";\n")
4ff0: 3b 0a 0a 20 20 69 66 28 20 67 2e 66 44 65 62 75  ;..  if( g.fDebu
5000: 67 20 26 20 44 45 42 55 47 5f 44 49 46 46 5f 53  g & DEBUG_DIFF_S
5010: 51 4c 20 29 7b 20 0a 20 20 20 20 70 72 69 6e 74  QL ){ .    print
5020: 66 28 22 53 51 4c 20 66 6f 72 20 25 73 3a 5c 6e  f("SQL for %s:\n
5030: 25 73 5c 6e 22 2c 20 7a 49 64 2c 20 73 71 6c 2e  %s\n", zId, sql.
5040: 7a 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  z);.    goto end
5050: 5f 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b  _diff_one_table;
5060: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  .  }..  /* Drop 
5070: 69 6e 64 65 78 65 73 20 74 68 61 74 20 61 72 65  indexes that are
5080: 20 6d 69 73 73 69 6e 67 20 69 6e 20 74 68 65 20   missing in the 
5090: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
50a0: 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70   pStmt = db_prep
50b0: 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54  are(.    "SELECT
50c0: 20 6e 61 6d 65 20 46 52 4f 4d 20 6d 61 69 6e 2e   name FROM main.
50d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
50e0: 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d     " WHERE type=
50f0: 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f  'index' AND tbl_
5100: 6e 61 6d 65 3d 25 51 22 0a 20 20 20 20 22 20 20  name=%Q".    "  
5110: 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54 20   AND sql IS NOT 
5120: 4e 55 4c 4c 22 0a 20 20 20 20 22 20 20 20 41 4e  NULL".    "   AN
5130: 44 20 73 71 6c 20 4e 4f 54 20 49 4e 20 28 53 45  D sql NOT IN (SE
5140: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 61 75  LECT sql FROM au
5150: 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  x.sqlite_master"
5160: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
5170: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20            WHERE 
5180: 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44  type='index' AND
5190: 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 22 0a 20 20   tbl_name=%Q".  
51a0: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
51b0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 73 71 6c           AND sql
51c0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 29 22 2c 0a   IS NOT NULL)",.
51d0: 20 20 20 20 7a 54 61 62 2c 20 7a 54 61 62 29 3b      zTab, zTab);
51e0: 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
51f0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
5200: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
5210: 20 63 68 61 72 20 2a 7a 20 3d 20 73 61 66 65 49   char *z = safeI
5220: 64 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  d((const char*)s
5230: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
5240: 78 74 28 70 53 74 6d 74 2c 30 29 29 3b 0a 20 20  xt(pStmt,0));.  
5250: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
5260: 44 52 4f 50 20 49 4e 44 45 58 20 25 73 3b 5c 6e  DROP INDEX %s;\n
5270: 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
5280: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
5290: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
52a0: 7a 65 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a  ze(pStmt);..  /*
52b0: 20 52 75 6e 20 74 68 65 20 71 75 65 72 79 20 61   Run the query a
52c0: 6e 64 20 6f 75 74 70 75 74 20 64 69 66 66 65 72  nd output differ
52d0: 65 6e 63 65 73 20 2a 2f 0a 20 20 69 66 28 20 21  ences */.  if( !
52e0: 67 2e 62 53 63 68 65 6d 61 4f 6e 6c 79 20 29 7b  g.bSchemaOnly ){
52f0: 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 64 62 5f  .    pStmt = db_
5300: 70 72 65 70 61 72 65 28 22 25 73 22 2c 20 73 71  prepare("%s", sq
5310: 6c 2e 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  l.z);.    while(
5320: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
5330: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
5340: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
5350: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ype = sqlite3_co
5360: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
5370: 6e 50 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nPk);.      if( 
5380: 69 54 79 70 65 3d 3d 31 20 7c 7c 20 69 54 79 70  iType==1 || iTyp
5390: 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e==2 ){.        
53a0: 69 66 28 20 69 54 79 70 65 3d 3d 31 20 29 7b 20  if( iType==1 ){ 
53b0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
53c0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
53d0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
53e0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
53f0: 55 50 44 41 54 45 20 25 73 22 2c 20 7a 49 64 29  UPDATE %s", zId)
5400: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65 70  ;.          zSep
5410: 20 3d 20 22 20 53 45 54 22 3b 0a 20 20 20 20 20   = " SET";.     
5420: 20 20 20 20 20 66 6f 72 28 69 3d 6e 50 6b 2b 31       for(i=nPk+1
5430: 3b 20 69 3c 6e 51 3b 20 69 2b 3d 32 29 7b 0a 20  ; i<nQ; i+=2){. 
5440: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
5450: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
5460: 74 28 70 53 74 6d 74 2c 69 29 3d 3d 30 20 29 20  t(pStmt,i)==0 ) 
5470: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5480: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
5490: 74 2c 20 22 25 73 20 25 73 3d 22 2c 20 7a 53 65  t, "%s %s=", zSe
54a0: 70 2c 20 61 7a 32 5b 28 69 2b 6e 50 6b 2d 31 29  p, az2[(i+nPk-1)
54b0: 2f 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  /2]);.          
54c0: 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20    zSep = ",";.  
54d0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 51            printQ
54e0: 75 6f 74 65 64 28 6f 75 74 2c 20 73 71 6c 69 74  uoted(out, sqlit
54f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
5500: 70 53 74 6d 74 2c 69 2b 31 29 29 3b 0a 20 20 20  pStmt,i+1));.   
5510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5520: 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
5530: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
5540: 20 61 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20   a row */.      
5550: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
5560: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73   "DELETE FROM %s
5570: 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
5580: 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20   }.        zSep 
5590: 3d 20 22 20 57 48 45 52 45 22 3b 0a 20 20 20 20  = " WHERE";.    
55a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
55b0: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
55c0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
55d0: 20 22 25 73 20 25 73 3d 22 2c 20 7a 53 65 70 2c   "%s %s=", zSep,
55e0: 20 61 7a 32 5b 69 5d 29 3b 0a 20 20 20 20 20 20   az2[i]);.      
55f0: 20 20 20 20 70 72 69 6e 74 51 75 6f 74 65 64 28      printQuoted(
5600: 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  out, sqlite3_col
5610: 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c  umn_value(pStmt,
5620: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  i));.          z
5630: 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20  Sep = " AND";.  
5640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5650: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 3b 5c  fprintf(out, ";\
5660: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n");.      }else
5670: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
5680: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 61 20 72     /* Insert a r
5690: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 70  ow */.        fp
56a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 49 4e 53 45  rintf(out, "INSE
56b0: 52 54 20 49 4e 54 4f 20 25 73 28 25 73 22 2c 20  RT INTO %s(%s", 
56c0: 7a 49 64 2c 20 61 7a 32 5b 30 5d 29 3b 0a 20 20  zId, az2[0]);.  
56d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61        for(i=1; a
56e0: 7a 32 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69  z2[i]; i++) fpri
56f0: 6e 74 66 28 6f 75 74 2c 20 22 2c 25 73 22 2c 20  ntf(out, ",%s", 
5700: 61 7a 32 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  az2[i]);.       
5710: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 29   fprintf(out, ")
5720: 20 56 41 4c 55 45 53 22 29 3b 0a 20 20 20 20 20   VALUES");.     
5730: 20 20 20 7a 53 65 70 20 3d 20 22 28 22 3b 0a 20     zSep = "(";. 
5740: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
5750: 69 3c 6e 50 6b 32 3b 20 69 2b 2b 29 7b 0a 20 20  i<nPk2; i++){.  
5760: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
5770: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 53 65 70 29  out, "%s", zSep)
5780: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65 70  ;.          zSep
5790: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 20 20   = ",";.        
57a0: 20 20 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75    printQuoted(ou
57b0: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t, sqlite3_colum
57c0: 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 69 29  n_value(pStmt,i)
57d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
57e0: 20 20 20 20 20 66 6f 72 28 69 3d 6e 50 6b 32 2b       for(i=nPk2+
57f0: 32 3b 20 69 3c 6e 51 3b 20 69 2b 3d 32 29 7b 0a  2; i<nQ; i+=2){.
5800: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
5810: 66 28 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  f(out, ",");.   
5820: 20 20 20 20 20 20 20 70 72 69 6e 74 51 75 6f 74         printQuot
5830: 65 64 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f  ed(out, sqlite3_
5840: 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74  column_value(pSt
5850: 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  mt,i));.        
5860: 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  }.        fprint
5870: 66 28 6f 75 74 2c 20 22 29 3b 5c 6e 22 29 3b 0a  f(out, ");\n");.
5880: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5890: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
58a0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 20 2f  ze(pStmt);.  } /
58b0: 2a 20 65 6e 64 69 66 20 21 67 2e 62 53 63 68 65  * endif !g.bSche
58c0: 6d 61 4f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20  maOnly */..  /* 
58d0: 43 72 65 61 74 65 20 69 6e 64 65 78 65 73 20 74  Create indexes t
58e0: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
58f0: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 2a 2f  in the source */
5900: 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72  .  pStmt = db_pr
5910: 65 70 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45  epare(.    "SELE
5920: 43 54 20 73 71 6c 20 46 52 4f 4d 20 61 75 78 2e  CT sql FROM aux.
5930: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
5940: 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d     " WHERE type=
5950: 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f  'index' AND tbl_
5960: 6e 61 6d 65 3d 25 51 22 0a 20 20 20 20 22 20 20  name=%Q".    "  
5970: 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54 20   AND sql IS NOT 
5980: 4e 55 4c 4c 22 0a 20 20 20 20 22 20 20 20 41 4e  NULL".    "   AN
5990: 44 20 73 71 6c 20 4e 4f 54 20 49 4e 20 28 53 45  D sql NOT IN (SE
59a0: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 6d 61  LECT sql FROM ma
59b0: 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in.sqlite_master
59c0: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20  ".    "         
59d0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
59e0: 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e   type='index' AN
59f0: 44 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 22 0a 20  D tbl_name=%Q". 
5a00: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20     "            
5a10: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 73 71            AND sq
5a20: 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 29 22 2c  l IS NOT NULL)",
5a30: 0a 20 20 20 20 7a 54 61 62 2c 20 7a 54 61 62 29  .    zTab, zTab)
5a40: 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  ;.  while( SQLIT
5a50: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
5a60: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
5a70: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
5a80: 25 73 3b 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  %s;\n", sqlite3_
5a90: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
5aa0: 74 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  t,0));.  }.  sql
5ab0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
5ac0: 74 6d 74 29 3b 0a 0a 65 6e 64 5f 64 69 66 66 5f  tmt);..end_diff_
5ad0: 6f 6e 65 5f 74 61 62 6c 65 3a 0a 20 20 73 74 72  one_table:.  str
5ae0: 46 72 65 65 28 26 73 71 6c 29 3b 0a 20 20 73 71  Free(&sql);.  sq
5af0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 64 29 3b  lite3_free(zId);
5b00: 0a 20 20 6e 61 6d 65 6c 69 73 74 46 72 65 65 28  .  namelistFree(
5b10: 61 7a 29 3b 0a 20 20 6e 61 6d 65 6c 69 73 74 46  az);.  namelistF
5b20: 72 65 65 28 61 7a 32 29 3b 0a 20 20 72 65 74 75  ree(az2);.  retu
5b30: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rn;.}../*.** Che
5b40: 63 6b 20 74 68 61 74 20 74 61 62 6c 65 20 7a 54  ck that table zT
5b50: 61 62 20 65 78 69 73 74 73 20 61 6e 64 20 68 61  ab exists and ha
5b60: 73 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d  s the same schem
5b70: 61 20 69 6e 20 62 6f 74 68 20 74 68 65 20 22 6d  a in both the "m
5b80: 61 69 6e 22 0a 2a 2a 20 61 6e 64 20 22 61 75 78  ain".** and "aux
5b90: 22 20 64 61 74 61 62 61 73 65 73 20 63 75 72 72  " databases curr
5ba0: 65 6e 74 6c 79 20 6f 70 65 6e 65 64 20 62 79 20  ently opened by 
5bb0: 74 68 65 20 67 6c 6f 62 61 6c 20 64 62 20 68 61  the global db ha
5bc0: 6e 64 6c 65 2e 20 49 66 20 74 68 65 79 0a 2a 2a  ndle. If they.**
5bd0: 20 64 6f 20 6e 6f 74 2c 20 6f 75 74 70 75 74 20   do not, output 
5be0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5bf0: 20 6f 6e 20 73 74 64 65 72 72 20 61 6e 64 20 65   on stderr and e
5c00: 78 69 74 28 31 29 2e 20 4f 74 68 65 72 77 69 73  xit(1). Otherwis
5c10: 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 73 63 68  e, if.** the sch
5c20: 65 6d 61 73 20 64 6f 20 6d 61 74 63 68 2c 20 72  emas do match, r
5c30: 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f  eturn control to
5c40: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
5c50: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
5c60: 6b 53 63 68 65 6d 61 73 4d 61 74 63 68 28 63 6f  kSchemasMatch(co
5c70: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b  nst char *zTab){
5c80: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5c90: 2a 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70  *pStmt = db_prep
5ca0: 61 72 65 28 0a 20 20 20 20 20 20 22 53 45 4c 45  are(.      "SELE
5cb0: 43 54 20 41 2e 73 71 6c 3d 42 2e 73 71 6c 20 46  CT A.sql=B.sql F
5cc0: 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  ROM main.sqlite_
5cd0: 6d 61 73 74 65 72 20 41 2c 20 61 75 78 2e 73 71  master A, aux.sq
5ce0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 42 22 0a 20  lite_master B". 
5cf0: 20 20 20 20 20 22 20 57 48 45 52 45 20 41 2e 6e       " WHERE A.n
5d00: 61 6d 65 3d 25 51 20 41 4e 44 20 42 2e 6e 61 6d  ame=%Q AND B.nam
5d10: 65 3d 25 51 22 2c 20 7a 54 61 62 2c 20 7a 54 61  e=%Q", zTab, zTa
5d20: 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  b.  );.  if( SQL
5d30: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
5d40: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
5d50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
5d60: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
5d70: 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,0)==0 ){.      
5d80: 72 75 6e 74 69 6d 65 45 72 72 6f 72 28 22 73 63  runtimeError("sc
5d90: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 66 6f 72  hema changes for
5da0: 20 74 61 62 6c 65 20 25 73 22 2c 20 73 61 66 65   table %s", safe
5db0: 49 64 28 7a 54 61 62 29 29 3b 0a 20 20 20 20 7d  Id(zTab));.    }
5dc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 75  .  }else{.    ru
5dd0: 6e 74 69 6d 65 45 72 72 6f 72 28 22 74 61 62 6c  ntimeError("tabl
5de0: 65 20 25 73 20 6d 69 73 73 69 6e 67 20 66 72 6f  e %s missing fro
5df0: 6d 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 64 61  m one or both da
5e00: 74 61 62 61 73 65 73 22 2c 20 73 61 66 65 49 64  tabases", safeId
5e10: 28 7a 54 61 62 29 29 3b 0a 20 20 7d 0a 20 20 73  (zTab));.  }.  s
5e20: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
5e30: 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  pStmt);.}../****
5e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e80: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ******.** The fo
5e90: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20  llowing code is 
5ea0: 63 6f 70 69 65 64 20 66 72 6f 6d 20 66 6f 73 73  copied from foss
5eb0: 69 6c 2e 20 49 74 20 69 73 20 75 73 65 64 20 74  il. It is used t
5ec0: 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 0a 2a  o generate the.*
5ed0: 2a 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 20 62  * fossil delta b
5ee0: 6c 6f 62 73 20 73 6f 6d 65 74 69 6d 65 73 20 75  lobs sometimes u
5ef0: 73 65 64 20 69 6e 20 52 42 55 20 75 70 64 61 74  sed in RBU updat
5f00: 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 0a 74  e records..*/..t
5f10: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
5f20: 73 68 6f 72 74 20 75 31 36 3b 0a 74 79 70 65 64  short u16;.typed
5f30: 65 66 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ef unsigned int 
5f40: 75 33 32 3b 0a 74 79 70 65 64 65 66 20 75 6e 73  u32;.typedef uns
5f50: 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 0a  igned char u8;..
5f60: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 64 74 68 20  /*.** The width 
5f70: 6f 66 20 61 20 68 61 73 68 20 77 69 6e 64 6f 77  of a hash window
5f80: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20   in bytes.  The 
5f90: 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77  algorithm only w
5fa0: 6f 72 6b 73 20 69 66 20 74 68 69 73 0a 2a 2a 20  orks if this.** 
5fb0: 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 32 2e  is a power of 2.
5fc0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 48 41 53  .*/.#define NHAS
5fd0: 48 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  H 16../*.** The 
5fe0: 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
5ff0: 20 74 68 65 20 72 6f 6c 6c 69 6e 67 20 68 61 73   the rolling has
6000: 68 2e 0a 2a 2a 0a 2a 2a 20 7a 5b 5d 20 68 6f 6c  h..**.** z[] hol
6010: 64 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ds the values th
6020: 61 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 73  at have been has
6030: 68 65 64 2e 20 20 7a 5b 5d 20 69 73 20 61 20 63  hed.  z[] is a c
6040: 69 72 63 75 6c 61 72 20 62 75 66 66 65 72 2e 0a  ircular buffer..
6050: 2a 2a 20 7a 5b 69 5d 20 69 73 20 74 68 65 20 66  ** z[i] is the f
6060: 69 72 73 74 20 65 6e 74 72 79 20 61 6e 64 20 7a  irst entry and z
6070: 5b 28 69 2b 4e 48 41 53 48 2d 31 29 25 4e 48 41  [(i+NHASH-1)%NHA
6080: 53 48 5d 20 69 73 20 74 68 65 20 6c 61 73 74 20  SH] is the last 
6090: 65 6e 74 72 79 20 6f 66 0a 2a 2a 20 74 68 65 20  entry of.** the 
60a0: 77 69 6e 64 6f 77 2e 0a 2a 2a 0a 2a 2a 20 48 61  window..**.** Ha
60b0: 73 68 2e 61 20 69 73 20 74 68 65 20 73 75 6d 20  sh.a is the sum 
60c0: 6f 66 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  of all elements 
60d0: 6f 66 20 68 61 73 68 2e 7a 5b 5d 2e 20 20 48 61  of hash.z[].  Ha
60e0: 73 68 2e 62 20 69 73 20 61 20 77 65 69 67 68 74  sh.b is a weight
60f0: 65 64 0a 2a 2a 20 73 75 6d 2e 20 20 48 61 73 68  ed.** sum.  Hash
6100: 2e 62 20 69 73 20 7a 5b 69 5d 2a 4e 48 41 53 48  .b is z[i]*NHASH
6110: 20 2b 20 7a 5b 69 2b 31 5d 2a 28 4e 48 41 53 48   + z[i+1]*(NHASH
6120: 2d 31 29 20 2b 20 2e 2e 2e 20 2b 20 7a 5b 69 2b  -1) + ... + z[i+
6130: 4e 48 41 53 48 2d 31 5d 2a 31 2e 0a 2a 2a 20 28  NHASH-1]*1..** (
6140: 45 61 63 68 20 69 6e 64 65 78 20 66 6f 72 20 7a  Each index for z
6150: 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6d 6f 64  [] should be mod
6160: 75 6c 65 20 4e 48 41 53 48 2c 20 6f 66 20 63 6f  ule NHASH, of co
6170: 75 72 73 65 2e 20 20 54 68 65 20 25 4e 48 41 53  urse.  The %NHAS
6180: 48 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  H operator.** is
6190: 20 6f 6d 69 74 74 65 64 20 69 6e 20 74 68 65 20   omitted in the 
61a0: 70 72 69 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  prior expression
61b0: 20 66 6f 72 20 62 72 65 76 69 74 79 2e 29 0a 2a   for brevity.).*
61c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
61d0: 20 68 61 73 68 20 68 61 73 68 3b 0a 73 74 72 75   hash hash;.stru
61e0: 63 74 20 68 61 73 68 20 7b 0a 20 20 75 31 36 20  ct hash {.  u16 
61f0: 61 2c 20 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  a, b;         /*
6200: 20 48 61 73 68 20 76 61 6c 75 65 73 20 2a 2f 0a   Hash values */.
6210: 20 20 75 31 36 20 69 3b 20 20 20 20 20 20 20 20    u16 i;        
6220: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
6230: 74 68 65 20 68 61 73 68 20 77 69 6e 64 6f 77 20  the hash window 
6240: 2a 2f 0a 20 20 63 68 61 72 20 7a 5b 4e 48 41 53  */.  char z[NHAS
6250: 48 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 76 61  H];    /* The va
6260: 6c 75 65 73 20 74 68 61 74 20 68 61 76 65 20 62  lues that have b
6270: 65 65 6e 20 68 61 73 68 65 64 20 2a 2f 0a 7d 3b  een hashed */.};
6280: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
6290: 7a 65 20 74 68 65 20 72 6f 6c 6c 69 6e 67 20 68  ze the rolling h
62a0: 61 73 68 20 75 73 69 6e 67 20 74 68 65 20 66 69  ash using the fi
62b0: 72 73 74 20 4e 48 41 53 48 20 63 68 61 72 61 63  rst NHASH charac
62c0: 74 65 72 73 20 6f 66 20 7a 5b 5d 0a 2a 2f 0a 73  ters of z[].*/.s
62d0: 74 61 74 69 63 20 76 6f 69 64 20 68 61 73 68 5f  tatic void hash_
62e0: 69 6e 69 74 28 68 61 73 68 20 2a 70 48 61 73 68  init(hash *pHash
62f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
6300: 7b 0a 20 20 75 31 36 20 61 2c 20 62 2c 20 69 3b  {.  u16 a, b, i;
6310: 0a 20 20 61 20 3d 20 62 20 3d 20 30 3b 0a 20 20  .  a = b = 0;.  
6320: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 48 41 53 48  for(i=0; i<NHASH
6330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 20 2b 3d  ; i++){.    a +=
6340: 20 7a 5b 69 5d 3b 0a 20 20 20 20 62 20 2b 3d 20   z[i];.    b += 
6350: 28 4e 48 41 53 48 2d 69 29 2a 7a 5b 69 5d 3b 0a  (NHASH-i)*z[i];.
6360: 20 20 20 20 70 48 61 73 68 2d 3e 7a 5b 69 5d 20      pHash->z[i] 
6370: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 48  = z[i];.  }.  pH
6380: 61 73 68 2d 3e 61 20 3d 20 61 20 26 20 30 78 66  ash->a = a & 0xf
6390: 66 66 66 3b 0a 20 20 70 48 61 73 68 2d 3e 62 20  fff;.  pHash->b 
63a0: 3d 20 62 20 26 20 30 78 66 66 66 66 3b 0a 20 20  = b & 0xffff;.  
63b0: 70 48 61 73 68 2d 3e 69 20 3d 20 30 3b 0a 7d 0a  pHash->i = 0;.}.
63c0: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
63d0: 68 65 20 72 6f 6c 6c 69 6e 67 20 68 61 73 68 20  he rolling hash 
63e0: 62 79 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72  by a single char
63f0: 61 63 74 65 72 20 22 63 22 0a 2a 2f 0a 73 74 61  acter "c".*/.sta
6400: 74 69 63 20 76 6f 69 64 20 68 61 73 68 5f 6e 65  tic void hash_ne
6410: 78 74 28 68 61 73 68 20 2a 70 48 61 73 68 2c 20  xt(hash *pHash, 
6420: 69 6e 74 20 63 29 7b 0a 20 20 75 31 36 20 6f 6c  int c){.  u16 ol
6430: 64 20 3d 20 70 48 61 73 68 2d 3e 7a 5b 70 48 61  d = pHash->z[pHa
6440: 73 68 2d 3e 69 5d 3b 0a 20 20 70 48 61 73 68 2d  sh->i];.  pHash-
6450: 3e 7a 5b 70 48 61 73 68 2d 3e 69 5d 20 3d 20 28  >z[pHash->i] = (
6460: 63 68 61 72 29 63 3b 0a 20 20 70 48 61 73 68 2d  char)c;.  pHash-
6470: 3e 69 20 3d 20 28 70 48 61 73 68 2d 3e 69 2b 31  >i = (pHash->i+1
6480: 29 26 28 4e 48 41 53 48 2d 31 29 3b 0a 20 20 70  )&(NHASH-1);.  p
6490: 48 61 73 68 2d 3e 61 20 3d 20 70 48 61 73 68 2d  Hash->a = pHash-
64a0: 3e 61 20 2d 20 6f 6c 64 20 2b 20 28 63 68 61 72  >a - old + (char
64b0: 29 63 3b 0a 20 20 70 48 61 73 68 2d 3e 62 20 3d  )c;.  pHash->b =
64c0: 20 70 48 61 73 68 2d 3e 62 20 2d 20 4e 48 41 53   pHash->b - NHAS
64d0: 48 2a 6f 6c 64 20 2b 20 70 48 61 73 68 2d 3e 61  H*old + pHash->a
64e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
64f0: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
6500: 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  value.*/.static 
6510: 75 33 32 20 68 61 73 68 5f 33 32 62 69 74 28 68  u32 hash_32bit(h
6520: 61 73 68 20 2a 70 48 61 73 68 29 7b 0a 20 20 72  ash *pHash){.  r
6530: 65 74 75 72 6e 20 28 70 48 61 73 68 2d 3e 61 20  eturn (pHash->a 
6540: 26 20 30 78 66 66 66 66 29 20 7c 20 28 28 28 75  & 0xffff) | (((u
6550: 33 32 29 28 70 48 61 73 68 2d 3e 62 20 26 20 30  32)(pHash->b & 0
6560: 78 66 66 66 66 29 29 3c 3c 31 36 29 3b 0a 7d 0a  xffff))<<16);.}.
6570: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
6580: 62 61 73 65 2d 36 34 20 69 6e 74 65 67 65 72 20  base-64 integer 
6590: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 62  into the given b
65a0: 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
65b0: 20 76 6f 69 64 20 70 75 74 49 6e 74 28 75 6e 73   void putInt(uns
65c0: 69 67 6e 65 64 20 69 6e 74 20 76 2c 20 63 68 61  igned int v, cha
65d0: 72 20 2a 2a 70 7a 29 7b 0a 20 20 73 74 61 74 69  r **pz){.  stati
65e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 44 69  c const char zDi
65f0: 67 69 74 73 5b 5d 20 3d 0a 20 20 20 20 22 30 31  gits[] =.    "01
6600: 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48  23456789ABCDEFGH
6610: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
6620: 59 5a 5f 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  YZ_abcdefghijklm
6630: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7e 22 3b  nopqrstuvwxyz~";
6640: 0a 20 20 2f 2a 20 20 31 32 33 34 35 36 37 38 39  .  /*  123456789
6650: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
6660: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
6670: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
6680: 38 39 20 31 32 33 20 2a 2f 0a 20 20 69 6e 74 20  89 123 */.  int 
6690: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 42 75  i, j;.  char zBu
66a0: 66 5b 32 30 5d 3b 0a 20 20 69 66 28 20 76 3d 3d  f[20];.  if( v==
66b0: 30 20 29 7b 0a 20 20 20 20 2a 28 2a 70 7a 29 2b  0 ){.    *(*pz)+
66c0: 2b 20 3d 20 27 30 27 3b 0a 20 20 20 20 72 65 74  + = '0';.    ret
66d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
66e0: 3d 30 3b 20 76 3e 30 3b 20 69 2b 2b 2c 20 76 3e  =0; v>0; i++, v>
66f0: 3e 3d 36 29 7b 0a 20 20 20 20 7a 42 75 66 5b 69  >=6){.    zBuf[i
6700: 5d 20 3d 20 7a 44 69 67 69 74 73 5b 76 26 30 78  ] = zDigits[v&0x
6710: 33 66 5d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6a  3f];.  }.  for(j
6720: 3d 69 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  =i-1; j>=0; j--)
6730: 7b 0a 20 20 20 20 2a 28 2a 70 7a 29 2b 2b 20 3d  {.    *(*pz)++ =
6740: 20 7a 42 75 66 5b 6a 5d 3b 0a 20 20 7d 0a 7d 0a   zBuf[j];.  }.}.
6750: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6760: 65 20 6e 75 6d 62 65 72 20 64 69 67 69 74 73 20  e number digits 
6770: 69 6e 20 74 68 65 20 62 61 73 65 2d 36 34 20 72  in the base-64 r
6780: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
6790: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
67a0: 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ger.*/.static in
67b0: 74 20 64 69 67 69 74 5f 63 6f 75 6e 74 28 69 6e  t digit_count(in
67c0: 74 20 76 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  t v){.  unsigned
67d0: 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 66 6f 72   int i, x;.  for
67e0: 28 69 3d 31 2c 20 78 3d 36 34 3b 20 28 75 6e 73  (i=1, x=64; (uns
67f0: 69 67 6e 65 64 20 69 6e 74 29 76 3e 3d 78 3b 20  igned int)v>=x; 
6800: 69 2b 2b 2c 20 78 20 3c 3c 3d 20 36 29 7b 7d 0a  i++, x <<= 6){}.
6810: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
6820: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 33  *.** Compute a 3
6830: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
6840: 6e 20 74 68 65 20 4e 2d 62 79 74 65 20 62 75 66  n the N-byte buf
6850: 66 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  fer.  Return the
6860: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
6870: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
6880: 63 68 65 63 6b 73 75 6d 28 63 6f 6e 73 74 20 63  checksum(const c
6890: 68 61 72 20 2a 7a 49 6e 2c 20 73 69 7a 65 5f 74  har *zIn, size_t
68a0: 20 4e 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73   N){.  const uns
68b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20  igned char *z = 
68c0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
68d0: 63 68 61 72 20 2a 29 7a 49 6e 3b 0a 20 20 75 6e  char *)zIn;.  un
68e0: 73 69 67 6e 65 64 20 73 75 6d 30 20 3d 20 30 3b  signed sum0 = 0;
68f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 31  .  unsigned sum1
6900: 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
6910: 20 73 75 6d 32 20 3d 20 30 3b 0a 20 20 75 6e 73   sum2 = 0;.  uns
6920: 69 67 6e 65 64 20 73 75 6d 33 20 3d 20 30 3b 0a  igned sum3 = 0;.
6930: 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 31 36 29    while(N >= 16)
6940: 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20 28 28  {.    sum0 += ((
6950: 75 6e 73 69 67 6e 65 64 29 7a 5b 30 5d 20 2b 20  unsigned)z[0] + 
6960: 7a 5b 34 5d 20 2b 20 7a 5b 38 5d 20 2b 20 7a 5b  z[4] + z[8] + z[
6970: 31 32 5d 29 3b 0a 20 20 20 20 73 75 6d 31 20 2b  12]);.    sum1 +
6980: 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 31  = ((unsigned)z[1
6990: 5d 20 2b 20 7a 5b 35 5d 20 2b 20 7a 5b 39 5d 20  ] + z[5] + z[9] 
69a0: 2b 20 7a 5b 31 33 5d 29 3b 0a 20 20 20 20 73 75  + z[13]);.    su
69b0: 6d 32 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64  m2 += ((unsigned
69c0: 29 7a 5b 32 5d 20 2b 20 7a 5b 36 5d 20 2b 20 7a  )z[2] + z[6] + z
69d0: 5b 31 30 5d 2b 20 7a 5b 31 34 5d 29 3b 0a 20 20  [10]+ z[14]);.  
69e0: 20 20 73 75 6d 33 20 2b 3d 20 28 28 75 6e 73 69    sum3 += ((unsi
69f0: 67 6e 65 64 29 7a 5b 33 5d 20 2b 20 7a 5b 37 5d  gned)z[3] + z[7]
6a00: 20 2b 20 7a 5b 31 31 5d 2b 20 7a 5b 31 35 5d 29   + z[11]+ z[15])
6a10: 3b 0a 20 20 20 20 7a 20 2b 3d 20 31 36 3b 0a 20  ;.    z += 16;. 
6a20: 20 20 20 4e 20 2d 3d 20 31 36 3b 0a 20 20 7d 0a     N -= 16;.  }.
6a30: 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 34 29 7b    while(N >= 4){
6a40: 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20 7a 5b 30  .    sum0 += z[0
6a50: 5d 3b 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20 7a  ];.    sum1 += z
6a60: 5b 31 5d 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d  [1];.    sum2 +=
6a70: 20 7a 5b 32 5d 3b 0a 20 20 20 20 73 75 6d 33 20   z[2];.    sum3 
6a80: 2b 3d 20 7a 5b 33 5d 3b 0a 20 20 20 20 7a 20 2b  += z[3];.    z +
6a90: 3d 20 34 3b 0a 20 20 20 20 4e 20 2d 3d 20 34 3b  = 4;.    N -= 4;
6aa0: 0a 20 20 7d 0a 20 20 73 75 6d 33 20 2b 3d 20 28  .  }.  sum3 += (
6ab0: 73 75 6d 32 20 3c 3c 20 38 29 20 2b 20 28 73 75  sum2 << 8) + (su
6ac0: 6d 31 20 3c 3c 20 31 36 29 20 2b 20 28 73 75 6d  m1 << 16) + (sum
6ad0: 30 20 3c 3c 20 32 34 29 3b 0a 20 20 73 77 69 74  0 << 24);.  swit
6ae0: 63 68 28 4e 29 7b 0a 20 20 20 20 63 61 73 65 20  ch(N){.    case 
6af0: 33 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b  3:   sum3 += (z[
6b00: 32 5d 20 3c 3c 20 38 29 3b 0a 20 20 20 20 63 61  2] << 8);.    ca
6b10: 73 65 20 32 3a 20 20 20 73 75 6d 33 20 2b 3d 20  se 2:   sum3 += 
6b20: 28 7a 5b 31 5d 20 3c 3c 20 31 36 29 3b 0a 20 20  (z[1] << 16);.  
6b30: 20 20 63 61 73 65 20 31 3a 20 20 20 73 75 6d 33    case 1:   sum3
6b40: 20 2b 3d 20 28 7a 5b 30 5d 20 3c 3c 20 32 34 29   += (z[0] << 24)
6b50: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
6b60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
6b70: 75 6d 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  um3;.}../*.** Cr
6b80: 65 61 74 65 20 61 20 6e 65 77 20 64 65 6c 74 61  eate a new delta
6b90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74  ..**.** The delt
6ba0: 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  a is written int
6bb0: 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
6bc0: 20 62 75 66 66 65 72 2c 20 7a 44 65 6c 74 61 2c   buffer, zDelta,
6bd0: 20 77 68 69 63 68 0a 2a 2a 20 73 68 6f 75 6c 64   which.** should
6be0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 36 30 20   be at least 60 
6bf0: 62 79 74 65 73 20 6c 6f 6e 67 65 72 20 74 68 61  bytes longer tha
6c00: 6e 20 74 68 65 20 74 61 72 67 65 74 20 66 69 6c  n the target fil
6c10: 65 2c 20 7a 4f 75 74 2e 0a 2a 2a 20 54 68 65 20  e, zOut..** The 
6c20: 64 65 6c 74 61 20 73 74 72 69 6e 67 20 77 69 6c  delta string wil
6c30: 6c 20 62 65 20 4e 55 4c 2d 74 65 72 6d 69 6e 61  l be NUL-termina
6c40: 74 65 64 2c 20 62 75 74 20 69 74 20 6d 69 67 68  ted, but it migh
6c50: 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 2a  t also contain.*
6c60: 2a 20 65 6d 62 65 64 64 65 64 20 4e 55 4c 20 63  * embedded NUL c
6c70: 68 61 72 61 63 74 65 72 73 20 69 66 20 65 69 74  haracters if eit
6c80: 68 65 72 20 74 68 65 20 7a 53 72 63 20 6f 72 20  her the zSrc or 
6c90: 7a 4f 75 74 20 66 69 6c 65 73 20 61 72 65 0a 2a  zOut files are.*
6ca0: 2a 20 62 69 6e 61 72 79 2e 20 20 54 68 69 73 20  * binary.  This 
6cb0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6cc0: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
6cd0: 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 0a  he delta string.
6ce0: 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 65 78 63  ** in bytes, exc
6cf0: 6c 75 64 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  luding the final
6d00: 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20   NUL terminator 
6d10: 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a  character..**.**
6d20: 20 4f 75 74 70 75 74 20 46 6f 72 6d 61 74 3a 0a   Output Format:.
6d30: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20  **.** The delta 
6d40: 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 62 61  begins with a ba
6d50: 73 65 36 34 20 6e 75 6d 62 65 72 20 66 6f 6c 6c  se64 number foll
6d60: 6f 77 65 64 20 62 79 20 61 20 6e 65 77 6c 69 6e  owed by a newlin
6d70: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6e 75 6d 62  e.  This.** numb
6d80: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
6d90: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
6da0: 20 54 41 52 47 45 54 20 66 69 6c 65 2e 20 20 54   TARGET file.  T
6db0: 68 75 73 2c 20 67 69 76 65 6e 20 61 0a 2a 2a 20  hus, given a.** 
6dc0: 64 65 6c 74 61 20 66 69 6c 65 20 7a 2c 20 61 20  delta file z, a 
6dd0: 70 72 6f 67 72 61 6d 20 63 61 6e 20 63 6f 6d 70  program can comp
6de0: 75 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ute the size of 
6df0: 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 0a  the output file.
6e00: 2a 2a 20 73 69 6d 70 6c 79 20 62 79 20 72 65 61  ** simply by rea
6e10: 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 6c  ding the first l
6e20: 69 6e 65 20 61 6e 64 20 64 65 63 6f 64 69 6e 67  ine and decoding
6e30: 20 74 68 65 20 62 61 73 65 2d 36 34 20 6e 75 6d   the base-64 num
6e40: 62 65 72 0a 2a 2a 20 66 6f 75 6e 64 20 74 68 65  ber.** found the
6e50: 72 65 2e 20 20 54 68 65 20 64 65 6c 74 61 5f 6f  re.  The delta_o
6e60: 75 74 70 75 74 5f 73 69 7a 65 28 29 20 72 6f 75  utput_size() rou
6e70: 74 69 6e 65 20 64 6f 65 73 20 65 78 61 63 74 6c  tine does exactl
6e80: 79 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 66  y this..**.** Af
6e90: 74 65 72 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ter the initial 
6ea0: 73 69 7a 65 20 6e 75 6d 62 65 72 2c 20 74 68 65  size number, the
6eb0: 20 64 65 6c 74 61 20 63 6f 6e 73 69 73 74 73 20   delta consists 
6ec0: 6f 66 20 61 20 73 65 72 69 65 73 20 6f 66 0a 2a  of a series of.*
6ed0: 2a 20 6c 69 74 65 72 61 6c 20 74 65 78 74 20 73  * literal text s
6ee0: 65 67 6d 65 6e 74 73 20 61 6e 64 20 63 6f 6d 6d  egments and comm
6ef0: 61 6e 64 73 20 74 6f 20 63 6f 70 79 20 66 72 6f  ands to copy fro
6f00: 6d 20 74 68 65 20 53 4f 55 52 43 45 20 66 69 6c  m the SOURCE fil
6f10: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 63 6f 6d  e..** A copy com
6f20: 6d 61 6e 64 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  mand looks like 
6f30: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
6f40: 4e 4e 4e 40 4d 4d 4d 2c 0a 2a 2a 0a 2a 2a 20 77  NNN@MMM,.**.** w
6f50: 68 65 72 65 20 4e 4e 4e 20 69 73 20 74 68 65 20  here NNN is the 
6f60: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6f70: 74 6f 20 62 65 20 63 6f 70 69 65 64 20 61 6e 64  to be copied and
6f80: 20 4d 4d 4d 20 69 73 20 74 68 65 20 6f 66 66 73   MMM is the offs
6f90: 65 74 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73  et.** into the s
6fa0: 6f 75 72 63 65 20 66 69 6c 65 20 6f 66 20 74 68  ource file of th
6fb0: 65 20 66 69 72 73 74 20 62 79 74 65 20 28 62 6f  e first byte (bo
6fc0: 74 68 20 62 61 73 65 2d 36 34 29 2e 20 20 20 49  th base-64).   I
6fd0: 66 20 4e 4e 4e 20 69 73 20 30 0a 2a 2a 20 69 74  f NNN is 0.** it
6fe0: 20 6d 65 61 6e 73 20 63 6f 70 79 20 74 68 65 20   means copy the 
6ff0: 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 70 75  rest of the inpu
7000: 74 20 66 69 6c 65 2e 20 20 4c 69 74 65 72 61 6c  t file.  Literal
7010: 20 74 65 78 74 20 69 73 20 6c 69 6b 65 20 74 68   text is like th
7020: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e 4e  is:.**.**     NN
7030: 4e 3a 54 54 54 54 54 0a 2a 2a 0a 2a 2a 20 77 68  N:TTTTT.**.** wh
7040: 65 72 65 20 4e 4e 4e 20 69 73 20 74 68 65 20 6e  ere NNN is the n
7050: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
7060: 66 20 74 65 78 74 20 28 62 61 73 65 2d 36 34 29  f text (base-64)
7070: 20 61 6e 64 20 54 54 54 54 54 20 69 73 20 74 68   and TTTTT is th
7080: 65 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e text..**.** Th
7090: 65 20 6c 61 73 74 20 74 65 72 6d 20 69 73 20 6f  e last term is o
70a0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
70b0: 20 20 20 20 20 4e 4e 4e 3b 0a 2a 2a 0a 2a 2a 20       NNN;.**.** 
70c0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4e 4e  In this case, NN
70d0: 4e 20 69 73 20 61 20 33 32 2d 62 69 74 20 62 69  N is a 32-bit bi
70e0: 67 65 6e 64 69 61 6e 20 63 68 65 63 6b 73 75 6d  gendian checksum
70f0: 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 66   of the output f
7100: 69 6c 65 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  ile.** that can 
7110: 62 65 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  be used to verif
7120: 79 20 74 68 61 74 20 74 68 65 20 64 65 6c 74 61  y that the delta
7130: 20 61 70 70 6c 69 65 64 20 63 6f 72 72 65 63 74   applied correct
7140: 6c 79 2e 20 20 41 6c 6c 0a 2a 2a 20 6e 75 6d 62  ly.  All.** numb
7150: 65 72 73 20 61 72 65 20 69 6e 20 62 61 73 65 2d  ers are in base-
7160: 36 34 2e 0a 2a 2a 0a 2a 2a 20 50 75 72 65 20 74  64..**.** Pure t
7170: 65 78 74 20 66 69 6c 65 73 20 67 65 6e 65 72 61  ext files genera
7180: 74 65 20 61 20 70 75 72 65 20 74 65 78 74 20 64  te a pure text d
7190: 65 6c 74 61 2e 20 20 42 69 6e 61 72 79 20 66 69  elta.  Binary fi
71a0: 6c 65 73 20 67 65 6e 65 72 61 74 65 20 61 0a 2a  les generate a.*
71b0: 2a 20 64 65 6c 74 61 20 74 68 61 74 20 6d 61 79  * delta that may
71c0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 62 69   contain some bi
71d0: 6e 61 72 79 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  nary data..**.**
71e0: 20 41 6c 67 6f 72 69 74 68 6d 3a 0a 2a 2a 0a 2a   Algorithm:.**.*
71f0: 2a 20 54 68 65 20 65 6e 63 6f 64 65 72 20 66 69  * The encoder fi
7200: 72 73 74 20 62 75 69 6c 64 73 20 61 20 68 61 73  rst builds a has
7210: 68 20 74 61 62 6c 65 20 74 6f 20 68 65 6c 70 20  h table to help 
7220: 69 74 20 66 69 6e 64 20 6d 61 74 63 68 69 6e 67  it find matching
7230: 0a 2a 2a 20 70 61 74 74 65 72 6e 73 20 69 6e 20  .** patterns in 
7240: 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65 2e  the source file.
7250: 20 20 31 36 2d 62 79 74 65 20 63 68 75 6e 6b 73    16-byte chunks
7260: 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 66   of the source f
7270: 69 6c 65 0a 2a 2a 20 73 61 6d 70 6c 65 64 20 61  ile.** sampled a
7280: 74 20 65 76 65 6e 6c 79 20 73 70 61 63 65 64 20  t evenly spaced 
7290: 69 6e 74 65 72 76 61 6c 73 20 61 72 65 20 75 73  intervals are us
72a0: 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ed to populate t
72b0: 68 65 20 68 61 73 68 0a 2a 2a 20 74 61 62 6c 65  he hash.** table
72c0: 2e 0a 2a 2a 0a 2a 2a 20 4e 65 78 74 20 77 65 20  ..**.** Next we 
72d0: 62 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74  begin scanning t
72e0: 68 65 20 74 61 72 67 65 74 20 66 69 6c 65 20 75  he target file u
72f0: 73 69 6e 67 20 61 20 73 6c 69 64 69 6e 67 20 31  sing a sliding 1
7300: 36 2d 62 79 74 65 0a 2a 2a 20 77 69 6e 64 6f 77  6-byte.** window
7310: 2e 20 20 54 68 65 20 68 61 73 68 20 6f 66 20 74  .  The hash of t
7320: 68 65 20 31 36 2d 62 79 74 65 20 77 69 6e 64 6f  he 16-byte windo
7330: 77 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 20  w in the target 
7340: 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 73 65  is used to.** se
7350: 61 72 63 68 20 66 6f 72 20 61 20 6d 61 74 63 68  arch for a match
7360: 69 6e 67 20 73 65 63 74 69 6f 6e 20 69 6e 20 74  ing section in t
7370: 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 20  he source file. 
7380: 20 57 68 65 6e 20 61 20 6d 61 74 63 68 0a 2a 2a   When a match.**
7390: 20 69 73 20 66 6f 75 6e 64 2c 20 61 20 63 6f 70   is found, a cop
73a0: 79 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 64 64  y command is add
73b0: 65 64 20 74 6f 20 74 68 65 20 64 65 6c 74 61 2e  ed to the delta.
73c0: 20 20 41 6e 20 65 66 66 6f 72 74 20 69 73 0a 2a    An effort is.*
73d0: 2a 20 6d 61 64 65 20 74 6f 20 65 78 74 65 6e 64  * made to extend
73e0: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 73 65   the matching se
73f0: 63 74 69 6f 6e 20 74 6f 20 72 65 67 69 6f 6e 73  ction to regions
7400: 20 74 68 61 74 20 63 6f 6d 65 20 62 65 66 6f 72   that come befor
7410: 65 0a 2a 2a 20 61 6e 64 20 61 66 74 65 72 20 74  e.** and after t
7420: 68 65 20 31 36 2d 62 79 74 65 20 68 61 73 68 20  he 16-byte hash 
7430: 77 69 6e 64 6f 77 2e 20 20 41 20 63 6f 70 79 20  window.  A copy 
7440: 63 6f 6d 6d 61 6e 64 20 69 73 20 6f 6e 6c 79 20  command is only 
7450: 69 73 73 75 65 64 0a 2a 2a 20 69 66 20 74 68 65  issued.** if the
7460: 20 72 65 73 75 6c 74 20 77 6f 75 6c 64 20 75 73   result would us
7470: 65 20 6c 65 73 73 20 73 70 61 63 65 20 74 68 61  e less space tha
7480: 74 20 6a 75 73 74 20 71 75 6f 74 69 6e 67 20 74  t just quoting t
7490: 68 65 20 74 65 78 74 0a 2a 2a 20 6c 69 74 65 72  he text.** liter
74a0: 61 6c 6c 79 2e 20 4c 69 74 65 72 61 6c 20 74 65  ally. Literal te
74b0: 78 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  xt is added to t
74c0: 68 65 20 64 65 6c 74 61 20 66 6f 72 20 73 65 63  he delta for sec
74d0: 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20 64 6f  tions that.** do
74e0: 20 6e 6f 74 20 6d 61 74 63 68 20 6f 72 20 77 68   not match or wh
74f0: 69 63 68 20 63 61 6e 20 6e 6f 74 20 62 65 20 65  ich can not be e
7500: 6e 63 6f 64 65 64 20 65 66 66 69 63 69 65 6e 74  ncoded efficient
7510: 6c 79 20 75 73 69 6e 67 20 63 6f 70 79 0a 2a 2a  ly using copy.**
7520: 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2f 0a 73 74   commands..*/.st
7530: 61 74 69 63 20 69 6e 74 20 72 62 75 44 65 6c 74  atic int rbuDelt
7540: 61 43 72 65 61 74 65 28 0a 20 20 63 6f 6e 73 74  aCreate(.  const
7550: 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20   char *zSrc,    
7560: 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20    /* The source 
7570: 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20  or pattern file 
7580: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
7590: 74 20 6c 65 6e 53 72 63 2c 20 20 20 2f 2a 20 4c  t lenSrc,   /* L
75a0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75  ength of the sou
75b0: 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  rce file */.  co
75c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20  nst char *zOut, 
75d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 72 67       /* The targ
75e0: 65 74 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73  et file */.  uns
75f0: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 4f 75 74  igned int lenOut
7600: 2c 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66  ,   /* Length of
7610: 20 74 68 65 20 74 61 72 67 65 74 20 66 69 6c 65   the target file
7620: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c   */.  char *zDel
7630: 74 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta           /* 
7640: 57 72 69 74 65 20 74 68 65 20 64 65 6c 74 61 20  Write the delta 
7650: 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
7660: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
7670: 64 20 69 6e 74 20 69 2c 20 62 61 73 65 3b 0a 20  d int i, base;. 
7680: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 65 6c 74   char *zOrigDelt
7690: 61 20 3d 20 7a 44 65 6c 74 61 3b 0a 20 20 68 61  a = zDelta;.  ha
76a0: 73 68 20 68 3b 0a 20 20 69 6e 74 20 6e 48 61 73  sh h;.  int nHas
76b0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
76c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
76d0: 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69  hash table entri
76e0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 6c 61 6e  es */.  int *lan
76f0: 64 6d 61 72 6b 3b 20 20 20 20 20 20 20 20 20 20  dmark;          
7700: 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 68 61     /* Primary ha
7710: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  sh table */.  in
7720: 74 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 20 20 20  t *collide;     
7730: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
7740: 69 73 69 6f 6e 20 63 68 61 69 6e 20 2a 2f 0a 20  ision chain */. 
7750: 20 69 6e 74 20 6c 61 73 74 52 65 61 64 20 3d 20   int lastRead = 
7760: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  -1;         /* L
7770: 61 73 74 20 62 79 74 65 20 6f 66 20 7a 53 72 63  ast byte of zSrc
7780: 20 72 65 61 64 20 62 79 20 61 20 43 4f 50 59 20   read by a COPY 
7790: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 0a 20 20 2f 2a  command */..  /*
77a0: 20 41 64 64 20 74 68 65 20 74 61 72 67 65 74 20   Add the target 
77b0: 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 74 68 65  file size to the
77c0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
77d0: 65 20 64 65 6c 74 61 0a 20 20 2a 2f 0a 20 20 70  e delta.  */.  p
77e0: 75 74 49 6e 74 28 6c 65 6e 4f 75 74 2c 20 26 7a  utInt(lenOut, &z
77f0: 44 65 6c 74 61 29 3b 0a 20 20 2a 28 7a 44 65 6c  Delta);.  *(zDel
7800: 74 61 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 0a 20  ta++) = '\n';.. 
7810: 20 2f 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63   /* If the sourc
7820: 65 20 66 69 6c 65 20 69 73 20 76 65 72 79 20 73  e file is very s
7830: 6d 61 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  mall, it means t
7840: 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20  hat we have no. 
7850: 20 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 65 76   ** chance of ev
7860: 65 72 20 64 6f 69 6e 67 20 61 20 63 6f 70 79 20  er doing a copy 
7870: 63 6f 6d 6d 61 6e 64 2e 20 20 4a 75 73 74 20 6f  command.  Just o
7880: 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 0a 20  utput a single. 
7890: 20 2a 2a 20 6c 69 74 65 72 61 6c 20 73 65 67 6d   ** literal segm
78a0: 65 6e 74 20 66 6f 72 20 74 68 65 20 65 6e 74 69  ent for the enti
78b0: 72 65 20 74 61 72 67 65 74 20 61 6e 64 20 65 78  re target and ex
78c0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  it..  */.  if( l
78d0: 65 6e 53 72 63 3c 3d 4e 48 41 53 48 20 29 7b 0a  enSrc<=NHASH ){.
78e0: 20 20 20 20 70 75 74 49 6e 74 28 6c 65 6e 4f 75      putInt(lenOu
78f0: 74 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20 20  t, &zDelta);.   
7900: 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20 27   *(zDelta++) = '
7910: 3a 27 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  :';.    memcpy(z
7920: 44 65 6c 74 61 2c 20 7a 4f 75 74 2c 20 6c 65 6e  Delta, zOut, len
7930: 4f 75 74 29 3b 0a 20 20 20 20 7a 44 65 6c 74 61  Out);.    zDelta
7940: 20 2b 3d 20 6c 65 6e 4f 75 74 3b 0a 20 20 20 20   += lenOut;.    
7950: 70 75 74 49 6e 74 28 63 68 65 63 6b 73 75 6d 28  putInt(checksum(
7960: 7a 4f 75 74 2c 20 6c 65 6e 4f 75 74 29 2c 20 26  zOut, lenOut), &
7970: 7a 44 65 6c 74 61 29 3b 0a 20 20 20 20 2a 28 7a  zDelta);.    *(z
7980: 44 65 6c 74 61 2b 2b 29 20 3d 20 27 3b 27 3b 0a  Delta++) = ';';.
7990: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29      return (int)
79a0: 28 7a 44 65 6c 74 61 20 2d 20 7a 4f 72 69 67 44  (zDelta - zOrigD
79b0: 65 6c 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  elta);.  }..  /*
79c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 68 61 73   Compute the has
79d0: 68 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  h table used to 
79e0: 6c 6f 63 61 74 65 20 6d 61 74 63 68 69 6e 67 20  locate matching 
79f0: 73 65 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 0a  sections in the.
7a00: 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
7a10: 2e 0a 20 20 2a 2f 0a 20 20 6e 48 61 73 68 20 3d  ..  */.  nHash =
7a20: 20 6c 65 6e 53 72 63 2f 4e 48 41 53 48 3b 0a 20   lenSrc/NHASH;. 
7a30: 20 63 6f 6c 6c 69 64 65 20 3d 20 73 71 6c 69 74   collide = sqlit
7a40: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 48 61 73 68  e3_malloc( nHash
7a50: 2a 32 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29  *2*sizeof(int) )
7a60: 3b 0a 20 20 6c 61 6e 64 6d 61 72 6b 20 3d 20 26  ;.  landmark = &
7a70: 63 6f 6c 6c 69 64 65 5b 6e 48 61 73 68 5d 3b 0a  collide[nHash];.
7a80: 20 20 6d 65 6d 73 65 74 28 6c 61 6e 64 6d 61 72    memset(landmar
7a90: 6b 2c 20 2d 31 2c 20 6e 48 61 73 68 2a 73 69 7a  k, -1, nHash*siz
7aa0: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 6d 65 6d  eof(int));.  mem
7ab0: 73 65 74 28 63 6f 6c 6c 69 64 65 2c 20 2d 31 2c  set(collide, -1,
7ac0: 20 6e 48 61 73 68 2a 73 69 7a 65 6f 66 28 69 6e   nHash*sizeof(in
7ad0: 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t));.  for(i=0; 
7ae0: 69 3c 6c 65 6e 53 72 63 2d 4e 48 41 53 48 3b 20  i<lenSrc-NHASH; 
7af0: 69 2b 3d 4e 48 41 53 48 29 7b 0a 20 20 20 20 69  i+=NHASH){.    i
7b00: 6e 74 20 68 76 3b 0a 20 20 20 20 68 61 73 68 5f  nt hv;.    hash_
7b10: 69 6e 69 74 28 26 68 2c 20 26 7a 53 72 63 5b 69  init(&h, &zSrc[i
7b20: 5d 29 3b 0a 20 20 20 20 68 76 20 3d 20 68 61 73  ]);.    hv = has
7b30: 68 5f 33 32 62 69 74 28 26 68 29 20 25 20 6e 48  h_32bit(&h) % nH
7b40: 61 73 68 3b 0a 20 20 20 20 63 6f 6c 6c 69 64 65  ash;.    collide
7b50: 5b 69 2f 4e 48 41 53 48 5d 20 3d 20 6c 61 6e 64  [i/NHASH] = land
7b60: 6d 61 72 6b 5b 68 76 5d 3b 0a 20 20 20 20 6c 61  mark[hv];.    la
7b70: 6e 64 6d 61 72 6b 5b 68 76 5d 20 3d 20 69 2f 4e  ndmark[hv] = i/N
7b80: 48 41 53 48 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  HASH;.  }..  /* 
7b90: 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74  Begin scanning t
7ba0: 68 65 20 74 61 72 67 65 74 20 66 69 6c 65 20 61  he target file a
7bb0: 6e 64 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  nd generating co
7bc0: 70 79 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 0a  py commands and.
7bd0: 20 20 2a 2a 20 6c 69 74 65 72 61 6c 20 73 65 63    ** literal sec
7be0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 65 6c  tions of the del
7bf0: 74 61 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20  ta..  */.  base 
7c00: 3d 20 30 3b 20 20 20 20 2f 2a 20 57 65 20 68 61  = 0;    /* We ha
7c10: 76 65 20 61 6c 72 65 61 64 79 20 67 65 6e 65 72  ve already gener
7c20: 61 74 65 64 20 65 76 65 72 79 74 68 69 6e 67 20  ated everything 
7c30: 62 65 66 6f 72 65 20 7a 4f 75 74 5b 62 61 73 65  before zOut[base
7c40: 5d 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 62 61  ] */.  while( ba
7c50: 73 65 2b 4e 48 41 53 48 3c 6c 65 6e 4f 75 74 20  se+NHASH<lenOut 
7c60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 72 63 2c  ){.    int iSrc,
7c70: 20 69 42 6c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74   iBlock;.    int
7c80: 20 62 65 73 74 43 6e 74 2c 20 62 65 73 74 4f 66   bestCnt, bestOf
7c90: 73 74 3d 30 2c 20 62 65 73 74 4c 69 74 73 7a 3d  st=0, bestLitsz=
7ca0: 30 3b 0a 20 20 20 20 68 61 73 68 5f 69 6e 69 74  0;.    hash_init
7cb0: 28 26 68 2c 20 26 7a 4f 75 74 5b 62 61 73 65 5d  (&h, &zOut[base]
7cc0: 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b 20 20 20  );.    i = 0;   
7cd0: 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 6d    /* Trying to m
7ce0: 61 74 63 68 20 61 20 6c 61 6e 64 6d 61 72 6b 20  atch a landmark 
7cf0: 61 67 61 69 6e 73 74 20 7a 4f 75 74 5b 62 61 73  against zOut[bas
7d00: 65 2b 69 5d 20 2a 2f 0a 20 20 20 20 62 65 73 74  e+i] */.    best
7d10: 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  Cnt = 0;.    whi
7d20: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
7d30: 6e 74 20 68 76 3b 0a 20 20 20 20 20 20 69 6e 74  nt hv;.      int
7d40: 20 6c 69 6d 69 74 20 3d 20 32 35 30 3b 0a 0a 20   limit = 250;.. 
7d50: 20 20 20 20 20 68 76 20 3d 20 68 61 73 68 5f 33       hv = hash_3
7d60: 32 62 69 74 28 26 68 29 20 25 20 6e 48 61 73 68  2bit(&h) % nHash
7d70: 3b 0a 20 20 20 20 20 20 69 42 6c 6f 63 6b 20 3d  ;.      iBlock =
7d80: 20 6c 61 6e 64 6d 61 72 6b 5b 68 76 5d 3b 0a 20   landmark[hv];. 
7d90: 20 20 20 20 20 77 68 69 6c 65 28 20 69 42 6c 6f       while( iBlo
7da0: 63 6b 3e 3d 30 20 26 26 20 28 6c 69 6d 69 74 2d  ck>=0 && (limit-
7db0: 2d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  -)>0 ){.        
7dc0: 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  /*.        ** Th
7dd0: 65 20 68 61 73 68 20 77 69 6e 64 6f 77 20 68 61  e hash window ha
7de0: 73 20 69 64 65 6e 74 69 66 69 65 64 20 61 20 70  s identified a p
7df0: 6f 74 65 6e 74 69 61 6c 20 6d 61 74 63 68 20 61  otential match a
7e00: 67 61 69 6e 73 74 0a 20 20 20 20 20 20 20 20 2a  gainst.        *
7e10: 2a 20 6c 61 6e 64 6d 61 72 6b 20 62 6c 6f 63 6b  * landmark block
7e20: 20 69 42 6c 6f 63 6b 2e 20 20 42 75 74 20 77 65   iBlock.  But we
7e30: 20 6e 65 65 64 20 74 6f 20 69 6e 76 65 73 74 69   need to investi
7e40: 67 61 74 65 20 66 75 72 74 68 65 72 2e 0a 20 20  gate further..  
7e50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
7e60: 20 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 20 72   ** Look for a r
7e70: 65 67 69 6f 6e 20 69 6e 20 7a 4f 75 74 20 74 68  egion in zOut th
7e80: 61 74 20 6d 61 74 63 68 65 73 20 7a 53 72 63 2e  at matches zSrc.
7e90: 20 41 6e 63 68 6f 72 20 74 68 65 20 73 65 61 72   Anchor the sear
7ea0: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74  ch.        ** at
7eb0: 20 7a 53 72 63 5b 69 53 72 63 5d 20 61 6e 64 20   zSrc[iSrc] and 
7ec0: 7a 4f 75 74 5b 62 61 73 65 2b 69 5d 2e 20 20 44  zOut[base+i].  D
7ed0: 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e  o not include an
7ee0: 79 74 68 69 6e 67 20 70 72 69 6f 72 20 74 6f 0a  ything prior to.
7ef0: 20 20 20 20 20 20 20 20 2a 2a 20 7a 4f 75 74 5b          ** zOut[
7f00: 62 61 73 65 5d 20 6f 72 20 61 66 74 65 72 20 7a  base] or after z
7f10: 4f 75 74 5b 6f 75 74 4c 65 6e 5d 20 6e 6f 72 20  Out[outLen] nor 
7f20: 61 6e 79 74 68 69 6e 67 20 61 66 74 65 72 20 7a  anything after z
7f30: 53 72 63 5b 73 72 63 4c 65 6e 5d 2e 0a 20 20 20  Src[srcLen]..   
7f40: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
7f50: 2a 2a 20 53 65 74 20 63 6e 74 20 65 71 75 61 6c  ** Set cnt equal
7f60: 20 74 6f 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   to the length o
7f70: 66 20 74 68 65 20 6d 61 74 63 68 20 61 6e 64 20  f the match and 
7f80: 73 65 74 20 6f 66 73 74 20 73 6f 20 74 68 61 74  set ofst so that
7f90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 53 72 63  .        ** zSrc
7fa0: 5b 6f 66 73 74 5d 20 69 73 20 74 68 65 20 66 69  [ofst] is the fi
7fb0: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  rst element of t
7fc0: 68 65 20 6d 61 74 63 68 2e 20 20 6c 69 74 73 7a  he match.  litsz
7fd0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 20   is the number. 
7fe0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 63 68 61         ** of cha
7ff0: 72 61 63 74 65 72 73 20 62 65 74 77 65 65 6e 20  racters between 
8000: 7a 4f 75 74 5b 62 61 73 65 5d 20 61 6e 64 20 74  zOut[base] and t
8010: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8020: 74 68 65 20 6d 61 74 63 68 2e 0a 20 20 20 20 20  the match..     
8030: 20 20 20 2a 2a 20 73 7a 20 77 69 6c 6c 20 62 65     ** sz will be
8040: 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 28 69   the overhead (i
8050: 6e 20 62 79 74 65 73 29 20 6e 65 65 64 65 64 20  n bytes) needed 
8060: 74 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 63 6f  to encode the co
8070: 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  py.        ** co
8080: 6d 6d 61 6e 64 2e 20 20 4f 6e 6c 79 20 67 65 6e  mmand.  Only gen
8090: 65 72 61 74 65 20 63 6f 70 79 20 63 6f 6d 6d 61  erate copy comma
80a0: 6e 64 20 69 66 20 74 68 65 20 6f 76 65 72 68 65  nd if the overhe
80b0: 61 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ad of the.      
80c0: 20 20 2a 2a 20 63 6f 70 79 20 63 6f 6d 6d 61 6e    ** copy comman
80d0: 64 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  d is less than t
80e0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 69 74  he amount of lit
80f0: 65 72 61 6c 20 74 65 78 74 20 74 6f 20 62 65 20  eral text to be 
8100: 63 6f 70 69 65 64 2e 0a 20 20 20 20 20 20 20 20  copied..        
8110: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
8120: 6e 74 2c 20 6f 66 73 74 2c 20 6c 69 74 73 7a 3b  nt, ofst, litsz;
8130: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20  .        int j, 
8140: 6b 2c 20 78 2c 20 79 3b 0a 20 20 20 20 20 20 20  k, x, y;.       
8150: 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
8160: 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 61    /* Beginning a
8170: 74 20 69 53 72 63 2c 20 6d 61 74 63 68 20 66 6f  t iSrc, match fo
8180: 72 77 61 72 64 73 20 61 73 20 66 61 72 20 61 73  rwards as far as
8190: 20 77 65 20 63 61 6e 2e 20 20 6a 20 63 6f 75 6e   we can.  j coun
81a0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ts.        ** th
81b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
81c0: 61 63 74 65 72 73 20 74 68 61 74 20 6d 61 74 63  acters that matc
81d0: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 53 72  h */.        iSr
81e0: 63 20 3d 20 69 42 6c 6f 63 6b 2a 4e 48 41 53 48  c = iBlock*NHASH
81f0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 0a 20  ;.        for(. 
8200: 20 20 20 20 20 20 20 20 20 6a 3d 30 2c 20 78 3d           j=0, x=
8210: 69 53 72 63 2c 20 79 3d 62 61 73 65 2b 69 3b 0a  iSrc, y=base+i;.
8220: 20 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67            (unsig
8230: 6e 65 64 20 69 6e 74 29 78 3c 6c 65 6e 53 72 63  ned int)x<lenSrc
8240: 20 26 26 20 28 75 6e 73 69 67 6e 65 64 20 69 6e   && (unsigned in
8250: 74 29 79 3c 6c 65 6e 4f 75 74 3b 0a 20 20 20 20  t)y<lenOut;.    
8260: 20 20 20 20 20 20 6a 2b 2b 2c 20 78 2b 2b 2c 20        j++, x++, 
8270: 79 2b 2b 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  y++.        ){. 
8280: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 72           if( zSr
8290: 63 5b 78 5d 21 3d 7a 4f 75 74 5b 79 5d 20 29 20  c[x]!=zOut[y] ) 
82a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
82b0: 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 0a 20  .        j--;.. 
82c0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
82d0: 69 6e 67 20 61 74 20 69 53 72 63 2d 31 2c 20 6d  ing at iSrc-1, m
82e0: 61 74 63 68 20 62 61 63 6b 77 61 72 64 73 20 61  atch backwards a
82f0: 73 20 66 61 72 20 61 73 20 77 65 20 63 61 6e 2e  s far as we can.
8300: 20 20 6b 20 63 6f 75 6e 74 73 0a 20 20 20 20 20    k counts.     
8310: 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72     ** the number
8320: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74   of characters t
8330: 68 61 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  hat match */.   
8340: 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
8350: 69 53 72 63 20 26 26 20 28 75 6e 73 69 67 6e 65  iSrc && (unsigne
8360: 64 20 69 6e 74 29 6b 3c 3d 69 3b 20 6b 2b 2b 29  d int)k<=i; k++)
8370: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8380: 7a 53 72 63 5b 69 53 72 63 2d 6b 5d 21 3d 7a 4f  zSrc[iSrc-k]!=zO
8390: 75 74 5b 62 61 73 65 2b 69 2d 6b 5d 20 29 20 62  ut[base+i-k] ) b
83a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
83b0: 20 20 20 20 20 20 20 20 6b 2d 2d 3b 0a 0a 20 20          k--;..  
83c0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65        /* Compute
83d0: 20 74 68 65 20 6f 66 66 73 65 74 20 61 6e 64 20   the offset and 
83e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 74 63  size of the matc
83f0: 68 69 6e 67 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  hing region */. 
8400: 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20 69 53         ofst = iS
8410: 72 63 2d 6b 3b 0a 20 20 20 20 20 20 20 20 63 6e  rc-k;.        cn
8420: 74 20 3d 20 6a 2b 6b 2b 31 3b 0a 20 20 20 20 20  t = j+k+1;.     
8430: 20 20 20 6c 69 74 73 7a 20 3d 20 69 2d 6b 3b 20     litsz = i-k; 
8440: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
8450: 74 65 73 20 6f 66 20 6c 69 74 65 72 61 6c 20 74  tes of literal t
8460: 65 78 74 20 62 65 66 6f 72 65 20 74 68 65 20 63  ext before the c
8470: 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f  opy */.        /
8480: 2a 20 73 7a 20 77 69 6c 6c 20 68 6f 6c 64 20 74  * sz will hold t
8490: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
84a0: 65 73 20 6e 65 65 64 65 64 20 74 6f 20 65 6e 63  es needed to enc
84b0: 6f 64 65 20 74 68 65 20 22 69 6e 73 65 72 74 22  ode the "insert"
84c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d  .        ** comm
84d0: 61 6e 64 20 61 6e 64 20 74 68 65 20 63 6f 70 79  and and the copy
84e0: 20 63 6f 6d 6d 61 6e 64 2c 20 6e 6f 74 20 63 6f   command, not co
84f0: 75 6e 74 69 6e 67 20 74 68 65 20 22 69 6e 73 65  unting the "inse
8500: 72 74 22 20 74 65 78 74 20 2a 2f 0a 20 20 20 20  rt" text */.    
8510: 20 20 20 20 73 7a 20 3d 20 64 69 67 69 74 5f 63      sz = digit_c
8520: 6f 75 6e 74 28 69 2d 6b 29 2b 64 69 67 69 74 5f  ount(i-k)+digit_
8530: 63 6f 75 6e 74 28 63 6e 74 29 2b 64 69 67 69 74  count(cnt)+digit
8540: 5f 63 6f 75 6e 74 28 6f 66 73 74 29 2b 33 3b 0a  _count(ofst)+3;.
8550: 20 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e          if( cnt>
8560: 3d 73 7a 20 26 26 20 63 6e 74 3e 62 65 73 74 43  =sz && cnt>bestC
8570: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
8580: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 69 73  /* Remember this
8590: 20 6d 61 74 63 68 20 6f 6e 6c 79 20 69 66 20 69   match only if i
85a0: 74 20 69 73 20 74 68 65 20 62 65 73 74 20 73 6f  t is the best so
85b0: 20 66 61 72 20 61 6e 64 20 69 74 0a 20 20 20 20   far and it.    
85c0: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
85d0: 74 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  t increase the f
85e0: 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
85f0: 20 20 20 20 20 20 62 65 73 74 43 6e 74 20 3d 20        bestCnt = 
8600: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  cnt;.          b
8610: 65 73 74 4f 66 73 74 20 3d 20 69 53 72 63 2d 6b  estOfst = iSrc-k
8620: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
8630: 4c 69 74 73 7a 20 3d 20 6c 69 74 73 7a 3b 0a 20  Litsz = litsz;. 
8640: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
8650: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 6e    /* Check the n
8660: 65 78 74 20 6d 61 74 63 68 69 6e 67 20 62 6c 6f  ext matching blo
8670: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 42  ck */.        iB
8680: 6c 6f 63 6b 20 3d 20 63 6f 6c 6c 69 64 65 5b 69  lock = collide[i
8690: 42 6c 6f 63 6b 5d 3b 0a 20 20 20 20 20 20 7d 0a  Block];.      }.
86a0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
86b0: 65 20 61 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64  e a copy command
86c0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
86d0: 61 75 73 65 20 74 68 65 20 64 65 6c 74 61 20 74  ause the delta t
86e0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  o be larger.    
86f0: 20 20 2a 2a 20 74 68 61 6e 20 61 20 6c 69 74 65    ** than a lite
8700: 72 61 6c 20 69 6e 73 65 72 74 2e 20 20 53 6f 20  ral insert.  So 
8710: 61 64 64 20 74 68 65 20 63 6f 70 79 20 63 6f 6d  add the copy com
8720: 6d 61 6e 64 20 74 6f 20 74 68 65 20 64 65 6c 74  mand to the delt
8730: 61 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  a..      */.    
8740: 20 20 69 66 28 20 62 65 73 74 43 6e 74 3e 30 20    if( bestCnt>0 
8750: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ){.        if( b
8760: 65 73 74 4c 69 74 73 7a 3e 30 20 29 7b 0a 20 20  estLitsz>0 ){.  
8770: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61          /* Add a
8780: 6e 20 69 6e 73 65 72 74 20 63 6f 6d 6d 61 6e 64  n insert command
8790: 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79   before the copy
87a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75   */.          pu
87b0: 74 49 6e 74 28 62 65 73 74 4c 69 74 73 7a 2c 26  tInt(bestLitsz,&
87c0: 7a 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  zDelta);.       
87d0: 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d     *(zDelta++) =
87e0: 20 27 3a 27 3b 0a 20 20 20 20 20 20 20 20 20 20   ':';.          
87f0: 6d 65 6d 63 70 79 28 7a 44 65 6c 74 61 2c 20 26  memcpy(zDelta, &
8800: 7a 4f 75 74 5b 62 61 73 65 5d 2c 20 62 65 73 74  zOut[base], best
8810: 4c 69 74 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  Litsz);.        
8820: 20 20 7a 44 65 6c 74 61 20 2b 3d 20 62 65 73 74    zDelta += best
8830: 4c 69 74 73 7a 3b 0a 20 20 20 20 20 20 20 20 20  Litsz;.         
8840: 20 62 61 73 65 20 2b 3d 20 62 65 73 74 4c 69 74   base += bestLit
8850: 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sz;.        }.  
8860: 20 20 20 20 20 20 62 61 73 65 20 2b 3d 20 62 65        base += be
8870: 73 74 43 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  stCnt;.        p
8880: 75 74 49 6e 74 28 62 65 73 74 43 6e 74 2c 20 26  utInt(bestCnt, &
8890: 7a 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  zDelta);.       
88a0: 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20 27   *(zDelta++) = '
88b0: 40 27 3b 0a 20 20 20 20 20 20 20 20 70 75 74 49  @';.        putI
88c0: 6e 74 28 62 65 73 74 4f 66 73 74 2c 20 26 7a 44  nt(bestOfst, &zD
88d0: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 2a  elta);.        *
88e0: 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20 27 2c 27  (zDelta++) = ','
88f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 65  ;.        if( be
8900: 73 74 4f 66 73 74 20 2b 20 62 65 73 74 43 6e 74  stOfst + bestCnt
8910: 20 2d 31 20 3e 20 6c 61 73 74 52 65 61 64 20 29   -1 > lastRead )
8920: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 61 73 74  {.          last
8930: 52 65 61 64 20 3d 20 62 65 73 74 4f 66 73 74 20  Read = bestOfst 
8940: 2b 20 62 65 73 74 43 6e 74 20 2d 20 31 3b 0a 20  + bestCnt - 1;. 
8950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8960: 20 62 65 73 74 43 6e 74 20 3d 20 30 3b 0a 20 20   bestCnt = 0;.  
8970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8980: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
8990: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
89a0: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
89b0: 6e 6f 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e  no match is foun
89c0: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
89d0: 20 20 69 66 28 20 62 61 73 65 2b 69 2b 4e 48 41    if( base+i+NHA
89e0: 53 48 3e 3d 6c 65 6e 4f 75 74 20 29 7b 0a 20 20  SH>=lenOut ){.  
89f0: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
8a00: 20 72 65 61 63 68 65 64 20 74 68 65 20 65 6e 64   reached the end
8a10: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
8a20: 20 68 61 76 65 20 6e 6f 74 20 66 6f 75 6e 64 20   have not found 
8a30: 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  any.        ** m
8a40: 61 74 63 68 65 73 2e 20 20 44 6f 20 61 6e 20 22  atches.  Do an "
8a50: 69 6e 73 65 72 74 22 20 66 6f 72 20 65 76 65 72  insert" for ever
8a60: 79 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ything that does
8a70: 20 6e 6f 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20   not match */.  
8a80: 20 20 20 20 20 20 70 75 74 49 6e 74 28 6c 65 6e        putInt(len
8a90: 4f 75 74 2d 62 61 73 65 2c 20 26 7a 44 65 6c 74  Out-base, &zDelt
8aa0: 61 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 7a 44  a);.        *(zD
8ab0: 65 6c 74 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20  elta++) = ':';. 
8ac0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44         memcpy(zD
8ad0: 65 6c 74 61 2c 20 26 7a 4f 75 74 5b 62 61 73 65  elta, &zOut[base
8ae0: 5d 2c 20 6c 65 6e 4f 75 74 2d 62 61 73 65 29 3b  ], lenOut-base);
8af0: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 20  .        zDelta 
8b00: 2b 3d 20 6c 65 6e 4f 75 74 2d 62 61 73 65 3b 0a  += lenOut-base;.
8b10: 20 20 20 20 20 20 20 20 62 61 73 65 20 3d 20 6c          base = l
8b20: 65 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 62  enOut;.        b
8b30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
8b40: 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20       /* Advance 
8b50: 74 68 65 20 68 61 73 68 20 62 79 20 6f 6e 65 20  the hash by one 
8b60: 63 68 61 72 61 63 74 65 72 2e 20 20 4b 65 65 70  character.  Keep
8b70: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 6d   looking for a m
8b80: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 68 61  atch */.      ha
8b90: 73 68 5f 6e 65 78 74 28 26 68 2c 20 7a 4f 75 74  sh_next(&h, zOut
8ba0: 5b 62 61 73 65 2b 69 2b 4e 48 41 53 48 5d 29 3b  [base+i+NHASH]);
8bb0: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
8bc0: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4f 75 74 70 75  }.  }.  /* Outpu
8bd0: 74 20 61 20 66 69 6e 61 6c 20 22 69 6e 73 65 72  t a final "inser
8be0: 74 22 20 72 65 63 6f 72 64 20 74 6f 20 67 65 74  t" record to get
8bf0: 20 61 6c 6c 20 74 68 65 20 74 65 78 74 20 61 74   all the text at
8c00: 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 2a 2a   the end of.  **
8c10: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 64   the file that d
8c20: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
8c30: 79 74 68 69 6e 67 20 69 6e 20 74 68 65 20 73 6f  ything in the so
8c40: 75 72 63 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  urce file..  */.
8c50: 20 20 69 66 28 20 62 61 73 65 3c 6c 65 6e 4f 75    if( base<lenOu
8c60: 74 20 29 7b 0a 20 20 20 20 70 75 74 49 6e 74 28  t ){.    putInt(
8c70: 6c 65 6e 4f 75 74 2d 62 61 73 65 2c 20 26 7a 44  lenOut-base, &zD
8c80: 65 6c 74 61 29 3b 0a 20 20 20 20 2a 28 7a 44 65  elta);.    *(zDe
8c90: 6c 74 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20 20  lta++) = ':';.  
8ca0: 20 20 6d 65 6d 63 70 79 28 7a 44 65 6c 74 61 2c    memcpy(zDelta,
8cb0: 20 26 7a 4f 75 74 5b 62 61 73 65 5d 2c 20 6c 65   &zOut[base], le
8cc0: 6e 4f 75 74 2d 62 61 73 65 29 3b 0a 20 20 20 20  nOut-base);.    
8cd0: 7a 44 65 6c 74 61 20 2b 3d 20 6c 65 6e 4f 75 74  zDelta += lenOut
8ce0: 2d 62 61 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a 20  -base;.  }.  /* 
8cf0: 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
8d00: 20 63 68 65 63 6b 73 75 6d 20 72 65 63 6f 72 64   checksum record
8d10: 2e 20 2a 2f 0a 20 20 70 75 74 49 6e 74 28 63 68  . */.  putInt(ch
8d20: 65 63 6b 73 75 6d 28 7a 4f 75 74 2c 20 6c 65 6e  ecksum(zOut, len
8d30: 4f 75 74 29 2c 20 26 7a 44 65 6c 74 61 29 3b 0a  Out), &zDelta);.
8d40: 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20    *(zDelta++) = 
8d50: 27 3b 27 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ';';.  sqlite3_f
8d60: 72 65 65 28 63 6f 6c 6c 69 64 65 29 3b 0a 20 20  ree(collide);.  
8d70: 72 65 74 75 72 6e 20 28 69 6e 74 29 28 7a 44 65  return (int)(zDe
8d80: 6c 74 61 20 2d 20 7a 4f 72 69 67 44 65 6c 74 61  lta - zOrigDelta
8d90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  );.}../*.** End 
8da0: 6f 66 20 63 6f 64 65 20 63 6f 70 69 65 64 20 66  of code copied f
8db0: 72 6f 6d 20 66 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a  rom fossil..****
8dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e00: 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63 20  ******/..static 
8e10: 76 6f 69 64 20 73 74 72 50 72 69 6e 74 66 41 72  void strPrintfAr
8e20: 72 61 79 28 0a 20 20 53 74 72 20 2a 70 53 74 72  ray(.  Str *pStr
8e30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8e40: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
8e50: 20 6f 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e   object to appen
8e60: 64 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  d to */.  const 
8e70: 63 68 61 72 20 2a 7a 53 65 70 2c 20 20 20 20 20  char *zSep,     
8e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 70            /* Sep
8e90: 61 72 61 74 6f 72 20 73 74 72 69 6e 67 20 2a 2f  arator string */
8ea0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8eb0: 46 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Fmt,            
8ec0: 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72     /* Format for
8ed0: 20 65 61 63 68 20 65 6e 74 72 79 20 2a 2f 0a 20   each entry */. 
8ee0: 20 63 68 61 72 20 2a 2a 61 7a 2c 20 69 6e 74 20   char **az, int 
8ef0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
8f00: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 74 72   /* Array of str
8f10: 69 6e 67 73 20 26 20 69 74 73 20 73 69 7a 65 20  ings & its size 
8f20: 28 6f 72 20 2d 31 29 20 2a 2f 0a 29 7b 0a 20 20  (or -1) */.){.  
8f30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
8f40: 3b 20 61 7a 5b 69 5d 20 26 26 20 28 69 3c 6e 20  ; az[i] && (i<n 
8f50: 7c 7c 20 6e 3c 30 29 3b 20 69 2b 2b 29 7b 0a 20  || n<0); i++){. 
8f60: 20 20 20 69 66 28 20 69 21 3d 30 20 29 20 73 74     if( i!=0 ) st
8f70: 72 50 72 69 6e 74 66 28 70 53 74 72 2c 20 22 25  rPrintf(pStr, "%
8f80: 73 22 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 73  s", zSep);.    s
8f90: 74 72 50 72 69 6e 74 66 28 70 53 74 72 2c 20 7a  trPrintf(pStr, z
8fa0: 46 6d 74 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69  Fmt, az[i], az[i
8fb0: 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 7d  ], az[i]);.  }.}
8fc0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  ..static void ge
8fd0: 74 52 62 75 64 69 66 66 51 75 65 72 79 28 0a 20  tRbudiffQuery(. 
8fe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
8ff0: 62 2c 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  b,.  char **azCo
9000: 6c 2c 0a 20 20 69 6e 74 20 6e 50 4b 2c 0a 20 20  l,.  int nPK,.  
9010: 69 6e 74 20 62 4f 74 61 52 6f 77 69 64 2c 0a 20  int bOtaRowid,. 
9020: 20 53 74 72 20 2a 70 53 71 6c 0a 29 7b 0a 20 20   Str *pSql.){.  
9030: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69 72  int i;..  /* Fir
9040: 73 74 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73  st the newly ins
9050: 65 72 74 65 64 20 72 6f 77 73 3a 20 2a 2a 2f 20  erted rows: **/ 
9060: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71  .  strPrintf(pSq
9070: 6c 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20  l, "SELECT ");. 
9080: 20 73 74 72 50 72 69 6e 74 66 41 72 72 61 79 28   strPrintfArray(
9090: 70 53 71 6c 2c 20 22 2c 20 22 2c 20 22 25 73 22  pSql, ", ", "%s"
90a0: 2c 20 61 7a 43 6f 6c 2c 20 2d 31 29 3b 0a 20 20  , azCol, -1);.  
90b0: 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20  strPrintf(pSql, 
90c0: 22 2c 20 30 2c 20 22 29 3b 20 20 20 20 20 20 20  ", 0, ");       
90d0: 2f 2a 20 53 65 74 20 6f 74 61 5f 63 6f 6e 74 72  /* Set ota_contr
90e0: 6f 6c 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 69  ol to 0 for an i
90f0: 6e 73 65 72 74 20 2a 2f 0a 20 20 73 74 72 50 72  nsert */.  strPr
9100: 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20  intfArray(pSql, 
9110: 22 2c 20 22 2c 20 22 4e 55 4c 4c 22 2c 20 61 7a  ", ", "NULL", az
9120: 43 6f 6c 2c 20 2d 31 29 3b 0a 20 20 73 74 72 50  Col, -1);.  strP
9130: 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 20 46 52  rintf(pSql, " FR
9140: 4f 4d 20 61 75 78 2e 25 51 20 41 53 20 6e 20 57  OM aux.%Q AS n W
9150: 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 20  HERE NOT EXISTS 
9160: 28 5c 6e 22 2c 20 7a 54 61 62 29 3b 0a 20 20 73  (\n", zTab);.  s
9170: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
9180: 20 20 20 20 53 45 4c 45 43 54 20 31 20 46 52 4f      SELECT 1 FRO
9190: 4d 20 22 2c 20 7a 54 61 62 29 3b 0a 20 20 73 74  M ", zTab);.  st
91a0: 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 20  rPrintf(pSql, " 
91b0: 6d 61 69 6e 2e 25 51 20 41 53 20 6f 20 57 48 45  main.%Q AS o WHE
91c0: 52 45 20 22 2c 20 7a 54 61 62 29 3b 0a 20 20 73  RE ", zTab);.  s
91d0: 74 72 50 72 69 6e 74 66 41 72 72 61 79 28 70 53  trPrintfArray(pS
91e0: 71 6c 2c 20 22 20 41 4e 44 20 22 2c 20 22 28 6e  ql, " AND ", "(n
91f0: 2e 25 51 20 49 53 20 6f 2e 25 51 29 22 2c 20 61  .%Q IS o.%Q)", a
9200: 7a 43 6f 6c 2c 20 6e 50 4b 29 3b 0a 20 20 73 74  zCol, nPK);.  st
9210: 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 5c  rPrintf(pSql, "\
9220: 6e 29 22 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  n)");..  /* Dele
9230: 74 65 64 20 72 6f 77 73 3a 20 2a 2f 0a 20 20 73  ted rows: */.  s
9240: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
9250: 5c 6e 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 53 45 4c  \nUNION ALL\nSEL
9260: 45 43 54 20 22 29 3b 0a 20 20 73 74 72 50 72 69  ECT ");.  strPri
9270: 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22  ntfArray(pSql, "
9280: 2c 20 22 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c  , ", "%s", azCol
9290: 2c 20 6e 50 4b 29 3b 0a 20 20 69 66 28 20 61 7a  , nPK);.  if( az
92a0: 43 6f 6c 5b 6e 50 4b 5d 20 29 7b 0a 20 20 20 20  Col[nPK] ){.    
92b0: 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20  strPrintf(pSql, 
92c0: 22 2c 20 22 29 3b 0a 20 20 20 20 73 74 72 50 72  ", ");.    strPr
92d0: 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20  intfArray(pSql, 
92e0: 22 2c 20 22 2c 20 22 4e 55 4c 4c 22 2c 20 26 61  ", ", "NULL", &a
92f0: 7a 43 6f 6c 5b 6e 50 4b 5d 2c 20 2d 31 29 3b 0a  zCol[nPK], -1);.
9300: 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28    }.  strPrintf(
9310: 70 53 71 6c 2c 20 22 2c 20 31 2c 20 22 29 3b 20  pSql, ", 1, "); 
9320: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 74 61        /* Set ota
9330: 5f 63 6f 6e 74 72 6f 6c 20 74 6f 20 31 20 66 6f  _control to 1 fo
9340: 72 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  r a delete */.  
9350: 73 74 72 50 72 69 6e 74 66 41 72 72 61 79 28 70  strPrintfArray(p
9360: 53 71 6c 2c 20 22 2c 20 22 2c 20 22 4e 55 4c 4c  Sql, ", ", "NULL
9370: 22 2c 20 61 7a 43 6f 6c 2c 20 2d 31 29 3b 0a 20  ", azCol, -1);. 
9380: 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c   strPrintf(pSql,
9390: 20 22 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 51 20   " FROM main.%Q 
93a0: 41 53 20 6e 20 57 48 45 52 45 20 4e 4f 54 20 45  AS n WHERE NOT E
93b0: 58 49 53 54 53 20 28 5c 6e 22 2c 20 7a 54 61 62  XISTS (\n", zTab
93c0: 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70  );.  strPrintf(p
93d0: 53 71 6c 2c 20 22 20 20 20 20 53 45 4c 45 43 54  Sql, "    SELECT
93e0: 20 31 20 46 52 4f 4d 20 22 2c 20 7a 54 61 62 29   1 FROM ", zTab)
93f0: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53  ;.  strPrintf(pS
9400: 71 6c 2c 20 22 20 61 75 78 2e 25 51 20 41 53 20  ql, " aux.%Q AS 
9410: 6f 20 57 48 45 52 45 20 22 2c 20 7a 54 61 62 29  o WHERE ", zTab)
9420: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 41 72 72  ;.  strPrintfArr
9430: 61 79 28 70 53 71 6c 2c 20 22 20 41 4e 44 20 22  ay(pSql, " AND "
9440: 2c 20 22 28 6e 2e 25 51 20 49 53 20 6f 2e 25 51  , "(n.%Q IS o.%Q
9450: 29 22 2c 20 61 7a 43 6f 6c 2c 20 6e 50 4b 29 3b  )", azCol, nPK);
9460: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71  .  strPrintf(pSq
9470: 6c 2c 20 22 5c 6e 29 20 22 29 3b 0a 0a 20 20 2f  l, "\n) ");..  /
9480: 2a 20 55 70 64 61 74 65 64 20 72 6f 77 73 2e 20  * Updated rows. 
9490: 49 66 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  If all table col
94a0: 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66  umns are part of
94b0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
94c0: 2c 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 63 61  , there .  ** ca
94d0: 6e 20 62 65 20 6e 6f 20 75 70 64 61 74 65 73 2e  n be no updates.
94e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
94f0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  is part of the c
9500: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 63  ompound SELECT c
9510: 61 6e 0a 20 20 2a 2a 20 62 65 20 6f 6d 69 74 74  an.  ** be omitt
9520: 65 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a  ed altogether. *
9530: 2f 0a 20 20 69 66 28 20 61 7a 43 6f 6c 5b 6e 50  /.  if( azCol[nP
9540: 4b 5d 20 29 7b 0a 20 20 20 20 73 74 72 50 72 69  K] ){.    strPri
9550: 6e 74 66 28 70 53 71 6c 2c 20 22 5c 6e 55 4e 49  ntf(pSql, "\nUNI
9560: 4f 4e 20 41 4c 4c 5c 6e 53 45 4c 45 43 54 20 22  ON ALL\nSELECT "
9570: 29 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  );.    strPrintf
9580: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 2c 20 22  Array(pSql, ", "
9590: 2c 20 22 6e 2e 25 73 22 2c 20 61 7a 43 6f 6c 2c  , "n.%s", azCol,
95a0: 20 6e 50 4b 29 3b 0a 20 20 20 20 73 74 72 50 72   nPK);.    strPr
95b0: 69 6e 74 66 28 70 53 71 6c 2c 20 22 2c 5c 6e 22  intf(pSql, ",\n"
95c0: 29 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  );.    strPrintf
95d0: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 20 2c 5c  Array(pSql, " ,\
95e0: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 22 20 20  n", .        "  
95f0: 20 20 43 41 53 45 20 57 48 45 4e 20 6e 2e 25 73    CASE WHEN n.%s
9600: 20 49 53 20 6f 2e 25 73 20 54 48 45 4e 20 4e 55   IS o.%s THEN NU
9610: 4c 4c 20 45 4c 53 45 20 6e 2e 25 73 20 45 4e 44  LL ELSE n.%s END
9620: 22 2c 20 26 61 7a 43 6f 6c 5b 6e 50 4b 5d 2c 20  ", &azCol[nPK], 
9630: 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  -1.    );..    i
9640: 66 28 20 62 4f 74 61 52 6f 77 69 64 3d 3d 30 20  f( bOtaRowid==0 
9650: 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e  ){.      strPrin
9660: 74 66 28 70 53 71 6c 2c 20 22 2c 20 27 22 29 3b  tf(pSql, ", '");
9670: 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66  .      strPrintf
9680: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 22 2c 20  Array(pSql, "", 
9690: 22 2e 22 2c 20 61 7a 43 6f 6c 2c 20 6e 50 4b 29  ".", azCol, nPK)
96a0: 3b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74  ;.      strPrint
96b0: 66 28 70 53 71 6c 2c 20 22 27 20 7c 7c 5c 6e 22  f(pSql, "' ||\n"
96c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
96d0: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 70 53      strPrintf(pS
96e0: 71 6c 2c 20 22 2c 5c 6e 22 29 3b 0a 20 20 20 20  ql, ",\n");.    
96f0: 7d 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 41  }.    strPrintfA
9700: 72 72 61 79 28 70 53 71 6c 2c 20 22 20 7c 7c 5c  rray(pSql, " ||\
9710: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 22 20 20  n", .        "  
9720: 20 20 43 41 53 45 20 57 48 45 4e 20 6e 2e 25 73    CASE WHEN n.%s
9730: 20 49 53 20 6f 2e 25 73 20 54 48 45 4e 20 27 2e   IS o.%s THEN '.
9740: 27 20 45 4c 53 45 20 27 78 27 20 45 4e 44 22 2c  ' ELSE 'x' END",
9750: 20 26 61 7a 43 6f 6c 5b 6e 50 4b 5d 2c 20 2d 31   &azCol[nPK], -1
9760: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 74 72 50  .    );.    strP
9770: 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 5c 6e 41  rintf(pSql, "\nA
9780: 53 20 6f 74 61 5f 63 6f 6e 74 72 6f 6c 2c 20 22  S ota_control, "
9790: 29 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  );.    strPrintf
97a0: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 2c 20 22  Array(pSql, ", "
97b0: 2c 20 22 4e 55 4c 4c 22 2c 20 61 7a 43 6f 6c 2c  , "NULL", azCol,
97c0: 20 6e 50 4b 29 3b 0a 20 20 20 20 73 74 72 50 72   nPK);.    strPr
97d0: 69 6e 74 66 28 70 53 71 6c 2c 20 22 2c 5c 6e 22  intf(pSql, ",\n"
97e0: 29 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  );.    strPrintf
97f0: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 20 2c 5c  Array(pSql, " ,\
9800: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 22 20 20  n", .        "  
9810: 20 20 43 41 53 45 20 57 48 45 4e 20 6e 2e 25 73    CASE WHEN n.%s
9820: 20 49 53 20 6f 2e 25 73 20 54 48 45 4e 20 4e 55   IS o.%s THEN NU
9830: 4c 4c 20 45 4c 53 45 20 6f 2e 25 73 20 45 4e 44  LL ELSE o.%s END
9840: 22 2c 20 26 61 7a 43 6f 6c 5b 6e 50 4b 5d 2c 20  ", &azCol[nPK], 
9850: 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 73  -1.    );..    s
9860: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
9870: 5c 6e 46 52 4f 4d 20 6d 61 69 6e 2e 25 51 20 41  \nFROM main.%Q A
9880: 53 20 6f 2c 20 61 75 78 2e 25 51 20 41 53 20 6e  S o, aux.%Q AS n
9890: 5c 6e 57 48 45 52 45 20 22 2c 20 7a 54 61 62 2c  \nWHERE ", zTab,
98a0: 20 7a 54 61 62 29 3b 0a 20 20 20 20 73 74 72 50   zTab);.    strP
98b0: 72 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c  rintfArray(pSql,
98c0: 20 22 20 41 4e 44 20 22 2c 20 22 28 6e 2e 25 51   " AND ", "(n.%Q
98d0: 20 49 53 20 6f 2e 25 51 29 22 2c 20 61 7a 43 6f   IS o.%Q)", azCo
98e0: 6c 2c 20 6e 50 4b 29 3b 0a 20 20 20 20 73 74 72  l, nPK);.    str
98f0: 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 20 41  Printf(pSql, " A
9900: 4e 44 20 6f 74 61 5f 63 6f 6e 74 72 6f 6c 20 4c  ND ota_control L
9910: 49 4b 45 20 27 25 25 78 25 25 27 22 29 3b 0a 20  IKE '%%x%%'");. 
9920: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 61 64 64   }..  /* Now add
9930: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
9940: 75 73 65 20 74 6f 20 73 6f 72 74 20 65 76 65 72  use to sort ever
9950: 79 74 68 69 6e 67 20 62 79 20 50 4b 2e 20 2a 2f  ything by PK. */
9960: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71  .  strPrintf(pSq
9970: 6c 2c 20 22 5c 6e 4f 52 44 45 52 20 42 59 20 22  l, "\nORDER BY "
9980: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
9990: 3d 6e 50 4b 3b 20 69 2b 2b 29 20 73 74 72 50 72  =nPK; i++) strPr
99a0: 69 6e 74 66 28 70 53 71 6c 2c 20 22 25 73 25 64  intf(pSql, "%s%d
99b0: 22 2c 20 28 28 69 3e 31 29 3f 22 2c 20 22 3a 22  ", ((i>1)?", ":"
99c0: 22 29 2c 20 69 29 3b 0a 7d 0a 0a 73 74 61 74 69  "), i);.}..stati
99d0: 63 20 76 6f 69 64 20 72 62 75 64 69 66 66 5f 6f  c void rbudiff_o
99e0: 6e 65 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20 63  ne_table(const c
99f0: 68 61 72 20 2a 7a 54 61 62 2c 20 46 49 4c 45 20  har *zTab, FILE 
9a00: 2a 6f 75 74 29 7b 0a 20 20 69 6e 74 20 62 4f 74  *out){.  int bOt
9a10: 61 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  aRowid;         
9a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9a30: 20 74 6f 20 75 73 65 20 61 6e 20 6f 74 61 5f 72   to use an ota_r
9a40: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  owid column */. 
9a50: 20 69 6e 74 20 6e 50 4b 3b 20 20 20 20 20 20 20   int nPK;       
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72   /* Number of pr
9a80: 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e  imary key column
9a90: 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  s in table */.  
9aa0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20  char **azCol;   
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 2f 2a 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74  /* NULL terminat
9ad0: 65 64 20 61 72 72 61 79 20 6f 66 20 63 6f 6c 20  ed array of col 
9ae0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  names */.  int i
9af0: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
9b00: 53 74 72 20 63 74 20 3d 20 7b 30 2c 20 30 2c 20  Str ct = {0, 0, 
9b10: 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0};             
9b20: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 20 54  /* The "CREATE T
9b30: 41 42 4c 45 20 64 61 74 61 5f 78 78 78 22 20 73  ABLE data_xxx" s
9b40: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 74  tatement */.  St
9b50: 72 20 73 71 6c 20 3d 20 7b 30 2c 20 30 2c 20 30  r sql = {0, 0, 0
9b60: 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  };            /*
9b70: 20 51 75 65 72 79 20 74 6f 20 66 69 6e 64 20 64   Query to find d
9b80: 69 66 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20  ifferences */.  
9b90: 53 74 72 20 69 6e 73 65 72 74 20 3d 20 7b 30 2c  Str insert = {0,
9ba0: 20 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20   0, 0};         
9bb0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
9bc0: 20 6f 75 74 70 75 74 20 49 4e 53 45 52 54 20 73   output INSERT s
9bd0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 73 71  tatement */.  sq
9be0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
9bf0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f  t = 0;.  int nRo
9c00: 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
9c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
9c20: 6c 20 72 6f 77 73 20 69 6e 20 64 61 74 61 5f 78  l rows in data_x
9c30: 78 78 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 2f  xx table */..  /
9c40: 2a 20 2d 2d 72 62 75 20 6d 6f 64 65 20 6d 75 73  * --rbu mode mus
9c50: 74 20 75 73 65 20 72 65 61 6c 20 70 72 69 6d 61  t use real prima
9c60: 72 79 20 6b 65 79 73 2e 20 2a 2f 0a 20 20 67 2e  ry keys. */.  g.
9c70: 62 53 63 68 65 6d 61 50 4b 20 3d 20 31 3b 0a 0a  bSchemaPK = 1;..
9c80: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9c90: 74 68 65 20 73 63 68 65 6d 61 73 20 6f 66 20 74  the schemas of t
9ca0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 6d 61  he two tables ma
9cb0: 74 63 68 2e 20 45 78 69 74 20 65 61 72 6c 79 20  tch. Exit early 
9cc0: 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20  otherwise. */.  
9cd0: 63 68 65 63 6b 53 63 68 65 6d 61 73 4d 61 74 63  checkSchemasMatc
9ce0: 68 28 7a 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 47  h(zTab);..  /* G
9cf0: 72 61 62 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  rab the column n
9d00: 61 6d 65 73 20 61 6e 64 20 50 4b 20 64 65 74 61  ames and PK deta
9d10: 69 6c 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ils for the tabl
9d20: 65 28 73 29 2e 20 49 66 20 6e 6f 20 75 73 61 62  e(s). If no usab
9d30: 6c 65 20 50 4b 0a 20 20 2a 2a 20 63 6f 6c 75 6d  le PK.  ** colum
9d40: 6e 73 20 61 72 65 20 66 6f 75 6e 64 2c 20 62 61  ns are found, ba
9d50: 69 6c 20 6f 75 74 20 65 61 72 6c 79 2e 20 20 2a  il out early.  *
9d60: 2f 0a 20 20 61 7a 43 6f 6c 20 3d 20 63 6f 6c 75  /.  azCol = colu
9d70: 6d 6e 4e 61 6d 65 73 28 22 6d 61 69 6e 22 2c 20  mnNames("main", 
9d80: 7a 54 61 62 2c 20 26 6e 50 4b 2c 20 26 62 4f 74  zTab, &nPK, &bOt
9d90: 61 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 61  aRowid);.  if( a
9da0: 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zCol==0 ){.    r
9db0: 75 6e 74 69 6d 65 45 72 72 6f 72 28 22 74 61 62  untimeError("tab
9dc0: 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 75 73 61  le %s has no usa
9dd0: 62 6c 65 20 50 4b 20 63 6f 6c 75 6d 6e 73 22 2c  ble PK columns",
9de0: 20 7a 54 61 62 29 3b 0a 20 20 7d 0a 20 20 66 6f   zTab);.  }.  fo
9df0: 72 28 6e 43 6f 6c 3d 30 3b 20 61 7a 43 6f 6c 5b  r(nCol=0; azCol[
9e00: 6e 43 6f 6c 5d 3b 20 6e 43 6f 6c 2b 2b 29 3b 0a  nCol]; nCol++);.
9e10: 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 64 20  .  /* Build and 
9e20: 6f 75 74 70 75 74 20 74 68 65 20 43 52 45 41 54  output the CREAT
9e30: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9e40: 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 5f 78  t for the data_x
9e50: 78 78 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 74  xx table */.  st
9e60: 72 50 72 69 6e 74 66 28 26 63 74 2c 20 22 43 52  rPrintf(&ct, "CR
9e70: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
9e80: 54 20 45 58 49 53 54 53 20 27 64 61 74 61 5f 25  T EXISTS 'data_%
9e90: 71 27 28 22 2c 20 7a 54 61 62 29 3b 0a 20 20 69  q'(", zTab);.  i
9ea0: 66 28 20 62 4f 74 61 52 6f 77 69 64 20 29 20 73  f( bOtaRowid ) s
9eb0: 74 72 50 72 69 6e 74 66 28 26 63 74 2c 20 22 72  trPrintf(&ct, "r
9ec0: 62 75 5f 72 6f 77 69 64 2c 20 22 29 3b 0a 20 20  bu_rowid, ");.  
9ed0: 73 74 72 50 72 69 6e 74 66 41 72 72 61 79 28 26  strPrintfArray(&
9ee0: 63 74 2c 20 22 2c 20 22 2c 20 22 25 73 22 2c 20  ct, ", ", "%s", 
9ef0: 26 61 7a 43 6f 6c 5b 62 4f 74 61 52 6f 77 69 64  &azCol[bOtaRowid
9f00: 5d 2c 20 2d 31 29 3b 0a 20 20 73 74 72 50 72 69  ], -1);.  strPri
9f10: 6e 74 66 28 26 63 74 2c 20 22 2c 20 72 62 75 5f  ntf(&ct, ", rbu_
9f20: 63 6f 6e 74 72 6f 6c 29 3b 22 29 3b 0a 0a 20 20  control);");..  
9f30: 2f 2a 20 47 65 74 20 74 68 65 20 53 51 4c 20 66  /* Get the SQL f
9f40: 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
9f50: 72 65 74 72 69 65 76 65 20 64 61 74 61 20 66 72  retrieve data fr
9f60: 6f 6d 20 74 68 65 20 74 77 6f 20 64 61 74 61 62  om the two datab
9f70: 61 73 65 73 20 2a 2f 0a 20 20 67 65 74 52 62 75  ases */.  getRbu
9f80: 64 69 66 66 51 75 65 72 79 28 7a 54 61 62 2c 20  diffQuery(zTab, 
9f90: 61 7a 43 6f 6c 2c 20 6e 50 4b 2c 20 62 4f 74 61  azCol, nPK, bOta
9fa0: 52 6f 77 69 64 2c 20 26 73 71 6c 29 3b 0a 0a 20  Rowid, &sql);.. 
9fb0: 20 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 66 69   /* Build the fi
9fc0: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
9fd0: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
9fe0: 20 6f 75 74 70 75 74 20 66 6f 72 20 65 61 63 68   output for each
9ff0: 20 72 6f 77 0a 20 20 2a 2a 20 69 6e 20 74 68 65   row.  ** in the
a000: 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 2e   data_xxx table.
a010: 20 2a 2f 0a 20 20 73 74 72 50 72 69 6e 74 66 28   */.  strPrintf(
a020: 26 69 6e 73 65 72 74 2c 20 22 49 4e 53 45 52 54  &insert, "INSERT
a030: 20 49 4e 54 4f 20 27 64 61 74 61 5f 25 71 27 20   INTO 'data_%q' 
a040: 28 22 2c 20 7a 54 61 62 29 3b 0a 20 20 69 66 28  (", zTab);.  if(
a050: 20 62 4f 74 61 52 6f 77 69 64 20 29 20 73 74 72   bOtaRowid ) str
a060: 50 72 69 6e 74 66 28 26 69 6e 73 65 72 74 2c 20  Printf(&insert, 
a070: 22 72 62 75 5f 72 6f 77 69 64 2c 20 22 29 3b 0a  "rbu_rowid, ");.
a080: 20 20 73 74 72 50 72 69 6e 74 66 41 72 72 61 79    strPrintfArray
a090: 28 26 69 6e 73 65 72 74 2c 20 22 2c 20 22 2c 20  (&insert, ", ", 
a0a0: 22 25 73 22 2c 20 26 61 7a 43 6f 6c 5b 62 4f 74  "%s", &azCol[bOt
a0b0: 61 52 6f 77 69 64 5d 2c 20 2d 31 29 3b 0a 20 20  aRowid], -1);.  
a0c0: 73 74 72 50 72 69 6e 74 66 28 26 69 6e 73 65 72  strPrintf(&inser
a0d0: 74 2c 20 22 2c 20 72 62 75 5f 63 6f 6e 74 72 6f  t, ", rbu_contro
a0e0: 6c 29 20 56 41 4c 55 45 53 28 22 29 3b 0a 0a 20  l) VALUES(");.. 
a0f0: 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70   pStmt = db_prep
a100: 61 72 65 28 22 25 73 22 2c 20 73 71 6c 2e 7a 29  are("%s", sql.z)
a110: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  ;..  while( sqli
a120: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
a130: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
a140: 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68     .    /* If th
a150: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
a160: 72 6f 77 20 6f 75 74 70 75 74 2c 20 70 72 69 6e  row output, prin
a170: 74 20 6f 75 74 20 74 68 65 20 43 52 45 41 54 45  t out the CREATE
a180: 20 54 41 42 4c 45 20 0a 20 20 20 20 2a 2a 20 73   TABLE .    ** s
a190: 74 61 74 65 6d 65 6e 74 20 66 69 72 73 74 2e 20  tatement first. 
a1a0: 41 6e 64 20 74 68 65 6e 20 73 65 74 20 63 74 2e  And then set ct.
a1b0: 7a 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 61  z to NULL so tha
a1c0: 74 20 69 74 20 69 73 20 6e 6f 74 20 0a 20 20 20  t it is not .   
a1d0: 20 2a 2a 20 70 72 69 6e 74 65 64 20 61 67 61 69   ** printed agai
a1e0: 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  n.  */.    if( c
a1f0: 74 2e 7a 20 29 7b 0a 20 20 20 20 20 20 66 70 72  t.z ){.      fpr
a200: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
a210: 2c 20 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20 73  , ct.z);.      s
a220: 74 72 46 72 65 65 28 26 63 74 29 3b 0a 20 20 20  trFree(&ct);.   
a230: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 75 74 70 75   }..    /* Outpu
a240: 74 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  t the first part
a250: 20 6f 66 20 74 68 65 20 49 4e 53 45 52 54 20 73   of the INSERT s
a260: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
a270: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
a280: 22 2c 20 69 6e 73 65 72 74 2e 7a 29 3b 0a 20 20  ", insert.z);.  
a290: 20 20 6e 52 6f 77 2b 2b 3b 0a 0a 20 20 20 20 69    nRow++;..    i
a2a0: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
a2b0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 6e 43  n_type(pStmt, nC
a2c0: 6f 6c 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ol)==SQLITE_INTE
a2d0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  GER ){.      for
a2e0: 28 69 3d 30 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69  (i=0; i<=nCol; i
a2f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
a300: 20 69 3e 30 20 29 20 66 70 72 69 6e 74 66 28 6f   i>0 ) fprintf(o
a310: 75 74 2c 20 22 2c 20 22 29 3b 0a 20 20 20 20 20  ut, ", ");.     
a320: 20 20 20 70 72 69 6e 74 51 75 6f 74 65 64 28 6f     printQuoted(o
a330: 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ut, sqlite3_colu
a340: 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20  mn_value(pStmt, 
a350: 69 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i));.      }.   
a360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
a370: 61 72 20 2a 7a 4f 74 61 43 6f 6e 74 72 6f 6c 3b  ar *zOtaControl;
a380: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 74 61 43  .      int nOtaC
a390: 6f 6e 74 72 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ontrol = sqlite3
a3a0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
a3b0: 74 6d 74 2c 20 6e 43 6f 6c 29 3b 0a 0a 20 20 20  tmt, nCol);..   
a3c0: 20 20 20 7a 4f 74 61 43 6f 6e 74 72 6f 6c 20 3d     zOtaControl =
a3d0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
a3e0: 6d 61 6c 6c 6f 63 28 6e 4f 74 61 43 6f 6e 74 72  malloc(nOtaContr
a3f0: 6f 6c 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ol);.      memcp
a400: 79 28 7a 4f 74 61 43 6f 6e 74 72 6f 6c 2c 20 73  y(zOtaControl, s
a410: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
a420: 78 74 28 70 53 74 6d 74 2c 20 6e 43 6f 6c 29 2c  xt(pStmt, nCol),
a430: 20 6e 4f 74 61 43 6f 6e 74 72 6f 6c 2b 31 29 3b   nOtaControl+1);
a440: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
a450: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
a460: 20 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65         int bDone
a470: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
a480: 28 20 69 3e 3d 6e 50 4b 20 0a 20 20 20 20 20 20  ( i>=nPK .      
a490: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
a4a0: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
a4b0: 6d 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f 42  mt, i)==SQLITE_B
a4c0: 4c 4f 42 0a 20 20 20 20 20 20 20 20 20 20 20 20  LOB.            
a4d0: 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  && sqlite3_colum
a4e0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 6e 43  n_type(pStmt, nC
a4f0: 6f 6c 2b 31 2b 69 29 3d 3d 53 51 4c 49 54 45 5f  ol+1+i)==SQLITE_
a500: 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 29 7b 0a  BLOB.        ){.
a510: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
a520: 63 68 61 72 20 2a 61 53 72 63 20 3d 20 73 71 6c  char *aSrc = sql
a530: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
a540: 28 70 53 74 6d 74 2c 20 6e 43 6f 6c 2b 31 2b 69  (pStmt, nCol+1+i
a550: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
a560: 20 6e 53 72 63 20 3d 20 73 71 6c 69 74 65 33 5f   nSrc = sqlite3_
a570: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
a580: 6d 74 2c 20 6e 43 6f 6c 2b 31 2b 69 29 3b 0a 20  mt, nCol+1+i);. 
a590: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
a5a0: 68 61 72 20 2a 61 46 69 6e 61 6c 20 3d 20 73 71  har *aFinal = sq
a5b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
a5c0: 62 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  b(pStmt, i);.   
a5d0: 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6e 61         int nFina
a5e0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
a5f0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
a600: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  i);.          ch
a610: 61 72 20 2a 61 44 65 6c 74 61 3b 0a 20 20 20 20  ar *aDelta;.    
a620: 20 20 20 20 20 20 69 6e 74 20 6e 44 65 6c 74 61        int nDelta
a630: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 61 44 65  ;..          aDe
a640: 6c 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  lta = sqlite3_ma
a650: 6c 6c 6f 63 28 6e 46 69 6e 61 6c 20 2b 20 36 30  lloc(nFinal + 60
a660: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65  );.          nDe
a670: 6c 74 61 20 3d 20 72 62 75 44 65 6c 74 61 43 72  lta = rbuDeltaCr
a680: 65 61 74 65 28 61 53 72 63 2c 20 6e 53 72 63 2c  eate(aSrc, nSrc,
a690: 20 61 46 69 6e 61 6c 2c 20 6e 46 69 6e 61 6c 2c   aFinal, nFinal,
a6a0: 20 61 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20   aDelta);.      
a6b0: 20 20 20 20 69 66 28 20 6e 44 65 6c 74 61 3c 6e      if( nDelta<n
a6c0: 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Final ){.       
a6d0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a6e0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
a6f0: 6f 75 74 2c 20 22 78 27 22 29 3b 0a 20 20 20 20  out, "x'");.    
a700: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
a710: 20 6a 3c 6e 44 65 6c 74 61 3b 20 6a 2b 2b 29 20   j<nDelta; j++) 
a720: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
a730: 32 78 22 2c 20 28 75 38 29 61 44 65 6c 74 61 5b  2x", (u8)aDelta[
a740: 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  j]);.           
a750: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27   fprintf(out, "'
a760: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
a770: 7a 4f 74 61 43 6f 6e 74 72 6f 6c 5b 69 2d 62 4f  zOtaControl[i-bO
a780: 74 61 52 6f 77 69 64 5d 20 3d 20 27 66 27 3b 0a  taRowid] = 'f';.
a790: 20 20 20 20 20 20 20 20 20 20 20 20 62 44 6f 6e              bDon
a7a0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
a7b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
a7c0: 69 74 65 33 5f 66 72 65 65 28 61 44 65 6c 74 61  ite3_free(aDelta
a7d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
a7e0: 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 3d        if( bDone=
a7f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a800: 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75 74 2c  printQuoted(out,
a810: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a820: 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69 29 29  value(pStmt, i))
a830: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a840: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
a850: 20 22 2c 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a   ", ");.      }.
a860: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
a870: 74 2c 20 22 27 25 73 27 22 2c 20 7a 4f 74 61 43  t, "'%s'", zOtaC
a880: 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 20 20 73  ontrol);.      s
a890: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 74 61  qlite3_free(zOta
a8a0: 43 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 7d 0a  Control);.    }.
a8b0: 0a 20 20 20 20 2f 2a 20 41 6e 64 20 74 68 65 20  .    /* And the 
a8c0: 63 6c 6f 73 69 6e 67 20 62 72 61 63 6b 65 74 20  closing bracket 
a8d0: 6f 66 20 74 68 65 20 69 6e 73 65 72 74 20 73 74  of the insert st
a8e0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 66  atement */.    f
a8f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 29 3b 5c  printf(out, ");\
a900: 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  n");.  }..  sqli
a910: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
a920: 6d 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3e  mt);.  if( nRow>
a930: 30 20 29 7b 0a 20 20 20 20 53 74 72 20 63 6e 74  0 ){.    Str cnt
a940: 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20   = {0, 0, 0};.  
a950: 20 20 73 74 72 50 72 69 6e 74 66 28 26 63 6e 74    strPrintf(&cnt
a960: 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 72  , "INSERT INTO r
a970: 62 75 5f 63 6f 75 6e 74 20 56 41 4c 55 45 53 28  bu_count VALUES(
a980: 27 64 61 74 61 5f 25 71 27 2c 20 25 64 29 3b 22  'data_%q', %d);"
a990: 2c 20 7a 54 61 62 2c 20 6e 52 6f 77 29 3b 0a 20  , zTab, nRow);. 
a9a0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
a9b0: 22 25 73 5c 6e 22 2c 20 63 6e 74 2e 7a 29 3b 0a  "%s\n", cnt.z);.
a9c0: 20 20 20 20 73 74 72 46 72 65 65 28 26 63 6e 74      strFree(&cnt
a9d0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 74 72 46 72 65  );.  }..  strFre
a9e0: 65 28 26 63 74 29 3b 0a 20 20 73 74 72 46 72 65  e(&ct);.  strFre
a9f0: 65 28 26 73 71 6c 29 3b 0a 20 20 73 74 72 46 72  e(&sql);.  strFr
aa00: 65 65 28 26 69 6e 73 65 72 74 29 3b 0a 7d 0a 0a  ee(&insert);.}..
aa10: 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20  /*.** Display a 
aa20: 73 75 6d 6d 61 72 79 20 6f 66 20 64 69 66 66 65  summary of diffe
aa30: 72 65 6e 63 65 73 20 62 65 74 77 65 65 6e 20 74  rences between t
aa40: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
aa50: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 61 62 6c 65  he same.** table
aa60: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   table..**.**   
aa70: 2a 20 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  *  Number of row
aa80: 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 20 20 2a  s changed.**   *
aa90: 20 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73    Number of rows
aaa0: 20 61 64 64 65 64 0a 2a 2a 20 20 20 2a 20 20 4e   added.**   *  N
aab0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65  umber of rows de
aac0: 6c 65 74 65 64 0a 2a 2a 20 20 20 2a 20 20 4e 75  leted.**   *  Nu
aad0: 6d 62 65 72 20 6f 66 20 69 64 65 6e 74 69 63 61  mber of identica
aae0: 6c 20 72 6f 77 73 0a 2a 2f 0a 73 74 61 74 69 63  l rows.*/.static
aaf0: 20 76 6f 69 64 20 73 75 6d 6d 61 72 69 7a 65 5f   void summarize_
ab00: 6f 6e 65 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20  one_table(const 
ab10: 63 68 61 72 20 2a 7a 54 61 62 2c 20 46 49 4c 45  char *zTab, FILE
ab20: 20 2a 6f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a   *out){.  char *
ab30: 7a 49 64 20 3d 20 73 61 66 65 49 64 28 7a 54 61  zId = safeId(zTa
ab40: 62 29 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  b); /* Name of t
ab50: 61 62 6c 65 20 28 74 72 61 6e 73 6c 61 74 65 64  able (translated
ab60: 20 66 6f 72 20 75 73 20 69 6e 20 53 51 4c 29 20   for us in SQL) 
ab70: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 20 3d  */.  char **az =
ab80: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
ab90: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61 69  * Columns in mai
aba0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  n */.  char **az
abb0: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
abc0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 61   /* Columns in a
abd0: 75 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 3b  ux */.  int nPk;
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65 79    /* Primary key
ac00: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61 69 6e   columns in main
ac10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 32 3b 20   */.  int nPk2; 
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65 79 20 63  /* Primary key c
ac40: 6f 6c 75 6d 6e 73 20 69 6e 20 61 75 78 20 2a 2f  olumns in aux */
ac50: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 20 20 20  .  int n = 0;   
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac70: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
ac80: 73 20 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20 69  s in main */.  i
ac90: 6e 74 20 6e 32 3b 20 20 20 20 20 20 20 20 20 20  nt n2;          
aca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
acb0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
acc0: 20 61 75 78 20 2a 2f 0a 20 20 69 6e 74 20 69 3b   aux */.  int i;
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
acf0: 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ter */.  const c
ad00: 68 61 72 20 2a 7a 53 65 70 3b 20 20 20 20 20 20  har *zSep;      
ad10: 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20     /* Separator 
ad20: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 53 74 72 20  string */.  Str 
ad30: 73 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  sql;            
ad40: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
ad50: 73 6f 6e 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  son query */.  s
ad60: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
ad70: 6d 74 3b 20 20 20 20 20 20 2f 2a 20 51 75 65 72  mt;      /* Quer
ad80: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64  y statement to d
ad90: 6f 20 74 68 65 20 64 69 66 66 20 2a 2f 0a 20 20  o the diff */.  
ada0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 55  sqlite3_int64 nU
adb0: 70 64 61 74 65 3b 20 20 20 20 2f 2a 20 4e 75 6d  pdate;    /* Num
adc0: 62 65 72 20 6f 66 20 75 70 64 61 74 65 64 20 72  ber of updated r
add0: 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ows */.  sqlite3
ade0: 5f 69 6e 74 36 34 20 6e 55 6e 63 68 61 6e 67 65  _int64 nUnchange
adf0: 64 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  d; /* Number of 
ae00: 75 6e 6d 6f 64 69 66 69 65 64 20 72 6f 77 73 20  unmodified rows 
ae10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
ae20: 36 34 20 6e 44 65 6c 65 74 65 3b 20 20 20 20 2f  64 nDelete;    /
ae30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 65 6c 65  * Number of dele
ae40: 74 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ted rows */.  sq
ae50: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 49 6e 73  lite3_int64 nIns
ae60: 65 72 74 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ert;    /* Numbe
ae70: 72 20 6f 66 20 69 6e 73 65 72 74 65 64 20 72 6f  r of inserted ro
ae80: 77 73 20 2a 2f 0a 0a 20 20 73 74 72 49 6e 69 74  ws */..  strInit
ae90: 28 26 73 71 6c 29 3b 0a 20 20 69 66 28 20 73 71  (&sql);.  if( sq
aea0: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
aeb0: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 67 2e 64 62  mn_metadata(g.db
aec0: 2c 22 61 75 78 22 2c 7a 54 61 62 2c 30 2c 30 2c  ,"aux",zTab,0,0,
aed0: 30 2c 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  0,0,0,0) ){.    
aee0: 69 66 28 20 21 73 71 6c 69 74 65 33 5f 74 61 62  if( !sqlite3_tab
aef0: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
af00: 74 61 28 67 2e 64 62 2c 22 6d 61 69 6e 22 2c 7a  ta(g.db,"main",z
af10: 54 61 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29  Tab,0,0,0,0,0,0)
af20: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 61 62   ){.      /* Tab
af30: 6c 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  le missing from 
af40: 73 65 63 6f 6e 64 20 64 61 74 61 62 61 73 65 2e  second database.
af50: 20 2a 2f 0a 20 20 20 20 20 20 66 70 72 69 6e 74   */.      fprint
af60: 66 28 6f 75 74 2c 20 22 25 73 3a 20 6d 69 73 73  f(out, "%s: miss
af70: 69 6e 67 20 66 72 6f 6d 20 73 65 63 6f 6e 64 20  ing from second 
af80: 64 61 74 61 62 61 73 65 5c 6e 22 2c 20 7a 54 61  database\n", zTa
af90: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  b);.    }.    go
afa0: 74 6f 20 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65  to end_summarize
afb0: 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  _one_table;.  }.
afc0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
afd0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
afe0: 64 61 74 61 28 67 2e 64 62 2c 22 6d 61 69 6e 22  data(g.db,"main"
aff0: 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c  ,zTab,0,0,0,0,0,
b000: 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 62  0) ){.    /* Tab
b010: 6c 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  le missing from 
b020: 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 66 70  source */.    fp
b030: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3a 20  rintf(out, "%s: 
b040: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 66 69 72  missing from fir
b050: 73 74 20 64 61 74 61 62 61 73 65 5c 6e 22 2c 20  st database\n", 
b060: 7a 54 61 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20  zTab);.    goto 
b070: 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e  end_summarize_on
b080: 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  e_table;.  }..  
b090: 61 7a 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73  az = columnNames
b0a0: 28 22 6d 61 69 6e 22 2c 20 7a 54 61 62 2c 20 26  ("main", zTab, &
b0b0: 6e 50 6b 2c 20 30 29 3b 0a 20 20 61 7a 32 20 3d  nPk, 0);.  az2 =
b0c0: 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22 61 75   columnNames("au
b0d0: 78 22 2c 20 7a 54 61 62 2c 20 26 6e 50 6b 32 2c  x", zTab, &nPk2,
b0e0: 20 30 29 3b 0a 20 20 69 66 28 20 61 7a 20 26 26   0);.  if( az &&
b0f0: 20 61 7a 32 20 29 7b 0a 20 20 20 20 66 6f 72 28   az2 ){.    for(
b100: 6e 3d 30 3b 20 61 7a 5b 6e 5d 3b 20 6e 2b 2b 29  n=0; az[n]; n++)
b110: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
b120: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 5b 6e  te3_stricmp(az[n
b130: 5d 2c 61 7a 32 5b 6e 5d 29 21 3d 30 20 29 20 62  ],az2[n])!=0 ) b
b140: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
b150: 20 20 69 66 28 20 61 7a 3d 3d 30 0a 20 20 20 7c    if( az==0.   |
b160: 7c 20 61 7a 32 3d 3d 30 0a 20 20 20 7c 7c 20 6e  | az2==0.   || n
b170: 50 6b 21 3d 6e 50 6b 32 0a 20 20 20 7c 7c 20 61  Pk!=nPk2.   || a
b180: 7a 5b 6e 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  z[n].  ){.    /*
b190: 20 53 63 68 65 6d 61 20 6d 69 73 6d 61 74 63 68   Schema mismatch
b1a0: 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
b1b0: 6f 75 74 2c 20 22 25 73 3a 20 69 6e 63 6f 6d 70  out, "%s: incomp
b1c0: 61 74 69 62 6c 65 20 73 63 68 65 6d 61 5c 6e 22  atible schema\n"
b1d0: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 67 6f 74  , zTab);.    got
b1e0: 6f 20 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f  o end_summarize_
b1f0: 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  one_table;.  }..
b200: 20 20 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63    /* Build the c
b210: 6f 6d 70 61 72 69 73 6f 6e 20 71 75 65 72 79 20  omparison query 
b220: 2a 2f 0a 20 20 66 6f 72 28 6e 32 3d 6e 3b 20 61  */.  for(n2=n; a
b230: 7a 5b 6e 32 5d 3b 20 6e 32 2b 2b 29 7b 7d 0a 20  z[n2]; n2++){}. 
b240: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
b250: 20 22 53 45 4c 45 43 54 20 31 2c 20 63 6f 75 6e   "SELECT 1, coun
b260: 74 28 2a 29 22 29 3b 0a 20 20 69 66 28 20 6e 32  t(*)");.  if( n2
b270: 3d 3d 6e 50 6b 32 20 29 7b 0a 20 20 20 20 73 74  ==nPk2 ){.    st
b280: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c  rPrintf(&sql, ",
b290: 20 30 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b   0\n");.  }else{
b2a0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 73  .    zSep = ", s
b2b0: 75 6d 28 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  um(";.    for(i=
b2c0: 6e 50 6b 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29  nPk; az[i]; i++)
b2d0: 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74  {.      strPrint
b2e0: 66 28 26 73 71 6c 2c 20 22 25 73 41 2e 25 73 20  f(&sql, "%sA.%s 
b2f0: 49 53 20 4e 4f 54 20 42 2e 25 73 22 2c 20 7a 53  IS NOT B.%s", zS
b300: 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d  ep, az[i], az[i]
b310: 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  );.      zSep = 
b320: 22 20 4f 52 20 22 3b 0a 20 20 20 20 7d 0a 20 20  " OR ";.    }.  
b330: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
b340: 2c 20 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  , ")\n");.  }.  
b350: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
b360: 22 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20  "  FROM main.%s 
b370: 41 2c 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20  A, aux.%s B\n", 
b380: 7a 49 64 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65  zId, zId);.  zSe
b390: 70 20 3d 20 22 20 57 48 45 52 45 22 3b 0a 20 20  p = " WHERE";.  
b3a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20  for(i=0; i<nPk; 
b3b0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69  i++){.    strPri
b3c0: 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 20 41 2e  ntf(&sql, "%s A.
b3d0: 25 73 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20  %s=B.%s", zSep, 
b3e0: 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20  az[i], az[i]);. 
b3f0: 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 22     zSep = " AND"
b400: 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74  ;.  }.  strPrint
b410: 66 28 26 73 71 6c 2c 20 22 20 55 4e 49 4f 4e 20  f(&sql, " UNION 
b420: 41 4c 4c 5c 6e 22 29 3b 0a 20 20 73 74 72 50 72  ALL\n");.  strPr
b430: 69 6e 74 66 28 26 73 71 6c 2c 20 22 53 45 4c 45  intf(&sql, "SELE
b440: 43 54 20 32 2c 20 63 6f 75 6e 74 28 2a 29 2c 20  CT 2, count(*), 
b450: 30 5c 6e 22 29 3b 0a 20 20 73 74 72 50 72 69 6e  0\n");.  strPrin
b460: 74 66 28 26 73 71 6c 2c 20 22 20 20 46 52 4f 4d  tf(&sql, "  FROM
b470: 20 6d 61 69 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a   main.%s A\n", z
b480: 49 64 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66  Id);.  strPrintf
b490: 28 26 73 71 6c 2c 20 22 20 57 48 45 52 45 20 4e  (&sql, " WHERE N
b4a0: 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 54  OT EXISTS(SELECT
b4b0: 20 31 20 46 52 4f 4d 20 61 75 78 2e 25 73 20 42   1 FROM aux.%s B
b4c0: 20 22 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70   ", zId);.  zSep
b4d0: 20 3d 20 22 57 48 45 52 45 22 3b 0a 20 20 66 6f   = "WHERE";.  fo
b4e0: 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  r(i=0; i<nPk; i+
b4f0: 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74  +){.    strPrint
b500: 66 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73  f(&sql, "%s A.%s
b510: 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a  =B.%s", zSep, az
b520: 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20  [i], az[i]);.   
b530: 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a   zSep = " AND";.
b540: 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28    }.  strPrintf(
b550: 26 73 71 6c 2c 20 22 29 5c 6e 22 29 3b 0a 20 20  &sql, ")\n");.  
b560: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
b570: 22 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b  " UNION ALL\n");
b580: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
b590: 6c 2c 20 22 53 45 4c 45 43 54 20 33 2c 20 63 6f  l, "SELECT 3, co
b5a0: 75 6e 74 28 2a 29 2c 20 30 5c 6e 22 29 3b 0a 20  unt(*), 0\n");. 
b5b0: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
b5c0: 20 22 20 20 46 52 4f 4d 20 61 75 78 2e 25 73 20   "  FROM aux.%s 
b5d0: 42 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 73 74  B\n", zId);.  st
b5e0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20  rPrintf(&sql, " 
b5f0: 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53  WHERE NOT EXISTS
b600: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d  (SELECT 1 FROM m
b610: 61 69 6e 2e 25 73 20 41 20 22 2c 20 7a 49 64 29  ain.%s A ", zId)
b620: 3b 0a 20 20 7a 53 65 70 20 3d 20 22 57 48 45 52  ;.  zSep = "WHER
b630: 45 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  E";.  for(i=0; i
b640: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
b650: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
b660: 22 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20  "%s A.%s=B.%s", 
b670: 7a 53 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b  zSep, az[i], az[
b680: 69 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  i]);.    zSep = 
b690: 22 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74  " AND";.  }.  st
b6a0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 29  rPrintf(&sql, ")
b6b0: 5c 6e 20 4f 52 44 45 52 20 42 59 20 31 3b 5c 6e  \n ORDER BY 1;\n
b6c0: 22 29 3b 0a 0a 20 20 69 66 28 20 28 67 2e 66 44  ");..  if( (g.fD
b6d0: 65 62 75 67 20 26 20 44 45 42 55 47 5f 44 49 46  ebug & DEBUG_DIF
b6e0: 46 5f 53 51 4c 29 21 3d 30 20 29 7b 20 0a 20 20  F_SQL)!=0 ){ .  
b6f0: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 20 66 6f    printf("SQL fo
b700: 72 20 25 73 3a 5c 6e 25 73 5c 6e 22 2c 20 7a 49  r %s:\n%s\n", zI
b710: 64 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20 20 20 67  d, sql.z);.    g
b720: 6f 74 6f 20 65 6e 64 5f 73 75 6d 6d 61 72 69 7a  oto end_summariz
b730: 65 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d  e_one_table;.  }
b740: 0a 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 71  ..  /* Run the q
b750: 75 65 72 79 20 61 6e 64 20 6f 75 74 70 75 74 20  uery and output 
b760: 64 69 66 66 65 72 65 6e 63 65 20 73 75 6d 6d 61  difference summa
b770: 72 79 20 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20  ry */.  pStmt = 
b780: 64 62 5f 70 72 65 70 61 72 65 28 22 25 73 22 2c  db_prepare("%s",
b790: 20 73 71 6c 2e 7a 29 3b 0a 20 20 6e 55 70 64 61   sql.z);.  nUpda
b7a0: 74 65 20 3d 20 30 3b 0a 20 20 6e 49 6e 73 65 72  te = 0;.  nInser
b7b0: 74 20 3d 20 30 3b 0a 20 20 6e 44 65 6c 65 74 65  t = 0;.  nDelete
b7c0: 20 3d 20 30 3b 0a 20 20 6e 55 6e 63 68 61 6e 67   = 0;.  nUnchang
b7d0: 65 64 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ed = 0;.  while(
b7e0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
b7f0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
b800: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
b810: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
b820: 6e 74 28 70 53 74 6d 74 2c 30 29 20 29 7b 0a 20  nt(pStmt,0) ){. 
b830: 20 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20       case 1:.   
b840: 20 20 20 20 20 6e 55 70 64 61 74 65 20 3d 20 73       nUpdate = s
b850: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
b860: 74 36 34 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20  t64(pStmt,2);.  
b870: 20 20 20 20 20 20 6e 55 6e 63 68 61 6e 67 65 64        nUnchanged
b880: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
b890: 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 31 29  n_int64(pStmt,1)
b8a0: 20 2d 20 6e 55 70 64 61 74 65 3b 0a 20 20 20 20   - nUpdate;.    
b8b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b8c0: 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 20   case 2:.       
b8d0: 20 6e 44 65 6c 65 74 65 20 3d 20 73 71 6c 69 74   nDelete = sqlit
b8e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
b8f0: 70 53 74 6d 74 2c 31 29 3b 0a 20 20 20 20 20 20  pStmt,1);.      
b900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b910: 61 73 65 20 33 3a 0a 20 20 20 20 20 20 20 20 6e  ase 3:.        n
b920: 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Insert = sqlite3
b930: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
b940: 74 6d 74 2c 31 29 3b 0a 20 20 20 20 20 20 20 20  tmt,1);.        
b950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
b960: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
b970: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 66 70  ize(pStmt);.  fp
b980: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3a 20  rintf(out, "%s: 
b990: 25 6c 6c 64 20 63 68 61 6e 67 65 73 2c 20 25 6c  %lld changes, %l
b9a0: 6c 64 20 69 6e 73 65 72 74 73 2c 20 25 6c 6c 64  ld inserts, %lld
b9b0: 20 64 65 6c 65 74 65 73 2c 20 25 6c 6c 64 20 75   deletes, %lld u
b9c0: 6e 63 68 61 6e 67 65 64 5c 6e 22 2c 0a 20 20 20  nchanged\n",.   
b9d0: 20 20 20 20 20 20 20 7a 54 61 62 2c 20 6e 55 70         zTab, nUp
b9e0: 64 61 74 65 2c 20 6e 49 6e 73 65 72 74 2c 20 6e  date, nInsert, n
b9f0: 44 65 6c 65 74 65 2c 20 6e 55 6e 63 68 61 6e 67  Delete, nUnchang
ba00: 65 64 29 3b 0a 0a 65 6e 64 5f 73 75 6d 6d 61 72  ed);..end_summar
ba10: 69 7a 65 5f 6f 6e 65 5f 74 61 62 6c 65 3a 0a 20  ize_one_table:. 
ba20: 20 73 74 72 46 72 65 65 28 26 73 71 6c 29 3b 0a   strFree(&sql);.
ba30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ba40: 49 64 29 3b 0a 20 20 6e 61 6d 65 6c 69 73 74 46  Id);.  namelistF
ba50: 72 65 65 28 61 7a 29 3b 0a 20 20 6e 61 6d 65 6c  ree(az);.  namel
ba60: 69 73 74 46 72 65 65 28 61 7a 32 29 3b 0a 20 20  istFree(az2);.  
ba70: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
ba80: 20 57 72 69 74 65 20 61 20 36 34 2d 62 69 74 20   Write a 64-bit 
ba90: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
baa0: 73 20 61 20 76 61 72 69 6e 74 20 6f 6e 74 6f 20  s a varint onto 
bab0: 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  out.*/.static vo
bac0: 69 64 20 70 75 74 73 56 61 72 69 6e 74 28 46 49  id putsVarint(FI
bad0: 4c 45 20 2a 6f 75 74 2c 20 73 71 6c 69 74 65 33  LE *out, sqlite3
bae0: 5f 75 69 6e 74 36 34 20 76 29 7b 0a 20 20 69 6e  _uint64 v){.  in
baf0: 74 20 69 2c 20 6e 3b 0a 20 20 75 6e 73 69 67 6e  t i, n;.  unsign
bb00: 65 64 20 63 68 61 72 20 70 5b 31 32 5d 3b 0a 20  ed char p[12];. 
bb10: 20 69 66 28 20 76 20 26 20 28 28 28 73 71 6c 69   if( v & (((sqli
bb20: 74 65 33 5f 75 69 6e 74 36 34 29 30 78 66 66 30  te3_uint64)0xff0
bb30: 30 30 30 30 30 29 3c 3c 33 32 29 20 29 7b 0a 20  00000)<<32) ){. 
bb40: 20 20 20 70 5b 38 5d 20 3d 20 28 75 6e 73 69 67     p[8] = (unsig
bb50: 6e 65 64 20 63 68 61 72 29 76 3b 0a 20 20 20 20  ned char)v;.    
bb60: 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 66 6f 72  v >>= 8;.    for
bb70: 28 69 3d 37 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  (i=7; i>=0; i--)
bb80: 7b 0a 20 20 20 20 20 20 70 5b 69 5d 20 3d 20 28  {.      p[i] = (
bb90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 28  unsigned char)((
bba0: 76 20 26 20 30 78 37 66 29 20 7c 20 30 78 38 30  v & 0x7f) | 0x80
bbb0: 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 37  );.      v >>= 7
bbc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 77 72 69  ;.    }.    fwri
bbd0: 74 65 28 70 2c 20 38 2c 20 31 2c 20 6f 75 74 29  te(p, 8, 1, out)
bbe0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
bbf0: 20 3d 20 39 3b 0a 20 20 20 20 64 6f 7b 0a 20 20   = 9;.    do{.  
bc00: 20 20 20 20 70 5b 6e 2d 2d 5d 20 3d 20 28 75 6e      p[n--] = (un
bc10: 73 69 67 6e 65 64 20 63 68 61 72 29 28 28 76 20  signed char)((v 
bc20: 26 20 30 78 37 66 29 20 7c 20 30 78 38 30 29 3b  & 0x7f) | 0x80);
bc30: 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 37 3b 0a  .      v >>= 7;.
bc40: 20 20 20 20 7d 77 68 69 6c 65 28 20 76 21 3d 30      }while( v!=0
bc50: 20 29 3b 0a 20 20 20 20 70 5b 39 5d 20 26 3d 20   );.    p[9] &= 
bc60: 30 78 37 66 3b 0a 20 20 20 20 66 77 72 69 74 65  0x7f;.    fwrite
bc70: 28 70 2b 6e 2b 31 2c 20 39 2d 6e 2c 20 31 2c 20  (p+n+1, 9-n, 1, 
bc80: 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  out);.  }.}../*.
bc90: 2a 2a 20 57 72 69 74 65 20 61 6e 20 53 51 4c 69  ** Write an SQLi
bca0: 74 65 20 76 61 6c 75 65 20 6f 6e 74 6f 20 6f 75  te value onto ou
bcb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
bcc0: 64 20 70 75 74 56 61 6c 75 65 28 46 49 4c 45 20  d putValue(FILE 
bcd0: 2a 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  *out, sqlite3_va
bce0: 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 6e  lue *pVal){.  in
bcf0: 74 20 69 44 54 79 70 65 20 3d 20 73 71 6c 69 74  t iDType = sqlit
bd00: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
bd10: 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  al);.  sqlite3_i
bd20: 6e 74 36 34 20 69 58 3b 0a 20 20 64 6f 75 62 6c  nt64 iX;.  doubl
bd30: 65 20 72 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e rX;.  sqlite3_
bd40: 75 69 6e 74 36 34 20 75 58 3b 0a 20 20 69 6e 74  uint64 uX;.  int
bd50: 20 6a 3b 0a 0a 20 20 70 75 74 63 28 69 44 54 79   j;..  putc(iDTy
bd60: 70 65 2c 20 6f 75 74 29 3b 0a 20 20 73 77 69 74  pe, out);.  swit
bd70: 63 68 28 20 69 44 54 79 70 65 20 29 7b 0a 20 20  ch( iDType ){.  
bd80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
bd90: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 69 58 20  TEGER:.      iX 
bda0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
bdb0: 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20  int64(pVal);.   
bdc0: 20 20 20 6d 65 6d 63 70 79 28 26 75 58 2c 20 26     memcpy(&uX, &
bdd0: 69 58 2c 20 38 29 3b 0a 20 20 20 20 20 20 66 6f  iX, 8);.      fo
bde0: 72 28 6a 3d 35 36 3b 20 6a 3e 3d 30 3b 20 6a 2d  r(j=56; j>=0; j-
bdf0: 3d 38 29 20 70 75 74 63 28 28 75 58 3e 3e 6a 29  =8) putc((uX>>j)
be00: 26 30 78 66 66 2c 20 6f 75 74 29 3b 0a 20 20 20  &0xff, out);.   
be10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
be20: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
be30: 0a 20 20 20 20 20 20 72 58 20 3d 20 73 71 6c 69  .      rX = sqli
be40: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
be50: 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 6d 65  (pVal);.      me
be60: 6d 63 70 79 28 26 75 58 2c 20 26 72 58 2c 20 38  mcpy(&uX, &rX, 8
be70: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 35  );.      for(j=5
be80: 36 3b 20 6a 3e 3d 30 3b 20 6a 2d 3d 38 29 20 70  6; j>=0; j-=8) p
be90: 75 74 63 28 28 75 58 3e 3e 6a 29 26 30 78 66 66  utc((uX>>j)&0xff
bea0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 62 72  , out);.      br
beb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
bec0: 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20  LITE_TEXT:.     
bed0: 20 69 58 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   iX = sqlite3_va
bee0: 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b  lue_bytes(pVal);
bef0: 0a 20 20 20 20 20 20 70 75 74 73 56 61 72 69 6e  .      putsVarin
bf00: 74 28 6f 75 74 2c 20 28 73 71 6c 69 74 65 33 5f  t(out, (sqlite3_
bf10: 75 69 6e 74 36 34 29 69 58 29 3b 0a 20 20 20 20  uint64)iX);.    
bf20: 20 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33    fwrite(sqlite3
bf30: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
bf40: 29 2c 31 2c 28 73 69 7a 65 5f 74 29 69 58 2c 6f  ),1,(size_t)iX,o
bf50: 75 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ut);.      break
bf60: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
bf70: 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 69 58  E_BLOB:.      iX
bf80: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
bf90: 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20  _bytes(pVal);.  
bfa0: 20 20 20 20 70 75 74 73 56 61 72 69 6e 74 28 6f      putsVarint(o
bfb0: 75 74 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e  ut, (sqlite3_uin
bfc0: 74 36 34 29 69 58 29 3b 0a 20 20 20 20 20 20 66  t64)iX);.      f
bfd0: 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61  write(sqlite3_va
bfe0: 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 2c 31  lue_blob(pVal),1
bff0: 2c 28 73 69 7a 65 5f 74 29 69 58 2c 6f 75 74 29  ,(size_t)iX,out)
c000: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c010: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c020: 55 4c 4c 3a 0a 20 20 20 20 20 20 62 72 65 61 6b  ULL:.      break
c030: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
c040: 65 6e 65 72 61 74 65 20 61 20 43 48 41 4e 47 45  enerate a CHANGE
c050: 53 45 54 20 66 6f 72 20 61 6c 6c 20 64 69 66 66  SET for all diff
c060: 65 72 65 6e 63 65 73 20 66 72 6f 6d 20 6d 61 69  erences from mai
c070: 6e 2e 7a 54 61 62 20 74 6f 20 61 75 78 2e 7a 54  n.zTab to aux.zT
c080: 61 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ab..*/.static vo
c090: 69 64 20 63 68 61 6e 67 65 73 65 74 5f 6f 6e 65  id changeset_one
c0a0: 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61  _table(const cha
c0b0: 72 20 2a 7a 54 61 62 2c 20 46 49 4c 45 20 2a 6f  r *zTab, FILE *o
c0c0: 75 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ut){.  sqlite3_s
c0d0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
c0e0: 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
c0f0: 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ment */.  char *
c100: 7a 49 64 20 3d 20 73 61 66 65 49 64 28 7a 54 61  zId = safeId(zTa
c110: 62 29 3b 20 20 20 20 20 2f 2a 20 45 73 63 61 70  b);     /* Escap
c120: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
c130: 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  able */.  char *
c140: 2a 61 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20  *azCol = 0;     
c150: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
c160: 6f 66 20 65 73 63 61 70 65 64 20 63 6f 6c 75 6d  of escaped colum
c170: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
c180: 20 6e 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20   nCol = 0;      
c190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c1a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
c1b0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 46 6c 67 20  */.  int *aiFlg 
c1c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c1d0: 20 20 20 2f 2a 20 30 20 69 66 20 63 6f 6c 75 6d     /* 0 if colum
c1e0: 6e 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  n is not part of
c1f0: 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69   PK */.  int *ai
c200: 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pk = 0;         
c210: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
c220: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
c230: 68 20 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  h PK column */. 
c240: 20 69 6e 74 20 6e 50 6b 20 3d 20 30 3b 20 20 20   int nPk = 0;   
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c260: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
c270: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
c280: 2a 2f 0a 20 20 53 74 72 20 73 71 6c 3b 20 20 20  */.  Str sql;   
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 2f 2a 20 53 51 4c 20 66 6f 72 20 74 68     /* SQL for th
c2b0: 65 20 64 69 66 66 20 71 75 65 72 79 20 2a 2f 0a  e diff query */.
c2c0: 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20    int i, k;     
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
c2f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
c300: 20 2a 7a 53 65 70 3b 20 20 20 20 20 20 20 20 20   *zSep;         
c310: 20 20 20 20 2f 2a 20 4c 69 73 74 20 73 65 70 61      /* List sepa
c320: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 2f 2a 20 43  rator */..  /* C
c330: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 63  heck that the sc
c340: 68 65 6d 61 73 20 6f 66 20 74 68 65 20 74 77 6f  hemas of the two
c350: 20 74 61 62 6c 65 73 20 6d 61 74 63 68 2e 20 45   tables match. E
c360: 78 69 74 20 65 61 72 6c 79 20 6f 74 68 65 72 77  xit early otherw
c370: 69 73 65 2e 20 2a 2f 0a 20 20 63 68 65 63 6b 53  ise. */.  checkS
c380: 63 68 65 6d 61 73 4d 61 74 63 68 28 7a 54 61 62  chemasMatch(zTab
c390: 29 3b 0a 0a 20 20 70 53 74 6d 74 20 3d 20 64 62  );..  pStmt = db
c3a0: 5f 70 72 65 70 61 72 65 28 22 50 52 41 47 4d 41  _prepare("PRAGMA
c3b0: 20 6d 61 69 6e 2e 74 61 62 6c 65 5f 69 6e 66 6f   main.table_info
c3c0: 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20 77  =%Q", zTab);.  w
c3d0: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
c3e0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
c3f0: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 6e 43 6f  Stmt) ){.    nCo
c400: 6c 2b 2b 3b 0a 20 20 20 20 61 7a 43 6f 6c 20 3d  l++;.    azCol =
c410: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
c420: 28 61 7a 43 6f 6c 2c 20 73 69 7a 65 6f 66 28 63  (azCol, sizeof(c
c430: 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  har*)*nCol);.   
c440: 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
c450: 72 75 6e 74 69 6d 65 45 72 72 6f 72 28 22 6f 75  runtimeError("ou
c460: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
c470: 20 20 20 61 69 46 6c 67 20 3d 20 73 71 6c 69 74     aiFlg = sqlit
c480: 65 33 5f 72 65 61 6c 6c 6f 63 28 61 69 46 6c 67  e3_realloc(aiFlg
c490: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43  , sizeof(int)*nC
c4a0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 61 69 46  ol);.    if( aiF
c4b0: 6c 67 3d 3d 30 20 29 20 72 75 6e 74 69 6d 65 45  lg==0 ) runtimeE
c4c0: 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d  rror("out of mem
c4d0: 6f 72 79 22 29 3b 0a 20 20 20 20 61 7a 43 6f 6c  ory");.    azCol
c4e0: 5b 6e 43 6f 6c 2d 31 5d 20 3d 20 73 61 66 65 49  [nCol-1] = safeI
c4f0: 64 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  d((const char*)s
c500: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
c510: 78 74 28 70 53 74 6d 74 2c 31 29 29 3b 0a 20 20  xt(pStmt,1));.  
c520: 20 20 61 69 46 6c 67 5b 6e 43 6f 6c 2d 31 5d 20    aiFlg[nCol-1] 
c530: 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  = i = sqlite3_co
c540: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 35  lumn_int(pStmt,5
c550: 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  );.    if( i>0 )
c560: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 6e 50  {.      if( i>nP
c570: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6b  k ){.        nPk
c580: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 61 69   = i;.        ai
c590: 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  Pk = sqlite3_rea
c5a0: 6c 6c 6f 63 28 61 69 50 6b 2c 20 73 69 7a 65 6f  lloc(aiPk, sizeo
c5b0: 66 28 69 6e 74 29 2a 6e 50 6b 29 3b 0a 20 20 20  f(int)*nPk);.   
c5c0: 20 20 20 20 20 69 66 28 20 61 69 50 6b 3d 3d 30       if( aiPk==0
c5d0: 20 29 20 72 75 6e 74 69 6d 65 45 72 72 6f 72 28   ) runtimeError(
c5e0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
c5f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c600: 61 69 50 6b 5b 69 2d 31 5d 20 3d 20 6e 43 6f 6c  aiPk[i-1] = nCol
c610: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
c620: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
c630: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e  (pStmt);.  if( n
c640: 50 6b 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  Pk==0 ) goto end
c650: 5f 63 68 61 6e 67 65 73 65 74 5f 6f 6e 65 5f 74  _changeset_one_t
c660: 61 62 6c 65 3b 20 0a 20 20 73 74 72 49 6e 69 74  able; .  strInit
c670: 28 26 73 71 6c 29 3b 0a 20 20 69 66 28 20 6e 43  (&sql);.  if( nC
c680: 6f 6c 3e 6e 50 6b 20 29 7b 0a 20 20 20 20 73 74  ol>nPk ){.    st
c690: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 53  rPrintf(&sql, "S
c6a0: 45 4c 45 43 54 20 25 64 22 2c 20 53 51 4c 49 54  ELECT %d", SQLIT
c6b0: 45 5f 55 50 44 41 54 45 29 3b 0a 20 20 20 20 66  E_UPDATE);.    f
c6c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
c6d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
c6e0: 61 69 46 6c 67 5b 69 5d 20 29 7b 0a 20 20 20 20  aiFlg[i] ){.    
c6f0: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
c700: 71 6c 2c 20 22 2c 5c 6e 20 20 20 20 20 20 20 41  ql, ",\n       A
c710: 2e 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  .%s", azCol[i]);
c720: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c730: 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28        strPrintf(
c740: 26 73 71 6c 2c 20 22 2c 5c 6e 20 20 20 20 20 20  &sql, ",\n      
c750: 20 41 2e 25 73 20 49 53 20 4e 4f 54 20 42 2e 25   A.%s IS NOT B.%
c760: 73 2c 20 41 2e 25 73 2c 20 42 2e 25 73 22 2c 0a  s, A.%s, B.%s",.
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c780: 20 20 61 7a 43 6f 6c 5b 69 5d 2c 20 61 7a 43 6f    azCol[i], azCo
c790: 6c 5b 69 5d 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20  l[i], azCol[i], 
c7a0: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
c7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72   }.    }.    str
c7c0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 22 5c 6e 20  Printf(&sql,"\n 
c7d0: 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 2c   FROM main.%s A,
c7e0: 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49   aux.%s B\n", zI
c7f0: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 7a 53 65  d, zId);.    zSe
c800: 70 20 3d 20 22 20 57 48 45 52 45 22 3b 0a 20 20  p = " WHERE";.  
c810: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
c820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
c830: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
c840: 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53  s A.%s=B.%s", zS
c850: 65 70 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b 5b 69  ep, azCol[aiPk[i
c860: 5d 5d 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b 5b 69  ]], azCol[aiPk[i
c870: 5d 5d 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20  ]]);.      zSep 
c880: 3d 20 22 20 41 4e 44 22 3b 0a 20 20 20 20 7d 0a  = " AND";.    }.
c890: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
c8a0: 20 41 4e 44 20 28 22 3b 0a 20 20 20 20 66 6f 72   AND (";.    for
c8b0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
c8c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 69  +){.      if( ai
c8d0: 46 6c 67 5b 69 5d 20 29 20 63 6f 6e 74 69 6e 75  Flg[i] ) continu
c8e0: 65 3b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e  e;.      strPrin
c8f0: 74 66 28 26 73 71 6c 2c 20 22 25 73 41 2e 25 73  tf(&sql, "%sA.%s
c900: 20 49 53 20 4e 4f 54 20 42 2e 25 73 22 2c 20 7a   IS NOT B.%s", z
c910: 53 65 70 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 61  Sep, azCol[i], a
c920: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
c930: 7a 53 65 70 20 3d 20 22 20 4f 52 5c 6e 20 20 20  zSep = " OR\n   
c940: 20 20 20 20 20 22 3b 0a 20 20 20 20 7d 0a 20 20       ";.    }.  
c950: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
c960: 2c 22 29 5c 6e 20 55 4e 49 4f 4e 20 41 4c 4c 5c  ,")\n UNION ALL\
c970: 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72  n");.  }.  strPr
c980: 69 6e 74 66 28 26 73 71 6c 2c 20 22 53 45 4c 45  intf(&sql, "SELE
c990: 43 54 20 25 64 22 2c 20 53 51 4c 49 54 45 5f 44  CT %d", SQLITE_D
c9a0: 45 4c 45 54 45 29 3b 0a 20 20 66 6f 72 28 69 3d  ELETE);.  for(i=
c9b0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
c9c0: 0a 20 20 20 20 69 66 28 20 61 69 46 6c 67 5b 69  .    if( aiFlg[i
c9d0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72  ] ){.      strPr
c9e0: 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c 5c 6e 20  intf(&sql, ",\n 
c9f0: 20 20 20 20 20 20 41 2e 25 73 22 2c 20 61 7a 43        A.%s", azC
ca00: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  ol[i]);.    }els
ca10: 65 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e  e{.      strPrin
ca20: 74 66 28 26 73 71 6c 2c 20 22 2c 5c 6e 20 20 20  tf(&sql, ",\n   
ca30: 20 20 20 20 31 2c 20 41 2e 25 73 2c 20 4e 55 4c      1, A.%s, NUL
ca40: 4c 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  L", azCol[i]);. 
ca50: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 50 72     }.  }.  strPr
ca60: 69 6e 74 66 28 26 73 71 6c 2c 20 22 5c 6e 20 20  intf(&sql, "\n  
ca70: 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 5c 6e  FROM main.%s A\n
ca80: 22 2c 20 7a 49 64 29 3b 0a 20 20 73 74 72 50 72  ", zId);.  strPr
ca90: 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 57 48 45  intf(&sql, " WHE
caa0: 52 45 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45  RE NOT EXISTS(SE
cab0: 4c 45 43 54 20 31 20 46 52 4f 4d 20 61 75 78 2e  LECT 1 FROM aux.
cac0: 25 73 20 42 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20  %s B\n", zId);. 
cad0: 20 7a 53 65 70 20 3d 20 20 20 20 20 20 20 20 20   zSep =         
cae0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
caf0: 20 20 20 20 20 57 48 45 52 45 22 3b 0a 20 20 66       WHERE";.  f
cb00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  or(i=0; i<nPk; i
cb10: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e  ++){.    strPrin
cb20: 74 66 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25  tf(&sql, "%s A.%
cb30: 73 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61  s=B.%s", zSep, a
cb40: 7a 43 6f 6c 5b 61 69 50 6b 5b 69 5d 5d 2c 20 61  zCol[aiPk[i]], a
cb50: 7a 43 6f 6c 5b 61 69 50 6b 5b 69 5d 5d 29 3b 0a  zCol[aiPk[i]]);.
cb60: 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44      zSep = " AND
cb70: 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e  ";.  }.  strPrin
cb80: 74 66 28 26 73 71 6c 2c 20 22 29 5c 6e 20 55 4e  tf(&sql, ")\n UN
cb90: 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b 0a 20 20 73  ION ALL\n");.  s
cba0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
cbb0: 53 45 4c 45 43 54 20 25 64 22 2c 20 53 51 4c 49  SELECT %d", SQLI
cbc0: 54 45 5f 49 4e 53 45 52 54 29 3b 0a 20 20 66 6f  TE_INSERT);.  fo
cbd0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
cbe0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 69 46  ++){.    if( aiF
cbf0: 6c 67 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73  lg[i] ){.      s
cc00: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
cc10: 2c 5c 6e 20 20 20 20 20 20 20 42 2e 25 73 22 2c  ,\n       B.%s",
cc20: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
cc30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72  }else{.      str
cc40: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c 5c  Printf(&sql, ",\
cc50: 6e 20 20 20 20 20 20 20 31 2c 20 4e 55 4c 4c 2c  n       1, NULL,
cc60: 20 42 2e 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d   B.%s", azCol[i]
cc70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
cc80: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
cc90: 5c 6e 20 20 46 52 4f 4d 20 61 75 78 2e 25 73 20  \n  FROM aux.%s 
cca0: 42 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 73 74  B\n", zId);.  st
ccb0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20  rPrintf(&sql, " 
ccc0: 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53  WHERE NOT EXISTS
ccd0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d  (SELECT 1 FROM m
cce0: 61 69 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a 49 64  ain.%s A\n", zId
ccf0: 29 3b 0a 20 20 7a 53 65 70 20 3d 20 20 20 20 20  );.  zSep =     
cd00: 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20       "          
cd10: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 22 3b           WHERE";
cd20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
cd30: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  k; i++){.    str
cd40: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73  Printf(&sql, "%s
cd50: 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53 65   A.%s=B.%s", zSe
cd60: 70 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b 5b 69 5d  p, azCol[aiPk[i]
cd70: 5d 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b 5b 69 5d  ], azCol[aiPk[i]
cd80: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ]);.    zSep = "
cd90: 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74 72   AND";.  }.  str
cda0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 29 5c  Printf(&sql, ")\
cdb0: 6e 22 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66  n");.  strPrintf
cdc0: 28 26 73 71 6c 2c 20 22 20 4f 52 44 45 52 20 42  (&sql, " ORDER B
cdd0: 59 22 29 3b 0a 20 20 7a 53 65 70 20 3d 20 22 20  Y");.  zSep = " 
cde0: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ";.  for(i=0; i<
cdf0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nPk; i++){.    s
ce00: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
ce10: 25 73 20 25 64 22 2c 20 7a 53 65 70 2c 20 61 69  %s %d", zSep, ai
ce20: 50 6b 5b 69 5d 2b 32 29 3b 0a 20 20 20 20 7a 53  Pk[i]+2);.    zS
ce30: 65 70 20 3d 20 22 2c 22 3b 0a 20 20 7d 0a 20 20  ep = ",";.  }.  
ce40: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
ce50: 22 3b 5c 6e 22 29 3b 0a 0a 20 20 69 66 28 20 67  ";\n");..  if( g
ce60: 2e 66 44 65 62 75 67 20 26 20 44 45 42 55 47 5f  .fDebug & DEBUG_
ce70: 44 49 46 46 5f 53 51 4c 20 29 7b 20 0a 20 20 20  DIFF_SQL ){ .   
ce80: 20 70 72 69 6e 74 66 28 22 53 51 4c 20 66 6f 72   printf("SQL for
ce90: 20 25 73 3a 5c 6e 25 73 5c 6e 22 2c 20 7a 49 64   %s:\n%s\n", zId
cea0: 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20 20 20 67 6f  , sql.z);.    go
ceb0: 74 6f 20 65 6e 64 5f 63 68 61 6e 67 65 73 65 74  to end_changeset
cec0: 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  _one_table;.  }.
ced0: 0a 20 20 70 75 74 63 28 27 54 27 2c 20 6f 75 74  .  putc('T', out
cee0: 29 3b 0a 20 20 70 75 74 73 56 61 72 69 6e 74 28  );.  putsVarint(
cef0: 6f 75 74 2c 20 28 73 71 6c 69 74 65 33 5f 75 69  out, (sqlite3_ui
cf00: 6e 74 36 34 29 6e 43 6f 6c 29 3b 0a 20 20 66 6f  nt64)nCol);.  fo
cf10: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
cf20: 2b 2b 29 20 70 75 74 63 28 61 69 46 6c 67 5b 69  ++) putc(aiFlg[i
cf30: 5d 21 3d 30 2c 20 6f 75 74 29 3b 0a 20 20 66 77  ]!=0, out);.  fw
cf40: 72 69 74 65 28 7a 54 61 62 2c 20 31 2c 20 73 74  rite(zTab, 1, st
cf50: 72 6c 65 6e 28 7a 54 61 62 29 2c 20 6f 75 74 29  rlen(zTab), out)
cf60: 3b 0a 20 20 70 75 74 63 28 30 2c 20 6f 75 74 29  ;.  putc(0, out)
cf70: 3b 0a 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f  ;..  pStmt = db_
cf80: 70 72 65 70 61 72 65 28 22 25 73 22 2c 20 73 71  prepare("%s", sq
cf90: 6c 2e 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 53  l.z);.  while( S
cfa0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
cfb0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
cfc0: 7b 0a 20 20 20 20 69 6e 74 20 69 54 79 70 65 20  {.    int iType 
cfd0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
cfe0: 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20  _int(pStmt,0);. 
cff0: 20 20 20 70 75 74 63 28 69 54 79 70 65 2c 20 6f     putc(iType, o
d000: 75 74 29 3b 0a 20 20 20 20 70 75 74 63 28 30 2c  ut);.    putc(0,
d010: 20 6f 75 74 29 3b 0a 20 20 20 20 73 77 69 74 63   out);.    switc
d020: 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
d030: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 20 29  n_int(pStmt,0) )
d040: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  {.      case SQL
d050: 49 54 45 5f 55 50 44 41 54 45 3a 20 7b 0a 20 20  ITE_UPDATE: {.  
d060: 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 2c 20 69        for(k=1, i
d070: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
d080: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
d090: 61 69 46 6c 67 5b 69 5d 20 29 7b 0a 20 20 20 20  aiFlg[i] ){.    
d0a0: 20 20 20 20 20 20 20 20 70 75 74 56 61 6c 75 65          putValue
d0b0: 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f  (out, sqlite3_co
d0c0: 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74  lumn_value(pStmt
d0d0: 2c 6b 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,k));.          
d0e0: 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    k++;.         
d0f0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
d100: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
d110: 74 6d 74 2c 6b 29 20 29 7b 0a 20 20 20 20 20 20  tmt,k) ){.      
d120: 20 20 20 20 20 20 70 75 74 56 61 6c 75 65 28 6f        putValue(o
d130: 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ut, sqlite3_colu
d140: 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 6b  mn_value(pStmt,k
d150: 2b 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1));.          
d160: 20 20 6b 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20    k += 3;.      
d170: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d180: 20 20 20 20 20 20 20 70 75 74 63 28 30 2c 20 6f         putc(0, o
d190: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
d1a0: 20 6b 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20   k += 3;.       
d1b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
d1c0: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 2c 20         for(k=1, 
d1d0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
d1e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
d1f0: 20 61 69 46 6c 67 5b 69 5d 20 29 7b 0a 20 20 20   aiFlg[i] ){.   
d200: 20 20 20 20 20 20 20 20 20 70 75 74 63 28 30 2c           putc(0,
d210: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20   out);.         
d220: 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20     k++;.        
d230: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
d240: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
d250: 53 74 6d 74 2c 6b 29 20 29 7b 0a 20 20 20 20 20  Stmt,k) ){.     
d260: 20 20 20 20 20 20 20 70 75 74 56 61 6c 75 65 28         putValue(
d270: 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  out, sqlite3_col
d280: 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c  umn_value(pStmt,
d290: 6b 2b 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20  k+2));.         
d2a0: 20 20 20 6b 20 2b 3d 20 33 3b 0a 20 20 20 20 20     k += 3;.     
d2b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d2c0: 20 20 20 20 20 20 20 20 70 75 74 63 28 30 2c 20          putc(0, 
d2d0: 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
d2e0: 20 20 6b 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20    k += 3;.      
d2f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d300: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
d320: 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 3a  e SQLITE_INSERT:
d330: 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b   {.        for(k
d340: 3d 31 2c 20 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  =1, i=0; i<nCol;
d350: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
d360: 20 69 66 28 20 61 69 46 6c 67 5b 69 5d 20 29 7b   if( aiFlg[i] ){
d370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
d380: 56 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69 74  Value(out, sqlit
d390: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
d3a0: 70 53 74 6d 74 2c 6b 29 29 3b 0a 20 20 20 20 20  pStmt,k));.     
d3b0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
d3c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d3d0: 20 20 20 20 20 20 20 20 20 70 75 74 56 61 6c 75           putValu
d3e0: 65 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63  e(out, sqlite3_c
d3f0: 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d  olumn_value(pStm
d400: 74 2c 6b 2b 32 29 29 3b 0a 20 20 20 20 20 20 20  t,k+2));.       
d410: 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a 20 20 20       k += 3;.   
d420: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d430: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
d440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d450: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45  case SQLITE_DELE
d460: 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 6f  TE: {.        fo
d470: 72 28 6b 3d 31 2c 20 69 3d 30 3b 20 69 3c 6e 43  r(k=1, i=0; i<nC
d480: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
d490: 20 20 20 20 69 66 28 20 61 69 46 6c 67 5b 69 5d      if( aiFlg[i]
d4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d4b0: 70 75 74 56 61 6c 75 65 28 6f 75 74 2c 20 73 71  putValue(out, sq
d4c0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
d4d0: 75 65 28 70 53 74 6d 74 2c 6b 29 29 3b 0a 20 20  ue(pStmt,k));.  
d4e0: 20 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20            k++;. 
d4f0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
d500: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 56              putV
d510: 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69 74 65  alue(out, sqlite
d520: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
d530: 53 74 6d 74 2c 6b 2b 31 29 29 3b 0a 20 20 20 20  Stmt,k+1));.    
d540: 20 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a          k += 3;.
d550: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d560: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
d570: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d580: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
d590: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
d5a0: 3b 0a 20 20 0a 65 6e 64 5f 63 68 61 6e 67 65 73  ;.  .end_changes
d5b0: 65 74 5f 6f 6e 65 5f 74 61 62 6c 65 3a 0a 20 20  et_one_table:.  
d5c0: 77 68 69 6c 65 28 20 6e 43 6f 6c 3e 30 20 29 20  while( nCol>0 ) 
d5d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
d5e0: 6f 6c 5b 2d 2d 6e 43 6f 6c 5d 29 3b 0a 20 20 73  ol[--nCol]);.  s
d5f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
d600: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
d610: 65 65 28 61 69 50 6b 29 3b 0a 20 20 73 71 6c 69  ee(aiPk);.  sqli
d620: 74 65 33 5f 66 72 65 65 28 7a 49 64 29 3b 0a 7d  te3_free(zId);.}
d630: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
d640: 74 68 65 20 6e 65 78 74 20 53 51 4c 20 6b 65 79  the next SQL key
d650: 77 6f 72 64 20 6f 72 20 71 75 6f 74 65 64 20 73  word or quoted s
d660: 74 72 69 6e 67 20 66 72 6f 6d 20 62 75 66 66 65  tring from buffe
d670: 72 20 7a 49 6e 20 61 6e 64 20 63 6f 70 79 20 69  r zIn and copy i
d680: 74 0a 2a 2a 20 28 6f 72 20 61 20 70 72 65 66 69  t.** (or a prefi
d690: 78 20 6f 66 20 69 74 20 69 66 20 69 74 20 77 69  x of it if it wi
d6a0: 6c 6c 20 6e 6f 74 20 66 69 74 29 20 69 6e 74 6f  ll not fit) into
d6b0: 20 62 75 66 66 65 72 20 7a 42 75 66 2c 20 73 69   buffer zBuf, si
d6c0: 7a 65 20 6e 42 75 66 20 62 79 74 65 73 2e 0a 2a  ze nBuf bytes..*
d6d0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
d6e0: 65 72 20 74 6f 20 74 68 65 20 63 68 61 72 61 63  er to the charac
d6f0: 74 65 72 20 77 69 74 68 69 6e 20 7a 49 6e 20 69  ter within zIn i
d700: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
d710: 77 69 6e 67 20 0a 2a 2a 20 74 68 65 20 74 6f 6b  wing .** the tok
d720: 65 6e 20 6f 72 20 71 75 6f 74 65 64 20 73 74 72  en or quoted str
d730: 69 6e 67 20 6a 75 73 74 20 65 78 74 72 61 63 74  ing just extract
d740: 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ed..*/.const cha
d750: 72 20 2a 67 6f 62 62 6c 65 5f 74 6f 6b 65 6e 28  r *gobble_token(
d760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
d770: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
d780: 20 6e 42 75 66 29 7b 0a 20 20 63 6f 6e 73 74 20   nBuf){.  const 
d790: 63 68 61 72 20 2a 70 20 3d 20 7a 49 6e 3b 0a 20  char *p = zIn;. 
d7a0: 20 63 68 61 72 20 2a 70 4f 75 74 20 3d 20 7a 42   char *pOut = zB
d7b0: 75 66 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64  uf;.  char *pEnd
d7c0: 20 3d 20 26 70 4f 75 74 5b 6e 42 75 66 2d 31 5d   = &pOut[nBuf-1]
d7d0: 3b 0a 20 20 63 68 61 72 20 71 20 3d 20 30 3b 20  ;.  char q = 0; 
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 2f 2a 20 71 75 6f 74 65 20 63 68 61      /* quote cha
d800: 72 61 63 74 65 72 2c 20 69 66 20 61 6e 79 20 2a  racter, if any *
d810: 2f 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  /..  if( p==0 ) 
d820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
d830: 65 28 20 2a 70 3d 3d 27 20 27 20 29 20 70 2b 2b  e( *p==' ' ) p++
d840: 3b 0a 20 20 73 77 69 74 63 68 28 20 2a 70 20 29  ;.  switch( *p )
d850: 7b 0a 20 20 20 20 63 61 73 65 20 27 22 27 3a 20  {.    case '"': 
d860: 71 20 3d 20 27 22 27 3b 20 62 72 65 61 6b 3b 0a  q = '"'; break;.
d870: 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 20 71      case '\'': q
d880: 20 3d 20 27 5c 27 27 3b 20 62 72 65 61 6b 3b 0a   = '\''; break;.
d890: 20 20 20 20 63 61 73 65 20 27 60 27 3a 20 71 20      case '`': q 
d8a0: 3d 20 27 60 27 3b 20 62 72 65 61 6b 3b 0a 20 20  = '`'; break;.  
d8b0: 20 20 63 61 73 65 20 27 5b 27 3a 20 71 20 3d 20    case '[': q = 
d8c0: 27 5d 27 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ']'; break;.  }.
d8d0: 0a 20 20 69 66 28 20 71 20 29 7b 0a 20 20 20 20  .  if( q ){.    
d8e0: 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  p++;.    while( 
d8f0: 2a 70 20 26 26 20 70 4f 75 74 3c 70 45 6e 64 20  *p && pOut<pEnd 
d900: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 3d  ){.      if( *p=
d910: 3d 71 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2b  =q ){.        p+
d920: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  +;.        if( *
d930: 70 21 3d 71 20 29 20 62 72 65 61 6b 3b 0a 20 20  p!=q ) break;.  
d940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d950: 70 4f 75 74 3c 70 45 6e 64 20 29 20 2a 70 4f 75  pOut<pEnd ) *pOu
d960: 74 2b 2b 20 3d 20 2a 70 3b 0a 20 20 20 20 20 20  t++ = *p;.      
d970: 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  p++;.    }.  }el
d980: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  se{.    while( *
d990: 70 20 26 26 20 2a 70 21 3d 27 20 27 20 26 26 20  p && *p!=' ' && 
d9a0: 2a 70 21 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  *p!='(' ){.     
d9b0: 20 69 66 28 20 70 4f 75 74 3c 70 45 6e 64 20 29   if( pOut<pEnd )
d9c0: 20 2a 70 4f 75 74 2b 2b 20 3d 20 2a 70 3b 0a 20   *pOut++ = *p;. 
d9d0: 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 7d 0a       p++;.    }.
d9e0: 20 20 7d 0a 0a 20 20 2a 70 4f 75 74 20 3d 20 27    }..  *pOut = '
d9f0: 5c 30 27 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  \0';.  return p;
da00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
da10: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69  unction is the i
da20: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
da30: 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63   SQL scalar func
da40: 74 69 6f 6e 20 22 6d 6f 64 75 6c 65 5f 6e 61 6d  tion "module_nam
da50: 65 22 3a 0a 2a 2a 0a 2a 2a 20 20 20 6d 6f 64 75  e":.**.**   modu
da60: 6c 65 5f 6e 61 6d 65 28 53 51 4c 29 0a 2a 2a 0a  le_name(SQL).**.
da70: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 61 72 67 75  ** The only argu
da80: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 61  ment should be a
da90: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
daa0: 6f 66 20 74 68 65 20 74 79 70 65 20 74 68 61 74  of the type that
dab0: 20 6d 61 79 20 61 70 70 65 61 72 0a 2a 2a 20 69   may appear.** i
dac0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
dad0: 74 65 72 20 74 61 62 6c 65 2e 20 49 66 20 74 68  ter table. If th
dae0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  e statement is a
daf0: 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
db00: 20 54 41 42 4c 45 22 0a 2a 2a 20 73 74 61 74 65   TABLE".** state
db10: 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 76  ment, then the v
db20: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
db30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
db40: 20 6d 6f 64 75 6c 65 20 74 68 61 74 20 69 74 0a   module that it.
db50: 2a 2a 20 75 73 65 73 2e 20 4f 74 68 65 72 77 69  ** uses. Otherwi
db60: 73 65 2c 20 69 66 20 74 68 65 20 73 74 61 74 65  se, if the state
db70: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 43 56  ment is not a CV
db80: 54 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  T, NULL is retur
db90: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ned..*/.static v
dba0: 6f 69 64 20 6d 6f 64 75 6c 65 5f 6e 61 6d 65 5f  oid module_name_
dbb0: 66 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  func(.  sqlite3_
dbc0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
dbd0: 20 20 69 6e 74 20 6e 56 61 6c 2c 20 73 71 6c 69    int nVal, sqli
dbe0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
dbf0: 6c 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  l.){.  const cha
dc00: 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
dc10: 7a 54 6f 6b 65 6e 5b 33 32 5d 3b 0a 0a 20 20 61  zToken[32];..  a
dc20: 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29  ssert( nVal==1 )
dc30: 3b 0a 20 20 7a 53 71 6c 20 3d 20 28 63 6f 6e 73  ;.  zSql = (cons
dc40: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
dc50: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
dc60: 5b 30 5d 29 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  [0]);..  zSql = 
dc70: 67 6f 62 62 6c 65 5f 74 6f 6b 65 6e 28 7a 53 71  gobble_token(zSq
dc80: 6c 2c 20 7a 54 6f 6b 65 6e 2c 20 73 69 7a 65 6f  l, zToken, sizeo
dc90: 66 28 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 69 66  f(zToken));.  if
dca0: 28 20 7a 53 71 6c 3d 3d 30 20 7c 7c 20 73 71 6c  ( zSql==0 || sql
dcb0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 6f  ite3_stricmp(zTo
dcc0: 6b 65 6e 2c 20 22 63 72 65 61 74 65 22 29 20 29  ken, "create") )
dcd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 53 71 6c 20   return;.  zSql 
dce0: 3d 20 67 6f 62 62 6c 65 5f 74 6f 6b 65 6e 28 7a  = gobble_token(z
dcf0: 53 71 6c 2c 20 7a 54 6f 6b 65 6e 2c 20 73 69 7a  Sql, zToken, siz
dd00: 65 6f 66 28 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20  eof(zToken));.  
dd10: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 7c 7c 20 73  if( zSql==0 || s
dd20: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
dd30: 54 6f 6b 65 6e 2c 20 22 76 69 72 74 75 61 6c 22  Token, "virtual"
dd40: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 53  ) ) return;.  zS
dd50: 71 6c 20 3d 20 67 6f 62 62 6c 65 5f 74 6f 6b 65  ql = gobble_toke
dd60: 6e 28 7a 53 71 6c 2c 20 7a 54 6f 6b 65 6e 2c 20  n(zSql, zToken, 
dd70: 73 69 7a 65 6f 66 28 7a 54 6f 6b 65 6e 29 29 3b  sizeof(zToken));
dd80: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 7c  .  if( zSql==0 |
dd90: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
dda0: 70 28 7a 54 6f 6b 65 6e 2c 20 22 74 61 62 6c 65  p(zToken, "table
ddb0: 22 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  ") ) return;.  z
ddc0: 53 71 6c 20 3d 20 67 6f 62 62 6c 65 5f 74 6f 6b  Sql = gobble_tok
ddd0: 65 6e 28 7a 53 71 6c 2c 20 7a 54 6f 6b 65 6e 2c  en(zSql, zToken,
dde0: 20 73 69 7a 65 6f 66 28 7a 54 6f 6b 65 6e 29 29   sizeof(zToken))
ddf0: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
de00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 53 71 6c  ) return;.  zSql
de10: 20 3d 20 67 6f 62 62 6c 65 5f 74 6f 6b 65 6e 28   = gobble_token(
de20: 7a 53 71 6c 2c 20 7a 54 6f 6b 65 6e 2c 20 73 69  zSql, zToken, si
de30: 7a 65 6f 66 28 7a 54 6f 6b 65 6e 29 29 3b 0a 20  zeof(zToken));. 
de40: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 7c 7c 20   if( zSql==0 || 
de50: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
de60: 7a 54 6f 6b 65 6e 2c 20 22 75 73 69 6e 67 22 29  zToken, "using")
de70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 53 71   ) return;.  zSq
de80: 6c 20 3d 20 67 6f 62 62 6c 65 5f 74 6f 6b 65 6e  l = gobble_token
de90: 28 7a 53 71 6c 2c 20 7a 54 6f 6b 65 6e 2c 20 73  (zSql, zToken, s
dea0: 69 7a 65 6f 66 28 7a 54 6f 6b 65 6e 29 29 3b 0a  izeof(zToken));.
deb0: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73    .  sqlite3_res
dec0: 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a  ult_text(pCtx, z
ded0: 54 6f 6b 65 6e 2c 20 2d 31 2c 20 53 51 4c 49 54  Token, -1, SQLIT
dee0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
def0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
df00: 65 20 74 65 78 74 20 6f 66 20 61 6e 20 53 51 4c  e text of an SQL
df10: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
df20: 69 74 73 65 6c 66 20 72 65 74 75 72 6e 73 20 74  itself returns t
df30: 68 65 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 74 61  he list of.** ta
df40: 62 6c 65 73 20 74 6f 20 70 72 6f 63 65 73 73 20  bles to process 
df50: 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62  within the datab
df60: 61 73 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ase..*/.const ch
df70: 61 72 20 2a 61 6c 6c 5f 74 61 62 6c 65 73 5f 73  ar *all_tables_s
df80: 71 6c 28 29 7b 0a 20 20 69 66 28 20 67 2e 62 48  ql(){.  if( g.bH
df90: 61 6e 64 6c 65 56 74 61 62 20 29 7b 0a 20 20 20  andleVtab ){.   
dfa0: 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 20 20   int rc;.  .    
dfb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
dfc0: 63 28 67 2e 64 62 2c 20 0a 20 20 20 20 20 20 20  c(g.db, .       
dfd0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
dfe0: 42 4c 45 20 74 62 6c 6d 61 70 28 6d 6f 64 75 6c  BLE tblmap(modul
dff0: 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  e COLLATE nocase
e000: 2c 20 70 6f 73 74 66 69 78 29 3b 22 0a 20 20 20  , postfix);".   
e010: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
e020: 4f 20 74 65 6d 70 2e 74 62 6c 6d 61 70 20 56 41  O temp.tblmap VA
e030: 4c 55 45 53 22 0a 20 20 20 20 20 20 20 20 22 28  LUES".        "(
e040: 27 66 74 73 33 27 2c 20 27 5f 63 6f 6e 74 65 6e  'fts3', '_conten
e050: 74 27 29 2c 20 28 27 66 74 73 33 27 2c 20 27 5f  t'), ('fts3', '_
e060: 73 65 67 6d 65 6e 74 73 27 29 2c 20 28 27 66 74  segments'), ('ft
e070: 73 33 27 2c 20 27 5f 73 65 67 64 69 72 27 29 2c  s3', '_segdir'),
e080: 22 0a 20 20 0a 20 20 20 20 20 20 20 20 22 28 27  ".  .        "('
e090: 66 74 73 34 27 2c 20 27 5f 63 6f 6e 74 65 6e 74  fts4', '_content
e0a0: 27 29 2c 20 28 27 66 74 73 34 27 2c 20 27 5f 73  '), ('fts4', '_s
e0b0: 65 67 6d 65 6e 74 73 27 29 2c 20 28 27 66 74 73  egments'), ('fts
e0c0: 34 27 2c 20 27 5f 73 65 67 64 69 72 27 29 2c 22  4', '_segdir'),"
e0d0: 0a 20 20 20 20 20 20 20 20 22 28 27 66 74 73 34  .        "('fts4
e0e0: 27 2c 20 27 5f 64 6f 63 73 69 7a 65 27 29 2c 20  ', '_docsize'), 
e0f0: 28 27 66 74 73 34 27 2c 20 27 5f 73 74 61 74 27  ('fts4', '_stat'
e100: 29 2c 22 0a 20 20 0a 20 20 20 20 20 20 20 20 22  ),".  .        "
e110: 28 27 66 74 73 35 27 2c 20 27 5f 64 61 74 61 27  ('fts5', '_data'
e120: 29 2c 20 28 27 66 74 73 35 27 2c 20 27 5f 69 64  ), ('fts5', '_id
e130: 78 27 29 2c 20 28 27 66 74 73 35 27 2c 20 27 5f  x'), ('fts5', '_
e140: 63 6f 6e 74 65 6e 74 27 29 2c 22 0a 20 20 20 20  content'),".    
e150: 20 20 20 20 22 28 27 66 74 73 35 27 2c 20 27 5f      "('fts5', '_
e160: 64 6f 63 73 69 7a 65 27 29 2c 20 28 27 66 74 73  docsize'), ('fts
e170: 35 27 2c 20 27 5f 63 6f 6e 66 69 67 27 29 2c 22  5', '_config'),"
e180: 0a 20 20 0a 20 20 20 20 20 20 20 20 22 28 27 72  .  .        "('r
e190: 74 72 65 65 27 2c 20 27 5f 6e 6f 64 65 27 29 2c  tree', '_node'),
e1a0: 20 28 27 72 74 72 65 65 27 2c 20 27 5f 72 6f 77   ('rtree', '_row
e1b0: 69 64 27 29 2c 20 28 27 72 74 72 65 65 27 2c 20  id'), ('rtree', 
e1c0: 27 5f 70 61 72 65 6e 74 27 29 3b 22 0a 20 20 20  '_parent');".   
e1d0: 20 20 20 20 20 2c 20 30 2c 20 30 2c 20 30 0a 20       , 0, 0, 0. 
e1e0: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
e1f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e200: 29 3b 0a 20 20 0a 20 20 20 20 72 63 20 3d 20 73  );.  .    rc = s
e210: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e220: 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
e230: 67 2e 64 62 2c 20 22 6d 6f 64 75 6c 65 5f 6e 61  g.db, "module_na
e240: 6d 65 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  me", 1, SQLITE_U
e250: 54 46 38 2c 20 30 2c 20 6d 6f 64 75 6c 65 5f 6e  TF8, 0, module_n
e260: 61 6d 65 5f 66 75 6e 63 2c 20 30 2c 20 30 0a 20  ame_func, 0, 0. 
e270: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
e280: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e290: 29 3b 0a 20 20 0a 20 20 20 20 72 65 74 75 72 6e  );.  .    return
e2a0: 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20   .      "SELECT 
e2b0: 6e 61 6d 65 20 46 52 4f 4d 20 6d 61 69 6e 2e 73  name FROM main.s
e2c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a  qlite_master\n".
e2d0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79        " WHERE ty
e2e0: 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 28  pe='table' AND (
e2f0: 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20 6d  \n".      "    m
e300: 6f 64 75 6c 65 5f 6e 61 6d 65 28 73 71 6c 29 20  odule_name(sql) 
e310: 49 53 20 4e 55 4c 4c 20 4f 52 20 5c 6e 22 0a 20  IS NULL OR \n". 
e320: 20 20 20 20 20 22 20 20 20 20 6d 6f 64 75 6c 65       "    module
e330: 5f 6e 61 6d 65 28 73 71 6c 29 20 49 4e 20 28 53  _name(sql) IN (S
e340: 45 4c 45 43 54 20 6d 6f 64 75 6c 65 20 46 52 4f  ELECT module FRO
e350: 4d 20 74 65 6d 70 2e 74 62 6c 6d 61 70 29 5c 6e  M temp.tblmap)\n
e360: 22 0a 20 20 20 20 20 20 22 20 29 20 41 4e 44 20  ".      " ) AND 
e370: 6e 61 6d 65 20 4e 4f 54 20 49 4e 20 28 5c 6e 22  name NOT IN (\n"
e380: 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  .      "  SELECT
e390: 20 61 2e 6e 61 6d 65 20 7c 7c 20 62 2e 70 6f 73   a.name || b.pos
e3a0: 74 66 69 78 20 5c 6e 22 0a 20 20 20 20 20 20 20  tfix \n".       
e3b0: 20 22 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69   "FROM main.sqli
e3c0: 74 65 5f 6d 61 73 74 65 72 20 41 53 20 61 2c 20  te_master AS a, 
e3d0: 74 65 6d 70 2e 74 62 6c 6d 61 70 20 41 53 20 62  temp.tblmap AS b
e3e0: 20 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 57 48   \n".        "WH
e3f0: 45 52 45 20 6d 6f 64 75 6c 65 5f 6e 61 6d 65 28  ERE module_name(
e400: 61 2e 73 71 6c 29 20 3d 20 62 2e 6d 6f 64 75 6c  a.sql) = b.modul
e410: 65 5c 6e 22 20 0a 20 20 20 20 20 20 22 20 29 5c  e\n" .      " )\
e420: 6e 22 0a 20 20 20 20 20 20 22 55 4e 49 4f 4e 20  n".      "UNION 
e430: 5c 6e 22 0a 20 20 20 20 20 20 22 53 45 4c 45 43  \n".      "SELEC
e440: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 75 78 2e  T name FROM aux.
e450: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22  sqlite_master\n"
e460: 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74  .      " WHERE t
e470: 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  ype='table' AND 
e480: 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20  (\n".      "    
e490: 6d 6f 64 75 6c 65 5f 6e 61 6d 65 28 73 71 6c 29  module_name(sql)
e4a0: 20 49 53 20 4e 55 4c 4c 20 4f 52 20 5c 6e 22 0a   IS NULL OR \n".
e4b0: 20 20 20 20 20 20 22 20 20 20 20 6d 6f 64 75 6c        "    modul
e4c0: 65 5f 6e 61 6d 65 28 73 71 6c 29 20 49 4e 20 28  e_name(sql) IN (
e4d0: 53 45 4c 45 43 54 20 6d 6f 64 75 6c 65 20 46 52  SELECT module FR
e4e0: 4f 4d 20 74 65 6d 70 2e 74 62 6c 6d 61 70 29 5c  OM temp.tblmap)\
e4f0: 6e 22 0a 20 20 20 20 20 20 22 20 29 20 41 4e 44  n".      " ) AND
e500: 20 6e 61 6d 65 20 4e 4f 54 20 49 4e 20 28 5c 6e   name NOT IN (\n
e510: 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43  ".      "  SELEC
e520: 54 20 61 2e 6e 61 6d 65 20 7c 7c 20 62 2e 70 6f  T a.name || b.po
e530: 73 74 66 69 78 20 5c 6e 22 0a 20 20 20 20 20 20  stfix \n".      
e540: 20 20 22 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69    "FROM aux.sqli
e550: 74 65 5f 6d 61 73 74 65 72 20 41 53 20 61 2c 20  te_master AS a, 
e560: 74 65 6d 70 2e 74 62 6c 6d 61 70 20 41 53 20 62  temp.tblmap AS b
e570: 20 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 57 48   \n".        "WH
e580: 45 52 45 20 6d 6f 64 75 6c 65 5f 6e 61 6d 65 28  ERE module_name(
e590: 61 2e 73 71 6c 29 20 3d 20 62 2e 6d 6f 64 75 6c  a.sql) = b.modul
e5a0: 65 5c 6e 22 20 0a 20 20 20 20 20 20 22 20 29 5c  e\n" .      " )\
e5b0: 6e 22 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52  n".      " ORDER
e5c0: 20 42 59 20 6e 61 6d 65 22 3b 0a 20 20 7d 65 6c   BY name";.  }el
e5d0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 0a 20  se{.    return. 
e5e0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
e5f0: 65 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69  e FROM main.sqli
e600: 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20  te_master\n".   
e610: 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d     " WHERE type=
e620: 27 74 61 62 6c 65 27 20 41 4e 44 20 73 71 6c 20  'table' AND sql 
e630: 4e 4f 54 20 4c 49 4b 45 20 27 43 52 45 41 54 45  NOT LIKE 'CREATE
e640: 20 56 49 52 54 55 41 4c 25 25 27 5c 6e 22 0a 20   VIRTUAL%%'\n". 
e650: 20 20 20 20 20 22 20 55 4e 49 4f 4e 5c 6e 22 0a       " UNION\n".
e660: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
e670: 6d 65 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69  me FROM aux.sqli
e680: 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20  te_master\n".   
e690: 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d     " WHERE type=
e6a0: 27 74 61 62 6c 65 27 20 41 4e 44 20 73 71 6c 20  'table' AND sql 
e6b0: 4e 4f 54 20 4c 49 4b 45 20 27 43 52 45 41 54 45  NOT LIKE 'CREATE
e6c0: 20 56 49 52 54 55 41 4c 25 25 27 5c 6e 22 0a 20   VIRTUAL%%'\n". 
e6d0: 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20       " ORDER BY 
e6e0: 6e 61 6d 65 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  name";.  }.}../*
e6f0: 0a 2a 2a 20 50 72 69 6e 74 20 73 6b 65 74 63 68  .** Print sketch
e700: 79 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  y documentation 
e710: 66 6f 72 20 74 68 69 73 20 75 74 69 6c 69 74 79  for this utility
e720: 20 70 72 6f 67 72 61 6d 0a 2a 2f 0a 73 74 61 74   program.*/.stat
e730: 69 63 20 76 6f 69 64 20 73 68 6f 77 48 65 6c 70  ic void showHelp
e740: 28 76 6f 69 64 29 7b 0a 20 20 70 72 69 6e 74 66  (void){.  printf
e750: 28 22 55 73 61 67 65 3a 20 25 73 20 5b 6f 70 74  ("Usage: %s [opt
e760: 69 6f 6e 73 5d 20 44 42 31 20 44 42 32 5c 6e 22  ions] DB1 DB2\n"
e770: 2c 20 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 70  , g.zArgv0);.  p
e780: 72 69 6e 74 66 28 0a 22 4f 75 74 70 75 74 20 53  rintf(."Output S
e790: 51 4c 20 74 65 78 74 20 74 68 61 74 20 77 6f 75  QL text that wou
e7a0: 6c 64 20 74 72 61 6e 73 66 6f 72 6d 20 44 42 31  ld transform DB1
e7b0: 20 69 6e 74 6f 20 44 42 32 2e 5c 6e 22 0a 22 4f   into DB2.\n"."O
e7c0: 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d 2d  ptions:\n"."  --
e7d0: 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20  changeset FILE  
e7e0: 20 20 20 20 57 72 69 74 65 20 61 20 43 48 41 4e      Write a CHAN
e7f0: 47 45 53 45 54 20 69 6e 74 6f 20 46 49 4c 45 5c  GESET into FILE\
e800: 6e 22 0a 22 20 20 2d 4c 7c 2d 2d 6c 69 62 20 4c  n"."  -L|--lib L
e810: 49 42 52 41 52 59 20 20 20 20 20 20 4c 6f 61 64  IBRARY      Load
e820: 20 61 6e 20 53 51 4c 69 74 65 20 65 78 74 65 6e   an SQLite exten
e830: 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22 0a  sion library\n".
e840: 22 20 20 2d 2d 70 72 69 6d 61 72 79 6b 65 79 20  "  --primarykey 
e850: 20 20 20 20 20 20 20 20 20 55 73 65 20 73 63 68           Use sch
e860: 65 6d 61 2d 64 65 66 69 6e 65 64 20 50 52 49 4d  ema-defined PRIM
e870: 41 52 59 20 4b 45 59 73 5c 6e 22 0a 22 20 20 2d  ARY KEYs\n"."  -
e880: 2d 72 62 75 20 20 20 20 20 20 20 20 20 20 20 20  -rbu            
e890: 20 20 20 20 20 4f 75 74 70 75 74 20 53 51 4c 20       Output SQL 
e8a0: 74 6f 20 63 72 65 61 74 65 2f 70 6f 70 75 6c 61  to create/popula
e8b0: 74 65 20 52 42 55 20 74 61 62 6c 65 28 73 29 5c  te RBU table(s)\
e8c0: 6e 22 0a 22 20 20 2d 2d 73 63 68 65 6d 61 20 20  n"."  --schema  
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
e8e0: 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65   only difference
e8f0: 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 5c  s in the schema\
e900: 6e 22 0a 22 20 20 2d 2d 73 75 6d 6d 61 72 79 20  n"."  --summary 
e910: 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
e920: 20 6f 6e 6c 79 20 61 20 73 75 6d 6d 61 72 79 20   only a summary 
e930: 6f 66 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  of the differenc
e940: 65 73 5c 6e 22 0a 22 20 20 2d 2d 74 61 62 6c 65  es\n"."  --table
e950: 20 54 41 42 20 20 20 20 20 20 20 20 20 20 20 53   TAB           S
e960: 68 6f 77 20 6f 6e 6c 79 20 64 69 66 66 65 72 65  how only differe
e970: 6e 63 65 73 20 69 6e 20 74 61 62 6c 65 20 54 41  nces in table TA
e980: 42 5c 6e 22 0a 22 20 20 2d 2d 74 72 61 6e 73 61  B\n"."  --transa
e990: 63 74 69 6f 6e 20 20 20 20 20 20 20 20 20 53 68  ction         Sh
e9a0: 6f 77 20 53 51 4c 20 6f 75 74 70 75 74 20 69 6e  ow SQL output in
e9b0: 73 69 64 65 20 61 20 74 72 61 6e 73 61 63 74 69  side a transacti
e9c0: 6f 6e 5c 6e 22 0a 22 20 20 2d 2d 76 74 61 62 20  on\n"."  --vtab 
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 48                 H
e9e0: 61 6e 64 6c 65 20 66 74 73 33 2c 20 66 74 73 34  andle fts3, fts4
e9f0: 2c 20 66 74 73 35 20 61 6e 64 20 72 74 72 65 65  , fts5 and rtree
ea00: 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 29 3b 0a   tables\n".  );.
ea10: 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20  }..int main(int 
ea20: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
ea30: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v){.  const char
ea40: 20 2a 7a 44 62 31 20 3d 20 30 3b 0a 20 20 63 6f   *zDb1 = 0;.  co
ea50: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 32 20 3d  nst char *zDb2 =
ea60: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
ea70: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
ea80: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 63 68  ErrMsg = 0;.  ch
ea90: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c 69  ar *zSql;.  sqli
eaa0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
eab0: 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  .  char *zTab = 
eac0: 30 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  0;.  FILE *out =
ead0: 20 73 74 64 6f 75 74 3b 0a 20 20 76 6f 69 64 20   stdout;.  void 
eae0: 28 2a 78 44 69 66 66 29 28 63 6f 6e 73 74 20 63  (*xDiff)(const c
eaf0: 68 61 72 2a 2c 46 49 4c 45 2a 29 20 3d 20 64 69  har*,FILE*) = di
eb00: 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 23 69  ff_one_table;.#i
eb10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eb20: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
eb30: 0a 20 20 69 6e 74 20 6e 45 78 74 20 3d 20 30 3b  .  int nExt = 0;
eb40: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 45 78 74 20  .  char **azExt 
eb50: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e  = 0;.#endif.  in
eb60: 74 20 75 73 65 54 72 61 6e 73 61 63 74 69 6f 6e  t useTransaction
eb70: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 65 76 65   = 0;.  int neve
eb80: 72 55 73 65 54 72 61 6e 73 61 63 74 69 6f 6e 20  rUseTransaction 
eb90: 3d 20 30 3b 0a 0a 20 20 67 2e 7a 41 72 67 76 30  = 0;..  g.zArgv0
eba0: 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 73 71   = argv[0];.  sq
ebb0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
ebc0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c  ITE_CONFIG_SINGL
ebd0: 45 54 48 52 45 41 44 29 3b 0a 20 20 66 6f 72 28  ETHREAD);.  for(
ebe0: 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=1; i<argc; i++
ebf0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
ec00: 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  r *z = argv[i];.
ec10: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
ec20: 27 20 29 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a  ' ){.      z++;.
ec30: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
ec40: 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
ec50: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 63   if( strcmp(z,"c
ec60: 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20 29 7b  hangeset")==0 ){
ec70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
ec80: 61 72 67 63 2d 31 20 29 20 63 6d 64 6c 69 6e 65  argc-1 ) cmdline
ec90: 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61  Error("missing a
eca0: 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 22 2c 20  rgument to %s", 
ecb0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
ecc0: 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 72    out = fopen(ar
ecd0: 67 76 5b 2b 2b 69 5d 2c 20 22 77 62 22 29 3b 0a  gv[++i], "wb");.
ece0: 20 20 20 20 20 20 20 20 69 66 28 20 6f 75 74 3d          if( out=
ecf0: 3d 30 20 29 20 63 6d 64 6c 69 6e 65 45 72 72 6f  =0 ) cmdlineErro
ed00: 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 3a 20  r("cannot open: 
ed10: 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  %s", argv[i]);. 
ed20: 20 20 20 20 20 20 20 78 44 69 66 66 20 3d 20 63         xDiff = c
ed30: 68 61 6e 67 65 73 65 74 5f 6f 6e 65 5f 74 61 62  hangeset_one_tab
ed40: 6c 65 3b 0a 20 20 20 20 20 20 20 20 6e 65 76 65  le;.        neve
ed50: 72 55 73 65 54 72 61 6e 73 61 63 74 69 6f 6e 20  rUseTransaction 
ed60: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
ed70: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
ed80: 70 28 7a 2c 22 64 65 62 75 67 22 29 3d 3d 30 20  p(z,"debug")==0 
ed90: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
eda0: 3d 3d 61 72 67 63 2d 31 20 29 20 63 6d 64 6c 69  ==argc-1 ) cmdli
edb0: 6e 65 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  neError("missing
edc0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 22   argument to %s"
edd0: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
ede0: 20 20 20 20 67 2e 66 44 65 62 75 67 20 3d 20 73      g.fDebug = s
edf0: 74 72 74 6f 6c 28 61 72 67 76 5b 2b 2b 69 5d 2c  trtol(argv[++i],
ee00: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   0, 0);.      }e
ee10: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
ee20: 72 63 6d 70 28 7a 2c 22 68 65 6c 70 22 29 3d 3d  rcmp(z,"help")==
ee30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 68 6f  0 ){.        sho
ee40: 77 48 65 6c 70 28 29 3b 0a 20 20 20 20 20 20 20  wHelp();.       
ee50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
ee60: 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
ee70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
ee80: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20  EXTENSION.      
ee90: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6c 69  if( strcmp(z,"li
eea0: 62 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70  b")==0 || strcmp
eeb0: 28 7a 2c 22 4c 22 29 3d 3d 30 20 29 7b 0a 20 20  (z,"L")==0 ){.  
eec0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 61 72 67        if( i==arg
eed0: 63 2d 31 20 29 20 63 6d 64 6c 69 6e 65 45 72 72  c-1 ) cmdlineErr
eee0: 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75  or("missing argu
eef0: 6d 65 6e 74 20 74 6f 20 25 73 22 2c 20 61 72 67  ment to %s", arg
ef00: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 61  v[i]);.        a
ef10: 7a 45 78 74 20 3d 20 72 65 61 6c 6c 6f 63 28 61  zExt = realloc(a
ef20: 7a 45 78 74 2c 20 73 69 7a 65 6f 66 28 61 7a 45  zExt, sizeof(azE
ef30: 78 74 5b 30 5d 29 2a 28 6e 45 78 74 2b 31 29 29  xt[0])*(nExt+1))
ef40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 7a  ;.        if( az
ef50: 45 78 74 3d 3d 30 20 29 20 63 6d 64 6c 69 6e 65  Ext==0 ) cmdline
ef60: 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65  Error("out of me
ef70: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20  mory");.        
ef80: 61 7a 45 78 74 5b 6e 45 78 74 2b 2b 5d 20 3d 20  azExt[nExt++] = 
ef90: 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20  argv[++i];.     
efa0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
efb0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
efc0: 2c 22 70 72 69 6d 61 72 79 6b 65 79 22 29 3d 3d  ,"primarykey")==
efd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 67 2e 62  0 ){.        g.b
efe0: 53 63 68 65 6d 61 50 4b 20 3d 20 31 3b 0a 20 20  SchemaPK = 1;.  
eff0: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
f000: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 72 62  if( strcmp(z,"rb
f010: 75 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  u")==0 ){.      
f020: 20 20 78 44 69 66 66 20 3d 20 72 62 75 64 69 66    xDiff = rbudif
f030: 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 20  f_one_table;.   
f040: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
f050: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 63 68  f( strcmp(z,"sch
f060: 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ema")==0 ){.    
f070: 20 20 20 20 67 2e 62 53 63 68 65 6d 61 4f 6e 6c      g.bSchemaOnl
f080: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  y = 1;.      }el
f090: 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
f0a0: 63 6d 70 28 7a 2c 22 73 75 6d 6d 61 72 79 22 29  cmp(z,"summary")
f0b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ==0 ){.        x
f0c0: 44 69 66 66 20 3d 20 73 75 6d 6d 61 72 69 7a 65  Diff = summarize
f0d0: 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 20 20  _one_table;.    
f0e0: 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
f0f0: 28 20 73 74 72 63 6d 70 28 7a 2c 22 74 61 62 6c  ( strcmp(z,"tabl
f100: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
f110: 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20    if( i==argc-1 
f120: 29 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22  ) cmdlineError("
f130: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
f140: 20 74 6f 20 25 73 22 2c 20 61 72 67 76 5b 69 5d   to %s", argv[i]
f150: 29 3b 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  );.        zTab 
f160: 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20 20  = argv[++i];.   
f170: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
f180: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 74 72 61  f( strcmp(z,"tra
f190: 6e 73 61 63 74 69 6f 6e 22 29 3d 3d 30 20 29 7b  nsaction")==0 ){
f1a0: 0a 20 20 20 20 20 20 20 20 75 73 65 54 72 61 6e  .        useTran
f1b0: 73 61 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20  saction = 1;.   
f1c0: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
f1d0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 76 74 61  f( strcmp(z,"vta
f1e0: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  b")==0 ){.      
f1f0: 20 20 67 2e 62 48 61 6e 64 6c 65 56 74 61 62 20    g.bHandleVtab 
f200: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
f210: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
f220: 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 75   cmdlineError("u
f230: 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
f240: 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  s", argv[i]);.  
f250: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
f260: 69 66 28 20 7a 44 62 31 3d 3d 30 20 29 7b 0a 20  if( zDb1==0 ){. 
f270: 20 20 20 20 20 7a 44 62 31 20 3d 20 61 72 67 76       zDb1 = argv
f280: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  [i];.    }else i
f290: 66 28 20 7a 44 62 32 3d 3d 30 20 29 7b 0a 20 20  f( zDb2==0 ){.  
f2a0: 20 20 20 20 7a 44 62 32 20 3d 20 61 72 67 76 5b      zDb2 = argv[
f2b0: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
f2c0: 20 20 20 20 20 63 6d 64 6c 69 6e 65 45 72 72 6f       cmdlineErro
f2d0: 72 28 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d  r("unknown argum
f2e0: 65 6e 74 3a 20 25 73 22 2c 20 61 72 67 76 5b 69  ent: %s", argv[i
f2f0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ]);.    }.  }.  
f300: 69 66 28 20 7a 44 62 32 3d 3d 30 20 29 7b 0a 20  if( zDb2==0 ){. 
f310: 20 20 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28     cmdlineError(
f320: 22 74 77 6f 20 64 61 74 61 62 61 73 65 20 61 72  "two database ar
f330: 67 75 6d 65 6e 74 73 20 72 65 71 75 69 72 65 64  guments required
f340: 22 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ");.  }.  rc = s
f350: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62 31  qlite3_open(zDb1
f360: 2c 20 26 67 2e 64 62 29 3b 0a 20 20 69 66 28 20  , &g.db);.  if( 
f370: 72 63 20 29 7b 0a 20 20 20 20 63 6d 64 6c 69 6e  rc ){.    cmdlin
f380: 65 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f  eError("cannot o
f390: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
f3a0: 65 20 5c 22 25 73 5c 22 22 2c 20 7a 44 62 31 29  e \"%s\"", zDb1)
f3b0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f3c0: 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20  ite3_exec(g.db, 
f3d0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
f3e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30  qlite_master", 0
f3f0: 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , 0, &zErrMsg);.
f400: 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72    if( rc || zErr
f410: 4d 73 67 20 29 7b 0a 20 20 20 20 63 6d 64 6c 69  Msg ){.    cmdli
f420: 6e 65 45 72 72 6f 72 28 22 5c 22 25 73 5c 22 20  neError("\"%s\" 
f430: 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
f440: 74 6f 20 62 65 20 61 20 76 61 6c 69 64 20 53 51  to be a valid SQ
f450: 4c 69 74 65 20 64 61 74 61 62 61 73 65 22 2c 20  Lite database", 
f460: 7a 44 62 31 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  zDb1);.  }.#ifnd
f470: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
f480: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
f490: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
f4a0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 67 2e  oad_extension(g.
f4b0: 64 62 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d  db, 1);.  for(i=
f4c0: 30 3b 20 69 3c 6e 45 78 74 3b 20 69 2b 2b 29 7b  0; i<nExt; i++){
f4d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f4e0: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
f4f0: 28 67 2e 64 62 2c 20 61 7a 45 78 74 5b 69 5d 2c  (g.db, azExt[i],
f500: 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
f510: 20 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72     if( rc || zEr
f520: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 63 6d  rMsg ){.      cm
f530: 64 6c 69 6e 65 45 72 72 6f 72 28 22 65 72 72 6f  dlineError("erro
f540: 72 20 6c 6f 61 64 69 6e 67 20 25 73 3a 20 25 73  r loading %s: %s
f550: 22 2c 20 61 7a 45 78 74 5b 69 5d 2c 20 7a 45 72  ", azExt[i], zEr
f560: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
f570: 0a 20 20 66 72 65 65 28 61 7a 45 78 74 29 3b 0a  .  free(azExt);.
f580: 23 65 6e 64 69 66 0a 20 20 7a 53 71 6c 20 3d 20  #endif.  zSql = 
f590: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
f5a0: 22 41 54 54 41 43 48 20 25 51 20 61 73 20 61 75  "ATTACH %Q as au
f5b0: 78 3b 22 2c 20 7a 44 62 32 29 3b 0a 20 20 72 63  x;", zDb2);.  rc
f5c0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
f5d0: 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  g.db, zSql, 0, 0
f5e0: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
f5f0: 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67  f( rc || zErrMsg
f600: 20 29 7b 0a 20 20 20 20 63 6d 64 6c 69 6e 65 45   ){.    cmdlineE
f610: 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 61 74 74  rror("cannot att
f620: 61 63 68 20 64 61 74 61 62 61 73 65 20 5c 22 25  ach database \"%
f630: 73 5c 22 22 2c 20 7a 44 62 32 29 3b 0a 20 20 7d  s\"", zDb2);.  }
f640: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
f650: 65 78 65 63 28 67 2e 64 62 2c 20 22 53 45 4c 45  exec(g.db, "SELE
f660: 43 54 20 2a 20 46 52 4f 4d 20 61 75 78 2e 73 71  CT * FROM aux.sq
f670: 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 2c  lite_master", 0,
f680: 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
f690: 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d   if( rc || zErrM
f6a0: 73 67 20 29 7b 0a 20 20 20 20 63 6d 64 6c 69 6e  sg ){.    cmdlin
f6b0: 65 45 72 72 6f 72 28 22 5c 22 25 73 5c 22 20 64  eError("\"%s\" d
f6c0: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74  oes not appear t
f6d0: 6f 20 62 65 20 61 20 76 61 6c 69 64 20 53 51 4c  o be a valid SQL
f6e0: 69 74 65 20 64 61 74 61 62 61 73 65 22 2c 20 7a  ite database", z
f6f0: 44 62 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Db2);.  }..  if(
f700: 20 6e 65 76 65 72 55 73 65 54 72 61 6e 73 61 63   neverUseTransac
f710: 74 69 6f 6e 20 29 20 75 73 65 54 72 61 6e 73 61  tion ) useTransa
f720: 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 69 66 28  ction = 0;.  if(
f730: 20 75 73 65 54 72 61 6e 73 61 63 74 69 6f 6e 20   useTransaction 
f740: 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
f750: 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f  BEGIN TRANSACTIO
f760: 4e 3b 5c 6e 22 29 3b 0a 20 20 69 66 28 20 78 44  N;\n");.  if( xD
f770: 69 66 66 3d 3d 72 62 75 64 69 66 66 5f 6f 6e 65  iff==rbudiff_one
f780: 5f 74 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 70  _table ){.    fp
f790: 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41  rintf(out, "CREA
f7a0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
f7b0: 45 58 49 53 54 53 20 72 62 75 5f 63 6f 75 6e 74  EXISTS rbu_count
f7c0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 28 74  ".           "(t
f7d0: 62 6c 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  bl TEXT PRIMARY 
f7e0: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41  KEY COLLATE NOCA
f7f0: 53 45 2c 20 63 6e 74 20 49 4e 54 45 47 45 52 29  SE, cnt INTEGER)
f800: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 57   ".           "W
f810: 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 5c 6e 22  ITHOUT ROWID;\n"
f820: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66  .    );.  }.  if
f830: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 78 44  ( zTab ){.    xD
f840: 69 66 66 28 7a 54 61 62 2c 20 6f 75 74 29 3b 0a  iff(zTab, out);.
f850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
f860: 48 61 6e 64 6c 65 20 74 61 62 6c 65 73 20 6f 6e  Handle tables on
f870: 65 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  e by one */.    
f880: 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61  pStmt = db_prepa
f890: 72 65 28 22 25 73 22 2c 20 61 6c 6c 5f 74 61 62  re("%s", all_tab
f8a0: 6c 65 73 5f 73 71 6c 28 29 20 29 3b 0a 20 20 20  les_sql() );.   
f8b0: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
f8c0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
f8d0: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
f8e0: 20 78 44 69 66 66 28 28 63 6f 6e 73 74 20 63 68   xDiff((const ch
f8f0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
f900: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29  mn_text(pStmt,0)
f910: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  , out);.    }.  
f920: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
f930: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  ze(pStmt);.  }. 
f940: 20 69 66 28 20 75 73 65 54 72 61 6e 73 61 63 74   if( useTransact
f950: 69 6f 6e 20 29 20 70 72 69 6e 74 66 28 22 43 4f  ion ) printf("CO
f960: 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 0a 20 20 2f 2a  MMIT;\n");..  /*
f970: 20 54 42 44 3a 20 48 61 6e 64 6c 65 20 74 72 69   TBD: Handle tri
f980: 67 67 65 72 20 64 69 66 66 65 72 65 6e 63 65 73  gger differences
f990: 20 2a 2f 0a 20 20 2f 2a 20 54 42 44 3a 20 48 61   */.  /* TBD: Ha
f9a0: 6e 64 6c 65 20 76 69 65 77 20 64 69 66 66 65 72  ndle view differ
f9b0: 65 6e 63 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ences */.  sqlit
f9c0: 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a  e3_close(g.db);.
f9d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a          return 0;.}.