/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 3fb48a6c6669d2d2c59a7f072a410dd2583579b4:


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 2f 2a 20 43 6f 75 6c 64 20 62 65 20 61 6e    /* Could be an
3220: 20 4f 4f 4d 2c 20 63 6f 75 6c 64 20 62 65 20 61   OOM, could be a
3230: 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 20   zero-byte blob 
3240: 2a 2f 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  */.        fprin
3250: 74 66 28 6f 75 74 2c 20 22 58 27 27 22 29 3b 0a  tf(out, "X''");.
3260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
3270: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3280: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
3290: 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75   {.      const u
32a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41  nsigned char *zA
32b0: 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  rg = sqlite3_val
32c0: 75 65 5f 74 65 78 74 28 58 29 3b 0a 20 20 20 20  ue_text(X);.    
32d0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 20    int i, j;..   
32e0: 20 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29     if( zArg==0 )
32f0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
3300: 66 28 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a  f(out, "NULL");.
3310: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3320: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
3330: 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20  , "'");.        
3340: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 41 72 67 5b  for(i=j=0; zArg[
3350: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
3360: 20 20 20 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d      if( zArg[i]=
3370: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
3380: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
3390: 2c 20 22 25 2e 2a 73 27 22 2c 20 69 2d 6a 2b 31  , "%.*s'", i-j+1
33a0: 2c 20 26 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20  , &zArg[j]);.   
33b0: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b 31           j = i+1
33c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33e0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
33f0: 27 22 2c 20 26 7a 41 72 67 5b 6a 5d 29 3b 0a 20  '", &zArg[j]);. 
3400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3410: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3420: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
3430: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
3440: 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  out, "NULL");.  
3450: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3460: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  .  }.}../*.** Ou
3470: 74 70 75 74 20 53 51 4c 20 74 68 61 74 20 77 69  tput SQL that wi
3480: 6c 6c 20 72 65 63 72 65 61 74 65 20 74 68 65 20  ll recreate the 
3490: 61 75 78 2e 7a 54 61 62 20 74 61 62 6c 65 2e 0a  aux.zTab table..
34a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
34b0: 75 6d 70 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20  ump_table(const 
34c0: 63 68 61 72 20 2a 7a 54 61 62 2c 20 46 49 4c 45  char *zTab, FILE
34d0: 20 2a 6f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a   *out){.  char *
34e0: 7a 49 64 20 3d 20 73 61 66 65 49 64 28 7a 54 61  zId = safeId(zTa
34f0: 62 29 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  b); /* Name of t
3500: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68  he table */.  ch
3510: 61 72 20 2a 2a 61 7a 20 3d 20 30 3b 20 20 20 20  ar **az = 0;    
3520: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
3530: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
3540: 69 6e 74 20 6e 50 6b 3b 20 20 20 20 20 20 20 20  int nPk;        
3550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3560: 62 65 72 20 6f 66 20 74 72 75 65 20 70 72 69 6d  ber of true prim
3570: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  ary key columns 
3580: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
35b0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
35c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
35d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
35e0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
35f0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
3600: 3b 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74  ;      /* SQL st
3610: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
3620: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20  st char *zSep;  
3630: 20 20 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61         /* Separa
3640: 74 6f 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  tor string */.  
3650: 53 74 72 20 69 6e 73 3b 20 20 20 20 20 20 20 20  Str ins;        
3660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
3670: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 49 4e  inning of the IN
3680: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  SERT statement *
3690: 2f 0a 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f  /..  pStmt = db_
36a0: 70 72 65 70 61 72 65 28 22 53 45 4c 45 43 54 20  prepare("SELECT 
36b0: 73 71 6c 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c  sql FROM aux.sql
36c0: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
36d0: 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 54 61 62 29   name=%Q", zTab)
36e0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  ;.  if( SQLITE_R
36f0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
3700: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 66  (pStmt) ){.    f
3710: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3b  printf(out, "%s;
3720: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
3730: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30  umn_text(pStmt,0
3740: 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
3750: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
3760: 29 3b 0a 20 20 69 66 28 20 21 67 2e 62 53 63 68  );.  if( !g.bSch
3770: 65 6d 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 61  emaOnly ){.    a
3780: 7a 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28  z = columnNames(
3790: 22 61 75 78 22 2c 20 7a 54 61 62 2c 20 26 6e 50  "aux", zTab, &nP
37a0: 6b 2c 20 30 29 3b 0a 20 20 20 20 73 74 72 49 6e  k, 0);.    strIn
37b0: 69 74 28 26 69 6e 73 29 3b 0a 20 20 20 20 69 66  it(&ins);.    if
37c0: 28 20 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( az==0 ){.     
37d0: 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70   pStmt = db_prep
37e0: 61 72 65 28 22 53 45 4c 45 43 54 20 2a 20 46 52  are("SELECT * FR
37f0: 4f 4d 20 61 75 78 2e 25 73 22 2c 20 7a 49 64 29  OM aux.%s", zId)
3800: 3b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e 74  ;.      strPrint
3810: 66 28 26 69 6e 73 2c 22 49 4e 53 45 52 54 20 49  f(&ins,"INSERT I
3820: 4e 54 4f 20 25 73 20 56 41 4c 55 45 53 22 2c 20  NTO %s VALUES", 
3830: 7a 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  zId);.    }else{
3840: 0a 20 20 20 20 20 20 53 74 72 20 73 71 6c 3b 0a  .      Str sql;.
3850: 20 20 20 20 20 20 73 74 72 49 6e 69 74 28 26 73        strInit(&s
3860: 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20  ql);.      zSep 
3870: 3d 20 20 22 53 45 4c 45 43 54 22 3b 0a 20 20 20  =  "SELECT";.   
3880: 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 5b 69     for(i=0; az[i
3890: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
38a0: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
38b0: 20 22 25 73 20 25 73 22 2c 20 7a 53 65 70 2c 20   "%s %s", zSep, 
38c0: 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  az[i]);.        
38d0: 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20  zSep = ",";.    
38e0: 20 20 7d 0a 20 20 20 20 20 20 73 74 72 50 72 69    }.      strPri
38f0: 6e 74 66 28 26 73 71 6c 2c 22 20 46 52 4f 4d 20  ntf(&sql," FROM 
3900: 61 75 78 2e 25 73 22 2c 20 7a 49 64 29 3b 0a 20  aux.%s", zId);. 
3910: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52       zSep = " OR
3920: 44 45 52 20 42 59 22 3b 0a 20 20 20 20 20 20 66  DER BY";.      f
3930: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 50 6b 3b 20  or(i=1; i<=nPk; 
3940: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
3950: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
3960: 73 20 25 64 22 2c 20 7a 53 65 70 2c 20 69 29 3b  s %d", zSep, i);
3970: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
3980: 22 2c 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ",";.      }.   
3990: 20 20 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72     pStmt = db_pr
39a0: 65 70 61 72 65 28 22 25 73 22 2c 20 73 71 6c 2e  epare("%s", sql.
39b0: 7a 29 3b 0a 20 20 20 20 20 20 73 74 72 46 72 65  z);.      strFre
39c0: 65 28 26 73 71 6c 29 3b 0a 20 20 20 20 20 20 73  e(&sql);.      s
39d0: 74 72 50 72 69 6e 74 66 28 26 69 6e 73 2c 20 22  trPrintf(&ins, "
39e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22 2c  INSERT INTO %s",
39f0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 7a 53 65   zId);.      zSe
3a00: 70 20 3d 20 22 28 22 3b 0a 20 20 20 20 20 20 66  p = "(";.      f
3a10: 6f 72 28 69 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69  or(i=0; az[i]; i
3a20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
3a30: 50 72 69 6e 74 66 28 26 69 6e 73 2c 20 22 25 73  Printf(&ins, "%s
3a40: 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d  %s", zSep, az[i]
3a50: 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20  );.        zSep 
3a60: 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 7d 0a 20  = ",";.      }. 
3a70: 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26       strPrintf(&
3a80: 69 6e 73 2c 22 29 20 56 41 4c 55 45 53 22 29 3b  ins,") VALUES");
3a90: 0a 20 20 20 20 20 20 6e 61 6d 65 6c 69 73 74 46  .      namelistF
3aa0: 72 65 65 28 61 7a 29 3b 0a 20 20 20 20 7d 0a 20  ree(az);.    }. 
3ab0: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
3ac0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
3ad0: 53 74 6d 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  Stmt);.    while
3ae0: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
3af0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
3b00: 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
3b10: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 69 6e 73  tf(out, "%s",ins
3b20: 2e 7a 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20  .z);.      zSep 
3b30: 3d 20 22 28 22 3b 0a 20 20 20 20 20 20 66 6f 72  = "(";.      for
3b40: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
3b50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
3b60: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 7a 53  ntf(out, "%s",zS
3b70: 65 70 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69  ep);.        pri
3b80: 6e 74 51 75 6f 74 65 64 28 6f 75 74 2c 20 73 71  ntQuoted(out, sq
3b90: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
3ba0: 75 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  ue(pStmt,i));.  
3bb0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22        zSep = ","
3bc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3bd0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 29 3b  fprintf(out, ");
3be0: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
3bf0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
3c00: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 74 72  (pStmt);.    str
3c10: 46 72 65 65 28 26 69 6e 73 29 3b 0a 20 20 7d 20  Free(&ins);.  } 
3c20: 2f 2a 20 65 6e 64 69 66 20 21 67 2e 62 53 63 68  /* endif !g.bSch
3c30: 65 6d 61 4f 6e 6c 79 20 2a 2f 0a 20 20 70 53 74  emaOnly */.  pSt
3c40: 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28  mt = db_prepare(
3c50: 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
3c60: 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74   aux.sqlite_mast
3c70: 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
3c80: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
3c90: 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e   type='index' AN
3ca0: 44 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 41 4e  D tbl_name=%Q AN
3cb0: 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c  D sql IS NOT NUL
3cc0: 4c 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L",.            
3cd0: 20 20 20 20 20 20 20 20 20 7a 54 61 62 29 3b 0a           zTab);.
3ce0: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
3cf0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
3d00: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
3d10: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
3d20: 3b 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ;\n", sqlite3_co
3d30: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
3d40: 30 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  0));.  }.  sqlit
3d50: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
3d60: 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  t);.}.../*.** Co
3d70: 6d 70 75 74 65 20 61 6c 6c 20 64 69 66 66 65 72  mpute all differ
3d80: 65 6e 63 65 73 20 66 6f 72 20 61 20 73 69 6e 67  ences for a sing
3d90: 6c 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  le table..*/.sta
3da0: 74 69 63 20 76 6f 69 64 20 64 69 66 66 5f 6f 6e  tic void diff_on
3db0: 65 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20 63 68  e_table(const ch
3dc0: 61 72 20 2a 7a 54 61 62 2c 20 46 49 4c 45 20 2a  ar *zTab, FILE *
3dd0: 6f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 49  out){.  char *zI
3de0: 64 20 3d 20 73 61 66 65 49 64 28 7a 54 61 62 29  d = safeId(zTab)
3df0: 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62  ; /* Name of tab
3e00: 6c 65 20 28 74 72 61 6e 73 6c 61 74 65 64 20 66  le (translated f
3e10: 6f 72 20 75 73 20 69 6e 20 53 51 4c 29 20 2a 2f  or us in SQL) */
3e20: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 20 3d 20 30  .  char **az = 0
3e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3e40: 43 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61 69 6e 20  Columns in main 
3e50: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 32 20  */.  char **az2 
3e60: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
3e70: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 61 75 78  * Columns in aux
3e80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 3b 20 20   */.  int nPk;  
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65 79 20 63  /* Primary key c
3eb0: 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61 69 6e 20 2a  olumns in main *
3ec0: 2f 0a 20 20 69 6e 74 20 6e 50 6b 32 3b 20 20 20  /.  int nPk2;   
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 50 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   Primary key col
3ef0: 75 6d 6e 73 20 69 6e 20 61 75 78 20 2a 2f 0a 20  umns in aux */. 
3f00: 20 69 6e 74 20 6e 20 3d 20 30 3b 20 20 20 20 20   int n = 0;     
3f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3f20: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
3f30: 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20 69 6e 74  in main */.  int
3f40: 20 6e 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   n2;            
3f50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3f60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61   of columns in a
3f70: 75 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 51 3b 20  ux */.  int nQ; 
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
3fa0: 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  utput columns in
3fb0: 20 74 68 65 20 64 69 66 66 20 71 75 65 72 79 20   the diff query 
3fc0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fe0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
3ff0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4000: 7a 53 65 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  zSep;         /*
4010: 20 53 65 70 61 72 61 74 6f 72 20 73 74 72 69 6e   Separator strin
4020: 67 20 2a 2f 0a 20 20 53 74 72 20 73 71 6c 3b 20  g */.  Str sql; 
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 71   /* Comparison q
4050: 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
4060: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
4070: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 73 74 61      /* Query sta
4080: 74 65 6d 65 6e 74 20 74 6f 20 64 6f 20 74 68 65  tement to do the
4090: 20 64 69 66 66 20 2a 2f 0a 0a 20 20 73 74 72 49   diff */..  strI
40a0: 6e 69 74 28 26 73 71 6c 29 3b 0a 20 20 69 66 28  nit(&sql);.  if(
40b0: 20 67 2e 66 44 65 62 75 67 3d 3d 44 45 42 55 47   g.fDebug==DEBUG
40c0: 5f 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 53 20 29 7b  _COLUMN_NAMES ){
40d0: 0a 20 20 20 20 2f 2a 20 53 69 6d 70 6c 79 20 72  .    /* Simply r
40e0: 75 6e 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  un columnNames()
40f0: 20 6f 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 6f   on all tables o
4100: 66 20 74 68 65 20 6f 72 69 67 69 6e 0a 20 20 20  f the origin.   
4110: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
4120: 20 73 68 6f 77 20 74 68 65 20 72 65 73 75 6c 74   show the result
4130: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
4140: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 20 20 20   for testing.   
4150: 20 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e   ** and debuggin
4160: 67 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 4e  g of the columnN
4170: 61 6d 65 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ames() function.
4180: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 7a 20 3d  .    */.    az =
4190: 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22 61 75   columnNames("au
41a0: 78 22 2c 7a 54 61 62 2c 20 26 6e 50 6b 2c 20 30  x",zTab, &nPk, 0
41b0: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 3d 3d 30  );.    if( az==0
41c0: 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   ){.      printf
41d0: 28 22 52 6f 77 69 64 20 6e 6f 74 20 61 63 63 65  ("Rowid not acce
41e0: 73 73 69 62 6c 65 20 66 6f 72 20 25 73 5c 6e 22  ssible for %s\n"
41f0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73  , zId);.    }els
4200: 65 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  e{.      printf(
4210: 22 25 73 3a 22 2c 20 7a 49 64 29 3b 0a 20 20 20  "%s:", zId);.   
4220: 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 5b 69     for(i=0; az[i
4230: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
4240: 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20 61   printf(" %s", a
4250: 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  z[i]);.        i
4260: 66 28 20 69 2b 31 3d 3d 6e 50 6b 20 29 20 70 72  f( i+1==nPk ) pr
4270: 69 6e 74 66 28 22 20 2a 22 29 3b 0a 20 20 20 20  intf(" *");.    
4280: 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
4290: 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ("\n");.    }.  
42a0: 20 20 67 6f 74 6f 20 65 6e 64 5f 64 69 66 66 5f    goto end_diff_
42b0: 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  one_table;.  }. 
42c0: 20 20 20 0a 0a 20 20 69 66 28 20 73 71 6c 69 74     ..  if( sqlit
42d0: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
42e0: 6d 65 74 61 64 61 74 61 28 67 2e 64 62 2c 22 61  metadata(g.db,"a
42f0: 75 78 22 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c 30  ux",zTab,0,0,0,0
4300: 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 69 66 28  ,0,0) ){.    if(
4310: 20 21 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f   !sqlite3_table_
4320: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
4330: 67 2e 64 62 2c 22 6d 61 69 6e 22 2c 7a 54 61 62  g.db,"main",zTab
4340: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 20 29 7b  ,0,0,0,0,0,0) ){
4350: 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  .      /* Table 
4360: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 65 63  missing from sec
4370: 6f 6e 64 20 64 61 74 61 62 61 73 65 2e 20 2a 2f  ond database. */
4380: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
4390: 75 74 2c 20 22 44 52 4f 50 20 54 41 42 4c 45 20  ut, "DROP TABLE 
43a0: 25 73 3b 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20  %s;\n", zId);.  
43b0: 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64    }.    goto end
43c0: 5f 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b  _diff_one_table;
43d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69  .  }..  if( sqli
43e0: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
43f0: 5f 6d 65 74 61 64 61 74 61 28 67 2e 64 62 2c 22  _metadata(g.db,"
4400: 6d 61 69 6e 22 2c 7a 54 61 62 2c 30 2c 30 2c 30  main",zTab,0,0,0
4410: 2c 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 2f  ,0,0,0) ){.    /
4420: 2a 20 54 61 62 6c 65 20 6d 69 73 73 69 6e 67 20  * Table missing 
4430: 66 72 6f 6d 20 73 6f 75 72 63 65 20 2a 2f 0a 20  from source */. 
4440: 20 20 20 64 75 6d 70 5f 74 61 62 6c 65 28 7a 54     dump_table(zT
4450: 61 62 2c 20 6f 75 74 29 3b 0a 20 20 20 20 67 6f  ab, out);.    go
4460: 74 6f 20 65 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f  to end_diff_one_
4470: 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 61 7a  table;.  }..  az
4480: 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22   = columnNames("
4490: 6d 61 69 6e 22 2c 20 7a 54 61 62 2c 20 26 6e 50  main", zTab, &nP
44a0: 6b 2c 20 30 29 3b 0a 20 20 61 7a 32 20 3d 20 63  k, 0);.  az2 = c
44b0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22 61 75 78 22  olumnNames("aux"
44c0: 2c 20 7a 54 61 62 2c 20 26 6e 50 6b 32 2c 20 30  , zTab, &nPk2, 0
44d0: 29 3b 0a 20 20 69 66 28 20 61 7a 20 26 26 20 61  );.  if( az && a
44e0: 7a 32 20 29 7b 0a 20 20 20 20 66 6f 72 28 6e 3d  z2 ){.    for(n=
44f0: 30 3b 20 61 7a 5b 6e 5d 20 26 26 20 61 7a 32 5b  0; az[n] && az2[
4500: 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  n]; n++){.      
4510: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
4520: 63 6d 70 28 61 7a 5b 6e 5d 2c 61 7a 32 5b 6e 5d  cmp(az[n],az2[n]
4530: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
4540: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 7a    }.  }.  if( az
4550: 3d 3d 30 0a 20 20 20 7c 7c 20 61 7a 32 3d 3d 30  ==0.   || az2==0
4560: 0a 20 20 20 7c 7c 20 6e 50 6b 21 3d 6e 50 6b 32  .   || nPk!=nPk2
4570: 0a 20 20 20 7c 7c 20 61 7a 5b 6e 5d 0a 20 20 29  .   || az[n].  )
4580: 7b 0a 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20  {.    /* Schema 
4590: 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  mismatch */.    
45a0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 44 52  fprintf(out, "DR
45b0: 4f 50 20 54 41 42 4c 45 20 25 73 3b 20 2d 2d 20  OP TABLE %s; -- 
45c0: 64 75 65 20 74 6f 20 73 63 68 65 6d 61 20 6d 69  due to schema mi
45d0: 73 6d 61 74 63 68 5c 6e 22 2c 20 7a 49 64 29 3b  smatch\n", zId);
45e0: 0a 20 20 20 20 64 75 6d 70 5f 74 61 62 6c 65 28  .    dump_table(
45f0: 7a 54 61 62 2c 20 6f 75 74 29 3b 0a 20 20 20 20  zTab, out);.    
4600: 67 6f 74 6f 20 65 6e 64 5f 64 69 66 66 5f 6f 6e  goto end_diff_on
4610: 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  e_table;.  }..  
4620: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d  /* Build the com
4630: 70 61 72 69 73 6f 6e 20 71 75 65 72 79 20 2a 2f  parison query */
4640: 0a 20 20 66 6f 72 28 6e 32 3d 6e 3b 20 61 7a 32  .  for(n2=n; az2
4650: 5b 6e 32 5d 3b 20 6e 32 2b 2b 29 7b 0a 20 20 20  [n2]; n2++){.   
4660: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 41   fprintf(out, "A
4670: 4c 54 45 52 20 54 41 42 4c 45 20 25 73 20 41 44  LTER TABLE %s AD
4680: 44 20 43 4f 4c 55 4d 4e 20 25 73 3b 5c 6e 22 2c  D COLUMN %s;\n",
4690: 20 7a 49 64 2c 20 73 61 66 65 49 64 28 61 7a 32   zId, safeId(az2
46a0: 5b 6e 32 5d 29 29 3b 0a 20 20 7d 0a 20 20 6e 51  [n2]));.  }.  nQ
46b0: 20 3d 20 6e 50 6b 32 2b 31 2b 32 2a 28 6e 32 2d   = nPk2+1+2*(n2-
46c0: 6e 50 6b 32 29 3b 0a 20 20 69 66 28 20 6e 32 3e  nPk2);.  if( n2>
46d0: 6e 50 6b 32 20 29 7b 0a 20 20 20 20 7a 53 65 70  nPk2 ){.    zSep
46e0: 20 3d 20 22 53 45 4c 45 43 54 20 22 3b 0a 20 20   = "SELECT ";.  
46f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
4700: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
4710: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
4720: 73 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a  sB.%s", zSep, az
4730: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7a 53 65 70  [i]);.      zSep
4740: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a 20   = ", ";.    }. 
4750: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
4760: 6c 2c 20 22 2c 20 31 25 73 20 2d 2d 20 63 68 61  l, ", 1%s -- cha
4770: 6e 67 65 64 20 72 6f 77 5c 6e 22 2c 20 6e 50 6b  nged row\n", nPk
4780: 3d 3d 6e 20 3f 20 22 22 20 3a 20 22 2c 22 29 3b  ==n ? "" : ",");
4790: 0a 20 20 20 20 77 68 69 6c 65 28 20 61 7a 5b 69  .    while( az[i
47a0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72  ] ){.      strPr
47b0: 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20 20 20  intf(&sql, "    
47c0: 20 20 20 41 2e 25 73 20 49 53 20 4e 4f 54 20 42     A.%s IS NOT B
47d0: 2e 25 73 2c 20 42 2e 25 73 25 73 5c 6e 22 2c 0a  .%s, B.%s%s\n",.
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 61 7a 5b 69 5d 2c 20 61 7a 32 5b 69 5d 2c 20 61  az[i], az2[i], a
4800: 7a 32 5b 69 5d 2c 20 61 7a 32 5b 69 2b 31 5d 3d  z2[i], az2[i+1]=
4810: 3d 30 20 3f 20 22 22 20 3a 20 22 2c 22 29 3b 0a  =0 ? "" : ",");.
4820: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
4830: 0a 20 20 20 20 77 68 69 6c 65 28 20 61 7a 32 5b  .    while( az2[
4840: 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 74 72 50  i] ){.      strP
4850: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20 20  rintf(&sql, "   
4860: 20 20 20 20 42 2e 25 73 20 49 53 20 4e 4f 54 20      B.%s IS NOT 
4870: 4e 55 4c 4c 2c 20 42 2e 25 73 25 73 5c 6e 22 2c  NULL, B.%s%s\n",
4880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4890: 20 61 7a 32 5b 69 5d 2c 20 61 7a 32 5b 69 5d 2c   az2[i], az2[i],
48a0: 20 61 7a 32 5b 69 2b 31 5d 3d 3d 30 20 3f 20 22   az2[i+1]==0 ? "
48b0: 22 20 3a 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  " : ",");.      
48c0: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i++;.    }.    s
48d0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
48e0: 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41    FROM main.%s A
48f0: 2c 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a  , aux.%s B\n", z
4900: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 7a 53  Id, zId);.    zS
4910: 65 70 20 3d 20 22 20 57 48 45 52 45 22 3b 0a 20  ep = " WHERE";. 
4920: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50     for(i=0; i<nP
4930: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  k; i++){.      s
4940: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
4950: 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a  %s A.%s=B.%s", z
4960: 53 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69  Sep, az[i], az[i
4970: 5d 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d  ]);.      zSep =
4980: 20 22 20 41 4e 44 22 3b 0a 20 20 20 20 7d 0a 20   " AND";.    }. 
4990: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 20     zSep = "\n   
49a0: 41 4e 44 20 28 22 3b 0a 20 20 20 20 77 68 69 6c  AND (";.    whil
49b0: 65 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20  e( az[i] ){.    
49c0: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
49d0: 2c 20 22 25 73 41 2e 25 73 20 49 53 20 4e 4f 54  , "%sA.%s IS NOT
49e0: 20 42 2e 25 73 25 73 5c 6e 22 2c 0a 20 20 20 20   B.%s%s\n",.    
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 65 70              zSep
4a00: 2c 20 61 7a 5b 69 5d 2c 20 61 7a 32 5b 69 5d 2c  , az[i], az2[i],
4a10: 20 61 7a 32 5b 69 2b 31 5d 3d 3d 30 20 3f 20 22   az2[i+1]==0 ? "
4a20: 29 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  )" : "");.      
4a30: 7a 53 65 70 20 3d 20 22 20 20 20 20 20 20 20 20  zSep = "        
4a40: 4f 52 20 22 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  OR ";.      i++;
4a50: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
4a60: 28 20 61 7a 32 5b 69 5d 20 29 7b 0a 20 20 20 20  ( az2[i] ){.    
4a70: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
4a80: 2c 20 22 25 73 42 2e 25 73 20 49 53 20 4e 4f 54  , "%sB.%s IS NOT
4a90: 20 4e 55 4c 4c 25 73 5c 6e 22 2c 0a 20 20 20 20   NULL%s\n",.    
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 65 70              zSep
4ab0: 2c 20 61 7a 32 5b 69 5d 2c 20 61 7a 32 5b 69 2b  , az2[i], az2[i+
4ac0: 31 5d 3d 3d 30 20 3f 20 22 29 22 20 3a 20 22 22  1]==0 ? ")" : ""
4ad0: 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  );.      zSep = 
4ae0: 22 20 20 20 20 20 20 20 20 4f 52 20 22 3b 0a 20  "        OR ";. 
4af0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
4b00: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
4b10: 71 6c 2c 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 5c  ql, " UNION ALL\
4b20: 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 53 65 70 20  n");.  }.  zSep 
4b30: 3d 20 22 53 45 4c 45 43 54 20 22 3b 0a 20 20 66  = "SELECT ";.  f
4b40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  or(i=0; i<nPk; i
4b50: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e  ++){.    strPrin
4b60: 74 66 28 26 73 71 6c 2c 20 22 25 73 41 2e 25 73  tf(&sql, "%sA.%s
4b70: 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 29 3b  ", zSep, az[i]);
4b80: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22  .    zSep = ", "
4b90: 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74  ;.  }.  strPrint
4ba0: 66 28 26 73 71 6c 2c 20 22 2c 20 32 25 73 20 2d  f(&sql, ", 2%s -
4bb0: 2d 20 64 65 6c 65 74 65 64 20 72 6f 77 5c 6e 22  - deleted row\n"
4bc0: 2c 20 6e 50 6b 3d 3d 6e 20 3f 20 22 22 20 3a 20  , nPk==n ? "" : 
4bd0: 22 2c 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 61  ",");.  while( a
4be0: 7a 32 5b 69 5d 20 29 7b 0a 20 20 20 20 73 74 72  z2[i] ){.    str
4bf0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20  Printf(&sql, "  
4c00: 20 20 20 20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 25       NULL, NULL%
4c10: 73 5c 6e 22 2c 20 69 3d 3d 6e 32 2d 31 20 3f 20  s\n", i==n2-1 ? 
4c20: 22 22 20 3a 20 22 2c 22 29 3b 0a 20 20 20 20 69  "" : ",");.    i
4c30: 2b 2b 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69  ++;.  }.  strPri
4c40: 6e 74 66 28 26 73 71 6c 2c 20 22 20 20 46 52 4f  ntf(&sql, "  FRO
4c50: 4d 20 6d 61 69 6e 2e 25 73 20 41 5c 6e 22 2c 20  M main.%s A\n", 
4c60: 7a 49 64 29 3b 0a 20 20 73 74 72 50 72 69 6e 74  zId);.  strPrint
4c70: 66 28 26 73 71 6c 2c 20 22 20 57 48 45 52 45 20  f(&sql, " WHERE 
4c80: 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43  NOT EXISTS(SELEC
4c90: 54 20 31 20 46 52 4f 4d 20 61 75 78 2e 25 73 20  T 1 FROM aux.%s 
4ca0: 42 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 7a 53  B\n", zId);.  zS
4cb0: 65 70 20 3d 20 20 20 20 20 20 20 20 20 20 22 20  ep =          " 
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 57 48 45 52 45 22 3b 0a 20 20 66 6f 72 28    WHERE";.  for(
4ce0: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
4cf0: 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28  {.    strPrintf(
4d00: 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42  &sql, "%s A.%s=B
4d10: 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69  .%s", zSep, az[i
4d20: 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a  ], az[i]);.    z
4d30: 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20  Sep = " AND";.  
4d40: 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  }.  strPrintf(&s
4d50: 71 6c 2c 20 22 29 5c 6e 22 29 3b 0a 20 20 7a 53  ql, ")\n");.  zS
4d60: 65 70 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c 4c  ep = " UNION ALL
4d70: 5c 6e 53 45 4c 45 43 54 20 22 3b 0a 20 20 66 6f  \nSELECT ";.  fo
4d80: 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  r(i=0; i<nPk; i+
4d90: 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74  +){.    strPrint
4da0: 66 28 26 73 71 6c 2c 20 22 25 73 42 2e 25 73 22  f(&sql, "%sB.%s"
4db0: 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 29 3b 0a  , zSep, az[i]);.
4dc0: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b      zSep = ", ";
4dd0: 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66  .  }.  strPrintf
4de0: 28 26 73 71 6c 2c 20 22 2c 20 33 25 73 20 2d 2d  (&sql, ", 3%s --
4df0: 20 69 6e 73 65 72 74 65 64 20 72 6f 77 5c 6e 22   inserted row\n"
4e00: 2c 20 6e 50 6b 3d 3d 6e 20 3f 20 22 22 20 3a 20  , nPk==n ? "" : 
4e10: 22 2c 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 61  ",");.  while( a
4e20: 7a 32 5b 69 5d 20 29 7b 0a 20 20 20 20 73 74 72  z2[i] ){.    str
4e30: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20  Printf(&sql, "  
4e40: 20 20 20 20 20 31 2c 20 42 2e 25 73 25 73 5c 6e       1, B.%s%s\n
4e50: 22 2c 20 61 7a 32 5b 69 5d 2c 20 61 7a 32 5b 69  ", az2[i], az2[i
4e60: 2b 31 5d 3d 3d 30 20 3f 20 22 22 20 3a 20 22 2c  +1]==0 ? "" : ",
4e70: 22 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  ");.    i++;.  }
4e80: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
4e90: 6c 2c 20 22 20 20 46 52 4f 4d 20 61 75 78 2e 25  l, "  FROM aux.%
4ea0: 73 20 42 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20  s B\n", zId);.  
4eb0: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
4ec0: 22 20 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53  " WHERE NOT EXIS
4ed0: 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  TS(SELECT 1 FROM
4ee0: 20 6d 61 69 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a   main.%s A\n", z
4ef0: 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20 20 20  Id);.  zSep =   
4f00: 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20         "        
4f10: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
4f20: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ";.  for(i=0; i<
4f30: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nPk; i++){.    s
4f40: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
4f50: 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a  %s A.%s=B.%s", z
4f60: 53 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69  Sep, az[i], az[i
4f70: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ]);.    zSep = "
4f80: 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74 72   AND";.  }.  str
4f90: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 29 5c  Printf(&sql, ")\
4fa0: 6e 20 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20  n ORDER BY");.  
4fb0: 7a 53 65 70 20 3d 20 22 20 22 3b 0a 20 20 66 6f  zSep = " ";.  fo
4fc0: 72 28 69 3d 31 3b 20 69 3c 3d 6e 50 6b 3b 20 69  r(i=1; i<=nPk; i
4fd0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e  ++){.    strPrin
4fe0: 74 66 28 26 73 71 6c 2c 20 22 25 73 25 64 22 2c  tf(&sql, "%s%d",
4ff0: 20 7a 53 65 70 2c 20 69 29 3b 0a 20 20 20 20 7a   zSep, i);.    z
5000: 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a  Sep = ", ";.  }.
5010: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
5020: 2c 20 22 3b 5c 6e 22 29 3b 0a 0a 20 20 69 66 28  , ";\n");..  if(
5030: 20 67 2e 66 44 65 62 75 67 20 26 20 44 45 42 55   g.fDebug & DEBU
5040: 47 5f 44 49 46 46 5f 53 51 4c 20 29 7b 20 0a 20  G_DIFF_SQL ){ . 
5050: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 20 66     printf("SQL f
5060: 6f 72 20 25 73 3a 5c 6e 25 73 5c 6e 22 2c 20 7a  or %s:\n%s\n", z
5070: 49 64 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20 20 20  Id, sql.z);.    
5080: 67 6f 74 6f 20 65 6e 64 5f 64 69 66 66 5f 6f 6e  goto end_diff_on
5090: 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  e_table;.  }..  
50a0: 2f 2a 20 44 72 6f 70 20 69 6e 64 65 78 65 73 20  /* Drop indexes 
50b0: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
50c0: 20 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74   in the destinat
50d0: 69 6f 6e 20 2a 2f 0a 20 20 70 53 74 6d 74 20 3d  ion */.  pStmt =
50e0: 20 64 62 5f 70 72 65 70 61 72 65 28 0a 20 20 20   db_prepare(.   
50f0: 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
5100: 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d  OM main.sqlite_m
5110: 61 73 74 65 72 22 0a 20 20 20 20 22 20 57 48 45  aster".    " WHE
5120: 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
5130: 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 22  AND tbl_name=%Q"
5140: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 73 71 6c  .    "   AND sql
5150: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20   IS NOT NULL".  
5160: 20 20 22 20 20 20 41 4e 44 20 73 71 6c 20 4e 4f    "   AND sql NO
5170: 54 20 49 4e 20 28 53 45 4c 45 43 54 20 73 71 6c  T IN (SELECT sql
5180: 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65   FROM aux.sqlite
5190: 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 22 20 20  _master".    "  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e    WHERE type='in
51c0: 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d  dex' AND tbl_nam
51d0: 65 3d 25 51 22 0a 20 20 20 20 22 20 20 20 20 20  e=%Q".    "     
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54 20   AND sql IS NOT 
5200: 4e 55 4c 4c 29 22 2c 0a 20 20 20 20 7a 54 61 62  NULL)",.    zTab
5210: 2c 20 7a 54 61 62 29 3b 0a 20 20 77 68 69 6c 65  , zTab);.  while
5220: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
5230: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
5240: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
5250: 20 3d 20 73 61 66 65 49 64 28 28 63 6f 6e 73 74   = safeId((const
5260: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
5270: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
5280: 2c 30 29 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ,0));.    fprint
5290: 66 28 6f 75 74 2c 20 22 44 52 4f 50 20 49 4e 44  f(out, "DROP IND
52a0: 45 58 20 25 73 3b 5c 6e 22 2c 20 7a 29 3b 0a 20  EX %s;\n", z);. 
52b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
52c0: 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  z);.  }.  sqlite
52d0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
52e0: 29 3b 0a 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65  );..  /* Run the
52f0: 20 71 75 65 72 79 20 61 6e 64 20 6f 75 74 70 75   query and outpu
5300: 74 20 64 69 66 66 65 72 65 6e 63 65 73 20 2a 2f  t differences */
5310: 0a 20 20 69 66 28 20 21 67 2e 62 53 63 68 65 6d  .  if( !g.bSchem
5320: 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 53 74  aOnly ){.    pSt
5330: 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28  mt = db_prepare(
5340: 22 25 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20  "%s", sql.z);.  
5350: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
5360: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
5370: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
5380: 20 20 69 6e 74 20 69 54 79 70 65 20 3d 20 73 71    int iType = sq
5390: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
53a0: 28 70 53 74 6d 74 2c 20 6e 50 6b 29 3b 0a 20 20  (pStmt, nPk);.  
53b0: 20 20 20 20 69 66 28 20 69 54 79 70 65 3d 3d 31      if( iType==1
53c0: 20 7c 7c 20 69 54 79 70 65 3d 3d 32 20 29 7b 0a   || iType==2 ){.
53d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 54 79 70          if( iTyp
53e0: 65 3d 3d 31 20 29 7b 20 20 20 20 20 20 20 2f 2a  e==1 ){       /*
53f0: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   Change the cont
5400: 65 6e 74 20 6f 66 20 61 20 72 6f 77 20 2a 2f 0a  ent of a row */.
5410: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
5420: 66 28 6f 75 74 2c 20 22 55 50 44 41 54 45 20 25  f(out, "UPDATE %
5430: 73 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  s", zId);.      
5440: 20 20 20 20 7a 53 65 70 20 3d 20 22 20 53 45 54      zSep = " SET
5450: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ";.          for
5460: 28 69 3d 6e 50 6b 2b 31 3b 20 69 3c 6e 51 3b 20  (i=nPk+1; i<nQ; 
5470: 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  i+=2){.         
5480: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
5490: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
54a0: 69 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i)==0 ) continue
54b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
54c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 20 25  rintf(out, "%s %
54d0: 73 3d 22 2c 20 7a 53 65 70 2c 20 61 7a 32 5b 28  s=", zSep, az2[(
54e0: 69 2b 6e 50 6b 2d 31 29 2f 32 5d 29 3b 0a 20 20  i+nPk-1)/2]);.  
54f0: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
5500: 20 22 2c 22 3b 0a 20 20 20 20 20 20 20 20 20 20   ",";.          
5510: 20 20 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75    printQuoted(ou
5520: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t, sqlite3_colum
5530: 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 69 2b  n_value(pStmt,i+
5540: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  1));.          }
5550: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5570: 2a 20 44 65 6c 65 74 65 20 61 20 72 6f 77 20 2a  * Delete a row *
5580: 2f 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  /.          fpri
5590: 6e 74 66 28 6f 75 74 2c 20 22 44 45 4c 45 54 45  ntf(out, "DELETE
55a0: 20 46 52 4f 4d 20 25 73 22 2c 20 7a 49 64 29 3b   FROM %s", zId);
55b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
55c0: 20 20 20 7a 53 65 70 20 3d 20 22 20 57 48 45 52     zSep = " WHER
55d0: 45 22 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  E";.        for(
55e0: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
55f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
5600: 6e 74 66 28 6f 75 74 2c 20 22 25 73 20 25 73 3d  ntf(out, "%s %s=
5610: 22 2c 20 7a 53 65 70 2c 20 61 7a 32 5b 69 5d 29  ", zSep, az2[i])
5620: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e  ;.          prin
5630: 74 51 75 6f 74 65 64 28 6f 75 74 2c 20 73 71 6c  tQuoted(out, sql
5640: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
5650: 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  e(pStmt,i));.   
5660: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20         zSep = " 
5670: 41 4e 44 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  AND";.        }.
5680: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
5690: 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20  out, ";\n");.   
56a0: 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20     }else{       
56b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
56c0: 73 65 72 74 20 61 20 72 6f 77 20 2a 2f 0a 20 20  sert a row */.  
56d0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
56e0: 74 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  t, "INSERT INTO 
56f0: 25 73 28 25 73 22 2c 20 7a 49 64 2c 20 61 7a 32  %s(%s", zId, az2
5700: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
5710: 72 28 69 3d 31 3b 20 61 7a 32 5b 69 5d 3b 20 69  r(i=1; az2[i]; i
5720: 2b 2b 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ++) fprintf(out,
5730: 20 22 2c 25 73 22 2c 20 61 7a 32 5b 69 5d 29 3b   ",%s", az2[i]);
5740: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
5750: 28 6f 75 74 2c 20 22 29 20 56 41 4c 55 45 53 22  (out, ") VALUES"
5760: 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20  );.        zSep 
5770: 3d 20 22 28 22 3b 0a 20 20 20 20 20 20 20 20 66  = "(";.        f
5780: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 32 3b 20  or(i=0; i<nPk2; 
5790: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
57a0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
57b0: 22 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 20 20  ", zSep);.      
57c0: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a      zSep = ",";.
57d0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 51            printQ
57e0: 75 6f 74 65 64 28 6f 75 74 2c 20 73 71 6c 69 74  uoted(out, sqlit
57f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
5800: 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20  pStmt,i));.     
5810: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
5820: 28 69 3d 6e 50 6b 32 2b 32 3b 20 69 3c 6e 51 3b  (i=nPk2+2; i<nQ;
5830: 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20   i+=2){.        
5840: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
5850: 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ,");.          p
5860: 72 69 6e 74 51 75 6f 74 65 64 28 6f 75 74 2c 20  rintQuoted(out, 
5870: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
5880: 61 6c 75 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  alue(pStmt,i));.
5890: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
58a0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
58b0: 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  );\n");.      }.
58c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
58d0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
58e0: 29 3b 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  );.  } /* endif 
58f0: 21 67 2e 62 53 63 68 65 6d 61 4f 6e 6c 79 20 2a  !g.bSchemaOnly *
5900: 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 69  /..  /* Create i
5910: 6e 64 65 78 65 73 20 74 68 61 74 20 61 72 65 20  ndexes that are 
5920: 6d 69 73 73 69 6e 67 20 69 6e 20 74 68 65 20 73  missing in the s
5930: 6f 75 72 63 65 20 2a 2f 0a 20 20 70 53 74 6d 74  ource */.  pStmt
5940: 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28 0a 20   = db_prepare(. 
5950: 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
5960: 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d  ROM aux.sqlite_m
5970: 61 73 74 65 72 22 0a 20 20 20 20 22 20 57 48 45  aster".    " WHE
5980: 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
5990: 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 22  AND tbl_name=%Q"
59a0: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 73 71 6c  .    "   AND sql
59b0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20   IS NOT NULL".  
59c0: 20 20 22 20 20 20 41 4e 44 20 73 71 6c 20 4e 4f    "   AND sql NO
59d0: 54 20 49 4e 20 28 53 45 4c 45 43 54 20 73 71 6c  T IN (SELECT sql
59e0: 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74   FROM main.sqlit
59f0: 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 22 20  e_master".    " 
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 69     WHERE type='i
5a20: 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61  ndex' AND tbl_na
5a30: 6d 65 3d 25 51 22 0a 20 20 20 20 22 20 20 20 20  me=%Q".    "    
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54    AND sql IS NOT
5a60: 20 4e 55 4c 4c 29 22 2c 0a 20 20 20 20 7a 54 61   NULL)",.    zTa
5a70: 62 2c 20 7a 54 61 62 29 3b 0a 20 20 77 68 69 6c  b, zTab);.  whil
5a80: 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
5a90: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
5aa0: 74 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  t) ){.    fprint
5ab0: 66 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  f(out, "%s;\n", 
5ac0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5ad0: 65 78 74 28 70 53 74 6d 74 2c 30 29 29 3b 0a 20  ext(pStmt,0));. 
5ae0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
5af0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 0a 65  alize(pStmt);..e
5b00: 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c  nd_diff_one_tabl
5b10: 65 3a 0a 20 20 73 74 72 46 72 65 65 28 26 73 71  e:.  strFree(&sq
5b20: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
5b30: 65 65 28 7a 49 64 29 3b 0a 20 20 6e 61 6d 65 6c  ee(zId);.  namel
5b40: 69 73 74 46 72 65 65 28 61 7a 29 3b 0a 20 20 6e  istFree(az);.  n
5b50: 61 6d 65 6c 69 73 74 46 72 65 65 28 61 7a 32 29  amelistFree(az2)
5b60: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
5b70: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
5b80: 74 61 62 6c 65 20 7a 54 61 62 20 65 78 69 73 74  table zTab exist
5b90: 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
5ba0: 6d 65 20 73 63 68 65 6d 61 20 69 6e 20 62 6f 74  me schema in bot
5bb0: 68 20 74 68 65 20 22 6d 61 69 6e 22 0a 2a 2a 20  h the "main".** 
5bc0: 61 6e 64 20 22 61 75 78 22 20 64 61 74 61 62 61  and "aux" databa
5bd0: 73 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  ses currently op
5be0: 65 6e 65 64 20 62 79 20 74 68 65 20 67 6c 6f 62  ened by the glob
5bf0: 61 6c 20 64 62 20 68 61 6e 64 6c 65 2e 20 49 66  al db handle. If
5c00: 20 74 68 65 79 0a 2a 2a 20 64 6f 20 6e 6f 74 2c   they.** do not,
5c10: 20 6f 75 74 70 75 74 20 61 6e 20 65 72 72 6f 72   output an error
5c20: 20 6d 65 73 73 61 67 65 20 6f 6e 20 73 74 64 65   message on stde
5c30: 72 72 20 61 6e 64 20 65 78 69 74 28 31 29 2e 20  rr and exit(1). 
5c40: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
5c50: 20 74 68 65 20 73 63 68 65 6d 61 73 20 64 6f 20   the schemas do 
5c60: 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 63 6f  match, return co
5c70: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 63 61 6c  ntrol to the cal
5c80: 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ler..*/.static v
5c90: 6f 69 64 20 63 68 65 63 6b 53 63 68 65 6d 61 73  oid checkSchemas
5ca0: 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
5cb0: 20 2a 7a 54 61 62 29 7b 0a 20 20 73 71 6c 69 74   *zTab){.  sqlit
5cc0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
5cd0: 20 64 62 5f 70 72 65 70 61 72 65 28 0a 20 20 20   db_prepare(.   
5ce0: 20 20 20 22 53 45 4c 45 43 54 20 41 2e 73 71 6c     "SELECT A.sql
5cf0: 3d 42 2e 73 71 6c 20 46 52 4f 4d 20 6d 61 69 6e  =B.sql FROM main
5d00: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41  .sqlite_master A
5d10: 2c 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73  , aux.sqlite_mas
5d20: 74 65 72 20 42 22 0a 20 20 20 20 20 20 22 20 57  ter B".      " W
5d30: 48 45 52 45 20 41 2e 6e 61 6d 65 3d 25 51 20 41  HERE A.name=%Q A
5d40: 4e 44 20 42 2e 6e 61 6d 65 3d 25 51 22 2c 20 7a  ND B.name=%Q", z
5d50: 54 61 62 2c 20 7a 54 61 62 0a 20 20 29 3b 0a 20  Tab, zTab.  );. 
5d60: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
5d70: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
5d80: 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  tmt) ){.    if( 
5d90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
5da0: 6e 74 28 70 53 74 6d 74 2c 30 29 3d 3d 30 20 29  nt(pStmt,0)==0 )
5db0: 7b 0a 20 20 20 20 20 20 72 75 6e 74 69 6d 65 45  {.      runtimeE
5dc0: 72 72 6f 72 28 22 73 63 68 65 6d 61 20 63 68 61  rror("schema cha
5dd0: 6e 67 65 73 20 66 6f 72 20 74 61 62 6c 65 20 25  nges for table %
5de0: 73 22 2c 20 73 61 66 65 49 64 28 7a 54 61 62 29  s", safeId(zTab)
5df0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5e00: 7b 0a 20 20 20 20 72 75 6e 74 69 6d 65 45 72 72  {.    runtimeErr
5e10: 6f 72 28 22 74 61 62 6c 65 20 25 73 20 6d 69 73  or("table %s mis
5e20: 73 69 6e 67 20 66 72 6f 6d 20 6f 6e 65 20 6f 72  sing from one or
5e30: 20 62 6f 74 68 20 64 61 74 61 62 61 73 65 73 22   both databases"
5e40: 2c 20 73 61 66 65 49 64 28 7a 54 61 62 29 29 3b  , safeId(zTab));
5e50: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
5e60: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
5e70: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
5e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5ec0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5ed0: 63 6f 64 65 20 69 73 20 63 6f 70 69 65 64 20 66  code is copied f
5ee0: 72 6f 6d 20 66 6f 73 73 69 6c 2e 20 49 74 20 69  rom fossil. It i
5ef0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
5f00: 74 65 20 74 68 65 0a 2a 2a 20 66 6f 73 73 69 6c  te the.** fossil
5f10: 20 64 65 6c 74 61 20 62 6c 6f 62 73 20 73 6f 6d   delta blobs som
5f20: 65 74 69 6d 65 73 20 75 73 65 64 20 69 6e 20 52  etimes used in R
5f30: 42 55 20 75 70 64 61 74 65 20 72 65 63 6f 72 64  BU update record
5f40: 73 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 75  s..*/..typedef u
5f50: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 75 31  nsigned short u1
5f60: 36 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  6;.typedef unsig
5f70: 6e 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70  ned int u32;.typ
5f80: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
5f90: 61 72 20 75 38 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ar u8;../*.** Th
5fa0: 65 20 77 69 64 74 68 20 6f 66 20 61 20 68 61 73  e width of a has
5fb0: 68 20 77 69 6e 64 6f 77 20 69 6e 20 62 79 74 65  h window in byte
5fc0: 73 2e 20 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s.  The algorith
5fd0: 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
5fe0: 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 6f 77  this.** is a pow
5ff0: 65 72 20 6f 66 20 32 2e 0a 2a 2f 0a 23 64 65 66  er of 2..*/.#def
6000: 69 6e 65 20 4e 48 41 53 48 20 31 36 0a 0a 2f 2a  ine NHASH 16../*
6010: 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
6020: 73 74 61 74 65 20 6f 66 20 74 68 65 20 72 6f 6c  state of the rol
6030: 6c 69 6e 67 20 68 61 73 68 2e 0a 2a 2a 0a 2a 2a  ling hash..**.**
6040: 20 7a 5b 5d 20 68 6f 6c 64 73 20 74 68 65 20 76   z[] holds the v
6050: 61 6c 75 65 73 20 74 68 61 74 20 68 61 76 65 20  alues that have 
6060: 62 65 65 6e 20 68 61 73 68 65 64 2e 20 20 7a 5b  been hashed.  z[
6070: 5d 20 69 73 20 61 20 63 69 72 63 75 6c 61 72 20  ] is a circular 
6080: 62 75 66 66 65 72 2e 0a 2a 2a 20 7a 5b 69 5d 20  buffer..** z[i] 
6090: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
60a0: 72 79 20 61 6e 64 20 7a 5b 28 69 2b 4e 48 41 53  ry and z[(i+NHAS
60b0: 48 2d 31 29 25 4e 48 41 53 48 5d 20 69 73 20 74  H-1)%NHASH] is t
60c0: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 66  he last entry of
60d0: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 2e 0a  .** the window..
60e0: 2a 2a 0a 2a 2a 20 48 61 73 68 2e 61 20 69 73 20  **.** Hash.a is 
60f0: 74 68 65 20 73 75 6d 20 6f 66 20 61 6c 6c 20 65  the sum of all e
6100: 6c 65 6d 65 6e 74 73 20 6f 66 20 68 61 73 68 2e  lements of hash.
6110: 7a 5b 5d 2e 20 20 48 61 73 68 2e 62 20 69 73 20  z[].  Hash.b is 
6120: 61 20 77 65 69 67 68 74 65 64 0a 2a 2a 20 73 75  a weighted.** su
6130: 6d 2e 20 20 48 61 73 68 2e 62 20 69 73 20 7a 5b  m.  Hash.b is z[
6140: 69 5d 2a 4e 48 41 53 48 20 2b 20 7a 5b 69 2b 31  i]*NHASH + z[i+1
6150: 5d 2a 28 4e 48 41 53 48 2d 31 29 20 2b 20 2e 2e  ]*(NHASH-1) + ..
6160: 2e 20 2b 20 7a 5b 69 2b 4e 48 41 53 48 2d 31 5d  . + z[i+NHASH-1]
6170: 2a 31 2e 0a 2a 2a 20 28 45 61 63 68 20 69 6e 64  *1..** (Each ind
6180: 65 78 20 66 6f 72 20 7a 5b 5d 20 73 68 6f 75 6c  ex for z[] shoul
6190: 64 20 62 65 20 6d 6f 64 75 6c 65 20 4e 48 41 53  d be module NHAS
61a0: 48 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 54  H, of course.  T
61b0: 68 65 20 25 4e 48 41 53 48 20 6f 70 65 72 61 74  he %NHASH operat
61c0: 6f 72 0a 2a 2a 20 69 73 20 6f 6d 69 74 74 65 64  or.** is omitted
61d0: 20 69 6e 20 74 68 65 20 70 72 69 6f 72 20 65 78   in the prior ex
61e0: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 62 72 65  pression for bre
61f0: 76 69 74 79 2e 29 0a 2a 2f 0a 74 79 70 65 64 65  vity.).*/.typede
6200: 66 20 73 74 72 75 63 74 20 68 61 73 68 20 68 61  f struct hash ha
6210: 73 68 3b 0a 73 74 72 75 63 74 20 68 61 73 68 20  sh;.struct hash 
6220: 7b 0a 20 20 75 31 36 20 61 2c 20 62 3b 20 20 20  {.  u16 a, b;   
6230: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 76 61        /* Hash va
6240: 6c 75 65 73 20 2a 2f 0a 20 20 75 31 36 20 69 3b  lues */.  u16 i;
6250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6260: 74 61 72 74 20 6f 66 20 74 68 65 20 68 61 73 68  tart of the hash
6270: 20 77 69 6e 64 6f 77 20 2a 2f 0a 20 20 63 68 61   window */.  cha
6280: 72 20 7a 5b 4e 48 41 53 48 5d 3b 20 20 20 20 2f  r z[NHASH];    /
6290: 2a 20 54 68 65 20 76 61 6c 75 65 73 20 74 68 61  * The values tha
62a0: 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 73 68  t have been hash
62b0: 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ed */.};../*.** 
62c0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
62d0: 6f 6c 6c 69 6e 67 20 68 61 73 68 20 75 73 69 6e  olling hash usin
62e0: 67 20 74 68 65 20 66 69 72 73 74 20 4e 48 41 53  g the first NHAS
62f0: 48 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  H characters of 
6300: 7a 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  z[].*/.static vo
6310: 69 64 20 68 61 73 68 5f 69 6e 69 74 28 68 61 73  id hash_init(has
6320: 68 20 2a 70 48 61 73 68 2c 20 63 6f 6e 73 74 20  h *pHash, const 
6330: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 31 36 20  char *z){.  u16 
6340: 61 2c 20 62 2c 20 69 3b 0a 20 20 61 20 3d 20 62  a, b, i;.  a = b
6350: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
6360: 20 69 3c 4e 48 41 53 48 3b 20 69 2b 2b 29 7b 0a   i<NHASH; i++){.
6370: 20 20 20 20 61 20 2b 3d 20 7a 5b 69 5d 3b 0a 20      a += z[i];. 
6380: 20 20 20 62 20 2b 3d 20 28 4e 48 41 53 48 2d 69     b += (NHASH-i
6390: 29 2a 7a 5b 69 5d 3b 0a 20 20 20 20 70 48 61 73  )*z[i];.    pHas
63a0: 68 2d 3e 7a 5b 69 5d 20 3d 20 7a 5b 69 5d 3b 0a  h->z[i] = z[i];.
63b0: 20 20 7d 0a 20 20 70 48 61 73 68 2d 3e 61 20 3d    }.  pHash->a =
63c0: 20 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20 70   a & 0xffff;.  p
63d0: 48 61 73 68 2d 3e 62 20 3d 20 62 20 26 20 30 78  Hash->b = b & 0x
63e0: 66 66 66 66 3b 0a 20 20 70 48 61 73 68 2d 3e 69  ffff;.  pHash->i
63f0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   = 0;.}../*.** A
6400: 64 76 61 6e 63 65 20 74 68 65 20 72 6f 6c 6c 69  dvance the rolli
6410: 6e 67 20 68 61 73 68 20 62 79 20 61 20 73 69 6e  ng hash by a sin
6420: 67 6c 65 20 63 68 61 72 61 63 74 65 72 20 22 63  gle character "c
6430: 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ".*/.static void
6440: 20 68 61 73 68 5f 6e 65 78 74 28 68 61 73 68 20   hash_next(hash 
6450: 2a 70 48 61 73 68 2c 20 69 6e 74 20 63 29 7b 0a  *pHash, int c){.
6460: 20 20 75 31 36 20 6f 6c 64 20 3d 20 70 48 61 73    u16 old = pHas
6470: 68 2d 3e 7a 5b 70 48 61 73 68 2d 3e 69 5d 3b 0a  h->z[pHash->i];.
6480: 20 20 70 48 61 73 68 2d 3e 7a 5b 70 48 61 73 68    pHash->z[pHash
6490: 2d 3e 69 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a  ->i] = (char)c;.
64a0: 20 20 70 48 61 73 68 2d 3e 69 20 3d 20 28 70 48    pHash->i = (pH
64b0: 61 73 68 2d 3e 69 2b 31 29 26 28 4e 48 41 53 48  ash->i+1)&(NHASH
64c0: 2d 31 29 3b 0a 20 20 70 48 61 73 68 2d 3e 61 20  -1);.  pHash->a 
64d0: 3d 20 70 48 61 73 68 2d 3e 61 20 2d 20 6f 6c 64  = pHash->a - old
64e0: 20 2b 20 28 63 68 61 72 29 63 3b 0a 20 20 70 48   + (char)c;.  pH
64f0: 61 73 68 2d 3e 62 20 3d 20 70 48 61 73 68 2d 3e  ash->b = pHash->
6500: 62 20 2d 20 4e 48 41 53 48 2a 6f 6c 64 20 2b 20  b - NHASH*old + 
6510: 70 48 61 73 68 2d 3e 61 3b 0a 7d 0a 0a 2f 2a 0a  pHash->a;.}../*.
6520: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
6530: 69 74 20 68 61 73 68 20 76 61 6c 75 65 0a 2a 2f  it hash value.*/
6540: 0a 73 74 61 74 69 63 20 75 33 32 20 68 61 73 68  .static u32 hash
6550: 5f 33 32 62 69 74 28 68 61 73 68 20 2a 70 48 61  _32bit(hash *pHa
6560: 73 68 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  sh){.  return (p
6570: 48 61 73 68 2d 3e 61 20 26 20 30 78 66 66 66 66  Hash->a & 0xffff
6580: 29 20 7c 20 28 28 28 75 33 32 29 28 70 48 61 73  ) | (((u32)(pHas
6590: 68 2d 3e 62 20 26 20 30 78 66 66 66 66 29 29 3c  h->b & 0xffff))<
65a0: 3c 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  <16);.}../*.** W
65b0: 72 69 74 65 20 61 6e 20 62 61 73 65 2d 36 34 20  rite an base-64 
65c0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
65d0: 20 67 69 76 65 6e 20 62 75 66 66 65 72 2e 0a 2a   given buffer..*
65e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
65f0: 74 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 69 6e  tInt(unsigned in
6600: 74 20 76 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b  t v, char **pz){
6610: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
6620: 63 68 61 72 20 7a 44 69 67 69 74 73 5b 5d 20 3d  char zDigits[] =
6630: 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
6640: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
6650: 51 52 53 54 55 56 57 58 59 5a 5f 61 62 63 64 65  QRSTUVWXYZ_abcde
6660: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
6670: 76 77 78 79 7a 7e 22 3b 0a 20 20 2f 2a 20 20 31  vwxyz~";.  /*  1
6680: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
6690: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
66a0: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
66b0: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a   123456789 123 *
66c0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
66d0: 63 68 61 72 20 7a 42 75 66 5b 32 30 5d 3b 0a 20  char zBuf[20];. 
66e0: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
66f0: 20 2a 28 2a 70 7a 29 2b 2b 20 3d 20 27 30 27 3b   *(*pz)++ = '0';
6700: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6710: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 76 3e 30 3b  .  for(i=0; v>0;
6720: 20 69 2b 2b 2c 20 76 3e 3e 3d 36 29 7b 0a 20 20   i++, v>>=6){.  
6730: 20 20 7a 42 75 66 5b 69 5d 20 3d 20 7a 44 69 67    zBuf[i] = zDig
6740: 69 74 73 5b 76 26 30 78 33 66 5d 3b 0a 20 20 7d  its[v&0x3f];.  }
6750: 0a 20 20 66 6f 72 28 6a 3d 69 2d 31 3b 20 6a 3e  .  for(j=i-1; j>
6760: 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 2a 28  =0; j--){.    *(
6770: 2a 70 7a 29 2b 2b 20 3d 20 7a 42 75 66 5b 6a 5d  *pz)++ = zBuf[j]
6780: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
6790: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
67a0: 20 64 69 67 69 74 73 20 69 6e 20 74 68 65 20 62   digits in the b
67b0: 61 73 65 2d 36 34 20 72 65 70 72 65 73 65 6e 74  ase-64 represent
67c0: 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f 73 69 74  ation of a posit
67d0: 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73  ive integer.*/.s
67e0: 74 61 74 69 63 20 69 6e 74 20 64 69 67 69 74 5f  tatic int digit_
67f0: 63 6f 75 6e 74 28 69 6e 74 20 76 29 7b 0a 20 20  count(int v){.  
6800: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
6810: 78 3b 0a 20 20 66 6f 72 28 69 3d 31 2c 20 78 3d  x;.  for(i=1, x=
6820: 36 34 3b 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  64; (unsigned in
6830: 74 29 76 3e 3d 78 3b 20 69 2b 2b 2c 20 78 20 3c  t)v>=x; i++, x <
6840: 3c 3d 20 36 29 7b 7d 0a 20 20 72 65 74 75 72 6e  <= 6){}.  return
6850: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   i;.}../*.** Com
6860: 70 75 74 65 20 61 20 33 32 2d 62 69 74 20 63 68  pute a 32-bit ch
6870: 65 63 6b 73 75 6d 20 6f 6e 20 74 68 65 20 4e 2d  ecksum on the N-
6880: 62 79 74 65 20 62 75 66 66 65 72 2e 20 20 52 65  byte buffer.  Re
6890: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
68a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
68b0: 6e 65 64 20 69 6e 74 20 63 68 65 63 6b 73 75 6d  ned int checksum
68c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
68d0: 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20 63  , size_t N){.  c
68e0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
68f0: 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75  ar *z = (const u
6900: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a  nsigned char *)z
6910: 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73  In;.  unsigned s
6920: 75 6d 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  um0 = 0;.  unsig
6930: 6e 65 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20 20  ned sum1 = 0;.  
6940: 75 6e 73 69 67 6e 65 64 20 73 75 6d 32 20 3d 20  unsigned sum2 = 
6950: 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75  0;.  unsigned su
6960: 6d 33 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  m3 = 0;.  while(
6970: 4e 20 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73 75  N >= 16){.    su
6980: 6d 30 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64  m0 += ((unsigned
6990: 29 7a 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20 7a  )z[0] + z[4] + z
69a0: 5b 38 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20 20  [8] + z[12]);.  
69b0: 20 20 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73 69    sum1 += ((unsi
69c0: 67 6e 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d  gned)z[1] + z[5]
69d0: 20 2b 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29   + z[9] + z[13])
69e0: 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d 20 28 28  ;.    sum2 += ((
69f0: 75 6e 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b 20  unsigned)z[2] + 
6a00: 7a 5b 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a 5b  z[6] + z[10]+ z[
6a10: 31 34 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20 2b  14]);.    sum3 +
6a20: 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 33  = ((unsigned)z[3
6a30: 5d 20 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31 5d  ] + z[7] + z[11]
6a40: 2b 20 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a 20  + z[15]);.    z 
6a50: 2b 3d 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d 20  += 16;.    N -= 
6a60: 31 36 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  16;.  }.  while(
6a70: 4e 20 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75 6d  N >= 4){.    sum
6a80: 30 20 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 73  0 += z[0];.    s
6a90: 75 6d 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20 20  um1 += z[1];.   
6aa0: 20 73 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a 20   sum2 += z[2];. 
6ab0: 20 20 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d 3b     sum3 += z[3];
6ac0: 0a 20 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20 20  .    z += 4;.   
6ad0: 20 4e 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20 73   N -= 4;.  }.  s
6ae0: 75 6d 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c 20  um3 += (sum2 << 
6af0: 38 29 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31 36  8) + (sum1 << 16
6b00: 29 20 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34 29  ) + (sum0 << 24)
6b10: 3b 0a 20 20 73 77 69 74 63 68 28 4e 29 7b 0a 20  ;.  switch(N){. 
6b20: 20 20 20 63 61 73 65 20 33 3a 20 20 20 73 75 6d     case 3:   sum
6b30: 33 20 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38 29  3 += (z[2] << 8)
6b40: 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 20 20 20  ;.    case 2:   
6b50: 73 75 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c 3c  sum3 += (z[1] <<
6b60: 20 31 36 29 3b 0a 20 20 20 20 63 61 73 65 20 31   16);.    case 1
6b70: 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 30  :   sum3 += (z[0
6b80: 5d 20 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64 65  ] << 24);.    de
6b90: 66 61 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20 20  fault:  ;.  }.  
6ba0: 72 65 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a 0a  return sum3;.}..
6bb0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
6bc0: 65 77 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20  ew delta..**.** 
6bd0: 54 68 65 20 64 65 6c 74 61 20 69 73 20 77 72 69  The delta is wri
6be0: 74 74 65 6e 20 69 6e 74 6f 20 61 20 70 72 65 61  tten into a prea
6bf0: 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2c  llocated buffer,
6c00: 20 7a 44 65 6c 74 61 2c 20 77 68 69 63 68 0a 2a   zDelta, which.*
6c10: 2a 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  * should be at l
6c20: 65 61 73 74 20 36 30 20 62 79 74 65 73 20 6c 6f  east 60 bytes lo
6c30: 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 74 61  nger than the ta
6c40: 72 67 65 74 20 66 69 6c 65 2c 20 7a 4f 75 74 2e  rget file, zOut.
6c50: 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 73 74  .** The delta st
6c60: 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 4e 55 4c  ring will be NUL
6c70: 2d 74 65 72 6d 69 6e 61 74 65 64 2c 20 62 75 74  -terminated, but
6c80: 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 20 63   it might also c
6c90: 6f 6e 74 61 69 6e 0a 2a 2a 20 65 6d 62 65 64 64  ontain.** embedd
6ca0: 65 64 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72  ed NUL character
6cb0: 73 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  s if either the 
6cc0: 7a 53 72 63 20 6f 72 20 7a 4f 75 74 20 66 69 6c  zSrc or zOut fil
6cd0: 65 73 20 61 72 65 0a 2a 2a 20 62 69 6e 61 72 79  es are.** binary
6ce0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
6cf0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6c 65 6e   returns the len
6d00: 67 74 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61  gth of the delta
6d10: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 62 79   string.** in by
6d20: 74 65 73 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  tes, excluding t
6d30: 68 65 20 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72  he final NUL ter
6d40: 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65  minator characte
6d50: 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  r..**.** Output 
6d60: 46 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 54 68  Format:.**.** Th
6d70: 65 20 64 65 6c 74 61 20 62 65 67 69 6e 73 20 77  e delta begins w
6d80: 69 74 68 20 61 20 62 61 73 65 36 34 20 6e 75 6d  ith a base64 num
6d90: 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ber followed by 
6da0: 61 20 6e 65 77 6c 69 6e 65 2e 20 20 54 68 69 73  a newline.  This
6db0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 73 20 74 68  .** number is th
6dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
6dd0: 73 20 69 6e 20 74 68 65 20 54 41 52 47 45 54 20  s in the TARGET 
6de0: 66 69 6c 65 2e 20 20 54 68 75 73 2c 20 67 69 76  file.  Thus, giv
6df0: 65 6e 20 61 0a 2a 2a 20 64 65 6c 74 61 20 66 69  en a.** delta fi
6e00: 6c 65 20 7a 2c 20 61 20 70 72 6f 67 72 61 6d 20  le z, a program 
6e10: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
6e20: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70  size of the outp
6e30: 75 74 20 66 69 6c 65 0a 2a 2a 20 73 69 6d 70 6c  ut file.** simpl
6e40: 79 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  y by reading the
6e50: 20 66 69 72 73 74 20 6c 69 6e 65 20 61 6e 64 20   first line and 
6e60: 64 65 63 6f 64 69 6e 67 20 74 68 65 20 62 61 73  decoding the bas
6e70: 65 2d 36 34 20 6e 75 6d 62 65 72 0a 2a 2a 20 66  e-64 number.** f
6e80: 6f 75 6e 64 20 74 68 65 72 65 2e 20 20 54 68 65  ound there.  The
6e90: 20 64 65 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69   delta_output_si
6ea0: 7a 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  ze() routine doe
6eb0: 73 20 65 78 61 63 74 6c 79 20 74 68 69 73 2e 0a  s exactly this..
6ec0: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
6ed0: 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6e 75 6d  initial size num
6ee0: 62 65 72 2c 20 74 68 65 20 64 65 6c 74 61 20 63  ber, the delta c
6ef0: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65 72  onsists of a ser
6f00: 69 65 73 20 6f 66 0a 2a 2a 20 6c 69 74 65 72 61  ies of.** litera
6f10: 6c 20 74 65 78 74 20 73 65 67 6d 65 6e 74 73 20  l text segments 
6f20: 61 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 20  and commands to 
6f30: 63 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 53 4f  copy from the SO
6f40: 55 52 43 45 20 66 69 6c 65 2e 0a 2a 2a 20 41 20  URCE file..** A 
6f50: 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 6c 6f 6f  copy command loo
6f60: 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
6f70: 0a 2a 2a 20 20 20 20 20 4e 4e 4e 40 4d 4d 4d 2c  .**     NNN@MMM,
6f80: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4e 4e 4e  .**.** where NNN
6f90: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
6fa0: 66 20 62 79 74 65 73 20 74 6f 20 62 65 20 63 6f  f bytes to be co
6fb0: 70 69 65 64 20 61 6e 64 20 4d 4d 4d 20 69 73 20  pied and MMM is 
6fc0: 74 68 65 20 6f 66 66 73 65 74 0a 2a 2a 20 69 6e  the offset.** in
6fd0: 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 66 69  to the source fi
6fe0: 6c 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  le of the first 
6ff0: 62 79 74 65 20 28 62 6f 74 68 20 62 61 73 65 2d  byte (both base-
7000: 36 34 29 2e 20 20 20 49 66 20 4e 4e 4e 20 69 73  64).   If NNN is
7010: 20 30 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 63   0.** it means c
7020: 6f 70 79 20 74 68 65 20 72 65 73 74 20 6f 66 20  opy the rest of 
7030: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2e 20  the input file. 
7040: 20 4c 69 74 65 72 61 6c 20 74 65 78 74 20 69 73   Literal text is
7050: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
7060: 2a 20 20 20 20 20 4e 4e 4e 3a 54 54 54 54 54 0a  *     NNN:TTTTT.
7070: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4e 4e 4e 20  **.** where NNN 
7080: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
7090: 20 62 79 74 65 73 20 6f 66 20 74 65 78 74 20 28   bytes of text (
70a0: 62 61 73 65 2d 36 34 29 20 61 6e 64 20 54 54 54  base-64) and TTT
70b0: 54 54 20 69 73 20 74 68 65 20 74 65 78 74 2e 0a  TT is the text..
70c0: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 74  **.** The last t
70d0: 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f  erm is of the fo
70e0: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e 4e 4e  rm.**.**     NNN
70f0: 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ;.**.** In this 
7100: 63 61 73 65 2c 20 4e 4e 4e 20 69 73 20 61 20 33  case, NNN is a 3
7110: 32 2d 62 69 74 20 62 69 67 65 6e 64 69 61 6e 20  2-bit bigendian 
7120: 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20  checksum of the 
7130: 6f 75 74 70 75 74 20 66 69 6c 65 0a 2a 2a 20 74  output file.** t
7140: 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
7150: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
7160: 68 65 20 64 65 6c 74 61 20 61 70 70 6c 69 65 64  he delta applied
7170: 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 41 6c 6c   correctly.  All
7180: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 72 65 20  .** numbers are 
7190: 69 6e 20 62 61 73 65 2d 36 34 2e 0a 2a 2a 0a 2a  in base-64..**.*
71a0: 2a 20 50 75 72 65 20 74 65 78 74 20 66 69 6c 65  * Pure text file
71b0: 73 20 67 65 6e 65 72 61 74 65 20 61 20 70 75 72  s generate a pur
71c0: 65 20 74 65 78 74 20 64 65 6c 74 61 2e 20 20 42  e text delta.  B
71d0: 69 6e 61 72 79 20 66 69 6c 65 73 20 67 65 6e 65  inary files gene
71e0: 72 61 74 65 20 61 0a 2a 2a 20 64 65 6c 74 61 20  rate a.** delta 
71f0: 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  that may contain
7200: 20 73 6f 6d 65 20 62 69 6e 61 72 79 20 64 61 74   some binary dat
7210: 61 2e 0a 2a 2a 0a 2a 2a 20 41 6c 67 6f 72 69 74  a..**.** Algorit
7220: 68 6d 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 6e  hm:.**.** The en
7230: 63 6f 64 65 72 20 66 69 72 73 74 20 62 75 69 6c  coder first buil
7240: 64 73 20 61 20 68 61 73 68 20 74 61 62 6c 65 20  ds a hash table 
7250: 74 6f 20 68 65 6c 70 20 69 74 20 66 69 6e 64 20  to help it find 
7260: 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 70 61 74 74  matching.** patt
7270: 65 72 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  erns in the sour
7280: 63 65 20 66 69 6c 65 2e 20 20 31 36 2d 62 79 74  ce file.  16-byt
7290: 65 20 63 68 75 6e 6b 73 20 6f 66 20 74 68 65 20  e chunks of the 
72a0: 73 6f 75 72 63 65 20 66 69 6c 65 0a 2a 2a 20 73  source file.** s
72b0: 61 6d 70 6c 65 64 20 61 74 20 65 76 65 6e 6c 79  ampled at evenly
72c0: 20 73 70 61 63 65 64 20 69 6e 74 65 72 76 61 6c   spaced interval
72d0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 6f  s are used to po
72e0: 70 75 6c 61 74 65 20 74 68 65 20 68 61 73 68 0a  pulate the hash.
72f0: 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ** table..**.** 
7300: 4e 65 78 74 20 77 65 20 62 65 67 69 6e 20 73 63  Next we begin sc
7310: 61 6e 6e 69 6e 67 20 74 68 65 20 74 61 72 67 65  anning the targe
7320: 74 20 66 69 6c 65 20 75 73 69 6e 67 20 61 20 73  t file using a s
7330: 6c 69 64 69 6e 67 20 31 36 2d 62 79 74 65 0a 2a  liding 16-byte.*
7340: 2a 20 77 69 6e 64 6f 77 2e 20 20 54 68 65 20 68  * window.  The h
7350: 61 73 68 20 6f 66 20 74 68 65 20 31 36 2d 62 79  ash of the 16-by
7360: 74 65 20 77 69 6e 64 6f 77 20 69 6e 20 74 68 65  te window in the
7370: 20 74 61 72 67 65 74 20 69 73 20 75 73 65 64 20   target is used 
7380: 74 6f 0a 2a 2a 20 73 65 61 72 63 68 20 66 6f 72  to.** search for
7390: 20 61 20 6d 61 74 63 68 69 6e 67 20 73 65 63 74   a matching sect
73a0: 69 6f 6e 20 69 6e 20 74 68 65 20 73 6f 75 72 63  ion in the sourc
73b0: 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 61 20  e file.  When a 
73c0: 6d 61 74 63 68 0a 2a 2a 20 69 73 20 66 6f 75 6e  match.** is foun
73d0: 64 2c 20 61 20 63 6f 70 79 20 63 6f 6d 6d 61 6e  d, a copy comman
73e0: 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  d is added to th
73f0: 65 20 64 65 6c 74 61 2e 20 20 41 6e 20 65 66 66  e delta.  An eff
7400: 6f 72 74 20 69 73 0a 2a 2a 20 6d 61 64 65 20 74  ort is.** made t
7410: 6f 20 65 78 74 65 6e 64 20 74 68 65 20 6d 61 74  o extend the mat
7420: 63 68 69 6e 67 20 73 65 63 74 69 6f 6e 20 74 6f  ching section to
7430: 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 63 6f   regions that co
7440: 6d 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 64  me before.** and
7450: 20 61 66 74 65 72 20 74 68 65 20 31 36 2d 62 79   after the 16-by
7460: 74 65 20 68 61 73 68 20 77 69 6e 64 6f 77 2e 20  te hash window. 
7470: 20 41 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20   A copy command 
7480: 69 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 0a 2a  is only issued.*
7490: 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  * if the result 
74a0: 77 6f 75 6c 64 20 75 73 65 20 6c 65 73 73 20 73  would use less s
74b0: 70 61 63 65 20 74 68 61 74 20 6a 75 73 74 20 71  pace that just q
74c0: 75 6f 74 69 6e 67 20 74 68 65 20 74 65 78 74 0a  uoting the text.
74d0: 2a 2a 20 6c 69 74 65 72 61 6c 6c 79 2e 20 4c 69  ** literally. Li
74e0: 74 65 72 61 6c 20 74 65 78 74 20 69 73 20 61 64  teral text is ad
74f0: 64 65 64 20 74 6f 20 74 68 65 20 64 65 6c 74 61  ded to the delta
7500: 20 66 6f 72 20 73 65 63 74 69 6f 6e 73 20 74 68   for sections th
7510: 61 74 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 61 74  at.** do not mat
7520: 63 68 20 6f 72 20 77 68 69 63 68 20 63 61 6e 20  ch or which can 
7530: 6e 6f 74 20 62 65 20 65 6e 63 6f 64 65 64 20 65  not be encoded e
7540: 66 66 69 63 69 65 6e 74 6c 79 20 75 73 69 6e 67  fficiently using
7550: 20 63 6f 70 79 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   copy.** command
7560: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7570: 20 72 62 75 44 65 6c 74 61 43 72 65 61 74 65 28   rbuDeltaCreate(
7580: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7590: 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Src,      /* The
75a0: 20 73 6f 75 72 63 65 20 6f 72 20 70 61 74 74 65   source or patte
75b0: 72 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73  rn file */.  uns
75c0: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 53 72 63  igned int lenSrc
75d0: 2c 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66  ,   /* Length of
75e0: 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65   the source file
75f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7600: 20 2a 7a 4f 75 74 2c 20 20 20 20 20 20 2f 2a 20   *zOut,      /* 
7610: 54 68 65 20 74 61 72 67 65 74 20 66 69 6c 65 20  The target file 
7620: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
7630: 74 20 6c 65 6e 4f 75 74 2c 20 20 20 2f 2a 20 4c  t lenOut,   /* L
7640: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 74 61 72  ength of the tar
7650: 67 65 74 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  get file */.  ch
7660: 61 72 20 2a 7a 44 65 6c 74 61 20 20 20 20 20 20  ar *zDelta      
7670: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
7680: 65 20 64 65 6c 74 61 20 69 6e 74 6f 20 74 68 69  e delta into thi
7690: 73 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20  s buffer */.){. 
76a0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
76b0: 20 62 61 73 65 3b 0a 20 20 63 68 61 72 20 2a 7a   base;.  char *z
76c0: 4f 72 69 67 44 65 6c 74 61 20 3d 20 7a 44 65 6c  OrigDelta = zDel
76d0: 74 61 3b 0a 20 20 68 61 73 68 20 68 3b 0a 20 20  ta;.  hash h;.  
76e0: 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20  int nHash;      
76f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7700: 6d 62 65 72 20 6f 66 20 68 61 73 68 20 74 61 62  mber of hash tab
7710: 6c 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20  le entries */.  
7720: 69 6e 74 20 2a 6c 61 6e 64 6d 61 72 6b 3b 20 20  int *landmark;  
7730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
7740: 69 6d 61 72 79 20 68 61 73 68 20 74 61 62 6c 65  imary hash table
7750: 20 2a 2f 0a 20 20 69 6e 74 20 2a 63 6f 6c 6c 69   */.  int *colli
7760: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
7770: 20 2f 2a 20 43 6f 6c 6c 69 73 69 6f 6e 20 63 68   /* Collision ch
7780: 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73  ain */.  int las
7790: 74 52 65 61 64 20 3d 20 2d 31 3b 20 20 20 20 20  tRead = -1;     
77a0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 62 79 74 65      /* Last byte
77b0: 20 6f 66 20 7a 53 72 63 20 72 65 61 64 20 62 79   of zSrc read by
77c0: 20 61 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20   a COPY command 
77d0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  */..  /* Add the
77e0: 20 74 61 72 67 65 74 20 66 69 6c 65 20 73 69 7a   target file siz
77f0: 65 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  e to the beginni
7800: 6e 67 20 6f 66 20 74 68 65 20 64 65 6c 74 61 0a  ng of the delta.
7810: 20 20 2a 2f 0a 20 20 70 75 74 49 6e 74 28 6c 65    */.  putInt(le
7820: 6e 4f 75 74 2c 20 26 7a 44 65 6c 74 61 29 3b 0a  nOut, &zDelta);.
7830: 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d 20    *(zDelta++) = 
7840: 27 5c 6e 27 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  '\n';..  /* If t
7850: 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 69  he source file i
7860: 73 20 76 65 72 79 20 73 6d 61 6c 6c 2c 20 69 74  s very small, it
7870: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 68   means that we h
7880: 61 76 65 20 6e 6f 0a 20 20 2a 2a 20 63 68 61 6e  ave no.  ** chan
7890: 63 65 20 6f 66 20 65 76 65 72 20 64 6f 69 6e 67  ce of ever doing
78a0: 20 61 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 2e   a copy command.
78b0: 20 20 4a 75 73 74 20 6f 75 74 70 75 74 20 61 20    Just output a 
78c0: 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 6c 69 74 65  single.  ** lite
78d0: 72 61 6c 20 73 65 67 6d 65 6e 74 20 66 6f 72 20  ral segment for 
78e0: 74 68 65 20 65 6e 74 69 72 65 20 74 61 72 67 65  the entire targe
78f0: 74 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f  t and exit..  */
7900: 0a 20 20 69 66 28 20 6c 65 6e 53 72 63 3c 3d 4e  .  if( lenSrc<=N
7910: 48 41 53 48 20 29 7b 0a 20 20 20 20 70 75 74 49  HASH ){.    putI
7920: 6e 74 28 6c 65 6e 4f 75 74 2c 20 26 7a 44 65 6c  nt(lenOut, &zDel
7930: 74 61 29 3b 0a 20 20 20 20 2a 28 7a 44 65 6c 74  ta);.    *(zDelt
7940: 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20 20 20 20  a++) = ':';.    
7950: 6d 65 6d 63 70 79 28 7a 44 65 6c 74 61 2c 20 7a  memcpy(zDelta, z
7960: 4f 75 74 2c 20 6c 65 6e 4f 75 74 29 3b 0a 20 20  Out, lenOut);.  
7970: 20 20 7a 44 65 6c 74 61 20 2b 3d 20 6c 65 6e 4f    zDelta += lenO
7980: 75 74 3b 0a 20 20 20 20 70 75 74 49 6e 74 28 63  ut;.    putInt(c
7990: 68 65 63 6b 73 75 6d 28 7a 4f 75 74 2c 20 6c 65  hecksum(zOut, le
79a0: 6e 4f 75 74 29 2c 20 26 7a 44 65 6c 74 61 29 3b  nOut), &zDelta);
79b0: 0a 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29  .    *(zDelta++)
79c0: 20 3d 20 27 3b 27 3b 0a 20 20 20 20 72 65 74 75   = ';';.    retu
79d0: 72 6e 20 28 69 6e 74 29 28 7a 44 65 6c 74 61 20  rn (int)(zDelta 
79e0: 2d 20 7a 4f 72 69 67 44 65 6c 74 61 29 3b 0a 20  - zOrigDelta);. 
79f0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
7a00: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
7a10: 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 6d  used to locate m
7a20: 61 74 63 68 69 6e 67 20 73 65 63 74 69 6f 6e 73  atching sections
7a30: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73 6f 75   in the.  ** sou
7a40: 72 63 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  rce file..  */. 
7a50: 20 6e 48 61 73 68 20 3d 20 6c 65 6e 53 72 63 2f   nHash = lenSrc/
7a60: 4e 48 41 53 48 3b 0a 20 20 63 6f 6c 6c 69 64 65  NHASH;.  collide
7a70: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7a80: 63 28 20 6e 48 61 73 68 2a 32 2a 73 69 7a 65 6f  c( nHash*2*sizeo
7a90: 66 28 69 6e 74 29 20 29 3b 0a 20 20 6c 61 6e 64  f(int) );.  land
7aa0: 6d 61 72 6b 20 3d 20 26 63 6f 6c 6c 69 64 65 5b  mark = &collide[
7ab0: 6e 48 61 73 68 5d 3b 0a 20 20 6d 65 6d 73 65 74  nHash];.  memset
7ac0: 28 6c 61 6e 64 6d 61 72 6b 2c 20 2d 31 2c 20 6e  (landmark, -1, n
7ad0: 48 61 73 68 2a 73 69 7a 65 6f 66 28 69 6e 74 29  Hash*sizeof(int)
7ae0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 63 6f 6c 6c  );.  memset(coll
7af0: 69 64 65 2c 20 2d 31 2c 20 6e 48 61 73 68 2a 73  ide, -1, nHash*s
7b00: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 66  izeof(int));.  f
7b10: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 53 72 63  or(i=0; i<lenSrc
7b20: 2d 4e 48 41 53 48 3b 20 69 2b 3d 4e 48 41 53 48  -NHASH; i+=NHASH
7b30: 29 7b 0a 20 20 20 20 69 6e 74 20 68 76 3b 0a 20  ){.    int hv;. 
7b40: 20 20 20 68 61 73 68 5f 69 6e 69 74 28 26 68 2c     hash_init(&h,
7b50: 20 26 7a 53 72 63 5b 69 5d 29 3b 0a 20 20 20 20   &zSrc[i]);.    
7b60: 68 76 20 3d 20 68 61 73 68 5f 33 32 62 69 74 28  hv = hash_32bit(
7b70: 26 68 29 20 25 20 6e 48 61 73 68 3b 0a 20 20 20  &h) % nHash;.   
7b80: 20 63 6f 6c 6c 69 64 65 5b 69 2f 4e 48 41 53 48   collide[i/NHASH
7b90: 5d 20 3d 20 6c 61 6e 64 6d 61 72 6b 5b 68 76 5d  ] = landmark[hv]
7ba0: 3b 0a 20 20 20 20 6c 61 6e 64 6d 61 72 6b 5b 68  ;.    landmark[h
7bb0: 76 5d 20 3d 20 69 2f 4e 48 41 53 48 3b 0a 20 20  v] = i/NHASH;.  
7bc0: 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 73 63  }..  /* Begin sc
7bd0: 61 6e 6e 69 6e 67 20 74 68 65 20 74 61 72 67 65  anning the targe
7be0: 74 20 66 69 6c 65 20 61 6e 64 20 67 65 6e 65 72  t file and gener
7bf0: 61 74 69 6e 67 20 63 6f 70 79 20 63 6f 6d 6d 61  ating copy comma
7c00: 6e 64 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 69 74  nds and.  ** lit
7c10: 65 72 61 6c 20 73 65 63 74 69 6f 6e 73 20 6f 66  eral sections of
7c20: 20 74 68 65 20 64 65 6c 74 61 2e 0a 20 20 2a 2f   the delta..  */
7c30: 0a 20 20 62 61 73 65 20 3d 20 30 3b 20 20 20 20  .  base = 0;    
7c40: 2f 2a 20 57 65 20 68 61 76 65 20 61 6c 72 65 61  /* We have alrea
7c50: 64 79 20 67 65 6e 65 72 61 74 65 64 20 65 76 65  dy generated eve
7c60: 72 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20 7a  rything before z
7c70: 4f 75 74 5b 62 61 73 65 5d 20 2a 2f 0a 20 20 77  Out[base] */.  w
7c80: 68 69 6c 65 28 20 62 61 73 65 2b 4e 48 41 53 48  hile( base+NHASH
7c90: 3c 6c 65 6e 4f 75 74 20 29 7b 0a 20 20 20 20 69  <lenOut ){.    i
7ca0: 6e 74 20 69 53 72 63 2c 20 69 42 6c 6f 63 6b 3b  nt iSrc, iBlock;
7cb0: 0a 20 20 20 20 69 6e 74 20 62 65 73 74 43 6e 74  .    int bestCnt
7cc0: 2c 20 62 65 73 74 4f 66 73 74 3d 30 2c 20 62 65  , bestOfst=0, be
7cd0: 73 74 4c 69 74 73 7a 3d 30 3b 0a 20 20 20 20 68  stLitsz=0;.    h
7ce0: 61 73 68 5f 69 6e 69 74 28 26 68 2c 20 26 7a 4f  ash_init(&h, &zO
7cf0: 75 74 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20 69  ut[base]);.    i
7d00: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 79   = 0;     /* Try
7d10: 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 61 20 6c  ing to match a l
7d20: 61 6e 64 6d 61 72 6b 20 61 67 61 69 6e 73 74 20  andmark against 
7d30: 7a 4f 75 74 5b 62 61 73 65 2b 69 5d 20 2a 2f 0a  zOut[base+i] */.
7d40: 20 20 20 20 62 65 73 74 43 6e 74 20 3d 20 30 3b      bestCnt = 0;
7d50: 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
7d60: 0a 20 20 20 20 20 20 69 6e 74 20 68 76 3b 0a 20  .      int hv;. 
7d70: 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
7d80: 20 32 35 30 3b 0a 0a 20 20 20 20 20 20 68 76 20   250;..      hv 
7d90: 3d 20 68 61 73 68 5f 33 32 62 69 74 28 26 68 29  = hash_32bit(&h)
7da0: 20 25 20 6e 48 61 73 68 3b 0a 20 20 20 20 20 20   % nHash;.      
7db0: 69 42 6c 6f 63 6b 20 3d 20 6c 61 6e 64 6d 61 72  iBlock = landmar
7dc0: 6b 5b 68 76 5d 3b 0a 20 20 20 20 20 20 77 68 69  k[hv];.      whi
7dd0: 6c 65 28 20 69 42 6c 6f 63 6b 3e 3d 30 20 26 26  le( iBlock>=0 &&
7de0: 20 28 6c 69 6d 69 74 2d 2d 29 3e 30 20 29 7b 0a   (limit--)>0 ){.
7df0: 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20          /*.     
7e00: 20 20 20 2a 2a 20 54 68 65 20 68 61 73 68 20 77     ** The hash w
7e10: 69 6e 64 6f 77 20 68 61 73 20 69 64 65 6e 74 69  indow has identi
7e20: 66 69 65 64 20 61 20 70 6f 74 65 6e 74 69 61 6c  fied a potential
7e30: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 0a 20   match against. 
7e40: 20 20 20 20 20 20 20 2a 2a 20 6c 61 6e 64 6d 61         ** landma
7e50: 72 6b 20 62 6c 6f 63 6b 20 69 42 6c 6f 63 6b 2e  rk block iBlock.
7e60: 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f    But we need to
7e70: 20 69 6e 76 65 73 74 69 67 61 74 65 20 66 75 72   investigate fur
7e80: 74 68 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ther..        **
7e90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 6f 6f 6b  .        ** Look
7ea0: 20 66 6f 72 20 61 20 72 65 67 69 6f 6e 20 69 6e   for a region in
7eb0: 20 7a 4f 75 74 20 74 68 61 74 20 6d 61 74 63 68   zOut that match
7ec0: 65 73 20 7a 53 72 63 2e 20 41 6e 63 68 6f 72 20  es zSrc. Anchor 
7ed0: 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 20  the search.     
7ee0: 20 20 20 2a 2a 20 61 74 20 7a 53 72 63 5b 69 53     ** at zSrc[iS
7ef0: 72 63 5d 20 61 6e 64 20 7a 4f 75 74 5b 62 61 73  rc] and zOut[bas
7f00: 65 2b 69 5d 2e 20 20 44 6f 20 6e 6f 74 20 69 6e  e+i].  Do not in
7f10: 63 6c 75 64 65 20 61 6e 79 74 68 69 6e 67 20 70  clude anything p
7f20: 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 20 20  rior to.        
7f30: 2a 2a 20 7a 4f 75 74 5b 62 61 73 65 5d 20 6f 72  ** zOut[base] or
7f40: 20 61 66 74 65 72 20 7a 4f 75 74 5b 6f 75 74 4c   after zOut[outL
7f50: 65 6e 5d 20 6e 6f 72 20 61 6e 79 74 68 69 6e 67  en] nor anything
7f60: 20 61 66 74 65 72 20 7a 53 72 63 5b 73 72 63 4c   after zSrc[srcL
7f70: 65 6e 5d 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  en]..        **.
7f80: 20 20 20 20 20 20 20 20 2a 2a 20 53 65 74 20 63          ** Set c
7f90: 6e 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  nt equal to the 
7fa0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6d 61  length of the ma
7fb0: 74 63 68 20 61 6e 64 20 73 65 74 20 6f 66 73 74  tch and set ofst
7fc0: 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   so that.       
7fd0: 20 2a 2a 20 7a 53 72 63 5b 6f 66 73 74 5d 20 69   ** zSrc[ofst] i
7fe0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  s the first elem
7ff0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 61 74 63 68  ent of the match
8000: 2e 20 20 6c 69 74 73 7a 20 69 73 20 74 68 65 20  .  litsz is the 
8010: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 2a  number.        *
8020: 2a 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  * of characters 
8030: 62 65 74 77 65 65 6e 20 7a 4f 75 74 5b 62 61 73  between zOut[bas
8040: 65 5d 20 61 6e 64 20 74 68 65 20 62 65 67 69 6e  e] and the begin
8050: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 74 63  ning of the matc
8060: 68 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 7a  h..        ** sz
8070: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6f 76 65   will be the ove
8080: 72 68 65 61 64 20 28 69 6e 20 62 79 74 65 73 29  rhead (in bytes)
8090: 20 6e 65 65 64 65 64 20 74 6f 20 65 6e 63 6f 64   needed to encod
80a0: 65 20 74 68 65 20 63 6f 70 79 0a 20 20 20 20 20  e the copy.     
80b0: 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20     ** command.  
80c0: 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  Only generate co
80d0: 70 79 20 63 6f 6d 6d 61 6e 64 20 69 66 20 74 68  py command if th
80e0: 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 74 68  e overhead of th
80f0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  e.        ** cop
8100: 79 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6c 65 73  y command is les
8110: 73 20 74 68 61 6e 20 74 68 65 20 61 6d 6f 75 6e  s than the amoun
8120: 74 20 6f 66 20 6c 69 74 65 72 61 6c 20 74 65 78  t of literal tex
8130: 74 20 74 6f 20 62 65 20 63 6f 70 69 65 64 2e 0a  t to be copied..
8140: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8150: 20 20 20 69 6e 74 20 63 6e 74 2c 20 6f 66 73 74     int cnt, ofst
8160: 2c 20 6c 69 74 73 7a 3b 0a 20 20 20 20 20 20 20  , litsz;.       
8170: 20 69 6e 74 20 6a 2c 20 6b 2c 20 78 2c 20 79 3b   int j, k, x, y;
8180: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  .        int sz;
8190: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  ..        /* Beg
81a0: 69 6e 6e 69 6e 67 20 61 74 20 69 53 72 63 2c 20  inning at iSrc, 
81b0: 6d 61 74 63 68 20 66 6f 72 77 61 72 64 73 20 61  match forwards a
81c0: 73 20 66 61 72 20 61 73 20 77 65 20 63 61 6e 2e  s far as we can.
81d0: 20 20 6a 20 63 6f 75 6e 74 73 0a 20 20 20 20 20    j counts.     
81e0: 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72     ** the number
81f0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74   of characters t
8200: 68 61 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  hat match */.   
8210: 20 20 20 20 20 69 53 72 63 20 3d 20 69 42 6c 6f       iSrc = iBlo
8220: 63 6b 2a 4e 48 41 53 48 3b 0a 20 20 20 20 20 20  ck*NHASH;.      
8230: 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20    for(.         
8240: 20 6a 3d 30 2c 20 78 3d 69 53 72 63 2c 20 79 3d   j=0, x=iSrc, y=
8250: 62 61 73 65 2b 69 3b 0a 20 20 20 20 20 20 20 20  base+i;.        
8260: 20 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29    (unsigned int)
8270: 78 3c 6c 65 6e 53 72 63 20 26 26 20 28 75 6e 73  x<lenSrc && (uns
8280: 69 67 6e 65 64 20 69 6e 74 29 79 3c 6c 65 6e 4f  igned int)y<lenO
8290: 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b  ut;.          j+
82a0: 2b 2c 20 78 2b 2b 2c 20 79 2b 2b 0a 20 20 20 20  +, x++, y++.    
82b0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
82c0: 20 69 66 28 20 7a 53 72 63 5b 78 5d 21 3d 7a 4f   if( zSrc[x]!=zO
82d0: 75 74 5b 79 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ut[y] ) break;. 
82e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
82f0: 20 6a 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20 2f   j--;..        /
8300: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  * Beginning at i
8310: 53 72 63 2d 31 2c 20 6d 61 74 63 68 20 62 61 63  Src-1, match bac
8320: 6b 77 61 72 64 73 20 61 73 20 66 61 72 20 61 73  kwards as far as
8330: 20 77 65 20 63 61 6e 2e 20 20 6b 20 63 6f 75 6e   we can.  k coun
8340: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ts.        ** th
8350: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
8360: 61 63 74 65 72 73 20 74 68 61 74 20 6d 61 74 63  acters that matc
8370: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  h */.        for
8380: 28 6b 3d 31 3b 20 6b 3c 69 53 72 63 20 26 26 20  (k=1; k<iSrc && 
8390: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 6b 3c  (unsigned int)k<
83a0: 3d 69 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  =i; k++){.      
83b0: 20 20 20 20 69 66 28 20 7a 53 72 63 5b 69 53 72      if( zSrc[iSr
83c0: 63 2d 6b 5d 21 3d 7a 4f 75 74 5b 62 61 73 65 2b  c-k]!=zOut[base+
83d0: 69 2d 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  i-k] ) break;.  
83e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
83f0: 6b 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  k--;..        /*
8400: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6f 66 66   Compute the off
8410: 73 65 74 20 61 6e 64 20 73 69 7a 65 20 6f 66 20  set and size of 
8420: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 72 65 67  the matching reg
8430: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ion */.        o
8440: 66 73 74 20 3d 20 69 53 72 63 2d 6b 3b 0a 20 20  fst = iSrc-k;.  
8450: 20 20 20 20 20 20 63 6e 74 20 3d 20 6a 2b 6b 2b        cnt = j+k+
8460: 31 3b 0a 20 20 20 20 20 20 20 20 6c 69 74 73 7a  1;.        litsz
8470: 20 3d 20 69 2d 6b 3b 20 20 2f 2a 20 4e 75 6d 62   = i-k;  /* Numb
8480: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6c  er of bytes of l
8490: 69 74 65 72 61 6c 20 74 65 78 74 20 62 65 66 6f  iteral text befo
84a0: 72 65 20 74 68 65 20 63 6f 70 79 20 2a 2f 0a 20  re the copy */. 
84b0: 20 20 20 20 20 20 20 2f 2a 20 73 7a 20 77 69 6c         /* sz wil
84c0: 6c 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62 65  l hold the numbe
84d0: 72 20 6f 66 20 62 79 74 65 73 20 6e 65 65 64 65  r of bytes neede
84e0: 64 20 74 6f 20 65 6e 63 6f 64 65 20 74 68 65 20  d to encode the 
84f0: 22 69 6e 73 65 72 74 22 0a 20 20 20 20 20 20 20  "insert".       
8500: 20 2a 2a 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20   ** command and 
8510: 74 68 65 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64  the copy command
8520: 2c 20 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74  , not counting t
8530: 68 65 20 22 69 6e 73 65 72 74 22 20 74 65 78 74  he "insert" text
8540: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 7a 20 3d   */.        sz =
8550: 20 64 69 67 69 74 5f 63 6f 75 6e 74 28 69 2d 6b   digit_count(i-k
8560: 29 2b 64 69 67 69 74 5f 63 6f 75 6e 74 28 63 6e  )+digit_count(cn
8570: 74 29 2b 64 69 67 69 74 5f 63 6f 75 6e 74 28 6f  t)+digit_count(o
8580: 66 73 74 29 2b 33 3b 0a 20 20 20 20 20 20 20 20  fst)+3;.        
8590: 69 66 28 20 63 6e 74 3e 3d 73 7a 20 26 26 20 63  if( cnt>=sz && c
85a0: 6e 74 3e 62 65 73 74 43 6e 74 20 29 7b 0a 20 20  nt>bestCnt ){.  
85b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d          /* Remem
85c0: 62 65 72 20 74 68 69 73 20 6d 61 74 63 68 20 6f  ber this match o
85d0: 6e 6c 79 20 69 66 20 69 74 20 69 73 20 74 68 65  nly if it is the
85e0: 20 62 65 73 74 20 73 6f 20 66 61 72 20 61 6e 64   best so far and
85f0: 20 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   it.          **
8600: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 72 65 61   does not increa
8610: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
8620: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62 65   */.          be
8630: 73 74 43 6e 74 20 3d 20 63 6e 74 3b 0a 20 20 20  stCnt = cnt;.   
8640: 20 20 20 20 20 20 20 62 65 73 74 4f 66 73 74 20         bestOfst 
8650: 3d 20 69 53 72 63 2d 6b 3b 0a 20 20 20 20 20 20  = iSrc-k;.      
8660: 20 20 20 20 62 65 73 74 4c 69 74 73 7a 20 3d 20      bestLitsz = 
8670: 6c 69 74 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d  litsz;.        }
8680: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
8690: 63 6b 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  ck the next matc
86a0: 68 69 6e 67 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20  hing block */.  
86b0: 20 20 20 20 20 20 69 42 6c 6f 63 6b 20 3d 20 63        iBlock = c
86c0: 6f 6c 6c 69 64 65 5b 69 42 6c 6f 63 6b 5d 3b 0a  ollide[iBlock];.
86d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
86e0: 2a 20 57 65 20 68 61 76 65 20 61 20 63 6f 70 79  * We have a copy
86f0: 20 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20 64 6f   command that do
8700: 65 73 20 6e 6f 74 20 63 61 75 73 65 20 74 68 65  es not cause the
8710: 20 64 65 6c 74 61 20 74 6f 20 62 65 20 6c 61 72   delta to be lar
8720: 67 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ger.      ** tha
8730: 6e 20 61 20 6c 69 74 65 72 61 6c 20 69 6e 73 65  n a literal inse
8740: 72 74 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20  rt.  So add the 
8750: 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  copy command to 
8760: 74 68 65 20 64 65 6c 74 61 2e 0a 20 20 20 20 20  the delta..     
8770: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 65   */.      if( be
8780: 73 74 43 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20  stCnt>0 ){.     
8790: 20 20 20 69 66 28 20 62 65 73 74 4c 69 74 73 7a     if( bestLitsz
87a0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
87b0: 2f 2a 20 41 64 64 20 61 6e 20 69 6e 73 65 72 74  /* Add an insert
87c0: 20 63 6f 6d 6d 61 6e 64 20 62 65 66 6f 72 65 20   command before 
87d0: 74 68 65 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20  the copy */.    
87e0: 20 20 20 20 20 20 70 75 74 49 6e 74 28 62 65 73        putInt(bes
87f0: 74 4c 69 74 73 7a 2c 26 7a 44 65 6c 74 61 29 3b  tLitsz,&zDelta);
8800: 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 44 65  .          *(zDe
8810: 6c 74 61 2b 2b 29 20 3d 20 27 3a 27 3b 0a 20 20  lta++) = ':';.  
8820: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
8830: 44 65 6c 74 61 2c 20 26 7a 4f 75 74 5b 62 61 73  Delta, &zOut[bas
8840: 65 5d 2c 20 62 65 73 74 4c 69 74 73 7a 29 3b 0a  e], bestLitsz);.
8850: 20 20 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61            zDelta
8860: 20 2b 3d 20 62 65 73 74 4c 69 74 73 7a 3b 0a 20   += bestLitsz;. 
8870: 20 20 20 20 20 20 20 20 20 62 61 73 65 20 2b 3d           base +=
8880: 20 62 65 73 74 4c 69 74 73 7a 3b 0a 20 20 20 20   bestLitsz;.    
8890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 61      }.        ba
88a0: 73 65 20 2b 3d 20 62 65 73 74 43 6e 74 3b 0a 20  se += bestCnt;. 
88b0: 20 20 20 20 20 20 20 70 75 74 49 6e 74 28 62 65         putInt(be
88c0: 73 74 43 6e 74 2c 20 26 7a 44 65 6c 74 61 29 3b  stCnt, &zDelta);
88d0: 0a 20 20 20 20 20 20 20 20 2a 28 7a 44 65 6c 74  .        *(zDelt
88e0: 61 2b 2b 29 20 3d 20 27 40 27 3b 0a 20 20 20 20  a++) = '@';.    
88f0: 20 20 20 20 70 75 74 49 6e 74 28 62 65 73 74 4f      putInt(bestO
8900: 66 73 74 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20  fst, &zDelta);. 
8910: 20 20 20 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b         *(zDelta+
8920: 2b 29 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +) = ',';.      
8930: 20 20 69 66 28 20 62 65 73 74 4f 66 73 74 20 2b    if( bestOfst +
8940: 20 62 65 73 74 43 6e 74 20 2d 31 20 3e 20 6c 61   bestCnt -1 > la
8950: 73 74 52 65 61 64 20 29 7b 0a 20 20 20 20 20 20  stRead ){.      
8960: 20 20 20 20 6c 61 73 74 52 65 61 64 20 3d 20 62      lastRead = b
8970: 65 73 74 4f 66 73 74 20 2b 20 62 65 73 74 43 6e  estOfst + bestCn
8980: 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t - 1;.        }
8990: 0a 20 20 20 20 20 20 20 20 62 65 73 74 43 6e 74  .        bestCnt
89a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
89b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
89c0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
89d0: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
89e0: 74 20 6d 65 61 6e 73 20 6e 6f 20 6d 61 74 63 68  t means no match
89f0: 20 69 73 20 66 6f 75 6e 64 20 73 6f 20 66 61 72   is found so far
8a00: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 61   */.      if( ba
8a10: 73 65 2b 69 2b 4e 48 41 53 48 3e 3d 6c 65 6e 4f  se+i+NHASH>=lenO
8a20: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ut ){.        /*
8a30: 20 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64   We have reached
8a40: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8a50: 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20 6e 6f  file and have no
8a60: 74 20 66 6f 75 6e 64 20 61 6e 79 0a 20 20 20 20  t found any.    
8a70: 20 20 20 20 2a 2a 20 6d 61 74 63 68 65 73 2e 20      ** matches. 
8a80: 20 44 6f 20 61 6e 20 22 69 6e 73 65 72 74 22 20   Do an "insert" 
8a90: 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 74  for everything t
8aa0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
8ab0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  ch */.        pu
8ac0: 74 49 6e 74 28 6c 65 6e 4f 75 74 2d 62 61 73 65  tInt(lenOut-base
8ad0: 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20 20 20 20  , &zDelta);.    
8ae0: 20 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20      *(zDelta++) 
8af0: 3d 20 27 3a 27 3b 0a 20 20 20 20 20 20 20 20 6d  = ':';.        m
8b00: 65 6d 63 70 79 28 7a 44 65 6c 74 61 2c 20 26 7a  emcpy(zDelta, &z
8b10: 4f 75 74 5b 62 61 73 65 5d 2c 20 6c 65 6e 4f 75  Out[base], lenOu
8b20: 74 2d 62 61 73 65 29 3b 0a 20 20 20 20 20 20 20  t-base);.       
8b30: 20 7a 44 65 6c 74 61 20 2b 3d 20 6c 65 6e 4f 75   zDelta += lenOu
8b40: 74 2d 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20  t-base;.        
8b50: 62 61 73 65 20 3d 20 6c 65 6e 4f 75 74 3b 0a 20  base = lenOut;. 
8b60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8b70: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
8b80: 41 64 76 61 6e 63 65 20 74 68 65 20 68 61 73 68  Advance the hash
8b90: 20 62 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65   by one characte
8ba0: 72 2e 20 20 4b 65 65 70 20 6c 6f 6f 6b 69 6e 67  r.  Keep looking
8bb0: 20 66 6f 72 20 61 20 6d 61 74 63 68 20 2a 2f 0a   for a match */.
8bc0: 20 20 20 20 20 20 68 61 73 68 5f 6e 65 78 74 28        hash_next(
8bd0: 26 68 2c 20 7a 4f 75 74 5b 62 61 73 65 2b 69 2b  &h, zOut[base+i+
8be0: 4e 48 41 53 48 5d 29 3b 0a 20 20 20 20 20 20 69  NHASH]);.      i
8bf0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
8c00: 2f 2a 20 4f 75 74 70 75 74 20 61 20 66 69 6e 61  /* Output a fina
8c10: 6c 20 22 69 6e 73 65 72 74 22 20 72 65 63 6f 72  l "insert" recor
8c20: 64 20 74 6f 20 67 65 74 20 61 6c 6c 20 74 68 65  d to get all the
8c30: 20 74 65 78 74 20 61 74 20 74 68 65 20 65 6e 64   text at the end
8c40: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 6c   of.  ** the fil
8c50: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
8c60: 6d 61 74 63 68 20 61 6e 79 74 68 69 6e 67 20 69  match anything i
8c70: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c  n the source fil
8c80: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 62 61  e..  */.  if( ba
8c90: 73 65 3c 6c 65 6e 4f 75 74 20 29 7b 0a 20 20 20  se<lenOut ){.   
8ca0: 20 70 75 74 49 6e 74 28 6c 65 6e 4f 75 74 2d 62   putInt(lenOut-b
8cb0: 61 73 65 2c 20 26 7a 44 65 6c 74 61 29 3b 0a 20  ase, &zDelta);. 
8cc0: 20 20 20 2a 28 7a 44 65 6c 74 61 2b 2b 29 20 3d     *(zDelta++) =
8cd0: 20 27 3a 27 3b 0a 20 20 20 20 6d 65 6d 63 70 79   ':';.    memcpy
8ce0: 28 7a 44 65 6c 74 61 2c 20 26 7a 4f 75 74 5b 62  (zDelta, &zOut[b
8cf0: 61 73 65 5d 2c 20 6c 65 6e 4f 75 74 2d 62 61 73  ase], lenOut-bas
8d00: 65 29 3b 0a 20 20 20 20 7a 44 65 6c 74 61 20 2b  e);.    zDelta +
8d10: 3d 20 6c 65 6e 4f 75 74 2d 62 61 73 65 3b 0a 20  = lenOut-base;. 
8d20: 20 7d 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74   }.  /* Output t
8d30: 68 65 20 66 69 6e 61 6c 20 63 68 65 63 6b 73 75  he final checksu
8d40: 6d 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 70  m record. */.  p
8d50: 75 74 49 6e 74 28 63 68 65 63 6b 73 75 6d 28 7a  utInt(checksum(z
8d60: 4f 75 74 2c 20 6c 65 6e 4f 75 74 29 2c 20 26 7a  Out, lenOut), &z
8d70: 44 65 6c 74 61 29 3b 0a 20 20 2a 28 7a 44 65 6c  Delta);.  *(zDel
8d80: 74 61 2b 2b 29 20 3d 20 27 3b 27 3b 0a 20 20 73  ta++) = ';';.  s
8d90: 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6c 6c  qlite3_free(coll
8da0: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ide);.  return (
8db0: 69 6e 74 29 28 7a 44 65 6c 74 61 20 2d 20 7a 4f  int)(zDelta - zO
8dc0: 72 69 67 44 65 6c 74 61 29 3b 0a 7d 0a 0a 2f 2a  rigDelta);.}../*
8dd0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 63 6f 64 65 20  .** End of code 
8de0: 63 6f 70 69 65 64 20 66 72 6f 6d 20 66 6f 73 73  copied from foss
8df0: 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  il..************
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
8e40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 72  .static void str
8e50: 50 72 69 6e 74 66 41 72 72 61 79 28 0a 20 20 53  PrintfArray(.  S
8e60: 74 72 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  tr *pStr,       
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8e80: 2a 20 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 20  * String object 
8e90: 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a  to append to */.
8ea0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
8eb0: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
8ec0: 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 73    /* Separator s
8ed0: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  tring */.  const
8ee0: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 20 20 20   char *zFmt,    
8ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
8f00: 72 6d 61 74 20 66 6f 72 20 65 61 63 68 20 65 6e  rmat for each en
8f10: 74 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  try */.  char **
8f20: 61 7a 2c 20 69 6e 74 20 6e 20 20 20 20 20 20 20  az, int n       
8f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
8f40: 79 20 6f 66 20 73 74 72 69 6e 67 73 20 26 20 69  y of strings & i
8f50: 74 73 20 73 69 7a 65 20 28 6f 72 20 2d 31 29 20  ts size (or -1) 
8f60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
8f70: 20 66 6f 72 28 69 3d 30 3b 20 61 7a 5b 69 5d 20   for(i=0; az[i] 
8f80: 26 26 20 28 69 3c 6e 20 7c 7c 20 6e 3c 30 29 3b  && (i<n || n<0);
8f90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
8fa0: 21 3d 30 20 29 20 73 74 72 50 72 69 6e 74 66 28  !=0 ) strPrintf(
8fb0: 70 53 74 72 2c 20 22 25 73 22 2c 20 7a 53 65 70  pStr, "%s", zSep
8fc0: 29 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  );.    strPrintf
8fd0: 28 70 53 74 72 2c 20 7a 46 6d 74 2c 20 61 7a 5b  (pStr, zFmt, az[
8fe0: 69 5d 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d  i], az[i], az[i]
8ff0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
9000: 20 76 6f 69 64 20 67 65 74 52 62 75 64 69 66 66   void getRbudiff
9010: 51 75 65 72 79 28 0a 20 20 63 6f 6e 73 74 20 63  Query(.  const c
9020: 68 61 72 20 2a 7a 54 61 62 2c 0a 20 20 63 68 61  har *zTab,.  cha
9030: 72 20 2a 2a 61 7a 43 6f 6c 2c 0a 20 20 69 6e 74  r **azCol,.  int
9040: 20 6e 50 4b 2c 0a 20 20 69 6e 74 20 62 4f 74 61   nPK,.  int bOta
9050: 52 6f 77 69 64 2c 0a 20 20 53 74 72 20 2a 70 53  Rowid,.  Str *pS
9060: 71 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ql.){.  int i;..
9070: 20 20 2f 2a 20 46 69 72 73 74 20 74 68 65 20 6e    /* First the n
9080: 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 72 6f  ewly inserted ro
9090: 77 73 3a 20 2a 2a 2f 20 0a 20 20 73 74 72 50 72  ws: **/ .  strPr
90a0: 69 6e 74 66 28 70 53 71 6c 2c 20 22 53 45 4c 45  intf(pSql, "SELE
90b0: 43 54 20 22 29 3b 0a 20 20 73 74 72 50 72 69 6e  CT ");.  strPrin
90c0: 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22 2c  tfArray(pSql, ",
90d0: 20 22 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c 2c   ", "%s", azCol,
90e0: 20 2d 31 29 3b 0a 20 20 73 74 72 50 72 69 6e 74   -1);.  strPrint
90f0: 66 28 70 53 71 6c 2c 20 22 2c 20 30 2c 20 22 29  f(pSql, ", 0, ")
9100: 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f  ;       /* Set o
9110: 74 61 5f 63 6f 6e 74 72 6f 6c 20 74 6f 20 30 20  ta_control to 0 
9120: 66 6f 72 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f  for an insert */
9130: 0a 20 20 73 74 72 50 72 69 6e 74 66 41 72 72 61  .  strPrintfArra
9140: 79 28 70 53 71 6c 2c 20 22 2c 20 22 2c 20 22 4e  y(pSql, ", ", "N
9150: 55 4c 4c 22 2c 20 61 7a 43 6f 6c 2c 20 2d 31 29  ULL", azCol, -1)
9160: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53  ;.  strPrintf(pS
9170: 71 6c 2c 20 22 20 46 52 4f 4d 20 61 75 78 2e 25  ql, " FROM aux.%
9180: 51 20 41 53 20 6e 20 57 48 45 52 45 20 4e 4f 54  Q AS n WHERE NOT
9190: 20 45 58 49 53 54 53 20 28 5c 6e 22 2c 20 7a 54   EXISTS (\n", zT
91a0: 61 62 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66  ab);.  strPrintf
91b0: 28 70 53 71 6c 2c 20 22 20 20 20 20 53 45 4c 45  (pSql, "    SELE
91c0: 43 54 20 31 20 46 52 4f 4d 20 22 2c 20 7a 54 61  CT 1 FROM ", zTa
91d0: 62 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28  b);.  strPrintf(
91e0: 70 53 71 6c 2c 20 22 20 6d 61 69 6e 2e 25 51 20  pSql, " main.%Q 
91f0: 41 53 20 6f 20 57 48 45 52 45 20 22 2c 20 7a 54  AS o WHERE ", zT
9200: 61 62 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66  ab);.  strPrintf
9210: 41 72 72 61 79 28 70 53 71 6c 2c 20 22 20 41 4e  Array(pSql, " AN
9220: 44 20 22 2c 20 22 28 6e 2e 25 51 20 3d 20 6f 2e  D ", "(n.%Q = o.
9230: 25 51 29 22 2c 20 61 7a 43 6f 6c 2c 20 6e 50 4b  %Q)", azCol, nPK
9240: 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70  );.  strPrintf(p
9250: 53 71 6c 2c 20 22 5c 6e 29 20 41 4e 44 20 22 29  Sql, "\n) AND ")
9260: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 41 72 72  ;.  strPrintfArr
9270: 61 79 28 70 53 71 6c 2c 20 22 20 41 4e 44 20 22  ay(pSql, " AND "
9280: 2c 20 22 28 6e 2e 25 51 20 49 53 20 4e 4f 54 20  , "(n.%Q IS NOT 
9290: 4e 55 4c 4c 29 22 2c 20 61 7a 43 6f 6c 2c 20 6e  NULL)", azCol, n
92a0: 50 4b 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  PK);..  /* Delet
92b0: 65 64 20 72 6f 77 73 3a 20 2a 2f 0a 20 20 73 74  ed rows: */.  st
92c0: 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 5c  rPrintf(pSql, "\
92d0: 6e 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 53 45 4c 45  nUNION ALL\nSELE
92e0: 43 54 20 22 29 3b 0a 20 20 73 74 72 50 72 69 6e  CT ");.  strPrin
92f0: 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22 2c  tfArray(pSql, ",
9300: 20 22 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c 2c   ", "%s", azCol,
9310: 20 6e 50 4b 29 3b 0a 20 20 69 66 28 20 61 7a 43   nPK);.  if( azC
9320: 6f 6c 5b 6e 50 4b 5d 20 29 7b 0a 20 20 20 20 73  ol[nPK] ){.    s
9330: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
9340: 2c 20 22 29 3b 0a 20 20 20 20 73 74 72 50 72 69  , ");.    strPri
9350: 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20 22  ntfArray(pSql, "
9360: 2c 20 22 2c 20 22 4e 55 4c 4c 22 2c 20 26 61 7a  , ", "NULL", &az
9370: 43 6f 6c 5b 6e 50 4b 5d 2c 20 2d 31 29 3b 0a 20  Col[nPK], -1);. 
9380: 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70   }.  strPrintf(p
9390: 53 71 6c 2c 20 22 2c 20 31 2c 20 22 29 3b 20 20  Sql, ", 1, ");  
93a0: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 74 61 5f       /* Set ota_
93b0: 63 6f 6e 74 72 6f 6c 20 74 6f 20 31 20 66 6f 72  control to 1 for
93c0: 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73   a delete */.  s
93d0: 74 72 50 72 69 6e 74 66 41 72 72 61 79 28 70 53  trPrintfArray(pS
93e0: 71 6c 2c 20 22 2c 20 22 2c 20 22 4e 55 4c 4c 22  ql, ", ", "NULL"
93f0: 2c 20 61 7a 43 6f 6c 2c 20 2d 31 29 3b 0a 20 20  , azCol, -1);.  
9400: 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20  strPrintf(pSql, 
9410: 22 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 51 20 41  " FROM main.%Q A
9420: 53 20 6e 20 57 48 45 52 45 20 4e 4f 54 20 45 58  S n WHERE NOT EX
9430: 49 53 54 53 20 28 5c 6e 22 2c 20 7a 54 61 62 29  ISTS (\n", zTab)
9440: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53  ;.  strPrintf(pS
9450: 71 6c 2c 20 22 20 20 20 20 53 45 4c 45 43 54 20  ql, "    SELECT 
9460: 31 20 46 52 4f 4d 20 22 2c 20 7a 54 61 62 29 3b  1 FROM ", zTab);
9470: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 70 53 71  .  strPrintf(pSq
9480: 6c 2c 20 22 20 61 75 78 2e 25 51 20 41 53 20 6f  l, " aux.%Q AS o
9490: 20 57 48 45 52 45 20 22 2c 20 7a 54 61 62 29 3b   WHERE ", zTab);
94a0: 0a 20 20 73 74 72 50 72 69 6e 74 66 41 72 72 61  .  strPrintfArra
94b0: 79 28 70 53 71 6c 2c 20 22 20 41 4e 44 20 22 2c  y(pSql, " AND ",
94c0: 20 22 28 6e 2e 25 51 20 3d 20 6f 2e 25 51 29 22   "(n.%Q = o.%Q)"
94d0: 2c 20 61 7a 43 6f 6c 2c 20 6e 50 4b 29 3b 0a 20  , azCol, nPK);. 
94e0: 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c   strPrintf(pSql,
94f0: 20 22 5c 6e 29 20 41 4e 44 20 22 29 3b 0a 20 20   "\n) AND ");.  
9500: 73 74 72 50 72 69 6e 74 66 41 72 72 61 79 28 70  strPrintfArray(p
9510: 53 71 6c 2c 20 22 20 41 4e 44 20 22 2c 20 22 28  Sql, " AND ", "(
9520: 6e 2e 25 51 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  n.%Q IS NOT NULL
9530: 29 22 2c 20 61 7a 43 6f 6c 2c 20 6e 50 4b 29 3b  )", azCol, nPK);
9540: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 64 20 72  ..  /* Updated r
9550: 6f 77 73 2e 20 49 66 20 61 6c 6c 20 74 61 62 6c  ows. If all tabl
9560: 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61  e columns are pa
9570: 72 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  rt of the primar
9580: 79 20 6b 65 79 2c 20 74 68 65 72 65 20 0a 20 20  y key, there .  
9590: 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 75 70 64  ** can be no upd
95a0: 61 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ates. In this ca
95b0: 73 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  se this part of 
95c0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
95d0: 45 43 54 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20  ECT can.  ** be 
95e0: 6f 6d 69 74 74 65 64 20 61 6c 74 6f 67 65 74 68  omitted altogeth
95f0: 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 61 7a 43  er. */.  if( azC
9600: 6f 6c 5b 6e 50 4b 5d 20 29 7b 0a 20 20 20 20 73  ol[nPK] ){.    s
9610: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
9620: 5c 6e 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 53 45 4c  \nUNION ALL\nSEL
9630: 45 43 54 20 22 29 3b 0a 20 20 20 20 73 74 72 50  ECT ");.    strP
9640: 72 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c  rintfArray(pSql,
9650: 20 22 2c 20 22 2c 20 22 6e 2e 25 73 22 2c 20 61   ", ", "n.%s", a
9660: 7a 43 6f 6c 2c 20 6e 50 4b 29 3b 0a 20 20 20 20  zCol, nPK);.    
9670: 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20  strPrintf(pSql, 
9680: 22 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 50  ",\n");.    strP
9690: 72 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c  rintfArray(pSql,
96a0: 20 22 20 2c 5c 6e 22 2c 20 0a 20 20 20 20 20 20   " ,\n", .      
96b0: 20 20 22 20 20 20 20 43 41 53 45 20 57 48 45 4e    "    CASE WHEN
96c0: 20 6e 2e 25 73 20 49 53 20 6f 2e 25 73 20 54 48   n.%s IS o.%s TH
96d0: 45 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 6e 2e 25  EN NULL ELSE n.%
96e0: 73 20 45 4e 44 22 2c 20 26 61 7a 43 6f 6c 5b 6e  s END", &azCol[n
96f0: 50 4b 5d 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 0a  PK], -1.    );..
9700: 20 20 20 20 69 66 28 20 62 4f 74 61 52 6f 77 69      if( bOtaRowi
9710: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  d==0 ){.      st
9720: 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 2c  rPrintf(pSql, ",
9730: 20 27 22 29 3b 0a 20 20 20 20 20 20 73 74 72 50   '");.      strP
9740: 72 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c  rintfArray(pSql,
9750: 20 22 22 2c 20 22 2e 22 2c 20 61 7a 43 6f 6c 2c   "", ".", azCol,
9760: 20 6e 50 4b 29 3b 0a 20 20 20 20 20 20 73 74 72   nPK);.      str
9770: 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22 27 20  Printf(pSql, "' 
9780: 7c 7c 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73  ||\n");.    }els
9790: 65 7b 0a 20 20 20 20 20 20 73 74 72 50 72 69 6e  e{.      strPrin
97a0: 74 66 28 70 53 71 6c 2c 20 22 2c 5c 6e 22 29 3b  tf(pSql, ",\n");
97b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72 50 72  .    }.    strPr
97c0: 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c 20  intfArray(pSql, 
97d0: 22 20 7c 7c 5c 6e 22 2c 20 0a 20 20 20 20 20 20  " ||\n", .      
97e0: 20 20 22 20 20 20 20 43 41 53 45 20 57 48 45 4e    "    CASE WHEN
97f0: 20 6e 2e 25 73 20 49 53 20 6f 2e 25 73 20 54 48   n.%s IS o.%s TH
9800: 45 4e 20 27 2e 27 20 45 4c 53 45 20 27 78 27 20  EN '.' ELSE 'x' 
9810: 45 4e 44 22 2c 20 26 61 7a 43 6f 6c 5b 6e 50 4b  END", &azCol[nPK
9820: 5d 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20  ], -1.    );.   
9830: 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c   strPrintf(pSql,
9840: 20 22 5c 6e 41 53 20 6f 74 61 5f 63 6f 6e 74 72   "\nAS ota_contr
9850: 6f 6c 2c 20 22 29 3b 0a 20 20 20 20 73 74 72 50  ol, ");.    strP
9860: 72 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c  rintfArray(pSql,
9870: 20 22 2c 20 22 2c 20 22 4e 55 4c 4c 22 2c 20 61   ", ", "NULL", a
9880: 7a 43 6f 6c 2c 20 6e 50 4b 29 3b 0a 20 20 20 20  zCol, nPK);.    
9890: 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20  strPrintf(pSql, 
98a0: 22 2c 5c 6e 22 29 3b 0a 20 20 20 20 73 74 72 50  ",\n");.    strP
98b0: 72 69 6e 74 66 41 72 72 61 79 28 70 53 71 6c 2c  rintfArray(pSql,
98c0: 20 22 20 2c 5c 6e 22 2c 20 0a 20 20 20 20 20 20   " ,\n", .      
98d0: 20 20 22 20 20 20 20 43 41 53 45 20 57 48 45 4e    "    CASE WHEN
98e0: 20 6e 2e 25 73 20 49 53 20 6f 2e 25 73 20 54 48   n.%s IS o.%s TH
98f0: 45 4e 20 4e 55 4c 4c 20 45 4c 53 45 20 6f 2e 25  EN NULL ELSE o.%
9900: 73 20 45 4e 44 22 2c 20 26 61 7a 43 6f 6c 5b 6e  s END", &azCol[n
9910: 50 4b 5d 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 0a  PK], -1.    );..
9920: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 70 53      strPrintf(pS
9930: 71 6c 2c 20 22 5c 6e 46 52 4f 4d 20 6d 61 69 6e  ql, "\nFROM main
9940: 2e 25 51 20 41 53 20 6f 2c 20 61 75 78 2e 25 51  .%Q AS o, aux.%Q
9950: 20 41 53 20 6e 5c 6e 57 48 45 52 45 20 22 2c 20   AS n\nWHERE ", 
9960: 7a 54 61 62 2c 20 7a 54 61 62 29 3b 0a 20 20 20  zTab, zTab);.   
9970: 20 73 74 72 50 72 69 6e 74 66 41 72 72 61 79 28   strPrintfArray(
9980: 70 53 71 6c 2c 20 22 20 41 4e 44 20 22 2c 20 22  pSql, " AND ", "
9990: 28 6e 2e 25 51 20 3d 20 6f 2e 25 51 29 22 2c 20  (n.%Q = o.%Q)", 
99a0: 61 7a 43 6f 6c 2c 20 6e 50 4b 29 3b 0a 20 20 20  azCol, nPK);.   
99b0: 20 73 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c   strPrintf(pSql,
99c0: 20 22 20 41 4e 44 20 6f 74 61 5f 63 6f 6e 74 72   " AND ota_contr
99d0: 6f 6c 20 4c 49 4b 45 20 27 25 25 78 25 25 27 22  ol LIKE '%%x%%'"
99e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  );.  }..  /* Now
99f0: 20 61 64 64 20 61 6e 20 4f 52 44 45 52 20 42 59   add an ORDER BY
9a00: 20 63 6c 61 75 73 65 20 74 6f 20 73 6f 72 74 20   clause to sort 
9a10: 65 76 65 72 79 74 68 69 6e 67 20 62 79 20 50 4b  everything by PK
9a20: 2e 20 2a 2f 0a 20 20 73 74 72 50 72 69 6e 74 66  . */.  strPrintf
9a30: 28 70 53 71 6c 2c 20 22 5c 6e 4f 52 44 45 52 20  (pSql, "\nORDER 
9a40: 42 59 20 22 29 3b 0a 20 20 66 6f 72 28 69 3d 31  BY ");.  for(i=1
9a50: 3b 20 69 3c 3d 6e 50 4b 3b 20 69 2b 2b 29 20 73  ; i<=nPK; i++) s
9a60: 74 72 50 72 69 6e 74 66 28 70 53 71 6c 2c 20 22  trPrintf(pSql, "
9a70: 25 73 25 64 22 2c 20 28 28 69 3e 31 29 3f 22 2c  %s%d", ((i>1)?",
9a80: 20 22 3a 22 22 29 2c 20 69 29 3b 0a 7d 0a 0a 73   ":""), i);.}..s
9a90: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 64 69  tatic void rbudi
9aa0: 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 28 63 6f 6e  ff_one_table(con
9ab0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 46  st char *zTab, F
9ac0: 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 69 6e 74  ILE *out){.  int
9ad0: 20 62 4f 74 61 52 6f 77 69 64 3b 20 20 20 20 20   bOtaRowid;     
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9af0: 54 72 75 65 20 74 6f 20 75 73 65 20 61 6e 20 6f  True to use an o
9b00: 74 61 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  ta_rowid column 
9b10: 2a 2f 0a 20 20 69 6e 74 20 6e 50 4b 3b 20 20 20  */.  int nPK;   
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9b40: 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  f primary key co
9b50: 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a  lumns in table *
9b60: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  /.  char **azCol
9b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9b80: 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 74 65 72 6d      /* NULL term
9b90: 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66 20  inated array of 
9ba0: 63 6f 6c 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  col names */.  i
9bb0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
9bc0: 3b 0a 20 20 53 74 72 20 63 74 20 3d 20 7b 30 2c  ;.  Str ct = {0,
9bd0: 20 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20   0, 0};         
9be0: 20 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41      /* The "CREA
9bf0: 54 45 20 54 41 42 4c 45 20 64 61 74 61 5f 78 78  TE TABLE data_xx
9c00: 78 22 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  x" statement */.
9c10: 20 20 53 74 72 20 73 71 6c 20 3d 20 7b 30 2c 20    Str sql = {0, 
9c20: 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20  0, 0};          
9c30: 20 20 2f 2a 20 51 75 65 72 79 20 74 6f 20 66 69    /* Query to fi
9c40: 6e 64 20 64 69 66 66 65 72 65 6e 63 65 73 20 2a  nd differences *
9c50: 2f 0a 20 20 53 74 72 20 69 6e 73 65 72 74 20 3d  /.  Str insert =
9c60: 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20 20   {0, 0, 0};     
9c70: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
9c80: 74 20 6f 66 20 6f 75 74 70 75 74 20 49 4e 53 45  t of output INSE
9c90: 52 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  RT statement */.
9ca0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9cb0: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pStmt = 0;.  int
9cc0: 20 6e 52 6f 77 20 3d 20 30 3b 20 20 20 20 20 20   nRow = 0;      
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ce0: 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20 64 61  Total rows in da
9cf0: 74 61 5f 78 78 78 20 74 61 62 6c 65 20 2a 2f 0a  ta_xxx table */.
9d00: 0a 20 20 2f 2a 20 2d 2d 72 62 75 20 6d 6f 64 65  .  /* --rbu mode
9d10: 20 6d 75 73 74 20 75 73 65 20 72 65 61 6c 20 70   must use real p
9d20: 72 69 6d 61 72 79 20 6b 65 79 73 2e 20 2a 2f 0a  rimary keys. */.
9d30: 20 20 67 2e 62 53 63 68 65 6d 61 50 4b 20 3d 20    g.bSchemaPK = 
9d40: 31 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  1;..  /* Check t
9d50: 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 73 20  hat the schemas 
9d60: 6f 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  of the two table
9d70: 73 20 6d 61 74 63 68 2e 20 45 78 69 74 20 65 61  s match. Exit ea
9d80: 72 6c 79 20 6f 74 68 65 72 77 69 73 65 2e 20 2a  rly otherwise. *
9d90: 2f 0a 20 20 63 68 65 63 6b 53 63 68 65 6d 61 73  /.  checkSchemas
9da0: 4d 61 74 63 68 28 7a 54 61 62 29 3b 0a 0a 20 20  Match(zTab);..  
9db0: 2f 2a 20 47 72 61 62 20 74 68 65 20 63 6f 6c 75  /* Grab the colu
9dc0: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 50 4b 20  mn names and PK 
9dd0: 64 65 74 61 69 6c 73 20 66 6f 72 20 74 68 65 20  details for the 
9de0: 74 61 62 6c 65 28 73 29 2e 20 49 66 20 6e 6f 20  table(s). If no 
9df0: 75 73 61 62 6c 65 20 50 4b 0a 20 20 2a 2a 20 63  usable PK.  ** c
9e00: 6f 6c 75 6d 6e 73 20 61 72 65 20 66 6f 75 6e 64  olumns are found
9e10: 2c 20 62 61 69 6c 20 6f 75 74 20 65 61 72 6c 79  , bail out early
9e20: 2e 20 20 2a 2f 0a 20 20 61 7a 43 6f 6c 20 3d 20  .  */.  azCol = 
9e30: 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22 6d 61 69  columnNames("mai
9e40: 6e 22 2c 20 7a 54 61 62 2c 20 26 6e 50 4b 2c 20  n", zTab, &nPK, 
9e50: 26 62 4f 74 61 52 6f 77 69 64 29 3b 0a 20 20 69  &bOtaRowid);.  i
9e60: 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
9e70: 20 20 20 72 75 6e 74 69 6d 65 45 72 72 6f 72 28     runtimeError(
9e80: 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f  "table %s has no
9e90: 20 75 73 61 62 6c 65 20 50 4b 20 63 6f 6c 75 6d   usable PK colum
9ea0: 6e 73 22 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 0a  ns", zTab);.  }.
9eb0: 20 20 66 6f 72 28 6e 43 6f 6c 3d 30 3b 20 61 7a    for(nCol=0; az
9ec0: 43 6f 6c 5b 6e 43 6f 6c 5d 3b 20 6e 43 6f 6c 2b  Col[nCol]; nCol+
9ed0: 2b 29 3b 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20  +);..  /* Build 
9ee0: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 43  and output the C
9ef0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9f00: 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 64 61  ement for the da
9f10: 74 61 5f 78 78 78 20 74 61 62 6c 65 20 2a 2f 0a  ta_xxx table */.
9f20: 20 20 73 74 72 50 72 69 6e 74 66 28 26 63 74 2c    strPrintf(&ct,
9f30: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
9f40: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 27 64 61  F NOT EXISTS 'da
9f50: 74 61 5f 25 71 27 28 22 2c 20 7a 54 61 62 29 3b  ta_%q'(", zTab);
9f60: 0a 20 20 69 66 28 20 62 4f 74 61 52 6f 77 69 64  .  if( bOtaRowid
9f70: 20 29 20 73 74 72 50 72 69 6e 74 66 28 26 63 74   ) strPrintf(&ct
9f80: 2c 20 22 72 62 75 5f 72 6f 77 69 64 2c 20 22 29  , "rbu_rowid, ")
9f90: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 41 72 72  ;.  strPrintfArr
9fa0: 61 79 28 26 63 74 2c 20 22 2c 20 22 2c 20 22 25  ay(&ct, ", ", "%
9fb0: 73 22 2c 20 26 61 7a 43 6f 6c 5b 62 4f 74 61 52  s", &azCol[bOtaR
9fc0: 6f 77 69 64 5d 2c 20 2d 31 29 3b 0a 20 20 73 74  owid], -1);.  st
9fd0: 72 50 72 69 6e 74 66 28 26 63 74 2c 20 22 2c 20  rPrintf(&ct, ", 
9fe0: 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3b 22 29 3b  rbu_control);");
9ff0: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 53  ..  /* Get the S
a000: 51 4c 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  QL for the query
a010: 20 74 6f 20 72 65 74 72 69 65 76 65 20 64 61 74   to retrieve dat
a020: 61 20 66 72 6f 6d 20 74 68 65 20 74 77 6f 20 64  a from the two d
a030: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 67 65  atabases */.  ge
a040: 74 52 62 75 64 69 66 66 51 75 65 72 79 28 7a 54  tRbudiffQuery(zT
a050: 61 62 2c 20 61 7a 43 6f 6c 2c 20 6e 50 4b 2c 20  ab, azCol, nPK, 
a060: 62 4f 74 61 52 6f 77 69 64 2c 20 26 73 71 6c 29  bOtaRowid, &sql)
a070: 3b 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 74 68  ;..  /* Build th
a080: 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20  e first part of 
a090: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
a0a0: 6d 65 6e 74 20 6f 75 74 70 75 74 20 66 6f 72 20  ment output for 
a0b0: 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 69 6e  each row.  ** in
a0c0: 20 74 68 65 20 64 61 74 61 5f 78 78 78 20 74 61   the data_xxx ta
a0d0: 62 6c 65 2e 20 2a 2f 0a 20 20 73 74 72 50 72 69  ble. */.  strPri
a0e0: 6e 74 66 28 26 69 6e 73 65 72 74 2c 20 22 49 4e  ntf(&insert, "IN
a0f0: 53 45 52 54 20 49 4e 54 4f 20 27 64 61 74 61 5f  SERT INTO 'data_
a100: 25 71 27 20 28 22 2c 20 7a 54 61 62 29 3b 0a 20  %q' (", zTab);. 
a110: 20 69 66 28 20 62 4f 74 61 52 6f 77 69 64 20 29   if( bOtaRowid )
a120: 20 73 74 72 50 72 69 6e 74 66 28 26 69 6e 73 65   strPrintf(&inse
a130: 72 74 2c 20 22 72 62 75 5f 72 6f 77 69 64 2c 20  rt, "rbu_rowid, 
a140: 22 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 41  ");.  strPrintfA
a150: 72 72 61 79 28 26 69 6e 73 65 72 74 2c 20 22 2c  rray(&insert, ",
a160: 20 22 2c 20 22 25 73 22 2c 20 26 61 7a 43 6f 6c   ", "%s", &azCol
a170: 5b 62 4f 74 61 52 6f 77 69 64 5d 2c 20 2d 31 29  [bOtaRowid], -1)
a180: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 69  ;.  strPrintf(&i
a190: 6e 73 65 72 74 2c 20 22 2c 20 72 62 75 5f 63 6f  nsert, ", rbu_co
a1a0: 6e 74 72 6f 6c 29 20 56 41 4c 55 45 53 28 22 29  ntrol) VALUES(")
a1b0: 3b 0a 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f  ;..  pStmt = db_
a1c0: 70 72 65 70 61 72 65 28 22 25 73 22 2c 20 73 71  prepare("%s", sq
a1d0: 6c 2e 7a 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  l.z);..  while( 
a1e0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
a1f0: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
a200: 29 7b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  ){.    .    /* I
a210: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
a220: 72 73 74 20 72 6f 77 20 6f 75 74 70 75 74 2c 20  rst row output, 
a230: 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 43 52  print out the CR
a240: 45 41 54 45 20 54 41 42 4c 45 20 0a 20 20 20 20  EATE TABLE .    
a250: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 66 69 72  ** statement fir
a260: 73 74 2e 20 41 6e 64 20 74 68 65 6e 20 73 65 74  st. And then set
a270: 20 63 74 2e 7a 20 74 6f 20 4e 55 4c 4c 20 73 6f   ct.z to NULL so
a280: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
a290: 0a 20 20 20 20 2a 2a 20 70 72 69 6e 74 65 64 20  .    ** printed 
a2a0: 61 67 61 69 6e 2e 20 20 2a 2f 0a 20 20 20 20 69  again.  */.    i
a2b0: 66 28 20 63 74 2e 7a 20 29 7b 0a 20 20 20 20 20  f( ct.z ){.     
a2c0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
a2d0: 73 5c 6e 22 2c 20 63 74 2e 7a 29 3b 0a 20 20 20  s\n", ct.z);.   
a2e0: 20 20 20 73 74 72 46 72 65 65 28 26 63 74 29 3b     strFree(&ct);
a2f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
a300: 75 74 70 75 74 20 74 68 65 20 66 69 72 73 74 20  utput the first 
a310: 70 61 72 74 20 6f 66 20 74 68 65 20 49 4e 53 45  part of the INSE
a320: 52 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  RT statement */.
a330: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
a340: 20 22 25 73 22 2c 20 69 6e 73 65 72 74 2e 7a 29   "%s", insert.z)
a350: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 0a 20  ;.    nRow++;.. 
a360: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
a370: 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
a380: 2c 20 6e 43 6f 6c 29 3d 3d 53 51 4c 49 54 45 5f  , nCol)==SQLITE_
a390: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
a3a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6e 43 6f   for(i=0; i<=nCo
a3b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
a3c0: 20 69 66 28 20 69 3e 30 20 29 20 66 70 72 69 6e   if( i>0 ) fprin
a3d0: 74 66 28 6f 75 74 2c 20 22 2c 20 22 29 3b 0a 20  tf(out, ", ");. 
a3e0: 20 20 20 20 20 20 20 70 72 69 6e 74 51 75 6f 74         printQuot
a3f0: 65 64 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f  ed(out, sqlite3_
a400: 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74  column_value(pSt
a410: 6d 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 7d  mt, i));.      }
a420: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a430: 20 20 63 68 61 72 20 2a 7a 4f 74 61 43 6f 6e 74    char *zOtaCont
a440: 72 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  rol;.      int n
a450: 4f 74 61 43 6f 6e 74 72 6f 6c 20 3d 20 73 71 6c  OtaControl = sql
a460: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
a470: 73 28 70 53 74 6d 74 2c 20 6e 43 6f 6c 29 3b 0a  s(pStmt, nCol);.
a480: 0a 20 20 20 20 20 20 7a 4f 74 61 43 6f 6e 74 72  .      zOtaContr
a490: 6f 6c 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ol = (char*)sqli
a4a0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 74 61 43  te3_malloc(nOtaC
a4b0: 6f 6e 74 72 6f 6c 2b 31 29 3b 0a 20 20 20 20 20  ontrol+1);.     
a4c0: 20 6d 65 6d 63 70 79 28 7a 4f 74 61 43 6f 6e 74   memcpy(zOtaCont
a4d0: 72 6f 6c 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rol, sqlite3_col
a4e0: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
a4f0: 6e 43 6f 6c 29 2c 20 6e 4f 74 61 43 6f 6e 74 72  nCol), nOtaContr
a500: 6f 6c 2b 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f  ol+1);..      fo
a510: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
a520: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
a530: 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20   bDone = 0;.    
a540: 20 20 20 20 69 66 28 20 69 3e 3d 6e 50 4b 20 0a      if( i>=nPK .
a550: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
a560: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
a570: 70 65 28 70 53 74 6d 74 2c 20 69 29 3d 3d 53 51  pe(pStmt, i)==SQ
a580: 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 20 20 20 20  LITE_BLOB.      
a590: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
a5a0: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
a5b0: 6d 74 2c 20 6e 43 6f 6c 2b 31 2b 69 29 3d 3d 53  mt, nCol+1+i)==S
a5c0: 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 20 20 20  QLITE_BLOB.     
a5d0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
a5e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 53 72 63  const char *aSrc
a5f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
a600: 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 6e 43  n_blob(pStmt, nC
a610: 6f 6c 2b 31 2b 69 29 3b 0a 20 20 20 20 20 20 20  ol+1+i);.       
a620: 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 73 71     int nSrc = sq
a630: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
a640: 65 73 28 70 53 74 6d 74 2c 20 6e 43 6f 6c 2b 31  es(pStmt, nCol+1
a650: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  +i);.          c
a660: 6f 6e 73 74 20 63 68 61 72 20 2a 61 46 69 6e 61  onst char *aFina
a670: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
a680: 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  mn_blob(pStmt, i
a690: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
a6a0: 20 6e 46 69 6e 61 6c 20 3d 20 73 71 6c 69 74 65   nFinal = sqlite
a6b0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
a6c0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
a6d0: 20 20 20 20 63 68 61 72 20 2a 61 44 65 6c 74 61      char *aDelta
a6e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
a6f0: 6e 44 65 6c 74 61 3b 0a 0a 20 20 20 20 20 20 20  nDelta;..       
a700: 20 20 20 61 44 65 6c 74 61 20 3d 20 73 71 6c 69     aDelta = sqli
a710: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6e 61  te3_malloc(nFina
a720: 6c 20 2b 20 36 30 29 3b 0a 20 20 20 20 20 20 20  l + 60);.       
a730: 20 20 20 6e 44 65 6c 74 61 20 3d 20 72 62 75 44     nDelta = rbuD
a740: 65 6c 74 61 43 72 65 61 74 65 28 61 53 72 63 2c  eltaCreate(aSrc,
a750: 20 6e 53 72 63 2c 20 61 46 69 6e 61 6c 2c 20 6e   nSrc, aFinal, n
a760: 46 69 6e 61 6c 2c 20 61 44 65 6c 74 61 29 3b 0a  Final, aDelta);.
a770: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44            if( nD
a780: 65 6c 74 61 3c 6e 46 69 6e 61 6c 20 29 7b 0a 20  elta<nFinal ){. 
a790: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
a7a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
a7b0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 78 27 22 29  rintf(out, "x'")
a7c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
a7d0: 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 6c 74 61 3b  r(j=0; j<nDelta;
a7e0: 20 6a 2b 2b 29 20 66 70 72 69 6e 74 66 28 6f 75   j++) fprintf(ou
a7f0: 74 2c 20 22 25 30 32 78 22 2c 20 28 75 38 29 61  t, "%02x", (u8)a
a800: 44 65 6c 74 61 5b 6a 5d 29 3b 0a 20 20 20 20 20  Delta[j]);.     
a810: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
a820: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20  ut, "'");.      
a830: 20 20 20 20 20 20 7a 4f 74 61 43 6f 6e 74 72 6f        zOtaContro
a840: 6c 5b 69 2d 62 4f 74 61 52 6f 77 69 64 5d 20 3d  l[i-bOtaRowid] =
a850: 20 27 66 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'f';.          
a860: 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20    bDone = 1;.   
a870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a880: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a890: 61 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  aDelta);.       
a8a0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
a8b0: 62 44 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bDone==0 ){.    
a8c0: 20 20 20 20 20 20 70 72 69 6e 74 51 75 6f 74 65        printQuote
a8d0: 64 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f 63  d(out, sqlite3_c
a8e0: 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d  olumn_value(pStm
a8f0: 74 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20  t, i));.        
a900: 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  }.        fprint
a910: 66 28 6f 75 74 2c 20 22 2c 20 22 29 3b 0a 20 20  f(out, ", ");.  
a920: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
a930: 6e 74 66 28 6f 75 74 2c 20 22 27 25 73 27 22 2c  ntf(out, "'%s'",
a940: 20 7a 4f 74 61 43 6f 6e 74 72 6f 6c 29 3b 0a 20   zOtaControl);. 
a950: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
a960: 65 28 7a 4f 74 61 43 6f 6e 74 72 6f 6c 29 3b 0a  e(zOtaControl);.
a970: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6e      }..    /* An
a980: 64 20 74 68 65 20 63 6c 6f 73 69 6e 67 20 62 72  d the closing br
a990: 61 63 6b 65 74 20 6f 66 20 74 68 65 20 69 6e 73  acket of the ins
a9a0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ert statement */
a9b0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
a9c0: 2c 20 22 29 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 0a  , ");\n");.  }..
a9d0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
a9e0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
a9f0: 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20 20 20 53   nRow>0 ){.    S
aa00: 74 72 20 63 6e 74 20 3d 20 7b 30 2c 20 30 2c 20  tr cnt = {0, 0, 
aa10: 30 7d 3b 0a 20 20 20 20 73 74 72 50 72 69 6e 74  0};.    strPrint
aa20: 66 28 26 63 6e 74 2c 20 22 49 4e 53 45 52 54 20  f(&cnt, "INSERT 
aa30: 49 4e 54 4f 20 72 62 75 5f 63 6f 75 6e 74 20 56  INTO rbu_count V
aa40: 41 4c 55 45 53 28 27 64 61 74 61 5f 25 71 27 2c  ALUES('data_%q',
aa50: 20 25 64 29 3b 22 2c 20 7a 54 61 62 2c 20 6e 52   %d);", zTab, nR
aa60: 6f 77 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  ow);.    fprintf
aa70: 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 63 6e  (out, "%s\n", cn
aa80: 74 2e 7a 29 3b 0a 20 20 20 20 73 74 72 46 72 65  t.z);.    strFre
aa90: 65 28 26 63 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  e(&cnt);.  }..  
aaa0: 73 74 72 46 72 65 65 28 26 63 74 29 3b 0a 20 20  strFree(&ct);.  
aab0: 73 74 72 46 72 65 65 28 26 73 71 6c 29 3b 0a 20  strFree(&sql);. 
aac0: 20 73 74 72 46 72 65 65 28 26 69 6e 73 65 72 74   strFree(&insert
aad0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  );.}../*.** Disp
aae0: 6c 61 79 20 61 20 73 75 6d 6d 61 72 79 20 6f 66  lay a summary of
aaf0: 20 64 69 66 66 65 72 65 6e 63 65 73 20 62 65 74   differences bet
ab00: 77 65 65 6e 20 74 77 6f 20 76 65 72 73 69 6f 6e  ween two version
ab10: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s of the same.**
ab20: 20 74 61 62 6c 65 20 74 61 62 6c 65 2e 0a 2a 2a   table table..**
ab30: 0a 2a 2a 20 20 20 2a 20 20 4e 75 6d 62 65 72 20  .**   *  Number 
ab40: 6f 66 20 72 6f 77 73 20 63 68 61 6e 67 65 64 0a  of rows changed.
ab50: 2a 2a 20 20 20 2a 20 20 4e 75 6d 62 65 72 20 6f  **   *  Number o
ab60: 66 20 72 6f 77 73 20 61 64 64 65 64 0a 2a 2a 20  f rows added.** 
ab70: 20 20 2a 20 20 4e 75 6d 62 65 72 20 6f 66 20 72    *  Number of r
ab80: 6f 77 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20  ows deleted.**  
ab90: 20 2a 20 20 4e 75 6d 62 65 72 20 6f 66 20 69 64   *  Number of id
aba0: 65 6e 74 69 63 61 6c 20 72 6f 77 73 0a 2a 2f 0a  entical rows.*/.
abb0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 6d  static void summ
abc0: 61 72 69 7a 65 5f 6f 6e 65 5f 74 61 62 6c 65 28  arize_one_table(
abd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
abe0: 2c 20 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20  , FILE *out){.  
abf0: 63 68 61 72 20 2a 7a 49 64 20 3d 20 73 61 66 65  char *zId = safe
ac00: 49 64 28 7a 54 61 62 29 3b 20 2f 2a 20 4e 61 6d  Id(zTab); /* Nam
ac10: 65 20 6f 66 20 74 61 62 6c 65 20 28 74 72 61 6e  e of table (tran
ac20: 73 6c 61 74 65 64 20 66 6f 72 20 75 73 20 69 6e  slated for us in
ac30: 20 53 51 4c 29 20 2a 2f 0a 20 20 63 68 61 72 20   SQL) */.  char 
ac40: 2a 2a 61 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  **az = 0;       
ac50: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
ac60: 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20 63 68 61  in main */.  cha
ac70: 72 20 2a 2a 61 7a 32 20 3d 20 30 3b 20 20 20 20  r **az2 = 0;    
ac80: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
ac90: 73 20 69 6e 20 61 75 78 20 2a 2f 0a 20 20 69 6e  s in aux */.  in
aca0: 74 20 6e 50 6b 3b 20 20 20 20 20 20 20 20 20 20  t nPk;          
acb0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61          /* Prima
acc0: 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  ry key columns i
acd0: 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  n main */.  int 
ace0: 6e 50 6b 32 3b 20 20 20 20 20 20 20 20 20 20 20  nPk2;           
acf0: 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79        /* Primary
ad00: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
ad10: 61 75 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 3d  aux */.  int n =
ad20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ad30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ad40: 63 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61 69 6e 20  columns in main 
ad50: 2a 2f 0a 20 20 69 6e 74 20 6e 32 3b 20 20 20 20  */.  int n2;    
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ad70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
ad80: 6d 6e 73 20 69 6e 20 61 75 78 20 2a 2f 0a 20 20  mns in aux */.  
ad90: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
ada0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
adb0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63  p counter */.  c
adc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
add0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 70 61           /* Sepa
ade0: 72 61 74 6f 72 20 73 74 72 69 6e 67 20 2a 2f 0a  rator string */.
adf0: 20 20 53 74 72 20 73 71 6c 3b 20 20 20 20 20 20    Str sql;      
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
ae10: 6f 6d 70 61 72 69 73 6f 6e 20 71 75 65 72 79 20  omparison query 
ae20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
ae30: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 2f  t *pStmt;      /
ae40: 2a 20 51 75 65 72 79 20 73 74 61 74 65 6d 65 6e  * Query statemen
ae50: 74 20 74 6f 20 64 6f 20 74 68 65 20 64 69 66 66  t to do the diff
ae60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
ae70: 74 36 34 20 6e 55 70 64 61 74 65 3b 20 20 20 20  t64 nUpdate;    
ae80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 70 64  /* Number of upd
ae90: 61 74 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ated rows */.  s
aea0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 55 6e  qlite3_int64 nUn
aeb0: 63 68 61 6e 67 65 64 3b 20 2f 2a 20 4e 75 6d 62  changed; /* Numb
aec0: 65 72 20 6f 66 20 75 6e 6d 6f 64 69 66 69 65 64  er of unmodified
aed0: 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
aee0: 65 33 5f 69 6e 74 36 34 20 6e 44 65 6c 65 74 65  e3_int64 nDelete
aef0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
af00: 66 20 64 65 6c 65 74 65 64 20 72 6f 77 73 20 2a  f deleted rows *
af10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
af20: 34 20 6e 49 6e 73 65 72 74 3b 20 20 20 20 2f 2a  4 nInsert;    /*
af30: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 73 65 72   Number of inser
af40: 74 65 64 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 73  ted rows */..  s
af50: 74 72 49 6e 69 74 28 26 73 71 6c 29 3b 0a 20 20  trInit(&sql);.  
af60: 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  if( sqlite3_tabl
af70: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
af80: 61 28 67 2e 64 62 2c 22 61 75 78 22 2c 7a 54 61  a(g.db,"aux",zTa
af90: 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 20 29  b,0,0,0,0,0,0) )
afa0: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
afb0: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
afc0: 6d 65 74 61 64 61 74 61 28 67 2e 64 62 2c 22 6d  metadata(g.db,"m
afd0: 61 69 6e 22 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c  ain",zTab,0,0,0,
afe0: 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  0,0,0) ){.      
aff0: 2f 2a 20 54 61 62 6c 65 20 6d 69 73 73 69 6e 67  /* Table missing
b000: 20 66 72 6f 6d 20 73 65 63 6f 6e 64 20 64 61 74   from second dat
b010: 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  abase. */.      
b020: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
b030: 3a 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73  : missing from s
b040: 65 63 6f 6e 64 20 64 61 74 61 62 61 73 65 5c 6e  econd database\n
b050: 22 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 7d 0a  ", zTab);.    }.
b060: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 75 6d      goto end_sum
b070: 6d 61 72 69 7a 65 5f 6f 6e 65 5f 74 61 62 6c 65  marize_one_table
b080: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c  ;.  }..  if( sql
b090: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
b0a0: 6e 5f 6d 65 74 61 64 61 74 61 28 67 2e 64 62 2c  n_metadata(g.db,
b0b0: 22 6d 61 69 6e 22 2c 7a 54 61 62 2c 30 2c 30 2c  "main",zTab,0,0,
b0c0: 30 2c 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  0,0,0,0) ){.    
b0d0: 2f 2a 20 54 61 62 6c 65 20 6d 69 73 73 69 6e 67  /* Table missing
b0e0: 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 2a 2f 0a   from source */.
b0f0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
b100: 20 22 25 73 3a 20 6d 69 73 73 69 6e 67 20 66 72   "%s: missing fr
b110: 6f 6d 20 66 69 72 73 74 20 64 61 74 61 62 61 73  om first databas
b120: 65 5c 6e 22 2c 20 7a 54 61 62 29 3b 0a 20 20 20  e\n", zTab);.   
b130: 20 67 6f 74 6f 20 65 6e 64 5f 73 75 6d 6d 61 72   goto end_summar
b140: 69 7a 65 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20  ize_one_table;. 
b150: 20 7d 0a 0a 20 20 61 7a 20 3d 20 63 6f 6c 75 6d   }..  az = colum
b160: 6e 4e 61 6d 65 73 28 22 6d 61 69 6e 22 2c 20 7a  nNames("main", z
b170: 54 61 62 2c 20 26 6e 50 6b 2c 20 30 29 3b 0a 20  Tab, &nPk, 0);. 
b180: 20 61 7a 32 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d   az2 = columnNam
b190: 65 73 28 22 61 75 78 22 2c 20 7a 54 61 62 2c 20  es("aux", zTab, 
b1a0: 26 6e 50 6b 32 2c 20 30 29 3b 0a 20 20 69 66 28  &nPk2, 0);.  if(
b1b0: 20 61 7a 20 26 26 20 61 7a 32 20 29 7b 0a 20 20   az && az2 ){.  
b1c0: 20 20 66 6f 72 28 6e 3d 30 3b 20 61 7a 5b 6e 5d    for(n=0; az[n]
b1d0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; n++){.      if
b1e0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
b1f0: 70 28 61 7a 5b 6e 5d 2c 61 7a 32 5b 6e 5d 29 21  p(az[n],az2[n])!
b200: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
b210: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 7a 3d 3d  }.  }.  if( az==
b220: 30 0a 20 20 20 7c 7c 20 61 7a 32 3d 3d 30 0a 20  0.   || az2==0. 
b230: 20 20 7c 7c 20 6e 50 6b 21 3d 6e 50 6b 32 0a 20    || nPk!=nPk2. 
b240: 20 20 7c 7c 20 61 7a 5b 6e 5d 0a 20 20 29 7b 0a    || az[n].  ){.
b250: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6d 69      /* Schema mi
b260: 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 66 70  smatch */.    fp
b270: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3a 20  rintf(out, "%s: 
b280: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 73 63 68  incompatible sch
b290: 65 6d 61 5c 6e 22 2c 20 7a 54 61 62 29 3b 0a 20  ema\n", zTab);. 
b2a0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 75 6d 6d     goto end_summ
b2b0: 61 72 69 7a 65 5f 6f 6e 65 5f 74 61 62 6c 65 3b  arize_one_table;
b2c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64  .  }..  /* Build
b2d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
b2e0: 71 75 65 72 79 20 2a 2f 0a 20 20 66 6f 72 28 6e  query */.  for(n
b2f0: 32 3d 6e 3b 20 61 7a 5b 6e 32 5d 3b 20 6e 32 2b  2=n; az[n2]; n2+
b300: 2b 29 7b 7d 0a 20 20 73 74 72 50 72 69 6e 74 66  +){}.  strPrintf
b310: 28 26 73 71 6c 2c 20 22 53 45 4c 45 43 54 20 31  (&sql, "SELECT 1
b320: 2c 20 63 6f 75 6e 74 28 2a 29 22 29 3b 0a 20 20  , count(*)");.  
b330: 69 66 28 20 6e 32 3d 3d 6e 50 6b 32 20 29 7b 0a  if( n2==nPk2 ){.
b340: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
b350: 71 6c 2c 20 22 2c 20 30 5c 6e 22 29 3b 0a 20 20  ql, ", 0\n");.  
b360: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
b370: 3d 20 22 2c 20 73 75 6d 28 22 3b 0a 20 20 20 20  = ", sum(";.    
b380: 66 6f 72 28 69 3d 6e 50 6b 3b 20 61 7a 5b 69 5d  for(i=nPk; az[i]
b390: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
b3a0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
b3b0: 73 41 2e 25 73 20 49 53 20 4e 4f 54 20 42 2e 25  sA.%s IS NOT B.%
b3c0: 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 2c  s", zSep, az[i],
b3d0: 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7a   az[i]);.      z
b3e0: 53 65 70 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20  Sep = " OR ";.  
b3f0: 20 20 7d 0a 20 20 20 20 73 74 72 50 72 69 6e 74    }.    strPrint
b400: 66 28 26 73 71 6c 2c 20 22 29 5c 6e 22 29 3b 0a  f(&sql, ")\n");.
b410: 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28    }.  strPrintf(
b420: 26 73 71 6c 2c 20 22 20 20 46 52 4f 4d 20 6d 61  &sql, "  FROM ma
b430: 69 6e 2e 25 73 20 41 2c 20 61 75 78 2e 25 73 20  in.%s A, aux.%s 
b440: 42 5c 6e 22 2c 20 7a 49 64 2c 20 7a 49 64 29 3b  B\n", zId, zId);
b450: 0a 20 20 7a 53 65 70 20 3d 20 22 20 57 48 45 52  .  zSep = " WHER
b460: 45 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  E";.  for(i=0; i
b470: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
b480: 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20  strPrintf(&sql, 
b490: 22 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20  "%s A.%s=B.%s", 
b4a0: 7a 53 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b  zSep, az[i], az[
b4b0: 69 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  i]);.    zSep = 
b4c0: 22 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74  " AND";.  }.  st
b4d0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20  rPrintf(&sql, " 
b4e0: 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b 0a 20  UNION ALL\n");. 
b4f0: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
b500: 20 22 53 45 4c 45 43 54 20 32 2c 20 63 6f 75 6e   "SELECT 2, coun
b510: 74 28 2a 29 2c 20 30 5c 6e 22 29 3b 0a 20 20 73  t(*), 0\n");.  s
b520: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
b530: 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41    FROM main.%s A
b540: 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 73 74 72  \n", zId);.  str
b550: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 57  Printf(&sql, " W
b560: 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 28  HERE NOT EXISTS(
b570: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 61 75  SELECT 1 FROM au
b580: 78 2e 25 73 20 42 20 22 2c 20 7a 49 64 29 3b 0a  x.%s B ", zId);.
b590: 20 20 7a 53 65 70 20 3d 20 22 57 48 45 52 45 22    zSep = "WHERE"
b5a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
b5b0: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Pk; i++){.    st
b5c0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
b5d0: 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53  s A.%s=B.%s", zS
b5e0: 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d  ep, az[i], az[i]
b5f0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 20  );.    zSep = " 
b600: 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50  AND";.  }.  strP
b610: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 29 5c 6e  rintf(&sql, ")\n
b620: 22 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28  ");.  strPrintf(
b630: 26 73 71 6c 2c 20 22 20 55 4e 49 4f 4e 20 41 4c  &sql, " UNION AL
b640: 4c 5c 6e 22 29 3b 0a 20 20 73 74 72 50 72 69 6e  L\n");.  strPrin
b650: 74 66 28 26 73 71 6c 2c 20 22 53 45 4c 45 43 54  tf(&sql, "SELECT
b660: 20 33 2c 20 63 6f 75 6e 74 28 2a 29 2c 20 30 5c   3, count(*), 0\
b670: 6e 22 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66  n");.  strPrintf
b680: 28 26 73 71 6c 2c 20 22 20 20 46 52 4f 4d 20 61  (&sql, "  FROM a
b690: 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49 64 29  ux.%s B\n", zId)
b6a0: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  ;.  strPrintf(&s
b6b0: 71 6c 2c 20 22 20 57 48 45 52 45 20 4e 4f 54 20  ql, " WHERE NOT 
b6c0: 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20  EXISTS(SELECT 1 
b6d0: 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 20 22  FROM main.%s A "
b6e0: 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d  , zId);.  zSep =
b6f0: 20 22 57 48 45 52 45 22 3b 0a 20 20 66 6f 72 28   "WHERE";.  for(
b700: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
b710: 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28  {.    strPrintf(
b720: 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42  &sql, "%s A.%s=B
b730: 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69  .%s", zSep, az[i
b740: 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a  ], az[i]);.    z
b750: 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20  Sep = " AND";.  
b760: 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  }.  strPrintf(&s
b770: 71 6c 2c 20 22 29 5c 6e 20 4f 52 44 45 52 20 42  ql, ")\n ORDER B
b780: 59 20 31 3b 5c 6e 22 29 3b 0a 0a 20 20 69 66 28  Y 1;\n");..  if(
b790: 20 28 67 2e 66 44 65 62 75 67 20 26 20 44 45 42   (g.fDebug & DEB
b7a0: 55 47 5f 44 49 46 46 5f 53 51 4c 29 21 3d 30 20  UG_DIFF_SQL)!=0 
b7b0: 29 7b 20 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ){ .    printf("
b7c0: 53 51 4c 20 66 6f 72 20 25 73 3a 5c 6e 25 73 5c  SQL for %s:\n%s\
b7d0: 6e 22 2c 20 7a 49 64 2c 20 73 71 6c 2e 7a 29 3b  n", zId, sql.z);
b7e0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 75  .    goto end_su
b7f0: 6d 6d 61 72 69 7a 65 5f 6f 6e 65 5f 74 61 62 6c  mmarize_one_tabl
b800: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 75 6e  e;.  }..  /* Run
b810: 20 74 68 65 20 71 75 65 72 79 20 61 6e 64 20 6f   the query and o
b820: 75 74 70 75 74 20 64 69 66 66 65 72 65 6e 63 65  utput difference
b830: 20 73 75 6d 6d 61 72 79 20 2a 2f 0a 20 20 70 53   summary */.  pS
b840: 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65  tmt = db_prepare
b850: 28 22 25 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a 20  ("%s", sql.z);. 
b860: 20 6e 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20   nUpdate = 0;.  
b870: 6e 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 6e  nInsert = 0;.  n
b880: 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 6e 55  Delete = 0;.  nU
b890: 6e 63 68 61 6e 67 65 64 20 3d 20 30 3b 0a 20 20  nchanged = 0;.  
b8a0: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
b8b0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
b8c0: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 73 77  pStmt) ){.    sw
b8d0: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
b8e0: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30  lumn_int(pStmt,0
b8f0: 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ) ){.      case 
b900: 31 3a 0a 20 20 20 20 20 20 20 20 6e 55 70 64 61  1:.        nUpda
b910: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  te = sqlite3_col
b920: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
b930: 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 55 6e 63  2);.        nUnc
b940: 68 61 6e 67 65 64 20 3d 20 73 71 6c 69 74 65 33  hanged = sqlite3
b950: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
b960: 74 6d 74 2c 31 29 20 2d 20 6e 55 70 64 61 74 65  tmt,1) - nUpdate
b970: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
b980: 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 0a 20  .      case 2:. 
b990: 20 20 20 20 20 20 20 6e 44 65 6c 65 74 65 20 3d         nDelete =
b9a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b9b0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 31 29 3b 0a  int64(pStmt,1);.
b9c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b9d0: 20 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20       case 3:.   
b9e0: 20 20 20 20 20 6e 49 6e 73 65 72 74 20 3d 20 73       nInsert = s
b9f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
ba00: 74 36 34 28 70 53 74 6d 74 2c 31 29 3b 0a 20 20  t64(pStmt,1);.  
ba10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba20: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
ba30: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
ba40: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
ba50: 20 22 25 73 3a 20 25 6c 6c 64 20 63 68 61 6e 67   "%s: %lld chang
ba60: 65 73 2c 20 25 6c 6c 64 20 69 6e 73 65 72 74 73  es, %lld inserts
ba70: 2c 20 25 6c 6c 64 20 64 65 6c 65 74 65 73 2c 20  , %lld deletes, 
ba80: 25 6c 6c 64 20 75 6e 63 68 61 6e 67 65 64 5c 6e  %lld unchanged\n
ba90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 54 61  ",.          zTa
baa0: 62 2c 20 6e 55 70 64 61 74 65 2c 20 6e 49 6e 73  b, nUpdate, nIns
bab0: 65 72 74 2c 20 6e 44 65 6c 65 74 65 2c 20 6e 55  ert, nDelete, nU
bac0: 6e 63 68 61 6e 67 65 64 29 3b 0a 0a 65 6e 64 5f  nchanged);..end_
bad0: 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e 65 5f 74 61  summarize_one_ta
bae0: 62 6c 65 3a 0a 20 20 73 74 72 46 72 65 65 28 26  ble:.  strFree(&
baf0: 73 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  sql);.  sqlite3_
bb00: 66 72 65 65 28 7a 49 64 29 3b 0a 20 20 6e 61 6d  free(zId);.  nam
bb10: 65 6c 69 73 74 46 72 65 65 28 61 7a 29 3b 0a 20  elistFree(az);. 
bb20: 20 6e 61 6d 65 6c 69 73 74 46 72 65 65 28 61 7a   namelistFree(az
bb30: 32 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  2);.  return;.}.
bb40: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 36  ./*.** Write a 6
bb50: 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
bb60: 65 67 65 72 20 61 73 20 61 20 76 61 72 69 6e 74  eger as a varint
bb70: 20 6f 6e 74 6f 20 6f 75 74 0a 2a 2f 0a 73 74 61   onto out.*/.sta
bb80: 74 69 63 20 76 6f 69 64 20 70 75 74 73 56 61 72  tic void putsVar
bb90: 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73  int(FILE *out, s
bba0: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 76 29  qlite3_uint64 v)
bbb0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
bbc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 5b  unsigned char p[
bbd0: 31 32 5d 3b 0a 20 20 69 66 28 20 76 20 26 20 28  12];.  if( v & (
bbe0: 28 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34  ((sqlite3_uint64
bbf0: 29 30 78 66 66 30 30 30 30 30 30 29 3c 3c 33 32  )0xff000000)<<32
bc00: 29 20 29 7b 0a 20 20 20 20 70 5b 38 5d 20 3d 20  ) ){.    p[8] = 
bc10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 76  (unsigned char)v
bc20: 3b 0a 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20  ;.    v >>= 8;. 
bc30: 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 3e 3d 30     for(i=7; i>=0
bc40: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 5b  ; i--){.      p[
bc50: 69 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  i] = (unsigned c
bc60: 68 61 72 29 28 28 76 20 26 20 30 78 37 66 29 20  har)((v & 0x7f) 
bc70: 7c 20 30 78 38 30 29 3b 0a 20 20 20 20 20 20 76  | 0x80);.      v
bc80: 20 3e 3e 3d 20 37 3b 0a 20 20 20 20 7d 0a 20 20   >>= 7;.    }.  
bc90: 20 20 66 77 72 69 74 65 28 70 2c 20 38 2c 20 31    fwrite(p, 8, 1
bca0: 2c 20 6f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  , out);.  }else{
bcb0: 0a 20 20 20 20 6e 20 3d 20 39 3b 0a 20 20 20 20  .    n = 9;.    
bcc0: 64 6f 7b 0a 20 20 20 20 20 20 70 5b 6e 2d 2d 5d  do{.      p[n--]
bcd0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
bce0: 72 29 28 28 76 20 26 20 30 78 37 66 29 20 7c 20  r)((v & 0x7f) | 
bcf0: 30 78 38 30 29 3b 0a 20 20 20 20 20 20 76 20 3e  0x80);.      v >
bd00: 3e 3d 20 37 3b 0a 20 20 20 20 7d 77 68 69 6c 65  >= 7;.    }while
bd10: 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 70 5b  ( v!=0 );.    p[
bd20: 39 5d 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  9] &= 0x7f;.    
bd30: 66 77 72 69 74 65 28 70 2b 6e 2b 31 2c 20 39 2d  fwrite(p+n+1, 9-
bd40: 6e 2c 20 31 2c 20 6f 75 74 29 3b 0a 20 20 7d 0a  n, 1, out);.  }.
bd50: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
bd60: 6e 20 53 51 4c 69 74 65 20 76 61 6c 75 65 20 6f  n SQLite value o
bd70: 6e 74 6f 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74  nto out..*/.stat
bd80: 69 63 20 76 6f 69 64 20 70 75 74 56 61 6c 75 65  ic void putValue
bd90: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 71 6c 69  (FILE *out, sqli
bda0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29  te3_value *pVal)
bdb0: 7b 0a 20 20 69 6e 74 20 69 44 54 79 70 65 20 3d  {.  int iDType =
bdc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
bdd0: 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 73 71 6c  ype(pVal);.  sql
bde0: 69 74 65 33 5f 69 6e 74 36 34 20 69 58 3b 0a 20  ite3_int64 iX;. 
bdf0: 20 64 6f 75 62 6c 65 20 72 58 3b 0a 20 20 73 71   double rX;.  sq
be00: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 58 3b  lite3_uint64 uX;
be10: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 70 75 74  .  int j;..  put
be20: 63 28 69 44 54 79 70 65 2c 20 6f 75 74 29 3b 0a  c(iDType, out);.
be30: 20 20 73 77 69 74 63 68 28 20 69 44 54 79 70 65    switch( iDType
be40: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
be50: 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20  ITE_INTEGER:.   
be60: 20 20 20 69 58 20 3d 20 73 71 6c 69 74 65 33 5f     iX = sqlite3_
be70: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c  value_int64(pVal
be80: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
be90: 26 75 58 2c 20 26 69 58 2c 20 38 29 3b 0a 20 20  &uX, &iX, 8);.  
bea0: 20 20 20 20 66 6f 72 28 6a 3d 35 36 3b 20 6a 3e      for(j=56; j>
beb0: 3d 30 3b 20 6a 2d 3d 38 29 20 70 75 74 63 28 28  =0; j-=8) putc((
bec0: 75 58 3e 3e 6a 29 26 30 78 66 66 2c 20 6f 75 74  uX>>j)&0xff, out
bed0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
bee0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bef0: 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 72 58 20  FLOAT:.      rX 
bf00: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
bf10: 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20  double(pVal);.  
bf20: 20 20 20 20 6d 65 6d 63 70 79 28 26 75 58 2c 20      memcpy(&uX, 
bf30: 26 72 58 2c 20 38 29 3b 0a 20 20 20 20 20 20 66  &rX, 8);.      f
bf40: 6f 72 28 6a 3d 35 36 3b 20 6a 3e 3d 30 3b 20 6a  or(j=56; j>=0; j
bf50: 2d 3d 38 29 20 70 75 74 63 28 28 75 58 3e 3e 6a  -=8) putc((uX>>j
bf60: 29 26 30 78 66 66 2c 20 6f 75 74 29 3b 0a 20 20  )&0xff, out);.  
bf70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
bf80: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
bf90: 0a 20 20 20 20 20 20 69 58 20 3d 20 73 71 6c 69  .      iX = sqli
bfa0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
bfb0: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 75 74  pVal);.      put
bfc0: 73 56 61 72 69 6e 74 28 6f 75 74 2c 20 28 73 71  sVarint(out, (sq
bfd0: 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 69 58 29  lite3_uint64)iX)
bfe0: 3b 0a 20 20 20 20 20 20 66 77 72 69 74 65 28 73  ;.      fwrite(s
bff0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
c000: 74 28 70 56 61 6c 29 2c 31 2c 28 73 69 7a 65 5f  t(pVal),1,(size_
c010: 74 29 69 58 2c 6f 75 74 29 3b 0a 20 20 20 20 20  t)iX,out);.     
c020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
c030: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20   SQLITE_BLOB:.  
c040: 20 20 20 20 69 58 20 3d 20 73 71 6c 69 74 65 33      iX = sqlite3
c050: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
c060: 6c 29 3b 0a 20 20 20 20 20 20 70 75 74 73 56 61  l);.      putsVa
c070: 72 69 6e 74 28 6f 75 74 2c 20 28 73 71 6c 69 74  rint(out, (sqlit
c080: 65 33 5f 75 69 6e 74 36 34 29 69 58 29 3b 0a 20  e3_uint64)iX);. 
c090: 20 20 20 20 20 66 77 72 69 74 65 28 73 71 6c 69       fwrite(sqli
c0a0: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
c0b0: 56 61 6c 29 2c 31 2c 28 73 69 7a 65 5f 74 29 69  Val),1,(size_t)i
c0c0: 58 2c 6f 75 74 29 3b 0a 20 20 20 20 20 20 62 72  X,out);.      br
c0d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
c0e0: 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20  LITE_NULL:.     
c0f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f   break;.  }.}../
c100: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
c110: 43 48 41 4e 47 45 53 45 54 20 66 6f 72 20 61 6c  CHANGESET for al
c120: 6c 20 64 69 66 66 65 72 65 6e 63 65 73 20 66 72  l differences fr
c130: 6f 6d 20 6d 61 69 6e 2e 7a 54 61 62 20 74 6f 20  om main.zTab to 
c140: 61 75 78 2e 7a 54 61 62 2e 0a 2a 2f 0a 73 74 61  aux.zTab..*/.sta
c150: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 73  tic void changes
c160: 65 74 5f 6f 6e 65 5f 74 61 62 6c 65 28 63 6f 6e  et_one_table(con
c170: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 46  st char *zTab, F
c180: 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 73 71 6c  ILE *out){.  sql
c190: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
c1a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ;          /* SQ
c1b0: 4c 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20  L statment */.  
c1c0: 63 68 61 72 20 2a 7a 49 64 20 3d 20 73 61 66 65  char *zId = safe
c1d0: 49 64 28 7a 54 61 62 29 3b 20 20 20 20 20 2f 2a  Id(zTab);     /*
c1e0: 20 45 73 63 61 70 65 64 20 6e 61 6d 65 20 6f 66   Escaped name of
c1f0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
c200: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30  char **azCol = 0
c210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c220: 20 4c 69 73 74 20 6f 66 20 65 73 63 61 70 65 64   List of escaped
c230: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
c240: 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b  .  int nCol = 0;
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
c270: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  lumns */.  int *
c280: 61 69 46 6c 67 20 3d 20 30 3b 20 20 20 20 20 20  aiFlg = 0;      
c290: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 69 66           /* 0 if
c2a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 70   column is not p
c2b0: 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69  art of PK */.  i
c2c0: 6e 74 20 2a 61 69 50 6b 20 3d 20 30 3b 20 20 20  nt *aiPk = 0;   
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c2e0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 66  Column numbers f
c2f0: 6f 72 20 65 61 63 68 20 50 4b 20 63 6f 6c 75 6d  or each PK colum
c300: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 20 3d  n */.  int nPk =
c310: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c320: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c330: 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  f PRIMARY KEY co
c340: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 74 72 20 73  lumns */.  Str s
c350: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
c360: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
c370: 66 6f 72 20 74 68 65 20 64 69 66 66 20 71 75 65  for the diff que
c380: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6b  ry */.  int i, k
c390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c3a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c3b0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6e 73  unters */.  cons
c3c0: 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20  t char *zSep;   
c3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
c3e0: 74 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 0a  t separator */..
c3f0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
c400: 74 68 65 20 73 63 68 65 6d 61 73 20 6f 66 20 74  the schemas of t
c410: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 6d 61  he two tables ma
c420: 74 63 68 2e 20 45 78 69 74 20 65 61 72 6c 79 20  tch. Exit early 
c430: 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20  otherwise. */.  
c440: 63 68 65 63 6b 53 63 68 65 6d 61 73 4d 61 74 63  checkSchemasMatc
c450: 68 28 7a 54 61 62 29 3b 0a 0a 20 20 70 53 74 6d  h(zTab);..  pStm
c460: 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28 22  t = db_prepare("
c470: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 74 61 62 6c  PRAGMA main.tabl
c480: 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62  e_info=%Q", zTab
c490: 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49  );.  while( SQLI
c4a0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
c4b0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
c4c0: 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 61     nCol++;.    a
c4d0: 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72  zCol = sqlite3_r
c4e0: 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 73 69  ealloc(azCol, si
c4f0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c  zeof(char*)*nCol
c500: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
c510: 3d 3d 30 20 29 20 72 75 6e 74 69 6d 65 45 72 72  ==0 ) runtimeErr
c520: 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or("out of memor
c530: 79 22 29 3b 0a 20 20 20 20 61 69 46 6c 67 20 3d  y");.    aiFlg =
c540: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
c550: 28 61 69 46 6c 67 2c 20 73 69 7a 65 6f 66 28 69  (aiFlg, sizeof(i
c560: 6e 74 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 69  nt)*nCol);.    i
c570: 66 28 20 61 69 46 6c 67 3d 3d 30 20 29 20 72 75  f( aiFlg==0 ) ru
c580: 6e 74 69 6d 65 45 72 72 6f 72 28 22 6f 75 74 20  ntimeError("out 
c590: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
c5a0: 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2d 31 5d 20 3d   azCol[nCol-1] =
c5b0: 20 73 61 66 65 49 64 28 28 63 6f 6e 73 74 20 63   safeId((const c
c5c0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
c5d0: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31  umn_text(pStmt,1
c5e0: 29 29 3b 0a 20 20 20 20 61 69 46 6c 67 5b 6e 43  ));.    aiFlg[nC
c5f0: 6f 6c 2d 31 5d 20 3d 20 69 20 3d 20 73 71 6c 69  ol-1] = i = sqli
c600: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
c610: 53 74 6d 74 2c 35 29 3b 0a 20 20 20 20 69 66 28  Stmt,5);.    if(
c620: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66   i>0 ){.      if
c630: 28 20 69 3e 6e 50 6b 20 29 7b 0a 20 20 20 20 20  ( i>nPk ){.     
c640: 20 20 20 6e 50 6b 20 3d 20 69 3b 0a 20 20 20 20     nPk = i;.    
c650: 20 20 20 20 61 69 50 6b 20 3d 20 73 71 6c 69 74      aiPk = sqlit
c660: 65 33 5f 72 65 61 6c 6c 6f 63 28 61 69 50 6b 2c  e3_realloc(aiPk,
c670: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 50 6b   sizeof(int)*nPk
c680: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
c690: 69 50 6b 3d 3d 30 20 29 20 72 75 6e 74 69 6d 65  iPk==0 ) runtime
c6a0: 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65  Error("out of me
c6b0: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 7d 0a  mory");.      }.
c6c0: 20 20 20 20 20 20 61 69 50 6b 5b 69 2d 31 5d 20        aiPk[i-1] 
c6d0: 3d 20 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 0a  = nCol-1;.    }.
c6e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
c6f0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
c700: 20 69 66 28 20 6e 50 6b 3d 3d 30 20 29 20 67 6f   if( nPk==0 ) go
c710: 74 6f 20 65 6e 64 5f 63 68 61 6e 67 65 73 65 74  to end_changeset
c720: 5f 6f 6e 65 5f 74 61 62 6c 65 3b 20 0a 20 20 73  _one_table; .  s
c730: 74 72 49 6e 69 74 28 26 73 71 6c 29 3b 0a 20 20  trInit(&sql);.  
c740: 69 66 28 20 6e 43 6f 6c 3e 6e 50 6b 20 29 7b 0a  if( nCol>nPk ){.
c750: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
c760: 71 6c 2c 20 22 53 45 4c 45 43 54 20 25 64 22 2c  ql, "SELECT %d",
c770: 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3b   SQLITE_UPDATE);
c780: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c790: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
c7a0: 20 20 69 66 28 20 61 69 46 6c 67 5b 69 5d 20 29    if( aiFlg[i] )
c7b0: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 50 72 69  {.        strPri
c7c0: 6e 74 66 28 26 73 71 6c 2c 20 22 2c 5c 6e 20 20  ntf(&sql, ",\n  
c7d0: 20 20 20 20 20 41 2e 25 73 22 2c 20 61 7a 43 6f       A.%s", azCo
c7e0: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l[i]);.      }el
c7f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 50  se{.        strP
c800: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c 5c 6e  rintf(&sql, ",\n
c810: 20 20 20 20 20 20 20 41 2e 25 73 20 49 53 20 4e         A.%s IS N
c820: 4f 54 20 42 2e 25 73 2c 20 41 2e 25 73 2c 20 42  OT B.%s, A.%s, B
c830: 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .%s",.          
c840: 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d          azCol[i]
c850: 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 61 7a 43 6f  , azCol[i], azCo
c860: 6c 5b 69 5d 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  l[i], azCol[i]);
c870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c880: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
c890: 6c 2c 22 5c 6e 20 20 46 52 4f 4d 20 6d 61 69 6e  l,"\n  FROM main
c8a0: 2e 25 73 20 41 2c 20 61 75 78 2e 25 73 20 42 5c  .%s A, aux.%s B\
c8b0: 6e 22 2c 20 7a 49 64 2c 20 7a 49 64 29 3b 0a 20  n", zId, zId);. 
c8c0: 20 20 20 7a 53 65 70 20 3d 20 22 20 57 48 45 52     zSep = " WHER
c8d0: 45 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  E";.    for(i=0;
c8e0: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
c8f0: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
c900: 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e 25  ql, "%s A.%s=B.%
c910: 73 22 2c 20 7a 53 65 70 2c 20 61 7a 43 6f 6c 5b  s", zSep, azCol[
c920: 61 69 50 6b 5b 69 5d 5d 2c 20 61 7a 43 6f 6c 5b  aiPk[i]], azCol[
c930: 61 69 50 6b 5b 69 5d 5d 29 3b 0a 20 20 20 20 20  aiPk[i]]);.     
c940: 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a   zSep = " AND";.
c950: 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 70 20 3d      }.    zSep =
c960: 20 22 5c 6e 20 20 20 41 4e 44 20 28 22 3b 0a 20   "\n   AND (";. 
c970: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
c980: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
c990: 69 66 28 20 61 69 46 6c 67 5b 69 5d 20 29 20 63  if( aiFlg[i] ) c
c9a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73  ontinue;.      s
c9b0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
c9c0: 25 73 41 2e 25 73 20 49 53 20 4e 4f 54 20 42 2e  %sA.%s IS NOT B.
c9d0: 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 43 6f 6c  %s", zSep, azCol
c9e0: 5b 69 5d 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  [i], azCol[i]);.
c9f0: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f        zSep = " O
ca00: 52 5c 6e 20 20 20 20 20 20 20 20 22 3b 0a 20 20  R\n        ";.  
ca10: 20 20 7d 0a 20 20 20 20 73 74 72 50 72 69 6e 74    }.    strPrint
ca20: 66 28 26 73 71 6c 2c 22 29 5c 6e 20 55 4e 49 4f  f(&sql,")\n UNIO
ca30: 4e 20 41 4c 4c 5c 6e 22 29 3b 0a 20 20 7d 0a 20  N ALL\n");.  }. 
ca40: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
ca50: 20 22 53 45 4c 45 43 54 20 25 64 22 2c 20 53 51   "SELECT %d", SQ
ca60: 4c 49 54 45 5f 44 45 4c 45 54 45 29 3b 0a 20 20  LITE_DELETE);.  
ca70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
ca80: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
ca90: 69 46 6c 67 5b 69 5d 20 29 7b 0a 20 20 20 20 20  iFlg[i] ){.     
caa0: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
cab0: 20 22 2c 5c 6e 20 20 20 20 20 20 20 41 2e 25 73   ",\n       A.%s
cac0: 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", azCol[i]);.  
cad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
cae0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
caf0: 2c 5c 6e 20 20 20 20 20 20 20 31 2c 20 41 2e 25  ,\n       1, A.%
cb00: 73 2c 20 4e 55 4c 4c 22 2c 20 61 7a 43 6f 6c 5b  s, NULL", azCol[
cb10: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i]);.    }.  }. 
cb20: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
cb30: 20 22 5c 6e 20 20 46 52 4f 4d 20 6d 61 69 6e 2e   "\n  FROM main.
cb40: 25 73 20 41 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20  %s A\n", zId);. 
cb50: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
cb60: 20 22 20 57 48 45 52 45 20 4e 4f 54 20 45 58 49   " WHERE NOT EXI
cb70: 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f  STS(SELECT 1 FRO
cb80: 4d 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a  M aux.%s B\n", z
cb90: 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20 20 20  Id);.  zSep =   
cba0: 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20         "        
cbb0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
cbc0: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ";.  for(i=0; i<
cbd0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nPk; i++){.    s
cbe0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
cbf0: 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a  %s A.%s=B.%s", z
cc00: 53 65 70 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b 5b  Sep, azCol[aiPk[
cc10: 69 5d 5d 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b 5b  i]], azCol[aiPk[
cc20: 69 5d 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  i]]);.    zSep =
cc30: 20 22 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73   " AND";.  }.  s
cc40: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
cc50: 29 5c 6e 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22  )\n UNION ALL\n"
cc60: 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26  );.  strPrintf(&
cc70: 73 71 6c 2c 20 22 53 45 4c 45 43 54 20 25 64 22  sql, "SELECT %d"
cc80: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  , SQLITE_INSERT)
cc90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
cca0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
ccb0: 66 28 20 61 69 46 6c 67 5b 69 5d 20 29 7b 0a 20  f( aiFlg[i] ){. 
ccc0: 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26       strPrintf(&
ccd0: 73 71 6c 2c 20 22 2c 5c 6e 20 20 20 20 20 20 20  sql, ",\n       
cce0: 42 2e 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29  B.%s", azCol[i])
ccf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cd00: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
cd10: 6c 2c 20 22 2c 5c 6e 20 20 20 20 20 20 20 31 2c  l, ",\n       1,
cd20: 20 4e 55 4c 4c 2c 20 42 2e 25 73 22 2c 20 61 7a   NULL, B.%s", az
cd30: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Col[i]);.    }. 
cd40: 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26   }.  strPrintf(&
cd50: 73 71 6c 2c 20 22 5c 6e 20 20 46 52 4f 4d 20 61  sql, "\n  FROM a
cd60: 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49 64 29  ux.%s B\n", zId)
cd70: 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  ;.  strPrintf(&s
cd80: 71 6c 2c 20 22 20 57 48 45 52 45 20 4e 4f 54 20  ql, " WHERE NOT 
cd90: 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20  EXISTS(SELECT 1 
cda0: 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 5c 6e  FROM main.%s A\n
cdb0: 22 2c 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20  ", zId);.  zSep 
cdc0: 3d 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20  =          "    
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
cde0: 48 45 52 45 22 3b 0a 20 20 66 6f 72 28 69 3d 30  HERE";.  for(i=0
cdf0: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
ce00: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
ce10: 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e 25 73  l, "%s A.%s=B.%s
ce20: 22 2c 20 7a 53 65 70 2c 20 61 7a 43 6f 6c 5b 61  ", zSep, azCol[a
ce30: 69 50 6b 5b 69 5d 5d 2c 20 61 7a 43 6f 6c 5b 61  iPk[i]], azCol[a
ce40: 69 50 6b 5b 69 5d 5d 29 3b 0a 20 20 20 20 7a 53  iPk[i]]);.    zS
ce50: 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20 7d  ep = " AND";.  }
ce60: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
ce70: 6c 2c 20 22 29 5c 6e 22 29 3b 0a 20 20 73 74 72  l, ")\n");.  str
ce80: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 4f  Printf(&sql, " O
ce90: 52 44 45 52 20 42 59 22 29 3b 0a 20 20 7a 53 65  RDER BY");.  zSe
cea0: 70 20 3d 20 22 20 22 3b 0a 20 20 66 6f 72 28 69  p = " ";.  for(i
ceb0: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
cec0: 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26  .    strPrintf(&
ced0: 73 71 6c 2c 20 22 25 73 20 25 64 22 2c 20 7a 53  sql, "%s %d", zS
cee0: 65 70 2c 20 61 69 50 6b 5b 69 5d 2b 32 29 3b 0a  ep, aiPk[i]+2);.
cef0: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a      zSep = ",";.
cf00: 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28    }.  strPrintf(
cf10: 26 73 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 0a 20  &sql, ";\n");.. 
cf20: 20 69 66 28 20 67 2e 66 44 65 62 75 67 20 26 20   if( g.fDebug & 
cf30: 44 45 42 55 47 5f 44 49 46 46 5f 53 51 4c 20 29  DEBUG_DIFF_SQL )
cf40: 7b 20 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  { .    printf("S
cf50: 51 4c 20 66 6f 72 20 25 73 3a 5c 6e 25 73 5c 6e  QL for %s:\n%s\n
cf60: 22 2c 20 7a 49 64 2c 20 73 71 6c 2e 7a 29 3b 0a  ", zId, sql.z);.
cf70: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 68 61      goto end_cha
cf80: 6e 67 65 73 65 74 5f 6f 6e 65 5f 74 61 62 6c 65  ngeset_one_table
cf90: 3b 0a 20 20 7d 0a 0a 20 20 70 75 74 63 28 27 54  ;.  }..  putc('T
cfa0: 27 2c 20 6f 75 74 29 3b 0a 20 20 70 75 74 73 56  ', out);.  putsV
cfb0: 61 72 69 6e 74 28 6f 75 74 2c 20 28 73 71 6c 69  arint(out, (sqli
cfc0: 74 65 33 5f 75 69 6e 74 36 34 29 6e 43 6f 6c 29  te3_uint64)nCol)
cfd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
cfe0: 43 6f 6c 3b 20 69 2b 2b 29 20 70 75 74 63 28 61  Col; i++) putc(a
cff0: 69 46 6c 67 5b 69 5d 21 3d 30 2c 20 6f 75 74 29  iFlg[i]!=0, out)
d000: 3b 0a 20 20 66 77 72 69 74 65 28 7a 54 61 62 2c  ;.  fwrite(zTab,
d010: 20 31 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 29   1, strlen(zTab)
d020: 2c 20 6f 75 74 29 3b 0a 20 20 70 75 74 63 28 30  , out);.  putc(0
d030: 2c 20 6f 75 74 29 3b 0a 0a 20 20 70 53 74 6d 74  , out);..  pStmt
d040: 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28 22 25   = db_prepare("%
d050: 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20 77 68  s", sql.z);.  wh
d060: 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
d070: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
d080: 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  tmt) ){.    int 
d090: 69 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  iType = sqlite3_
d0a0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
d0b0: 2c 30 29 3b 0a 20 20 20 20 70 75 74 63 28 69 54  ,0);.    putc(iT
d0c0: 79 70 65 2c 20 6f 75 74 29 3b 0a 20 20 20 20 70  ype, out);.    p
d0d0: 75 74 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(0, out);.   
d0e0: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
d0f0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
d100: 74 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 63 61  t,0) ){.      ca
d110: 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45  se SQLITE_UPDATE
d120: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  : {.        for(
d130: 6b 3d 31 2c 20 69 3d 30 3b 20 69 3c 6e 43 6f 6c  k=1, i=0; i<nCol
d140: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d150: 20 20 69 66 28 20 61 69 46 6c 67 5b 69 5d 20 29    if( aiFlg[i] )
d160: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
d170: 74 56 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69  tValue(out, sqli
d180: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
d190: 28 70 53 74 6d 74 2c 6b 29 29 3b 0a 20 20 20 20  (pStmt,k));.    
d1a0: 20 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20          k++;.   
d1b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
d1c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d1d0: 69 6e 74 28 70 53 74 6d 74 2c 6b 29 20 29 7b 0a  int(pStmt,k) ){.
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 56              putV
d1f0: 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69 74 65  alue(out, sqlite
d200: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
d210: 53 74 6d 74 2c 6b 2b 31 29 29 3b 0a 20 20 20 20  Stmt,k+1));.    
d220: 20 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a          k += 3;.
d230: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
d240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
d250: 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  c(0, out);.     
d260: 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a 20         k += 3;. 
d270: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d280: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
d290: 28 6b 3d 31 2c 20 69 3d 30 3b 20 69 3c 6e 43 6f  (k=1, i=0; i<nCo
d2a0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
d2b0: 20 20 20 69 66 28 20 61 69 46 6c 67 5b 69 5d 20     if( aiFlg[i] 
d2c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d2d0: 75 74 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(0, out);.   
d2e0: 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20           k++;.  
d2f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d300: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
d310: 5f 69 6e 74 28 70 53 74 6d 74 2c 6b 29 20 29 7b  _int(pStmt,k) ){
d320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
d330: 56 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69 74  Value(out, sqlit
d340: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
d350: 70 53 74 6d 74 2c 6b 2b 32 29 29 3b 0a 20 20 20  pStmt,k+2));.   
d360: 20 20 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b           k += 3;
d370: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
d380: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
d390: 74 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(0, out);.    
d3a0: 20 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a          k += 3;.
d3b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d3c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
d3d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d3e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
d3f0: 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 20  NSERT: {.       
d400: 20 66 6f 72 28 6b 3d 31 2c 20 69 3d 30 3b 20 69   for(k=1, i=0; i
d410: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
d420: 20 20 20 20 20 20 20 69 66 28 20 61 69 46 6c 67         if( aiFlg
d430: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [i] ){.         
d440: 20 20 20 70 75 74 56 61 6c 75 65 28 6f 75 74 2c     putValue(out,
d450: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d460: 76 61 6c 75 65 28 70 53 74 6d 74 2c 6b 29 29 3b  value(pStmt,k));
d470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 2b 2b  .            k++
d480: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
d490: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
d4a0: 75 74 56 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c  utValue(out, sql
d4b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
d4c0: 65 28 70 53 74 6d 74 2c 6b 2b 32 29 29 3b 0a 20  e(pStmt,k+2));. 
d4d0: 20 20 20 20 20 20 20 20 20 20 20 6b 20 2b 3d 20             k += 
d4e0: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  3;.          }. 
d4f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d510: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
d520: 45 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20  E_DELETE: {.    
d530: 20 20 20 20 66 6f 72 28 6b 3d 31 2c 20 69 3d 30      for(k=1, i=0
d540: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
d550: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69            if( ai
d560: 46 6c 67 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  Flg[i] ){.      
d570: 20 20 20 20 20 20 70 75 74 56 61 6c 75 65 28 6f        putValue(o
d580: 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ut, sqlite3_colu
d590: 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 6b  mn_value(pStmt,k
d5a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
d5b0: 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  k++;.          }
d5c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d5d0: 20 20 70 75 74 56 61 6c 75 65 28 6f 75 74 2c 20    putValue(out, 
d5e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
d5f0: 61 6c 75 65 28 70 53 74 6d 74 2c 6b 2b 31 29 29  alue(pStmt,k+1))
d600: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20  ;.            k 
d610: 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20  += 3;.          
d620: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
d630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d640: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
d650: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
d660: 70 53 74 6d 74 29 3b 0a 20 20 0a 65 6e 64 5f 63  pStmt);.  .end_c
d670: 68 61 6e 67 65 73 65 74 5f 6f 6e 65 5f 74 61 62  hangeset_one_tab
d680: 6c 65 3a 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f  le:.  while( nCo
d690: 6c 3e 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72  l>0 ) sqlite3_fr
d6a0: 65 65 28 61 7a 43 6f 6c 5b 2d 2d 6e 43 6f 6c 5d  ee(azCol[--nCol]
d6b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
d6c0: 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  e(azCol);.  sqli
d6d0: 74 65 33 5f 66 72 65 65 28 61 69 50 6b 29 3b 0a  te3_free(aiPk);.
d6e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d6f0: 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  Id);.}../*.** Ex
d700: 74 72 61 63 74 20 74 68 65 20 6e 65 78 74 20 53  tract the next S
d710: 51 4c 20 6b 65 79 77 6f 72 64 20 6f 72 20 71 75  QL keyword or qu
d720: 6f 74 65 64 20 73 74 72 69 6e 67 20 66 72 6f 6d  oted string from
d730: 20 62 75 66 66 65 72 20 7a 49 6e 20 61 6e 64 20   buffer zIn and 
d740: 63 6f 70 79 20 69 74 0a 2a 2a 20 28 6f 72 20 61  copy it.** (or a
d750: 20 70 72 65 66 69 78 20 6f 66 20 69 74 20 69 66   prefix of it if
d760: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74   it will not fit
d770: 29 20 69 6e 74 6f 20 62 75 66 66 65 72 20 7a 42  ) into buffer zB
d780: 75 66 2c 20 73 69 7a 65 20 6e 42 75 66 20 62 79  uf, size nBuf by
d790: 74 65 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  tes..** Return a
d7a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d7b0: 63 68 61 72 61 63 74 65 72 20 77 69 74 68 69 6e  character within
d7c0: 20 7a 49 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79   zIn immediately
d7d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 74   following .** t
d7e0: 68 65 20 74 6f 6b 65 6e 20 6f 72 20 71 75 6f 74  he token or quot
d7f0: 65 64 20 73 74 72 69 6e 67 20 6a 75 73 74 20 65  ed string just e
d800: 78 74 72 61 63 74 65 64 2e 0a 2a 2f 0a 63 6f 6e  xtracted..*/.con
d810: 73 74 20 63 68 61 72 20 2a 67 6f 62 62 6c 65 5f  st char *gobble_
d820: 74 6f 6b 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  token(const char
d830: 20 2a 7a 49 6e 2c 20 63 68 61 72 20 2a 7a 42 75   *zIn, char *zBu
d840: 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20  f, int nBuf){.  
d850: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d 20  const char *p = 
d860: 7a 49 6e 3b 0a 20 20 63 68 61 72 20 2a 70 4f 75  zIn;.  char *pOu
d870: 74 20 3d 20 7a 42 75 66 3b 0a 20 20 63 68 61 72  t = zBuf;.  char
d880: 20 2a 70 45 6e 64 20 3d 20 26 70 4f 75 74 5b 6e   *pEnd = &pOut[n
d890: 42 75 66 2d 31 5d 3b 0a 20 20 63 68 61 72 20 71  Buf-1];.  char q
d8a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 71 75 6f            /* quo
d8c0: 74 65 20 63 68 61 72 61 63 74 65 72 2c 20 69 66  te character, if
d8d0: 20 61 6e 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   any */..  if( p
d8e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
d8f0: 20 20 77 68 69 6c 65 28 20 2a 70 3d 3d 27 20 27    while( *p==' '
d900: 20 29 20 70 2b 2b 3b 0a 20 20 73 77 69 74 63 68   ) p++;.  switch
d910: 28 20 2a 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( *p ){.    case
d920: 20 27 22 27 3a 20 71 20 3d 20 27 22 27 3b 20 62   '"': q = '"'; b
d930: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27  reak;.    case '
d940: 5c 27 27 3a 20 71 20 3d 20 27 5c 27 27 3b 20 62  \'': q = '\''; b
d950: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27  reak;.    case '
d960: 60 27 3a 20 71 20 3d 20 27 60 27 3b 20 62 72 65  `': q = '`'; bre
d970: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 5b 27  ak;.    case '['
d980: 3a 20 71 20 3d 20 27 5d 27 3b 20 62 72 65 61 6b  : q = ']'; break
d990: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 71 20 29  ;.  }..  if( q )
d9a0: 7b 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 77  {.    p++;.    w
d9b0: 68 69 6c 65 28 20 2a 70 20 26 26 20 70 4f 75 74  hile( *p && pOut
d9c0: 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69  <pEnd ){.      i
d9d0: 66 28 20 2a 70 3d 3d 71 20 29 7b 0a 20 20 20 20  f( *p==q ){.    
d9e0: 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20      p++;.       
d9f0: 20 69 66 28 20 2a 70 21 3d 71 20 29 20 62 72 65   if( *p!=q ) bre
da00: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
da10: 20 20 69 66 28 20 70 4f 75 74 3c 70 45 6e 64 20    if( pOut<pEnd 
da20: 29 20 2a 70 4f 75 74 2b 2b 20 3d 20 2a 70 3b 0a  ) *pOut++ = *p;.
da30: 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20 20 7d        p++;.    }
da40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
da50: 69 6c 65 28 20 2a 70 20 26 26 20 2a 70 21 3d 27  ile( *p && *p!='
da60: 20 27 20 26 26 20 2a 70 21 3d 27 28 27 20 29 7b   ' && *p!='(' ){
da70: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 75 74 3c  .      if( pOut<
da80: 70 45 6e 64 20 29 20 2a 70 4f 75 74 2b 2b 20 3d  pEnd ) *pOut++ =
da90: 20 2a 70 3b 0a 20 20 20 20 20 20 70 2b 2b 3b 0a   *p;.      p++;.
daa0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 4f      }.  }..  *pO
dab0: 75 74 20 3d 20 27 5c 30 27 3b 0a 20 20 72 65 74  ut = '\0';.  ret
dac0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
dad0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
dae0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
daf0: 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61  ion of SQL scala
db00: 72 20 66 75 6e 63 74 69 6f 6e 20 22 6d 6f 64 75  r function "modu
db10: 6c 65 5f 6e 61 6d 65 22 3a 0a 2a 2a 0a 2a 2a 20  le_name":.**.** 
db20: 20 20 6d 6f 64 75 6c 65 5f 6e 61 6d 65 28 53 51    module_name(SQ
db30: 4c 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c  L).**.** The onl
db40: 79 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  y argument shoul
db50: 64 20 62 65 20 61 6e 20 53 51 4c 20 73 74 61 74  d be an SQL stat
db60: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 79 70  ement of the typ
db70: 65 20 74 68 61 74 20 6d 61 79 20 61 70 70 65 61  e that may appea
db80: 72 0a 2a 2a 20 69 6e 20 74 68 65 20 73 71 6c 69  r.** in the sqli
db90: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
dba0: 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
dbb0: 74 20 69 73 20 61 20 22 43 52 45 41 54 45 20 56  t is a "CREATE V
dbc0: 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 2a 2a  IRTUAL TABLE".**
dbd0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
dbe0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
dbf0: 6e 65 64 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ned is the name 
dc00: 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 20 74 68  of the module th
dc10: 61 74 20 69 74 0a 2a 2a 20 75 73 65 73 2e 20 4f  at it.** uses. O
dc20: 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
dc30: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6e 6f   statement is no
dc40: 74 20 61 20 43 56 54 2c 20 4e 55 4c 4c 20 69 73  t a CVT, NULL is
dc50: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
dc60: 61 74 69 63 20 76 6f 69 64 20 6d 6f 64 75 6c 65  atic void module
dc70: 5f 6e 61 6d 65 5f 66 75 6e 63 28 0a 20 20 73 71  _name_func(.  sq
dc80: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
dc90: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56 61 6c  Ctx, .  int nVal
dca0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
dcb0: 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 63 6f 6e  **apVal.){.  con
dcc0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
dcd0: 20 63 68 61 72 20 7a 54 6f 6b 65 6e 5b 33 32 5d   char zToken[32]
dce0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61  ;..  assert( nVa
dcf0: 6c 3d 3d 31 20 29 3b 0a 20 20 7a 53 71 6c 20 3d  l==1 );.  zSql =
dd00: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
dd10: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
dd20: 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 7a  (apVal[0]);..  z
dd30: 53 71 6c 20 3d 20 67 6f 62 62 6c 65 5f 74 6f 6b  Sql = gobble_tok
dd40: 65 6e 28 7a 53 71 6c 2c 20 7a 54 6f 6b 65 6e 2c  en(zSql, zToken,
dd50: 20 73 69 7a 65 6f 66 28 7a 54 6f 6b 65 6e 29 29   sizeof(zToken))
dd60: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
dd70: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
dd80: 6d 70 28 7a 54 6f 6b 65 6e 2c 20 22 63 72 65 61  mp(zToken, "crea
dd90: 74 65 22 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  te") ) return;. 
dda0: 20 7a 53 71 6c 20 3d 20 67 6f 62 62 6c 65 5f 74   zSql = gobble_t
ddb0: 6f 6b 65 6e 28 7a 53 71 6c 2c 20 7a 54 6f 6b 65  oken(zSql, zToke
ddc0: 6e 2c 20 73 69 7a 65 6f 66 28 7a 54 6f 6b 65 6e  n, sizeof(zToken
ddd0: 29 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ));.  if( zSql==
dde0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
ddf0: 69 63 6d 70 28 7a 54 6f 6b 65 6e 2c 20 22 76 69  icmp(zToken, "vi
de00: 72 74 75 61 6c 22 29 20 29 20 72 65 74 75 72 6e  rtual") ) return
de10: 3b 0a 20 20 7a 53 71 6c 20 3d 20 67 6f 62 62 6c  ;.  zSql = gobbl
de20: 65 5f 74 6f 6b 65 6e 28 7a 53 71 6c 2c 20 7a 54  e_token(zSql, zT
de30: 6f 6b 65 6e 2c 20 73 69 7a 65 6f 66 28 7a 54 6f  oken, sizeof(zTo
de40: 6b 65 6e 29 29 3b 0a 20 20 69 66 28 20 7a 53 71  ken));.  if( zSq
de50: 6c 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  l==0 || sqlite3_
de60: 73 74 72 69 63 6d 70 28 7a 54 6f 6b 65 6e 2c 20  stricmp(zToken, 
de70: 22 74 61 62 6c 65 22 29 20 29 20 72 65 74 75 72  "table") ) retur
de80: 6e 3b 0a 20 20 7a 53 71 6c 20 3d 20 67 6f 62 62  n;.  zSql = gobb
de90: 6c 65 5f 74 6f 6b 65 6e 28 7a 53 71 6c 2c 20 7a  le_token(zSql, z
dea0: 54 6f 6b 65 6e 2c 20 73 69 7a 65 6f 66 28 7a 54  Token, sizeof(zT
deb0: 6f 6b 65 6e 29 29 3b 0a 20 20 69 66 28 20 7a 53  oken));.  if( zS
dec0: 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ql==0 ) return;.
ded0: 20 20 7a 53 71 6c 20 3d 20 67 6f 62 62 6c 65 5f    zSql = gobble_
dee0: 74 6f 6b 65 6e 28 7a 53 71 6c 2c 20 7a 54 6f 6b  token(zSql, zTok
def0: 65 6e 2c 20 73 69 7a 65 6f 66 28 7a 54 6f 6b 65  en, sizeof(zToke
df00: 6e 29 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  n));.  if( zSql=
df10: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
df20: 72 69 63 6d 70 28 7a 54 6f 6b 65 6e 2c 20 22 75  ricmp(zToken, "u
df30: 73 69 6e 67 22 29 20 29 20 72 65 74 75 72 6e 3b  sing") ) return;
df40: 0a 20 20 7a 53 71 6c 20 3d 20 67 6f 62 62 6c 65  .  zSql = gobble
df50: 5f 74 6f 6b 65 6e 28 7a 53 71 6c 2c 20 7a 54 6f  _token(zSql, zTo
df60: 6b 65 6e 2c 20 73 69 7a 65 6f 66 28 7a 54 6f 6b  ken, sizeof(zTok
df70: 65 6e 29 29 3b 0a 20 20 0a 20 20 73 71 6c 69 74  en));.  .  sqlit
df80: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
df90: 43 74 78 2c 20 7a 54 6f 6b 65 6e 2c 20 2d 31 2c  Ctx, zToken, -1,
dfa0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
dfb0: 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  T);.}../*.** Ret
dfc0: 75 72 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20  urn the text of 
dfd0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
dfe0: 20 74 68 61 74 20 69 74 73 65 6c 66 20 72 65 74   that itself ret
dff0: 75 72 6e 73 20 74 68 65 20 6c 69 73 74 20 6f 66  urns the list of
e000: 0a 2a 2a 20 74 61 62 6c 65 73 20 74 6f 20 70 72  .** tables to pr
e010: 6f 63 65 73 73 20 77 69 74 68 69 6e 20 74 68 65  ocess within the
e020: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 63 6f   database..*/.co
e030: 6e 73 74 20 63 68 61 72 20 2a 61 6c 6c 5f 74 61  nst char *all_ta
e040: 62 6c 65 73 5f 73 71 6c 28 29 7b 0a 20 20 69 66  bles_sql(){.  if
e050: 28 20 67 2e 62 48 61 6e 64 6c 65 56 74 61 62 20  ( g.bHandleVtab 
e060: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
e070: 20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74   .    rc = sqlit
e080: 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 0a 20  e3_exec(g.db, . 
e090: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
e0a0: 45 4d 50 20 54 41 42 4c 45 20 74 62 6c 6d 61 70  EMP TABLE tblmap
e0b0: 28 6d 6f 64 75 6c 65 20 43 4f 4c 4c 41 54 45 20  (module COLLATE 
e0c0: 6e 6f 63 61 73 65 2c 20 70 6f 73 74 66 69 78 29  nocase, postfix)
e0d0: 3b 22 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  ;".        "INSE
e0e0: 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e 74 62 6c  RT INTO temp.tbl
e0f0: 6d 61 70 20 56 41 4c 55 45 53 22 0a 20 20 20 20  map VALUES".    
e100: 20 20 20 20 22 28 27 66 74 73 33 27 2c 20 27 5f      "('fts3', '_
e110: 63 6f 6e 74 65 6e 74 27 29 2c 20 28 27 66 74 73  content'), ('fts
e120: 33 27 2c 20 27 5f 73 65 67 6d 65 6e 74 73 27 29  3', '_segments')
e130: 2c 20 28 27 66 74 73 33 27 2c 20 27 5f 73 65 67  , ('fts3', '_seg
e140: 64 69 72 27 29 2c 22 0a 20 20 0a 20 20 20 20 20  dir'),".  .     
e150: 20 20 20 22 28 27 66 74 73 34 27 2c 20 27 5f 63     "('fts4', '_c
e160: 6f 6e 74 65 6e 74 27 29 2c 20 28 27 66 74 73 34  ontent'), ('fts4
e170: 27 2c 20 27 5f 73 65 67 6d 65 6e 74 73 27 29 2c  ', '_segments'),
e180: 20 28 27 66 74 73 34 27 2c 20 27 5f 73 65 67 64   ('fts4', '_segd
e190: 69 72 27 29 2c 22 0a 20 20 20 20 20 20 20 20 22  ir'),".        "
e1a0: 28 27 66 74 73 34 27 2c 20 27 5f 64 6f 63 73 69  ('fts4', '_docsi
e1b0: 7a 65 27 29 2c 20 28 27 66 74 73 34 27 2c 20 27  ze'), ('fts4', '
e1c0: 5f 73 74 61 74 27 29 2c 22 0a 20 20 0a 20 20 20  _stat'),".  .   
e1d0: 20 20 20 20 20 22 28 27 66 74 73 35 27 2c 20 27       "('fts5', '
e1e0: 5f 64 61 74 61 27 29 2c 20 28 27 66 74 73 35 27  _data'), ('fts5'
e1f0: 2c 20 27 5f 69 64 78 27 29 2c 20 28 27 66 74 73  , '_idx'), ('fts
e200: 35 27 2c 20 27 5f 63 6f 6e 74 65 6e 74 27 29 2c  5', '_content'),
e210: 22 0a 20 20 20 20 20 20 20 20 22 28 27 66 74 73  ".        "('fts
e220: 35 27 2c 20 27 5f 64 6f 63 73 69 7a 65 27 29 2c  5', '_docsize'),
e230: 20 28 27 66 74 73 35 27 2c 20 27 5f 63 6f 6e 66   ('fts5', '_conf
e240: 69 67 27 29 2c 22 0a 20 20 0a 20 20 20 20 20 20  ig'),".  .      
e250: 20 20 22 28 27 72 74 72 65 65 27 2c 20 27 5f 6e    "('rtree', '_n
e260: 6f 64 65 27 29 2c 20 28 27 72 74 72 65 65 27 2c  ode'), ('rtree',
e270: 20 27 5f 72 6f 77 69 64 27 29 2c 20 28 27 72 74   '_rowid'), ('rt
e280: 72 65 65 27 2c 20 27 5f 70 61 72 65 6e 74 27 29  ree', '_parent')
e290: 3b 22 0a 20 20 20 20 20 20 20 20 2c 20 30 2c 20  ;".        , 0, 
e2a0: 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20  0, 0.    );.    
e2b0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
e2c0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 0a 20 20 20 20  TE_OK );.  .    
e2d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
e2e0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
e2f0: 20 20 20 20 20 20 67 2e 64 62 2c 20 22 6d 6f 64        g.db, "mod
e300: 75 6c 65 5f 6e 61 6d 65 22 2c 20 31 2c 20 53 51  ule_name", 1, SQ
e310: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6d 6f  LITE_UTF8, 0, mo
e320: 64 75 6c 65 5f 6e 61 6d 65 5f 66 75 6e 63 2c 20  dule_name_func, 
e330: 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20  0, 0.    );.    
e340: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
e350: 54 45 5f 4f 4b 20 29 3b 0a 20 20 0a 20 20 20 20  TE_OK );.  .    
e360: 72 65 74 75 72 6e 20 0a 20 20 20 20 20 20 22 53  return .      "S
e370: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
e380: 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
e390: 65 72 5c 6e 22 0a 20 20 20 20 20 20 22 20 57 48  er\n".      " WH
e3a0: 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
e3b0: 20 41 4e 44 20 28 5c 6e 22 0a 20 20 20 20 20 20   AND (\n".      
e3c0: 22 20 20 20 20 6d 6f 64 75 6c 65 5f 6e 61 6d 65  "    module_name
e3d0: 28 73 71 6c 29 20 49 53 20 4e 55 4c 4c 20 4f 52  (sql) IS NULL OR
e3e0: 20 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20   \n".      "    
e3f0: 6d 6f 64 75 6c 65 5f 6e 61 6d 65 28 73 71 6c 29  module_name(sql)
e400: 20 49 4e 20 28 53 45 4c 45 43 54 20 6d 6f 64 75   IN (SELECT modu
e410: 6c 65 20 46 52 4f 4d 20 74 65 6d 70 2e 74 62 6c  le FROM temp.tbl
e420: 6d 61 70 29 5c 6e 22 0a 20 20 20 20 20 20 22 20  map)\n".      " 
e430: 29 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 49  ) AND name NOT I
e440: 4e 20 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  N (\n".      "  
e450: 53 45 4c 45 43 54 20 61 2e 6e 61 6d 65 20 7c 7c  SELECT a.name ||
e460: 20 62 2e 70 6f 73 74 66 69 78 20 5c 6e 22 0a 20   b.postfix \n". 
e470: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 6d 61 69         "FROM mai
e480: 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n.sqlite_master 
e490: 41 53 20 61 2c 20 74 65 6d 70 2e 74 62 6c 6d 61  AS a, temp.tblma
e4a0: 70 20 41 53 20 62 20 5c 6e 22 0a 20 20 20 20 20  p AS b \n".     
e4b0: 20 20 20 22 57 48 45 52 45 20 6d 6f 64 75 6c 65     "WHERE module
e4c0: 5f 6e 61 6d 65 28 61 2e 73 71 6c 29 20 3d 20 62  _name(a.sql) = b
e4d0: 2e 6d 6f 64 75 6c 65 5c 6e 22 20 0a 20 20 20 20  .module\n" .    
e4e0: 20 20 22 20 29 5c 6e 22 0a 20 20 20 20 20 20 22    " )\n".      "
e4f0: 55 4e 49 4f 4e 20 5c 6e 22 0a 20 20 20 20 20 20  UNION \n".      
e500: 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
e510: 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73  M aux.sqlite_mas
e520: 74 65 72 5c 6e 22 0a 20 20 20 20 20 20 22 20 57  ter\n".      " W
e530: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
e540: 27 20 41 4e 44 20 28 5c 6e 22 0a 20 20 20 20 20  ' AND (\n".     
e550: 20 22 20 20 20 20 6d 6f 64 75 6c 65 5f 6e 61 6d   "    module_nam
e560: 65 28 73 71 6c 29 20 49 53 20 4e 55 4c 4c 20 4f  e(sql) IS NULL O
e570: 52 20 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20  R \n".      "   
e580: 20 6d 6f 64 75 6c 65 5f 6e 61 6d 65 28 73 71 6c   module_name(sql
e590: 29 20 49 4e 20 28 53 45 4c 45 43 54 20 6d 6f 64  ) IN (SELECT mod
e5a0: 75 6c 65 20 46 52 4f 4d 20 74 65 6d 70 2e 74 62  ule FROM temp.tb
e5b0: 6c 6d 61 70 29 5c 6e 22 0a 20 20 20 20 20 20 22  lmap)\n".      "
e5c0: 20 29 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20   ) AND name NOT 
e5d0: 49 4e 20 28 5c 6e 22 0a 20 20 20 20 20 20 22 20  IN (\n".      " 
e5e0: 20 53 45 4c 45 43 54 20 61 2e 6e 61 6d 65 20 7c   SELECT a.name |
e5f0: 7c 20 62 2e 70 6f 73 74 66 69 78 20 5c 6e 22 0a  | b.postfix \n".
e600: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 61 75          "FROM au
e610: 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  x.sqlite_master 
e620: 41 53 20 61 2c 20 74 65 6d 70 2e 74 62 6c 6d 61  AS a, temp.tblma
e630: 70 20 41 53 20 62 20 5c 6e 22 0a 20 20 20 20 20  p AS b \n".     
e640: 20 20 20 22 57 48 45 52 45 20 6d 6f 64 75 6c 65     "WHERE module
e650: 5f 6e 61 6d 65 28 61 2e 73 71 6c 29 20 3d 20 62  _name(a.sql) = b
e660: 2e 6d 6f 64 75 6c 65 5c 6e 22 20 0a 20 20 20 20  .module\n" .    
e670: 20 20 22 20 29 5c 6e 22 0a 20 20 20 20 20 20 22    " )\n".      "
e680: 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 22 3b   ORDER BY name";
e690: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
e6a0: 74 75 72 6e 0a 20 20 20 20 20 20 22 53 45 4c 45  turn.      "SELE
e6b0: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 6d 61 69  CT name FROM mai
e6c0: 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c  n.sqlite_master\
e6d0: 6e 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45  n".      " WHERE
e6e0: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e   type='table' AN
e6f0: 44 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20 27  D sql NOT LIKE '
e700: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 25 25  CREATE VIRTUAL%%
e710: 27 5c 6e 22 0a 20 20 20 20 20 20 22 20 55 4e 49  '\n".      " UNI
e720: 4f 4e 5c 6e 22 0a 20 20 20 20 20 20 22 53 45 4c  ON\n".      "SEL
e730: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 75  ECT name FROM au
e740: 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c  x.sqlite_master\
e750: 6e 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45  n".      " WHERE
e760: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e   type='table' AN
e770: 44 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20 27  D sql NOT LIKE '
e780: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 25 25  CREATE VIRTUAL%%
e790: 27 5c 6e 22 0a 20 20 20 20 20 20 22 20 4f 52 44  '\n".      " ORD
e7a0: 45 52 20 42 59 20 6e 61 6d 65 22 3b 0a 20 20 7d  ER BY name";.  }
e7b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
e7c0: 73 6b 65 74 63 68 79 20 64 6f 63 75 6d 65 6e 74  sketchy document
e7d0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 75  ation for this u
e7e0: 74 69 6c 69 74 79 20 70 72 6f 67 72 61 6d 0a 2a  tility program.*
e7f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
e800: 6f 77 48 65 6c 70 28 76 6f 69 64 29 7b 0a 20 20  owHelp(void){.  
e810: 70 72 69 6e 74 66 28 22 55 73 61 67 65 3a 20 25  printf("Usage: %
e820: 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 44 42 31 20  s [options] DB1 
e830: 44 42 32 5c 6e 22 2c 20 67 2e 7a 41 72 67 76 30  DB2\n", g.zArgv0
e840: 29 3b 0a 20 20 70 72 69 6e 74 66 28 0a 22 4f 75  );.  printf(."Ou
e850: 74 70 75 74 20 53 51 4c 20 74 65 78 74 20 74 68  tput SQL text th
e860: 61 74 20 77 6f 75 6c 64 20 74 72 61 6e 73 66 6f  at would transfo
e870: 72 6d 20 44 42 31 20 69 6e 74 6f 20 44 42 32 2e  rm DB1 into DB2.
e880: 5c 6e 22 0a 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22  \n"."Options:\n"
e890: 0a 22 20 20 2d 2d 63 68 61 6e 67 65 73 65 74 20  ."  --changeset 
e8a0: 46 49 4c 45 20 20 20 20 20 20 57 72 69 74 65 20  FILE      Write 
e8b0: 61 20 43 48 41 4e 47 45 53 45 54 20 69 6e 74 6f  a CHANGESET into
e8c0: 20 46 49 4c 45 5c 6e 22 0a 22 20 20 2d 4c 7c 2d   FILE\n"."  -L|-
e8d0: 2d 6c 69 62 20 4c 49 42 52 41 52 59 20 20 20 20  -lib LIBRARY    
e8e0: 20 20 4c 6f 61 64 20 61 6e 20 53 51 4c 69 74 65    Load an SQLite
e8f0: 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61   extension libra
e900: 72 79 5c 6e 22 0a 22 20 20 2d 2d 70 72 69 6d 61  ry\n"."  --prima
e910: 72 79 6b 65 79 20 20 20 20 20 20 20 20 20 20 55  rykey          U
e920: 73 65 20 73 63 68 65 6d 61 2d 64 65 66 69 6e 65  se schema-define
e930: 64 20 50 52 49 4d 41 52 59 20 4b 45 59 73 5c 6e  d PRIMARY KEYs\n
e940: 22 0a 22 20 20 2d 2d 72 62 75 20 20 20 20 20 20  "."  --rbu      
e950: 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75             Outpu
e960: 74 20 53 51 4c 20 74 6f 20 63 72 65 61 74 65 2f  t SQL to create/
e970: 70 6f 70 75 6c 61 74 65 20 52 42 55 20 74 61 62  populate RBU tab
e980: 6c 65 28 73 29 5c 6e 22 0a 22 20 20 2d 2d 73 63  le(s)\n"."  --sc
e990: 68 65 6d 61 20 20 20 20 20 20 20 20 20 20 20 20  hema            
e9a0: 20 20 53 68 6f 77 20 6f 6e 6c 79 20 64 69 66 66    Show only diff
e9b0: 65 72 65 6e 63 65 73 20 69 6e 20 74 68 65 20 73  erences in the s
e9c0: 63 68 65 6d 61 5c 6e 22 0a 22 20 20 2d 2d 73 75  chema\n"."  --su
e9d0: 6d 6d 61 72 79 20 20 20 20 20 20 20 20 20 20 20  mmary           
e9e0: 20 20 53 68 6f 77 20 6f 6e 6c 79 20 61 20 73 75    Show only a su
e9f0: 6d 6d 61 72 79 20 6f 66 20 74 68 65 20 64 69 66  mmary of the dif
ea00: 66 65 72 65 6e 63 65 73 5c 6e 22 0a 22 20 20 2d  ferences\n"."  -
ea10: 2d 74 61 62 6c 65 20 54 41 42 20 20 20 20 20 20  -table TAB      
ea20: 20 20 20 20 20 53 68 6f 77 20 6f 6e 6c 79 20 64       Show only d
ea30: 69 66 66 65 72 65 6e 63 65 73 20 69 6e 20 74 61  ifferences in ta
ea40: 62 6c 65 20 54 41 42 5c 6e 22 0a 22 20 20 2d 2d  ble TAB\n"."  --
ea50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 20 20 20 20  transaction     
ea60: 20 20 20 20 53 68 6f 77 20 53 51 4c 20 6f 75 74      Show SQL out
ea70: 70 75 74 20 69 6e 73 69 64 65 20 61 20 74 72 61  put inside a tra
ea80: 6e 73 61 63 74 69 6f 6e 5c 6e 22 0a 22 20 20 2d  nsaction\n"."  -
ea90: 2d 76 74 61 62 20 20 20 20 20 20 20 20 20 20 20  -vtab           
eaa0: 20 20 20 20 20 48 61 6e 64 6c 65 20 66 74 73 33       Handle fts3
eab0: 2c 20 66 74 73 34 2c 20 66 74 73 35 20 61 6e 64  , fts4, fts5 and
eac0: 20 72 74 72 65 65 20 74 61 62 6c 65 73 5c 6e 22   rtree tables\n"
ead0: 0a 20 20 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69  .  );.}..int mai
eae0: 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  n(int argc, char
eaf0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73   **argv){.  cons
eb00: 74 20 63 68 61 72 20 2a 7a 44 62 31 20 3d 20 30  t char *zDb1 = 0
eb10: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
eb20: 7a 44 62 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zDb2 = 0;.  int 
eb30: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  i;.  int rc;.  c
eb40: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
eb50: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
eb60: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
eb70: 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  pStmt;.  char *z
eb80: 54 61 62 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20  Tab = 0;.  FILE 
eb90: 2a 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  *out = stdout;. 
eba0: 20 76 6f 69 64 20 28 2a 78 44 69 66 66 29 28 63   void (*xDiff)(c
ebb0: 6f 6e 73 74 20 63 68 61 72 2a 2c 46 49 4c 45 2a  onst char*,FILE*
ebc0: 29 20 3d 20 64 69 66 66 5f 6f 6e 65 5f 74 61 62  ) = diff_one_tab
ebd0: 6c 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  le;.#ifndef SQLI
ebe0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
ebf0: 45 4e 53 49 4f 4e 0a 20 20 69 6e 74 20 6e 45 78  ENSION.  int nEx
ec00: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 2a  t = 0;.  char **
ec10: 61 7a 45 78 74 20 3d 20 30 3b 0a 23 65 6e 64 69  azExt = 0;.#endi
ec20: 66 0a 20 20 69 6e 74 20 75 73 65 54 72 61 6e 73  f.  int useTrans
ec30: 61 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 69 6e  action = 0;.  in
ec40: 74 20 6e 65 76 65 72 55 73 65 54 72 61 6e 73 61  t neverUseTransa
ec50: 63 74 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 67 2e  ction = 0;..  g.
ec60: 7a 41 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d  zArgv0 = argv[0]
ec70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  ;.  sqlite3_conf
ec80: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
ec90: 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a  _SINGLETHREAD);.
eca0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
ecb0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
ecc0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67  st char *z = arg
ecd0: 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b  v[i];.    if( z[
ece0: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
ecf0: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
ed00: 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[0]=='-' ) z++;
ed10: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
ed20: 70 28 7a 2c 22 63 68 61 6e 67 65 73 65 74 22 29  p(z,"changeset")
ed30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
ed40: 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 63  f( i==argc-1 ) c
ed50: 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 6d 69 73  mdlineError("mis
ed60: 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 74 6f  sing argument to
ed70: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
ed80: 20 20 20 20 20 20 20 20 6f 75 74 20 3d 20 66 6f          out = fo
ed90: 70 65 6e 28 61 72 67 76 5b 2b 2b 69 5d 2c 20 22  pen(argv[++i], "
eda0: 77 62 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  wb");.        if
edb0: 28 20 6f 75 74 3d 3d 30 20 29 20 63 6d 64 6c 69  ( out==0 ) cmdli
edc0: 6e 65 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20  neError("cannot 
edd0: 6f 70 65 6e 3a 20 25 73 22 2c 20 61 72 67 76 5b  open: %s", argv[
ede0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 44 69  i]);.        xDi
edf0: 66 66 20 3d 20 63 68 61 6e 67 65 73 65 74 5f 6f  ff = changeset_o
ee00: 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 20 20 20 20  ne_table;.      
ee10: 20 20 6e 65 76 65 72 55 73 65 54 72 61 6e 73 61    neverUseTransa
ee20: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 20  ction = 1;.     
ee30: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
ee40: 20 73 74 72 63 6d 70 28 7a 2c 22 64 65 62 75 67   strcmp(z,"debug
ee50: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
ee60: 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29   if( i==argc-1 )
ee70: 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 6d   cmdlineError("m
ee80: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
ee90: 74 6f 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29  to %s", argv[i])
eea0: 3b 0a 20 20 20 20 20 20 20 20 67 2e 66 44 65 62  ;.        g.fDeb
eeb0: 75 67 20 3d 20 73 74 72 74 6f 6c 28 61 72 67 76  ug = strtol(argv
eec0: 5b 2b 2b 69 5d 2c 20 30 2c 20 30 29 3b 0a 20 20  [++i], 0, 0);.  
eed0: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
eee0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 68 65  if( strcmp(z,"he
eef0: 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
ef00: 20 20 20 73 68 6f 77 48 65 6c 70 28 29 3b 0a 20     showHelp();. 
ef10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
ef20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 69 66  .      }else.#if
ef30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ef40: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
ef50: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
ef60: 28 7a 2c 22 6c 69 62 22 29 3d 3d 30 20 7c 7c 20  (z,"lib")==0 || 
ef70: 73 74 72 63 6d 70 28 7a 2c 22 4c 22 29 3d 3d 30  strcmp(z,"L")==0
ef80: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
ef90: 69 3d 3d 61 72 67 63 2d 31 20 29 20 63 6d 64 6c  i==argc-1 ) cmdl
efa0: 69 6e 65 45 72 72 6f 72 28 22 6d 69 73 73 69 6e  ineError("missin
efb0: 67 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 73  g argument to %s
efc0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
efd0: 20 20 20 20 20 61 7a 45 78 74 20 3d 20 72 65 61       azExt = rea
efe0: 6c 6c 6f 63 28 61 7a 45 78 74 2c 20 73 69 7a 65  lloc(azExt, size
eff0: 6f 66 28 61 7a 45 78 74 5b 30 5d 29 2a 28 6e 45  of(azExt[0])*(nE
f000: 78 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 20 20  xt+1));.        
f010: 69 66 28 20 61 7a 45 78 74 3d 3d 30 20 29 20 63  if( azExt==0 ) c
f020: 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 6f 75 74  mdlineError("out
f030: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
f040: 20 20 20 20 20 20 61 7a 45 78 74 5b 6e 45 78 74        azExt[nExt
f050: 2b 2b 5d 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b  ++] = argv[++i];
f060: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
f070: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 73 74  dif.      if( st
f080: 72 63 6d 70 28 7a 2c 22 70 72 69 6d 61 72 79 6b  rcmp(z,"primaryk
f090: 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ey")==0 ){.     
f0a0: 20 20 20 67 2e 62 53 63 68 65 6d 61 50 4b 20 3d     g.bSchemaPK =
f0b0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a   1;.      }else.
f0c0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
f0d0: 28 7a 2c 22 72 62 75 22 29 3d 3d 30 20 29 7b 0a  (z,"rbu")==0 ){.
f0e0: 20 20 20 20 20 20 20 20 78 44 69 66 66 20 3d 20          xDiff = 
f0f0: 72 62 75 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c  rbudiff_one_tabl
f100: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  e;.      }else. 
f110: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
f120: 7a 2c 22 73 63 68 65 6d 61 22 29 3d 3d 30 20 29  z,"schema")==0 )
f130: 7b 0a 20 20 20 20 20 20 20 20 67 2e 62 53 63 68  {.        g.bSch
f140: 65 6d 61 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  emaOnly = 1;.   
f150: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
f160: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 75 6d  f( strcmp(z,"sum
f170: 6d 61 72 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mary")==0 ){.   
f180: 20 20 20 20 20 78 44 69 66 66 20 3d 20 73 75 6d       xDiff = sum
f190: 6d 61 72 69 7a 65 5f 6f 6e 65 5f 74 61 62 6c 65  marize_one_table
f1a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
f1b0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
f1c0: 2c 22 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  ,"table")==0 ){.
f1d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 61          if( i==a
f1e0: 72 67 63 2d 31 20 29 20 63 6d 64 6c 69 6e 65 45  rgc-1 ) cmdlineE
f1f0: 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72  rror("missing ar
f200: 67 75 6d 65 6e 74 20 74 6f 20 25 73 22 2c 20 61  gument to %s", a
f210: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
f220: 20 7a 54 61 62 20 3d 20 61 72 67 76 5b 2b 2b 69   zTab = argv[++i
f230: 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  ];.      }else. 
f240: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
f250: 7a 2c 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 29  z,"transaction")
f260: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
f270: 73 65 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  seTransaction = 
f280: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  1;.      }else. 
f290: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
f2a0: 7a 2c 22 76 74 61 62 22 29 3d 3d 30 20 29 7b 0a  z,"vtab")==0 ){.
f2b0: 20 20 20 20 20 20 20 20 67 2e 62 48 61 6e 64 6c          g.bHandl
f2c0: 65 56 74 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  eVtab = 1;.     
f2d0: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20   }else.      {. 
f2e0: 20 20 20 20 20 20 20 63 6d 64 6c 69 6e 65 45 72         cmdlineEr
f2f0: 72 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  ror("unknown opt
f300: 69 6f 6e 3a 20 25 73 22 2c 20 61 72 67 76 5b 69  ion: %s", argv[i
f310: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
f320: 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 31 3d 3d  }else if( zDb1==
f330: 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 31 20  0 ){.      zDb1 
f340: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 7d  = argv[i];.    }
f350: 65 6c 73 65 20 69 66 28 20 7a 44 62 32 3d 3d 30  else if( zDb2==0
f360: 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 32 20 3d   ){.      zDb2 =
f370: 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 7d 65   argv[i];.    }e
f380: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6d 64 6c 69  lse{.      cmdli
f390: 6e 65 45 72 72 6f 72 28 22 75 6e 6b 6e 6f 77 6e  neError("unknown
f3a0: 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20   argument: %s", 
f3b0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  argv[i]);.    }.
f3c0: 20 20 7d 0a 20 20 69 66 28 20 7a 44 62 32 3d 3d    }.  if( zDb2==
f3d0: 30 20 29 7b 0a 20 20 20 20 63 6d 64 6c 69 6e 65  0 ){.    cmdline
f3e0: 45 72 72 6f 72 28 22 74 77 6f 20 64 61 74 61 62  Error("two datab
f3f0: 61 73 65 20 61 72 67 75 6d 65 6e 74 73 20 72 65  ase arguments re
f400: 71 75 69 72 65 64 22 29 3b 0a 20 20 7d 0a 20 20  quired");.  }.  
f410: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
f420: 6e 28 7a 44 62 31 2c 20 26 67 2e 64 62 29 3b 0a  n(zDb1, &g.db);.
f430: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f440: 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 63 61  cmdlineError("ca
f450: 6e 6e 6f 74 20 6f 70 65 6e 20 64 61 74 61 62 61  nnot open databa
f460: 73 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 22 2c  se file \"%s\"",
f470: 20 7a 44 62 31 29 3b 0a 20 20 7d 0a 20 20 72 63   zDb1);.  }.  rc
f480: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
f490: 67 2e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a 20  g.db, "SELECT * 
f4a0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
f4b0: 65 72 22 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  er", 0, 0, &zErr
f4c0: 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63 20 7c  Msg);.  if( rc |
f4d0: 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
f4e0: 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 5c   cmdlineError("\
f4f0: 22 25 73 5c 22 20 64 6f 65 73 20 6e 6f 74 20 61  "%s\" does not a
f500: 70 70 65 61 72 20 74 6f 20 62 65 20 61 20 76 61  ppear to be a va
f510: 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
f520: 61 73 65 22 2c 20 7a 44 62 31 29 3b 0a 20 20 7d  ase", zDb1);.  }
f530: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f540: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
f550: 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  ION.  sqlite3_en
f560: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
f570: 69 6f 6e 28 67 2e 64 62 2c 20 31 29 3b 0a 20 20  ion(g.db, 1);.  
f580: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 74 3b  for(i=0; i<nExt;
f590: 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
f5a0: 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
f5b0: 65 6e 73 69 6f 6e 28 67 2e 64 62 2c 20 61 7a 45  ension(g.db, azE
f5c0: 78 74 5b 69 5d 2c 20 30 2c 20 26 7a 45 72 72 4d  xt[i], 0, &zErrM
f5d0: 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  sg);.    if( rc 
f5e0: 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  || zErrMsg ){.  
f5f0: 20 20 20 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72      cmdlineError
f600: 28 22 65 72 72 6f 72 20 6c 6f 61 64 69 6e 67 20  ("error loading 
f610: 25 73 3a 20 25 73 22 2c 20 61 7a 45 78 74 5b 69  %s: %s", azExt[i
f620: 5d 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ], zErrMsg);.   
f630: 20 7d 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 7a   }.  }.  free(az
f640: 45 78 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7a  Ext);.#endif.  z
f650: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
f660: 72 69 6e 74 66 28 22 41 54 54 41 43 48 20 25 51  rintf("ATTACH %Q
f670: 20 61 73 20 61 75 78 3b 22 2c 20 7a 44 62 32 29   as aux;", zDb2)
f680: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
f690: 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c  _exec(g.db, zSql
f6a0: 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67  , 0, 0, &zErrMsg
f6b0: 29 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 7a  );.  if( rc || z
f6c0: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 6d  ErrMsg ){.    cm
f6d0: 64 6c 69 6e 65 45 72 72 6f 72 28 22 63 61 6e 6e  dlineError("cann
f6e0: 6f 74 20 61 74 74 61 63 68 20 64 61 74 61 62 61  ot attach databa
f6f0: 73 65 20 5c 22 25 73 5c 22 22 2c 20 7a 44 62 32  se \"%s\"", zDb2
f700: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
f710: 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c  lite3_exec(g.db,
f720: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
f730: 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  aux.sqlite_maste
f740: 72 22 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d  r", 0, 0, &zErrM
f750: 73 67 29 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c  sg);.  if( rc ||
f760: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
f770: 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 5c 22  cmdlineError("\"
f780: 25 73 5c 22 20 64 6f 65 73 20 6e 6f 74 20 61 70  %s\" does not ap
f790: 70 65 61 72 20 74 6f 20 62 65 20 61 20 76 61 6c  pear to be a val
f7a0: 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
f7b0: 73 65 22 2c 20 7a 44 62 32 29 3b 0a 20 20 7d 0a  se", zDb2);.  }.
f7c0: 0a 20 20 69 66 28 20 6e 65 76 65 72 55 73 65 54  .  if( neverUseT
f7d0: 72 61 6e 73 61 63 74 69 6f 6e 20 29 20 75 73 65  ransaction ) use
f7e0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30 3b  Transaction = 0;
f7f0: 0a 20 20 69 66 28 20 75 73 65 54 72 61 6e 73 61  .  if( useTransa
f800: 63 74 69 6f 6e 20 29 20 66 70 72 69 6e 74 66 28  ction ) fprintf(
f810: 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e  out, "BEGIN TRAN
f820: 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  SACTION;\n");.  
f830: 69 66 28 20 78 44 69 66 66 3d 3d 72 62 75 64 69  if( xDiff==rbudi
f840: 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 20 29 7b 0a  ff_one_table ){.
f850: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
f860: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
f870: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 72 62 75  F NOT EXISTS rbu
f880: 5f 63 6f 75 6e 74 22 0a 20 20 20 20 20 20 20 20  _count".        
f890: 20 20 20 22 28 74 62 6c 20 54 45 58 54 20 50 52     "(tbl TEXT PR
f8a0: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
f8b0: 45 20 4e 4f 43 41 53 45 2c 20 63 6e 74 20 49 4e  E NOCASE, cnt IN
f8c0: 54 45 47 45 52 29 20 22 0a 20 20 20 20 20 20 20  TEGER) ".       
f8d0: 20 20 20 20 22 57 49 54 48 4f 55 54 20 52 4f 57      "WITHOUT ROW
f8e0: 49 44 3b 5c 6e 22 0a 20 20 20 20 29 3b 0a 20 20  ID;\n".    );.  
f8f0: 7d 0a 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a  }.  if( zTab ){.
f900: 20 20 20 20 78 44 69 66 66 28 7a 54 61 62 2c 20      xDiff(zTab, 
f910: 6f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  out);.  }else{. 
f920: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 61 62     /* Handle tab
f930: 6c 65 73 20 6f 6e 65 20 62 79 20 6f 6e 65 20 2a  les one by one *
f940: 2f 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 64 62  /.    pStmt = db
f950: 5f 70 72 65 70 61 72 65 28 22 25 73 22 2c 20 61  _prepare("%s", a
f960: 6c 6c 5f 74 61 62 6c 65 73 5f 73 71 6c 28 29 20  ll_tables_sql() 
f970: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  );.    while( SQ
f980: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
f990: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
f9a0: 0a 20 20 20 20 20 20 78 44 69 66 66 28 28 63 6f  .      xDiff((co
f9b0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
f9c0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
f9d0: 74 6d 74 2c 30 29 2c 20 6f 75 74 29 3b 0a 20 20  tmt,0), out);.  
f9e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
f9f0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
fa00: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 54 72  .  }.  if( useTr
fa10: 61 6e 73 61 63 74 69 6f 6e 20 29 20 70 72 69 6e  ansaction ) prin
fa20: 74 66 28 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b  tf("COMMIT;\n");
fa30: 0a 0a 20 20 2f 2a 20 54 42 44 3a 20 48 61 6e 64  ..  /* TBD: Hand
fa40: 6c 65 20 74 72 69 67 67 65 72 20 64 69 66 66 65  le trigger diffe
fa50: 72 65 6e 63 65 73 20 2a 2f 0a 20 20 2f 2a 20 54  rences */.  /* T
fa60: 42 44 3a 20 48 61 6e 64 6c 65 20 76 69 65 77 20  BD: Handle view 
fa70: 64 69 66 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20  differences */. 
fa80: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67   sqlite3_close(g
fa90: 2e 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  .db);.  return 0
faa0: 3b 0a 7d 0a                                      ;.}.