/ Hex Artifact Content
Login

Artifact 393b0f5b17ef29341664563a90d40ee63a0a18f7:


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 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a  de "sqlite3.h"..
02e0: 2f 2a 0a 2a 2a 20 41 6c 6c 20 67 6c 6f 62 61 6c  /*.** All global
02f0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 67   variables are g
0300: 61 74 68 65 72 65 64 20 69 6e 74 6f 20 74 68 65  athered into the
0310: 20 22 67 22 20 73 69 6e 67 6c 65 74 6f 6e 2e 0a   "g" singleton..
0320: 2a 2f 0a 73 74 72 75 63 74 20 47 6c 6f 62 61 6c  */.struct Global
0330: 56 61 72 73 20 7b 0a 20 20 63 6f 6e 73 74 20 63  Vars {.  const c
0340: 68 61 72 20 2a 7a 41 72 67 76 30 3b 20 20 20 20  har *zArgv0;    
0350: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 70 72     /* Name of pr
0360: 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 62  ogram */.  int b
0370: 53 63 68 65 6d 61 4f 6e 6c 79 3b 20 20 20 20 20  SchemaOnly;     
0380: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f       /* Only sho
0390: 77 20 73 63 68 65 6d 61 20 64 69 66 66 65 72 65  w schema differe
03a0: 6e 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 53  nces */.  int bS
03b0: 63 68 65 6d 61 50 4b 3b 20 20 20 20 20 20 20 20  chemaPK;        
03c0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
03d0: 63 68 65 6d 61 2d 64 65 66 69 6e 65 64 20 50 4b  chema-defined PK
03e0: 2c 20 6e 6f 74 20 74 68 65 20 74 72 75 65 20 50  , not the true P
03f0: 4b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  K */.  unsigned 
0400: 66 44 65 62 75 67 3b 20 20 20 20 20 20 20 20 20  fDebug;         
0410: 20 2f 2a 20 44 65 62 75 67 20 66 6c 61 67 73 20   /* Debug flags 
0420: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
0430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0440: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
0450: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 7d 20 67  onnection */.} g
0460: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
0470: 20 76 61 6c 75 65 73 20 66 6f 72 20 67 2e 66 44   values for g.fD
0480: 65 62 75 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ebug.*/.#define 
0490: 44 45 42 55 47 5f 43 4f 4c 55 4d 4e 5f 4e 41 4d  DEBUG_COLUMN_NAM
04a0: 45 53 20 20 30 78 30 30 30 30 30 31 0a 23 64 65  ES  0x000001.#de
04b0: 66 69 6e 65 20 44 45 42 55 47 5f 44 49 46 46 5f  fine DEBUG_DIFF_
04c0: 53 51 4c 20 20 20 20 20 20 30 78 30 30 30 30 30  SQL      0x00000
04d0: 32 0a 0a 2f 2a 0a 2a 2a 20 44 79 6e 61 6d 69 63  2../*.** Dynamic
04e0: 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 0a 2a   string object.*
04f0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0500: 20 53 74 72 20 53 74 72 3b 0a 73 74 72 75 63 74   Str Str;.struct
0510: 20 53 74 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a   Str {.  char *z
0520: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74  ;        /* Text
0530: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 2a   of the string *
0540: 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
0550: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 6c      /* Bytes all
0560: 6f 63 61 74 65 64 20 69 6e 20 7a 5b 5d 20 2a 2f  ocated in z[] */
0570: 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20  .  int nUsed;   
0580: 20 20 20 2f 2a 20 42 79 74 65 73 20 61 63 74 75     /* Bytes actu
0590: 61 6c 6c 79 20 75 73 65 64 20 69 6e 20 7a 5b 5d  ally used in z[]
05a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e   */.};../*.** In
05b0: 69 74 69 61 6c 69 7a 65 20 61 20 53 74 72 20 6f  itialize a Str o
05c0: 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
05d0: 76 6f 69 64 20 73 74 72 49 6e 69 74 28 53 74 72  void strInit(Str
05e0: 20 2a 70 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 30   *p){.  p->z = 0
05f0: 3b 0a 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  ;.  p->nAlloc = 
0600: 30 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 3d 20  0;.  p->nUsed = 
0610: 30 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20 50 72  0;.}.  ./*.** Pr
0620: 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 72 65 73  int an error res
0630: 75 6c 74 69 6e 67 20 66 72 6f 6d 20 66 61 75 6c  ulting from faul
0640: 74 69 6e 67 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  ting command-lin
0650: 65 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 0a  e arguments and.
0660: 2a 2a 20 61 62 6f 72 74 20 74 68 65 20 70 72 6f  ** abort the pro
0670: 67 72 61 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gram..*/.static 
0680: 76 6f 69 64 20 63 6d 64 6c 69 6e 65 45 72 72 6f  void cmdlineErro
0690: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  r(const char *zF
06a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
06b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72  a_list ap;.  fpr
06c0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
06d0: 3a 20 22 2c 20 67 2e 7a 41 72 67 76 30 29 3b 0a  : ", g.zArgv0);.
06e0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
06f0: 46 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69  Format);.  vfpri
0700: 6e 74 66 28 73 74 64 65 72 72 2c 20 7a 46 6f 72  ntf(stderr, zFor
0710: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
0720: 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74  nd(ap);.  fprint
0730: 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 5c 22 25  f(stderr, "\n\"%
0740: 73 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d  s --help\" for m
0750: 6f 72 65 20 68 65 6c 70 5c 6e 22 2c 20 67 2e 7a  ore help\n", g.z
0760: 41 72 67 76 30 29 3b 0a 20 20 65 78 69 74 28 31  Argv0);.  exit(1
0770: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  );.}../*.** Prin
0780: 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
0790: 67 65 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20  ge for an error 
07a0: 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 72  that occurs at r
07b0: 75 6e 74 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20  untime, then.** 
07c0: 61 62 6f 72 74 20 74 68 65 20 70 72 6f 67 72 61  abort the progra
07d0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
07e0: 64 20 72 75 6e 74 69 6d 65 45 72 72 6f 72 28 63  d runtimeError(c
07f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
0800: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
0810: 69 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e 74  ist ap;.  fprint
0820: 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20 22  f(stderr, "%s: "
0830: 2c 20 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 76  , g.zArgv0);.  v
0840: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0850: 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74 66  mat);.  vfprintf
0860: 28 73 74 64 65 72 72 2c 20 7a 46 6f 72 6d 61 74  (stderr, zFormat
0870: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
0880: 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ap);.  fprintf(s
0890: 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 20 20  tderr, "\n");.  
08a0: 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(1);.}../*.*
08b0: 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
08c0: 79 20 68 65 6c 64 20 62 79 20 61 20 53 74 72 20  y held by a Str 
08d0: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
08e0: 20 76 6f 69 64 20 73 74 72 46 72 65 65 28 53 74   void strFree(St
08f0: 72 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  r *p){.  sqlite3
0900: 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 73  _free(p->z);.  s
0910: 74 72 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  trInit(p);.}../*
0920: 0a 2a 2a 20 41 64 64 20 66 6f 72 6d 61 74 74 65  .** Add formatte
0930: 64 20 74 65 78 74 20 74 6f 20 74 68 65 20 65 6e  d text to the en
0940: 64 20 6f 66 20 61 20 53 74 72 20 6f 62 6a 65 63  d of a Str objec
0950: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
0960: 20 73 74 72 50 72 69 6e 74 66 28 53 74 72 20 2a   strPrintf(Str *
0970: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
0980: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
0990: 69 6e 74 20 6e 4e 65 77 3b 0a 20 20 66 6f 72 28  int nNew;.  for(
09a0: 3b 3b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ;;){.    if( p->
09b0: 7a 20 29 7b 0a 20 20 20 20 20 20 76 61 5f 6c 69  z ){.      va_li
09c0: 73 74 20 61 70 3b 0a 20 20 20 20 20 20 76 61 5f  st ap;.      va_
09d0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
09e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
09f0: 33 5f 76 73 6e 70 72 69 6e 74 66 28 70 2d 3e 6e  3_vsnprintf(p->n
0a00: 41 6c 6c 6f 63 2d 70 2d 3e 6e 55 73 65 64 2c 20  Alloc-p->nUsed, 
0a10: 70 2d 3e 7a 2b 70 2d 3e 6e 55 73 65 64 2c 20 7a  p->z+p->nUsed, z
0a20: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
0a30: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
0a40: 20 20 20 20 20 6e 4e 65 77 20 3d 20 28 69 6e 74       nNew = (int
0a50: 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 20 2b 20 70  )strlen(p->z + p
0a60: 2d 3e 6e 55 73 65 64 29 3b 0a 20 20 20 20 7d 65  ->nUsed);.    }e
0a70: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4e 65 77 20  lse{.      nNew 
0a80: 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20  = p->nAlloc;.   
0a90: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 55   }.    if( p->nU
0aa0: 73 65 64 2b 6e 4e 65 77 20 3c 20 70 2d 3e 6e 41  sed+nNew < p->nA
0ab0: 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  lloc-1 ){.      
0ac0: 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e 4e 65 77  p->nUsed += nNew
0ad0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0ae0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c     }.    p->nAll
0af0: 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc = p->nAlloc*2
0b00: 20 2b 20 31 30 30 30 3b 0a 20 20 20 20 70 2d 3e   + 1000;.    p->
0b10: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  z = sqlite3_real
0b20: 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  loc(p->z, p->nAl
0b30: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
0b40: 3e 7a 3d 3d 30 20 29 20 72 75 6e 74 69 6d 65 45  >z==0 ) runtimeE
0b50: 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d  rror("out of mem
0b60: 6f 72 79 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a  ory");.  }.}....
0b70: 2f 2a 20 53 61 66 65 6c 79 20 71 75 6f 74 65 20  /* Safely quote 
0b80: 61 6e 20 53 51 4c 20 69 64 65 6e 74 69 66 69 65  an SQL identifie
0b90: 72 2e 20 20 55 73 65 20 74 68 65 20 6d 69 6e 69  r.  Use the mini
0ba0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 74 72  mum amount of tr
0bb0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20  ansformation.** 
0bc0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 6c 6c  necessary to all
0bd0: 6f 77 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f  ow the string to
0be0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 25 73   be used with %s
0bf0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
0c00: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
0c10: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
0c20: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
0c30: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  e3_malloc().  Th
0c40: 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 72  e.** caller is r
0c50: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
0c60: 6e 73 75 72 69 6e 67 20 74 68 69 73 20 73 70 61  nsuring this spa
0c70: 63 65 20 69 73 20 66 72 65 65 64 20 77 68 65 6e  ce is freed when
0c80: 20 6e 6f 20 6c 6f 6e 67 65 72 0a 2a 2a 20 6e 65   no longer.** ne
0c90: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
0ca0: 63 68 61 72 20 2a 73 61 66 65 49 64 28 63 6f 6e  char *safeId(con
0cb0: 73 74 20 63 68 61 72 20 2a 7a 49 64 29 7b 0a 20  st char *zId){. 
0cc0: 20 2f 2a 20 41 6c 6c 20 53 51 4c 69 74 65 20 6b   /* All SQLite k
0cd0: 65 79 77 6f 72 64 73 2c 20 69 6e 20 61 6c 70 68  eywords, in alph
0ce0: 61 62 65 74 69 63 61 6c 20 6f 72 64 65 72 20 2a  abetical order *
0cf0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
0d00: 20 63 68 61 72 20 2a 61 7a 4b 65 79 77 6f 72 64   char *azKeyword
0d10: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 41 42 4f  s[] = {.    "ABO
0d20: 52 54 22 2c 20 22 41 43 54 49 4f 4e 22 2c 20 22  RT", "ACTION", "
0d30: 41 44 44 22 2c 20 22 41 46 54 45 52 22 2c 20 22  ADD", "AFTER", "
0d40: 41 4c 4c 22 2c 20 22 41 4c 54 45 52 22 2c 20 22  ALL", "ALTER", "
0d50: 41 4e 41 4c 59 5a 45 22 2c 20 22 41 4e 44 22 2c  ANALYZE", "AND",
0d60: 20 22 41 53 22 2c 0a 20 20 20 20 22 41 53 43 22   "AS",.    "ASC"
0d70: 2c 20 22 41 54 54 41 43 48 22 2c 20 22 41 55 54  , "ATTACH", "AUT
0d80: 4f 49 4e 43 52 45 4d 45 4e 54 22 2c 20 22 42 45  OINCREMENT", "BE
0d90: 46 4f 52 45 22 2c 20 22 42 45 47 49 4e 22 2c 20  FORE", "BEGIN", 
0da0: 22 42 45 54 57 45 45 4e 22 2c 20 22 42 59 22 2c  "BETWEEN", "BY",
0db0: 0a 20 20 20 20 22 43 41 53 43 41 44 45 22 2c 20  .    "CASCADE", 
0dc0: 22 43 41 53 45 22 2c 20 22 43 41 53 54 22 2c 20  "CASE", "CAST", 
0dd0: 22 43 48 45 43 4b 22 2c 20 22 43 4f 4c 4c 41 54  "CHECK", "COLLAT
0de0: 45 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20 22 43  E", "COLUMN", "C
0df0: 4f 4d 4d 49 54 22 2c 0a 20 20 20 20 22 43 4f 4e  OMMIT",.    "CON
0e00: 46 4c 49 43 54 22 2c 20 22 43 4f 4e 53 54 52 41  FLICT", "CONSTRA
0e10: 49 4e 54 22 2c 20 22 43 52 45 41 54 45 22 2c 20  INT", "CREATE", 
0e20: 22 43 52 4f 53 53 22 2c 20 22 43 55 52 52 45 4e  "CROSS", "CURREN
0e30: 54 5f 44 41 54 45 22 2c 0a 20 20 20 20 22 43 55  T_DATE",.    "CU
0e40: 52 52 45 4e 54 5f 54 49 4d 45 22 2c 20 22 43 55  RRENT_TIME", "CU
0e50: 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 22  RRENT_TIMESTAMP"
0e60: 2c 20 22 44 41 54 41 42 41 53 45 22 2c 20 22 44  , "DATABASE", "D
0e70: 45 46 41 55 4c 54 22 2c 20 22 44 45 46 45 52 52  EFAULT", "DEFERR
0e80: 41 42 4c 45 22 2c 0a 20 20 20 20 22 44 45 46 45  ABLE",.    "DEFE
0e90: 52 52 45 44 22 2c 20 22 44 45 4c 45 54 45 22 2c  RRED", "DELETE",
0ea0: 20 22 44 45 53 43 22 2c 20 22 44 45 54 41 43 48   "DESC", "DETACH
0eb0: 22 2c 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  ", "DISTINCT", "
0ec0: 44 52 4f 50 22 2c 20 22 45 41 43 48 22 2c 0a 20  DROP", "EACH",. 
0ed0: 20 20 20 22 45 4c 53 45 22 2c 20 22 45 4e 44 22     "ELSE", "END"
0ee0: 2c 20 22 45 53 43 41 50 45 22 2c 20 22 45 58 43  , "ESCAPE", "EXC
0ef0: 45 50 54 22 2c 20 22 45 58 43 4c 55 53 49 56 45  EPT", "EXCLUSIVE
0f00: 22 2c 20 22 45 58 49 53 54 53 22 2c 20 22 45 58  ", "EXISTS", "EX
0f10: 50 4c 41 49 4e 22 2c 0a 20 20 20 20 22 46 41 49  PLAIN",.    "FAI
0f20: 4c 22 2c 20 22 46 4f 52 22 2c 20 22 46 4f 52 45  L", "FOR", "FORE
0f30: 49 47 4e 22 2c 20 22 46 52 4f 4d 22 2c 20 22 46  IGN", "FROM", "F
0f40: 55 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c 20 22 47  ULL", "GLOB", "G
0f50: 52 4f 55 50 22 2c 20 22 48 41 56 49 4e 47 22 2c  ROUP", "HAVING",
0f60: 20 22 49 46 22 2c 0a 20 20 20 20 22 49 47 4e 4f   "IF",.    "IGNO
0f70: 52 45 22 2c 20 22 49 4d 4d 45 44 49 41 54 45 22  RE", "IMMEDIATE"
0f80: 2c 20 22 49 4e 22 2c 20 22 49 4e 44 45 58 22 2c  , "IN", "INDEX",
0f90: 20 22 49 4e 44 45 58 45 44 22 2c 20 22 49 4e 49   "INDEXED", "INI
0fa0: 54 49 41 4c 4c 59 22 2c 20 22 49 4e 4e 45 52 22  TIALLY", "INNER"
0fb0: 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 22 2c 20  ,.    "INSERT", 
0fc0: 22 49 4e 53 54 45 41 44 22 2c 20 22 49 4e 54 45  "INSTEAD", "INTE
0fd0: 52 53 45 43 54 22 2c 20 22 49 4e 54 4f 22 2c 20  RSECT", "INTO", 
0fe0: 22 49 53 22 2c 20 22 49 53 4e 55 4c 4c 22 2c 20  "IS", "ISNULL", 
0ff0: 22 4a 4f 49 4e 22 2c 20 22 4b 45 59 22 2c 0a 20  "JOIN", "KEY",. 
1000: 20 20 20 22 4c 45 46 54 22 2c 20 22 4c 49 4b 45     "LEFT", "LIKE
1010: 22 2c 20 22 4c 49 4d 49 54 22 2c 20 22 4d 41 54  ", "LIMIT", "MAT
1020: 43 48 22 2c 20 22 4e 41 54 55 52 41 4c 22 2c 20  CH", "NATURAL", 
1030: 22 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20 22 4e 4f  "NO", "NOT", "NO
1040: 54 4e 55 4c 4c 22 2c 0a 20 20 20 20 22 4e 55 4c  TNULL",.    "NUL
1050: 4c 22 2c 20 22 4f 46 22 2c 20 22 4f 46 46 53 45  L", "OF", "OFFSE
1060: 54 22 2c 20 22 4f 4e 22 2c 20 22 4f 52 22 2c 20  T", "ON", "OR", 
1070: 22 4f 52 44 45 52 22 2c 20 22 4f 55 54 45 52 22  "ORDER", "OUTER"
1080: 2c 20 22 50 4c 41 4e 22 2c 20 22 50 52 41 47 4d  , "PLAN", "PRAGM
1090: 41 22 2c 0a 20 20 20 20 22 50 52 49 4d 41 52 59  A",.    "PRIMARY
10a0: 22 2c 20 22 51 55 45 52 59 22 2c 20 22 52 41 49  ", "QUERY", "RAI
10b0: 53 45 22 2c 20 22 52 45 43 55 52 53 49 56 45 22  SE", "RECURSIVE"
10c0: 2c 20 22 52 45 46 45 52 45 4e 43 45 53 22 2c 20  , "REFERENCES", 
10d0: 22 52 45 47 45 58 50 22 2c 0a 20 20 20 20 22 52  "REGEXP",.    "R
10e0: 45 49 4e 44 45 58 22 2c 20 22 52 45 4c 45 41 53  EINDEX", "RELEAS
10f0: 45 22 2c 20 22 52 45 4e 41 4d 45 22 2c 20 22 52  E", "RENAME", "R
1100: 45 50 4c 41 43 45 22 2c 20 22 52 45 53 54 52 49  EPLACE", "RESTRI
1110: 43 54 22 2c 20 22 52 49 47 48 54 22 2c 0a 20 20  CT", "RIGHT",.  
1120: 20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 22 52    "ROLLBACK", "R
1130: 4f 57 22 2c 20 22 53 41 56 45 50 4f 49 4e 54 22  OW", "SAVEPOINT"
1140: 2c 20 22 53 45 4c 45 43 54 22 2c 20 22 53 45 54  , "SELECT", "SET
1150: 22 2c 20 22 54 41 42 4c 45 22 2c 20 22 54 45 4d  ", "TABLE", "TEM
1160: 50 22 2c 0a 20 20 20 20 22 54 45 4d 50 4f 52 41  P",.    "TEMPORA
1170: 52 59 22 2c 20 22 54 48 45 4e 22 2c 20 22 54 4f  RY", "THEN", "TO
1180: 22 2c 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22  ", "TRANSACTION"
1190: 2c 20 22 54 52 49 47 47 45 52 22 2c 20 22 55 4e  , "TRIGGER", "UN
11a0: 49 4f 4e 22 2c 20 22 55 4e 49 51 55 45 22 2c 0a  ION", "UNIQUE",.
11b0: 20 20 20 20 22 55 50 44 41 54 45 22 2c 20 22 55      "UPDATE", "U
11c0: 53 49 4e 47 22 2c 20 22 56 41 43 55 55 4d 22 2c  SING", "VACUUM",
11d0: 20 22 56 41 4c 55 45 53 22 2c 20 22 56 49 45 57   "VALUES", "VIEW
11e0: 22 2c 20 22 56 49 52 54 55 41 4c 22 2c 20 22 57  ", "VIRTUAL", "W
11f0: 48 45 4e 22 2c 20 22 57 48 45 52 45 22 2c 0a 20  HEN", "WHERE",. 
1200: 20 20 20 22 57 49 54 48 22 2c 20 22 57 49 54 48     "WITH", "WITH
1210: 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  OUT",.  };.  int
1220: 20 6c 77 72 2c 20 75 70 72 2c 20 6d 69 64 2c 20   lwr, upr, mid, 
1230: 63 2c 20 69 2c 20 78 3b 0a 20 20 66 6f 72 28 69  c, i, x;.  for(i
1240: 3d 78 3d 30 3b 20 28 63 20 3d 20 7a 49 64 5b 69  =x=0; (c = zId[i
1250: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
1260: 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 63 29   if( !isalpha(c)
1270: 20 26 26 20 63 21 3d 27 5f 27 20 29 7b 0a 20 20   && c!='_' ){.  
1280: 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 69      if( i>0 && i
1290: 73 64 69 67 69 74 28 63 29 20 29 7b 0a 20 20 20  sdigit(c) ){.   
12a0: 20 20 20 20 20 78 2b 2b 3b 0a 20 20 20 20 20 20       x++;.      
12b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
12c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70  eturn sqlite3_mp
12d0: 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20  rintf("\"%w\"", 
12e0: 7a 49 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zId);.      }.  
12f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 20    }.  }.  if( x 
1300: 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  ) return sqlite3
1310: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
1320: 49 64 29 3b 0a 20 20 6c 77 72 20 3d 20 30 3b 0a  Id);.  lwr = 0;.
1330: 20 20 75 70 72 20 3d 20 73 69 7a 65 6f 66 28 61    upr = sizeof(a
1340: 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  zKeywords)/sizeo
1350: 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30 5d 29  f(azKeywords[0])
1360: 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c   - 1;.  while( l
1370: 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d  wr<=upr ){.    m
1380: 69 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  id = (lwr+upr)/2
1390: 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
13a0: 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65 79 77  3_stricmp(azKeyw
13b0: 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 49 64 29 3b  ords[mid], zId);
13c0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20  .    if( c==0 ) 
13d0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
13e0: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
13f0: 20 7a 49 64 29 3b 0a 20 20 20 20 69 66 28 20 63   zId);.    if( c
1400: 3c 30 20 29 7b 0a 20 20 20 20 20 20 6c 77 72 20  <0 ){.      lwr 
1410: 3d 20 6d 69 64 2b 31 3b 0a 20 20 20 20 7d 65 6c  = mid+1;.    }el
1420: 73 65 7b 0a 20 20 20 20 20 20 75 70 72 20 3d 20  se{.      upr = 
1430: 6d 69 64 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  mid-1;.    }.  }
1440: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1450: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1460: 7a 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  zId);.}../*.** P
1470: 72 65 70 61 72 65 20 61 20 6e 65 77 20 53 51 4c  repare a new SQL
1480: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72 69   statement.  Pri
1490: 6e 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20  nt an error and 
14a0: 61 62 6f 72 74 20 69 66 20 61 6e 79 74 68 69 6e  abort if anythin
14b0: 67 0a 2a 2a 20 67 6f 65 73 20 77 72 6f 6e 67 2e  g.** goes wrong.
14c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
14d0: 65 33 5f 73 74 6d 74 20 2a 64 62 5f 76 70 72 65  e3_stmt *db_vpre
14e0: 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20  pare(const char 
14f0: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73  *zFormat, va_lis
1500: 74 20 61 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t ap){.  char *z
1510: 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Sql;.  int rc;. 
1520: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1530: 53 74 6d 74 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  Stmt;..  zSql = 
1540: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
1550: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
1560: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
1570: 75 6e 74 69 6d 65 45 72 72 6f 72 28 22 6f 75 74  untimeError("out
1580: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
1590: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
15a0: 70 61 72 65 5f 76 32 28 67 2e 64 62 2c 20 7a 53  pare_v2(g.db, zS
15b0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
15c0: 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
15d0: 20 20 20 20 72 75 6e 74 69 6d 65 45 72 72 6f 72      runtimeError
15e0: 28 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  ("SQL statement 
15f0: 65 72 72 6f 72 3a 20 25 73 5c 6e 5c 22 25 73 5c  error: %s\n\"%s\
1600: 22 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  "", sqlite3_errm
1610: 73 67 28 67 2e 64 62 29 2c 0a 20 20 20 20 20 20  sg(g.db),.      
1620: 20 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 29             zSql)
1630: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1640: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65  free(zSql);.  re
1650: 74 75 72 6e 20 70 53 74 6d 74 3b 0a 7d 0a 73 74  turn pStmt;.}.st
1660: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
1670: 74 20 2a 64 62 5f 70 72 65 70 61 72 65 28 63 6f  t *db_prepare(co
1680: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1690: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
16a0: 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33  st ap;.  sqlite3
16b0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
16c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
16d0: 72 6d 61 74 29 3b 0a 20 20 70 53 74 6d 74 20 3d  rmat);.  pStmt =
16e0: 20 64 62 5f 76 70 72 65 70 61 72 65 28 7a 46 6f   db_vprepare(zFo
16f0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1700: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
1710: 6e 20 70 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pStmt;.}../*.*
1720: 2a 20 46 72 65 65 20 61 20 6c 69 73 74 20 6f 66  * Free a list of
1730: 20 73 74 72 69 6e 67 73 0a 2a 2f 0a 73 74 61 74   strings.*/.stat
1740: 69 63 20 76 6f 69 64 20 6e 61 6d 65 6c 69 73 74  ic void namelist
1750: 46 72 65 65 28 63 68 61 72 20 2a 2a 61 7a 29 7b  Free(char **az){
1760: 0a 20 20 69 66 28 20 61 7a 20 29 7b 0a 20 20 20  .  if( az ){.   
1770: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1780: 69 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29  i=0; az[i]; i++)
1790: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
17a0: 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [i]);.    sqlite
17b0: 33 5f 66 72 65 65 28 61 7a 29 3b 0a 20 20 7d 0a  3_free(az);.  }.
17c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17d0: 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
17e0: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65 20 74   names for the t
17f0: 61 62 6c 65 20 7a 44 62 2e 7a 54 61 62 2e 20 20  able zDb.zTab.  
1800: 53 70 61 63 65 20 74 6f 0a 2a 2a 20 68 6f 6c 64  Space to.** hold
1810: 20 74 68 65 20 6c 69 73 74 20 69 73 20 6f 62 74   the list is obt
1820: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1830: 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
1840: 73 68 6f 75 6c 64 20 72 65 6c 65 61 73 65 64 0a  should released.
1850: 2a 2a 20 75 73 69 6e 67 20 6e 61 6d 65 6c 69 73  ** using namelis
1860: 74 46 72 65 65 28 29 20 77 68 65 6e 20 6e 6f 20  tFree() when no 
1870: 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a  longer needed..*
1880: 2a 0a 2a 2a 20 50 72 69 6d 61 72 79 20 6b 65 79  *.** Primary key
1890: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 69 73   columns are lis
18a0: 74 65 64 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  ted first, follo
18b0: 77 65 64 20 62 79 20 64 61 74 61 20 63 6f 6c 75  wed by data colu
18c0: 6d 6e 73 2e 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  mns..** The numb
18d0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
18e0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
18f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20   is returned in 
1900: 2a 70 6e 50 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 4e  *pnPkey..**.** N
1910: 6f 72 6d 61 6c 6c 79 2c 20 74 68 65 20 22 70 72  ormally, the "pr
1920: 69 6d 61 72 79 20 6b 65 79 22 20 69 6e 20 74 68  imary key" in th
1930: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
1940: 6e 63 65 20 69 73 20 74 68 65 20 74 72 75 65 0a  nce is the true.
1950: 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2d  ** primary key -
1960: 20 74 68 65 20 72 6f 77 69 64 20 6f 72 20 49 4e   the rowid or IN
1970: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1980: 59 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74  Y for ordinary t
1990: 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 74 68 65 20  ables.** or the 
19a0: 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59  declared PRIMARY
19b0: 20 4b 45 59 20 66 6f 72 20 57 49 54 48 4f 55 54   KEY for WITHOUT
19c0: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 20 20   ROWID tables.  
19d0: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 74  However, if.** t
19e0: 68 65 20 67 2e 62 53 63 68 65 6d 61 50 4b 20 66  he g.bSchemaPK f
19f0: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
1a00: 20 74 68 65 20 73 63 68 65 6d 61 2d 64 65 66 69   the schema-defi
1a10: 6e 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20  ned PRIMARY KEY 
1a20: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 61 6c  is.** used in al
1a30: 6c 20 63 61 73 65 73 2e 20 20 49 6e 20 74 68 61  l cases.  In tha
1a40: 74 20 63 61 73 65 2c 20 65 6e 74 72 69 65 73 20  t case, entries 
1a50: 74 68 61 74 20 68 61 76 65 20 4e 55 4c 4c 20 76  that have NULL v
1a60: 61 6c 75 65 73 20 69 6e 0a 2a 2a 20 61 6e 79 20  alues in.** any 
1a70: 6f 66 20 74 68 65 69 72 20 70 72 69 6d 61 72 79  of their primary
1a80: 20 6b 65 79 20 66 69 65 6c 64 73 20 77 69 6c 6c   key fields will
1a90: 20 62 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f   be excluded fro
1aa0: 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a  m the analysis..
1ab0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 69  **.** If the pri
1ac0: 6d 61 72 79 20 6b 65 79 20 66 6f 72 20 61 20 74  mary key for a t
1ad0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 6f 77 69  able is the rowi
1ae0: 64 20 62 75 74 20 72 6f 77 69 64 20 69 73 20 69  d but rowid is i
1af0: 6e 61 63 63 65 73 73 69 62 6c 65 2c 0a 2a 2a 20  naccessible,.** 
1b00: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1b10: 65 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c  e returns a NULL
1b20: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
1b30: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 20 20 20 20  Examples:.**    
1b40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1b50: 61 20 49 4e 54 20 55 4e 49 51 55 45 2c 20 62 20  a INT UNIQUE, b 
1b60: 49 4e 54 45 47 45 52 2c 20 63 20 54 45 58 54 2c  INTEGER, c TEXT,
1b70: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 63 29 29   PRIMARY KEY(c))
1b80: 3b 0a 2a 2a 20 20 20 20 2a 70 6e 50 4b 65 79 20  ;.**    *pnPKey 
1b90: 3d 20 31 3b 0a 2a 2a 20 20 20 20 61 7a 20 3d 20  = 1;.**    az = 
1ba0: 7b 20 22 72 6f 77 69 64 22 2c 20 22 61 22 2c 20  { "rowid", "a", 
1bb0: 22 62 22 2c 20 22 63 22 2c 20 30 20 7d 20 20 2f  "b", "c", 0 }  /
1bc0: 2f 20 4e 6f 72 6d 61 6c 20 63 61 73 65 0a 2a 2a  / Normal case.**
1bd0: 20 20 20 20 61 7a 20 3d 20 7b 20 22 63 22 2c 20      az = { "c", 
1be0: 22 61 22 2c 20 22 62 22 2c 20 30 20 7d 20 20 20  "a", "b", 0 }   
1bf0: 20 20 20 20 20 20 20 20 2f 2f 20 67 2e 62 53 63          // g.bSc
1c00: 68 65 6d 61 50 4b 3d 3d 31 0a 2a 2a 0a 2a 2a 20  hemaPK==1.**.** 
1c10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1c20: 74 32 28 61 20 49 4e 54 20 55 4e 49 51 55 45 2c  t2(a INT UNIQUE,
1c30: 20 62 20 49 4e 54 45 47 45 52 2c 20 63 20 54 45   b INTEGER, c TE
1c40: 58 54 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28  XT, PRIMARY KEY(
1c50: 62 29 29 3b 0a 2a 2a 20 20 20 20 2a 70 6e 50 4b  b));.**    *pnPK
1c60: 65 79 20 3d 20 31 3b 0a 2a 2a 20 20 20 20 61 7a  ey = 1;.**    az
1c70: 20 3d 20 7b 20 22 62 22 2c 20 22 61 22 2c 20 22   = { "b", "a", "
1c80: 63 22 2c 20 30 20 7d 0a 2a 2a 0a 2a 2a 20 20 20  c", 0 }.**.**   
1c90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
1ca0: 28 78 2c 79 2c 7a 2c 50 52 49 4d 41 52 59 20 4b  (x,y,z,PRIMARY K
1cb0: 45 59 28 79 2c 7a 29 29 3b 0a 2a 2a 20 20 20 20  EY(y,z));.**    
1cc0: 2a 70 6e 50 4b 65 79 20 3d 20 31 20 20 20 20 20  *pnPKey = 1     
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 2f 2f 20 4e 6f 72 6d 61 6c 20 63 61      // Normal ca
1cf0: 73 65 0a 2a 2a 20 20 20 20 61 7a 20 3d 20 7b 20  se.**    az = { 
1d00: 22 72 6f 77 69 64 22 2c 20 22 78 22 2c 20 22 79  "rowid", "x", "y
1d10: 22 2c 20 22 7a 22 2c 20 30 20 7d 20 20 2f 2f 20  ", "z", 0 }  // 
1d20: 4e 6f 72 6d 61 6c 20 63 61 73 65 0a 2a 2a 20 20  Normal case.**  
1d30: 20 20 2a 70 6e 50 4b 65 79 20 3d 20 32 20 20 20    *pnPKey = 2   
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 20 20 20 20 2f 2f 20 67 2e 62 53 63 68 65        // g.bSche
1d60: 6d 61 50 4b 3d 3d 31 0a 2a 2a 20 20 20 20 61 7a  maPK==1.**    az
1d70: 20 3d 20 7b 20 22 79 22 2c 20 22 78 22 2c 20 22   = { "y", "x", "
1d80: 7a 22 2c 20 30 20 7d 20 20 20 20 20 20 20 20 20  z", 0 }         
1d90: 20 20 2f 2f 20 67 2e 62 53 63 68 65 6d 61 50 4b    // g.bSchemaPK
1da0: 3d 3d 31 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  ==1.**.**    CRE
1db0: 41 54 45 20 54 41 42 4c 45 20 74 34 28 78 2c 79  ATE TABLE t4(x,y
1dc0: 2c 7a 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 79  ,z,PRIMARY KEY(y
1dd0: 2c 7a 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57  ,z)) WITHOUT ROW
1de0: 49 44 3b 0a 2a 2a 20 20 20 20 2a 70 6e 50 4b 65  ID;.**    *pnPKe
1df0: 79 20 3d 20 32 0a 2a 2a 20 20 20 20 61 7a 20 3d  y = 2.**    az =
1e00: 20 7b 20 22 79 22 2c 20 22 7a 22 2c 20 22 78 22   { "y", "z", "x"
1e10: 2c 20 30 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 43  , 0 }.**.**    C
1e20: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 72  REATE TABLE t5(r
1e30: 6f 77 69 64 2c 5f 72 6f 77 69 64 5f 2c 6f 69 64  owid,_rowid_,oid
1e40: 29 3b 0a 2a 2a 20 20 20 20 61 7a 20 3d 20 30 20  );.**    az = 0 
1e50: 20 20 20 20 2f 2f 20 54 68 65 20 72 6f 77 69 64      // The rowid
1e60: 20 69 73 20 6e 6f 74 20 61 63 63 65 73 73 69 62   is not accessib
1e70: 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  le.*/.static cha
1e80: 72 20 2a 2a 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28  r **columnNames(
1e90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
1ea0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1eb0: 62 2c 20 69 6e 74 20 2a 70 6e 50 4b 65 79 29 7b  b, int *pnPKey){
1ec0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 20 3d 20 30  .  char **az = 0
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
1ee0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ist of column na
1ef0: 6d 65 73 20 74 6f 20 62 65 20 72 65 74 75 72 6e  mes to be return
1f00: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 7a 20  ed */.  int naz 
1f10: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1f30: 74 72 69 65 73 20 69 6e 20 61 7a 5b 5d 20 2a 2f  tries in az[] */
1f40: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1f50: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53  *pStmt;     /* S
1f60: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  QL statement bei
1f70: 6e 67 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72  ng run */.  char
1f80: 20 2a 7a 50 6b 49 64 78 4e 61 6d 65 20 3d 20 30   *zPkIdxName = 0
1f90: 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ;    /* Name of 
1fa0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
1fb0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 74  index */.  int t
1fc0: 72 75 65 50 6b 20 3d 20 30 3b 20 20 20 20 20 20  ruePk = 0;      
1fd0: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 74 61      /* PRAGMA ta
1fe0: 62 6c 65 5f 69 6e 66 6f 20 69 6e 64 65 6e 74 69  ble_info indenti
1ff0: 66 69 65 73 20 74 68 65 20 50 4b 20 74 6f 20 75  fies the PK to u
2000: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 4b 20  se */.  int nPK 
2010: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2020: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52   /* Number of PR
2030: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
2040: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  s */.  int i, j;
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2070: 20 2a 2f 0a 0a 20 20 69 66 28 20 67 2e 62 53 63   */..  if( g.bSc
2080: 68 65 6d 61 50 4b 3d 3d 30 20 29 7b 0a 20 20 20  hemaPK==0 ){.   
2090: 20 2f 2a 20 4e 6f 72 6d 61 6c 20 63 61 73 65 3a   /* Normal case:
20a0: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61    Figure out wha
20b0: 74 20 74 68 65 20 74 72 75 65 20 70 72 69 6d 61  t the true prima
20c0: 72 79 20 6b 65 79 20 69 73 20 66 6f 72 20 74 68  ry key is for th
20d0: 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  e table..    ** 
20e0: 20 20 2a 20 20 46 6f 72 20 57 49 54 48 4f 55 54    *  For WITHOUT
20f0: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2c 20 74   ROWID tables, t
2100: 68 65 20 74 72 75 65 20 70 72 69 6d 61 72 79 20  he true primary 
2110: 6b 65 79 20 69 73 20 74 68 65 20 73 61 6d 65 20  key is the same 
2120: 61 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  as.    **      t
2130: 68 65 20 73 63 68 65 6d 61 20 50 52 49 4d 41 52  he schema PRIMAR
2140: 59 20 4b 45 59 2c 20 77 68 69 63 68 20 69 73 20  Y KEY, which is 
2150: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2160: 20 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 2a 2a   present..    **
2170: 20 20 20 2a 20 20 46 6f 72 20 72 6f 77 69 64 20     *  For rowid 
2180: 74 61 62 6c 65 73 20 77 69 74 68 20 61 6e 20 49  tables with an I
2190: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
21a0: 45 59 2c 20 74 68 65 20 74 72 75 65 20 70 72 69  EY, the true pri
21b0: 6d 61 72 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  mary.    **     
21c0: 20 6b 65 79 20 69 73 20 74 68 65 20 49 4e 54 45   key is the INTE
21d0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
21e0: 0a 20 20 20 20 2a 2a 20 20 20 2a 20 20 46 6f 72  .    **   *  For
21f0: 20 61 6c 6c 20 6f 74 68 65 72 20 72 6f 77 69 64   all other rowid
2200: 20 74 61 62 6c 65 73 2c 20 74 68 65 20 72 6f 77   tables, the row
2210: 69 64 20 69 73 20 74 68 65 20 74 72 75 65 20 70  id is the true p
2220: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 20 20 20 20  rimary key..    
2230: 2a 2f 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 64  */.    pStmt = d
2240: 62 5f 70 72 65 70 61 72 65 28 22 50 52 41 47 4d  b_prepare("PRAGM
2250: 41 20 25 73 2e 69 6e 64 65 78 5f 6c 69 73 74 3d  A %s.index_list=
2260: 25 51 22 2c 20 7a 44 62 2c 20 7a 54 61 62 29 3b  %Q", zDb, zTab);
2270: 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
2280: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2290: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
22a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
22b0: 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
22c0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
22d0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
22e0: 33 29 2c 22 70 6b 22 29 3d 3d 30 20 29 7b 0a 20  3),"pk")==0 ){. 
22f0: 20 20 20 20 20 20 20 7a 50 6b 49 64 78 4e 61 6d         zPkIdxNam
2300: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2310: 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
2320: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2330: 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 20 20  tmt, 1));.      
2340: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2350: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2360: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2370: 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 6b 49  t);.    if( zPkI
2380: 64 78 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  dxName ){.      
2390: 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20  int nKey = 0;.  
23a0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30      int nCol = 0
23b0: 3b 0a 20 20 20 20 20 20 74 72 75 65 50 6b 20 3d  ;.      truePk =
23c0: 20 30 3b 0a 20 20 20 20 20 20 70 53 74 6d 74 20   0;.      pStmt 
23d0: 3d 20 64 62 5f 70 72 65 70 61 72 65 28 22 50 52  = db_prepare("PR
23e0: 41 47 4d 41 20 25 73 2e 69 6e 64 65 78 5f 78 69  AGMA %s.index_xi
23f0: 6e 66 6f 3d 25 51 22 2c 20 7a 44 62 2c 20 7a 50  nfo=%Q", zDb, zP
2400: 6b 49 64 78 4e 61 6d 65 29 3b 0a 20 20 20 20 20  kIdxName);.     
2410: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
2420: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2430: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
2440: 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
2450: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
2460: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2470: 35 29 20 29 7b 20 6e 4b 65 79 2b 2b 3b 20 63 6f  5) ){ nKey++; co
2480: 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
2490: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
24a0: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31  lumn_int(pStmt,1
24b0: 29 3e 3d 30 20 29 20 74 72 75 65 50 6b 20 3d 20  )>=0 ) truePk = 
24c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
24d0: 20 69 66 28 20 6e 43 6f 6c 3d 3d 6e 4b 65 79 20   if( nCol==nKey 
24e0: 29 20 74 72 75 65 50 6b 20 3d 20 31 3b 0a 20 20  ) truePk = 1;.  
24f0: 20 20 20 20 69 66 28 20 74 72 75 65 50 6b 20 29      if( truePk )
2500: 7b 0a 20 20 20 20 20 20 20 20 6e 50 4b 20 3d 20  {.        nPK = 
2510: 6e 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nKey;.      }els
2520: 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 4b 20 3d  e{.        nPK =
2530: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2540: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2550: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
2560: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
2570: 6b 49 64 78 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  kIdxName);.    }
2580: 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 72 75 65  else{.      true
2590: 50 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50  Pk = 1;.      nP
25a0: 4b 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  K = 1;.    }.   
25b0: 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70   pStmt = db_prep
25c0: 61 72 65 28 22 50 52 41 47 4d 41 20 25 73 2e 74  are("PRAGMA %s.t
25d0: 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a  able_info=%Q", z
25e0: 44 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c  Db, zTab);.  }el
25f0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 67  se{.    /* The g
2600: 2e 62 53 63 68 65 6d 61 50 4b 3d 3d 31 20 63 61  .bSchemaPK==1 ca
2610: 73 65 3a 20 20 55 73 65 20 77 68 61 74 65 76 65  se:  Use whateve
2620: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  r primary key is
2630: 20 64 65 63 6c 61 72 65 64 0a 20 20 20 20 2a 2a   declared.    **
2640: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 2e 20   in the schema. 
2650: 20 54 68 65 20 22 72 6f 77 69 64 22 20 77 69 6c   The "rowid" wil
2660: 6c 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  l still be used 
2670: 61 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  as the primary k
2680: 65 79 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  ey.    ** if the
2690: 20 74 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f   table definitio
26a0: 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  n does not conta
26b0: 69 6e 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  in a PRIMARY KEY
26c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 50 4b  ..    */.    nPK
26d0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 6d 74 20   = 0;.    pStmt 
26e0: 3d 20 64 62 5f 70 72 65 70 61 72 65 28 22 50 52  = db_prepare("PR
26f0: 41 47 4d 41 20 25 73 2e 74 61 62 6c 65 5f 69 6e  AGMA %s.table_in
2700: 66 6f 3d 25 51 22 2c 20 7a 44 62 2c 20 7a 54 61  fo=%Q", zDb, zTa
2710: 62 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53  b);.    while( S
2720: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2730: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
2740: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2750: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
2760: 53 74 6d 74 2c 35 29 3e 30 20 29 20 6e 50 4b 2b  Stmt,5)>0 ) nPK+
2770: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
2780: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
2790: 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d  );.    if( nPK==
27a0: 30 20 29 20 6e 50 4b 20 3d 20 31 3b 0a 20 20 20  0 ) nPK = 1;.   
27b0: 20 74 72 75 65 50 6b 20 3d 20 31 3b 0a 20 20 7d   truePk = 1;.  }
27c0: 0a 20 20 2a 70 6e 50 4b 65 79 20 3d 20 6e 50 4b  .  *pnPKey = nPK
27d0: 3b 0a 20 20 6e 61 7a 20 3d 20 6e 50 4b 3b 0a 20  ;.  naz = nPK;. 
27e0: 20 61 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61   az = sqlite3_ma
27f0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 63 68 61  lloc( sizeof(cha
2800: 72 2a 29 2a 28 6e 50 4b 2b 31 29 20 29 3b 0a 20  r*)*(nPK+1) );. 
2810: 20 69 66 28 20 61 7a 3d 3d 30 20 29 20 72 75 6e   if( az==0 ) run
2820: 74 69 6d 65 45 72 72 6f 72 28 22 6f 75 74 20 6f  timeError("out o
2830: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 6d 65  f memory");.  me
2840: 6d 73 65 74 28 61 7a 2c 20 30 2c 20 73 69 7a 65  mset(az, 0, size
2850: 6f 66 28 63 68 61 72 2a 29 2a 28 6e 50 4b 2b 31  of(char*)*(nPK+1
2860: 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c  ));.  while( SQL
2870: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2880: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
2890: 20 20 20 20 69 6e 74 20 69 50 4b 65 79 3b 0a 20      int iPKey;. 
28a0: 20 20 20 69 66 28 20 74 72 75 65 50 6b 20 26 26     if( truePk &&
28b0: 20 28 69 50 4b 65 79 20 3d 20 73 71 6c 69 74 65   (iPKey = sqlite
28c0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
28d0: 6d 74 2c 35 29 29 3e 30 20 29 7b 0a 20 20 20 20  mt,5))>0 ){.    
28e0: 20 20 61 7a 5b 69 50 4b 65 79 2d 31 5d 20 3d 20    az[iPKey-1] = 
28f0: 73 61 66 65 49 64 28 28 63 68 61 72 2a 29 73 71  safeId((char*)sq
2900: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2910: 74 28 70 53 74 6d 74 2c 31 29 29 3b 0a 20 20 20  t(pStmt,1));.   
2920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a   }else{.      az
2930: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
2940: 6f 63 28 61 7a 2c 20 73 69 7a 65 6f 66 28 63 68  oc(az, sizeof(ch
2950: 61 72 2a 29 2a 28 6e 61 7a 2b 32 29 20 29 3b 0a  ar*)*(naz+2) );.
2960: 20 20 20 20 20 20 69 66 28 20 61 7a 3d 3d 30 20        if( az==0 
2970: 29 20 72 75 6e 74 69 6d 65 45 72 72 6f 72 28 22  ) runtimeError("
2980: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
2990: 0a 20 20 20 20 20 20 61 7a 5b 6e 61 7a 2b 2b 5d  .      az[naz++]
29a0: 20 3d 20 73 61 66 65 49 64 28 28 63 68 61 72 2a   = safeId((char*
29b0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
29c0: 74 65 78 74 28 70 53 74 6d 74 2c 31 29 29 3b 0a  text(pStmt,1));.
29d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
29e0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
29f0: 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 20 29 20  mt);.  if( az ) 
2a00: 61 7a 5b 6e 61 7a 5d 20 3d 20 30 3b 0a 20 20 69  az[naz] = 0;.  i
2a10: 66 28 20 61 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20  f( az[0]==0 ){. 
2a20: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
2a30: 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20 22 72 6f  zRowid[] = { "ro
2a40: 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c  wid", "_rowid_",
2a50: 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20 20 66 6f   "oid" };.    fo
2a60: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
2a70: 61 7a 52 6f 77 69 64 29 2f 73 69 7a 65 6f 66 28  azRowid)/sizeof(
2a80: 61 7a 52 6f 77 69 64 5b 30 5d 29 3b 20 69 2b 2b  azRowid[0]); i++
2a90: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  ){.      for(j=1
2aa0: 3b 20 6a 3c 6e 61 7a 3b 20 6a 2b 2b 29 7b 0a 20  ; j<naz; j++){. 
2ab0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2ac0: 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 5b 6a 5d  e3_stricmp(az[j]
2ad0: 2c 20 61 7a 52 6f 77 69 64 5b 69 5d 29 3d 3d 30  , azRowid[i])==0
2ae0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2af0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 6e  }.      if( j>=n
2b00: 61 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 61 7a  az ){.        az
2b10: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [0] = sqlite3_mp
2b20: 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 52 6f  rintf("%s", azRo
2b30: 77 69 64 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  wid[i]);.       
2b40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2b50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 7a      }.    if( az
2b60: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
2b70: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 61 7a 3b 20  for(i=1; i<naz; 
2b80: 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66 72 65  i++) sqlite3_fre
2b90: 65 28 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  e(az[i]);.      
2ba0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 29  sqlite3_free(az)
2bb0: 3b 0a 20 20 20 20 20 20 61 7a 20 3d 20 30 3b 0a  ;.      az = 0;.
2bc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2bd0: 72 6e 20 61 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn az;.}../*.** 
2be0: 50 72 69 6e 74 20 74 68 65 20 73 71 6c 69 74 65  Print the sqlite
2bf0: 33 5f 76 61 6c 75 65 20 58 20 61 73 20 61 6e 20  3_value X as an 
2c00: 53 51 4c 20 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a  SQL literal..*/.
2c10: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
2c20: 74 51 75 6f 74 65 64 28 46 49 4c 45 20 2a 6f 75  tQuoted(FILE *ou
2c30: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
2c40: 20 2a 58 29 7b 0a 20 20 73 77 69 74 63 68 28 20   *X){.  switch( 
2c50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
2c60: 70 65 28 58 29 20 29 7b 0a 20 20 20 20 63 61 73  pe(X) ){.    cas
2c70: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
2c80: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
2c90: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42  1;.      char zB
2ca0: 75 66 5b 35 30 5d 3b 0a 20 20 20 20 20 20 72 31  uf[50];.      r1
2cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2cc0: 5f 64 6f 75 62 6c 65 28 58 29 3b 0a 20 20 20 20  _double(X);.    
2cd0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2ce0: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
2cf0: 20 7a 42 75 66 2c 20 22 25 21 2e 31 35 67 22 2c   zBuf, "%!.15g",
2d00: 20 72 31 29 3b 0a 20 20 20 20 20 20 66 70 72 69   r1);.      fpri
2d10: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
2d20: 42 75 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Buf);.      brea
2d30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2d40: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
2d50: 3a 20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  : {.      fprint
2d60: 66 28 6f 75 74 2c 20 22 25 6c 6c 64 22 2c 20 73  f(out, "%lld", s
2d70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2d80: 36 34 28 58 29 29 3b 0a 20 20 20 20 20 20 62 72  64(X));.      br
2d90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2da0: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
2db0: 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75   {.      const u
2dc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42  nsigned char *zB
2dd0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
2de0: 6c 75 65 5f 62 6c 6f 62 28 58 29 3b 0a 20 20 20  lue_blob(X);.   
2df0: 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73     int nBlob = s
2e00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2e10: 65 73 28 58 29 3b 0a 20 20 20 20 20 20 69 66 28  es(X);.      if(
2e20: 20 7a 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20   zBlob ){.      
2e30: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
2e40: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 78   fprintf(out, "x
2e50: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  '");.        for
2e60: 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69  (i=0; i<nBlob; i
2e70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
2e80: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
2e90: 78 22 2c 20 7a 42 6c 6f 62 5b 69 5d 29 3b 0a 20  x", zBlob[i]);. 
2ea0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eb0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27   fprintf(out, "'
2ec0: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
2ed0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
2ee0: 28 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  (out, "NULL");. 
2ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2f00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2f10: 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20  se SQLITE_TEXT: 
2f20: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e  {.      const un
2f30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72  signed char *zAr
2f40: 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  g = sqlite3_valu
2f50: 65 5f 74 65 78 74 28 58 29 3b 0a 20 20 20 20 20  e_text(X);.     
2f60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 20 20   int i, j;..    
2f70: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 7b    if( zArg==0 ){
2f80: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
2f90: 28 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  (out, "NULL");. 
2fa0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fb0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
2fc0: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 66   "'");.        f
2fd0: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 41 72 67 5b 69  or(i=j=0; zArg[i
2fe0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
2ff0: 20 20 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d     if( zArg[i]==
3000: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
3010: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
3020: 20 22 25 2e 2a 73 27 22 2c 20 69 2d 6a 2b 31 2c   "%.*s'", i-j+1,
3030: 20 26 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20   &zArg[j]);.    
3040: 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b          j = i+1;
3050: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
3070: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 27  printf(out, "%s'
3080: 22 2c 20 26 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20  ", &zArg[j]);.  
3090: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
30a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
30b0: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
30c0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
30d0: 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ut, "NULL");.   
30e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74    }.}../*.** Out
3100: 70 75 74 20 53 51 4c 20 74 68 61 74 20 77 69 6c  put SQL that wil
3110: 6c 20 72 65 63 72 65 61 74 65 20 74 68 65 20 61  l recreate the a
3120: 75 78 2e 7a 54 61 62 20 74 61 62 6c 65 2e 0a 2a  ux.zTab table..*
3130: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 75  /.static void du
3140: 6d 70 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20 63  mp_table(const c
3150: 68 61 72 20 2a 7a 54 61 62 2c 20 46 49 4c 45 20  har *zTab, FILE 
3160: 2a 6f 75 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *out){.  char *z
3170: 49 64 20 3d 20 73 61 66 65 49 64 28 7a 54 61 62  Id = safeId(zTab
3180: 29 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ); /* Name of th
3190: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61  e table */.  cha
31a0: 72 20 2a 2a 61 7a 20 3d 20 30 3b 20 20 20 20 20  r **az = 0;     
31b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
31c0: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  f columns */.  i
31d0: 6e 74 20 6e 50 6b 3b 20 20 20 20 20 20 20 20 20  nt nPk;         
31e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31f0: 65 72 20 6f 66 20 74 72 75 65 20 70 72 69 6d 61  er of true prima
3200: 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 2a  ry key columns *
3210: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3230: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 20   Number of data 
3240: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
3250: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
3260: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
3270: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ounter */.  sqli
3280: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
3290: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
32a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
32b0: 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20  t char *zSep;   
32c0: 20 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74        /* Separat
32d0: 6f 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 53  or string */.  S
32e0: 74 72 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  tr ins;         
32f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
3300: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 49 4e 53  nning of the INS
3310: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ERT statement */
3320: 0a 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f 70  ..  pStmt = db_p
3330: 72 65 70 61 72 65 28 22 53 45 4c 45 43 54 20 73  repare("SELECT s
3340: 71 6c 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69  ql FROM aux.sqli
3350: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
3360: 6e 61 6d 65 3d 25 51 22 2c 20 7a 54 61 62 29 3b  name=%Q", zTab);
3370: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
3380: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
3390: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 66 70  pStmt) ){.    fp
33a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3b 5c  rintf(out, "%s;\
33b0: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
33c0: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29  mn_text(pStmt,0)
33d0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
33e0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
33f0: 3b 0a 20 20 69 66 28 20 21 67 2e 62 53 63 68 65  ;.  if( !g.bSche
3400: 6d 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 61 7a  maOnly ){.    az
3410: 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22   = columnNames("
3420: 61 75 78 22 2c 20 7a 54 61 62 2c 20 26 6e 50 6b  aux", zTab, &nPk
3430: 29 3b 0a 20 20 20 20 73 74 72 49 6e 69 74 28 26  );.    strInit(&
3440: 69 6e 73 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  ins);.    if( az
3450: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 74  ==0 ){.      pSt
3460: 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65 28  mt = db_prepare(
3470: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61  "SELECT * FROM a
3480: 75 78 2e 25 73 22 2c 20 7a 49 64 29 3b 0a 20 20  ux.%s", zId);.  
3490: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 69      strPrintf(&i
34a0: 6e 73 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ns,"INSERT INTO 
34b0: 25 73 20 56 41 4c 55 45 53 22 2c 20 7a 49 64 29  %s VALUES", zId)
34c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
34d0: 20 20 20 53 74 72 20 73 71 6c 3b 0a 20 20 20 20     Str sql;.    
34e0: 20 20 73 74 72 49 6e 69 74 28 26 73 71 6c 29 3b    strInit(&sql);
34f0: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 20 22  .      zSep =  "
3500: 53 45 4c 45 43 54 22 3b 0a 20 20 20 20 20 20 66  SELECT";.      f
3510: 6f 72 28 69 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69  or(i=0; az[i]; i
3520: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
3530: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73  Printf(&sql, "%s
3540: 20 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69   %s", zSep, az[i
3550: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  ]);.        zSep
3560: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 7d 0a   = ",";.      }.
3570: 20 20 20 20 20 20 73 74 72 50 72 69 6e 74 66 28        strPrintf(
3580: 26 73 71 6c 2c 22 20 46 52 4f 4d 20 61 75 78 2e  &sql," FROM aux.
3590: 25 73 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  %s", zId);.     
35a0: 20 7a 53 65 70 20 3d 20 22 20 4f 52 44 45 52 20   zSep = " ORDER 
35b0: 42 59 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  BY";.      for(i
35c0: 3d 31 3b 20 69 3c 3d 6e 50 6b 3b 20 69 2b 2b 29  =1; i<=nPk; i++)
35d0: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 50 72 69  {.        strPri
35e0: 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 20 25 64  ntf(&sql, "%s %d
35f0: 22 2c 20 7a 53 65 70 2c 20 69 29 3b 0a 20 20 20  ", zSep, i);.   
3600: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b       zSep = ",";
3610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
3620: 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72  Stmt = db_prepar
3630: 65 28 22 25 73 22 2c 20 73 71 6c 2e 7a 29 3b 0a  e("%s", sql.z);.
3640: 20 20 20 20 20 20 73 74 72 46 72 65 65 28 26 73        strFree(&s
3650: 71 6c 29 3b 0a 20 20 20 20 20 20 73 74 72 50 72  ql);.      strPr
3660: 69 6e 74 66 28 26 69 6e 73 2c 20 22 49 4e 53 45  intf(&ins, "INSE
3670: 52 54 20 49 4e 54 4f 20 25 73 22 2c 20 7a 49 64  RT INTO %s", zId
3680: 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  );.      zSep = 
3690: 22 28 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  "(";.      for(i
36a0: 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  =0; az[i]; i++){
36b0: 0a 20 20 20 20 20 20 20 20 73 74 72 50 72 69 6e  .        strPrin
36c0: 74 66 28 26 69 6e 73 2c 20 22 25 73 25 73 22 2c  tf(&ins, "%s%s",
36d0: 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 29 3b 0a 20   zSep, az[i]);. 
36e0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
36f0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
3700: 20 73 74 72 50 72 69 6e 74 66 28 26 69 6e 73 2c   strPrintf(&ins,
3710: 22 29 20 56 41 4c 55 45 53 22 29 3b 0a 20 20 20  ") VALUES");.   
3720: 20 20 20 6e 61 6d 65 6c 69 73 74 46 72 65 65 28     namelistFree(
3730: 61 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  az);.    }.    n
3740: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
3750: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
3760: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  );.    while( SQ
3770: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
3780: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
3790: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
37a0: 75 74 2c 20 22 25 73 22 2c 69 6e 73 2e 7a 29 3b  ut, "%s",ins.z);
37b0: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 28  .      zSep = "(
37c0: 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ";.      for(i=0
37d0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
37e0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
37f0: 6f 75 74 2c 20 22 25 73 22 2c 7a 53 65 70 29 3b  out, "%s",zSep);
3800: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 51 75  .        printQu
3810: 6f 74 65 64 28 6f 75 74 2c 20 73 71 6c 69 74 65  oted(out, sqlite
3820: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
3830: 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20  Stmt,i));.      
3840: 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20    zSep = ",";.  
3850: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
3860: 6e 74 66 28 6f 75 74 2c 20 22 29 3b 5c 6e 22 29  ntf(out, ");\n")
3870: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3880: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
3890: 6d 74 29 3b 0a 20 20 20 20 73 74 72 46 72 65 65  mt);.    strFree
38a0: 28 26 69 6e 73 29 3b 0a 20 20 7d 20 2f 2a 20 65  (&ins);.  } /* e
38b0: 6e 64 69 66 20 21 67 2e 62 53 63 68 65 6d 61 4f  ndif !g.bSchemaO
38c0: 6e 6c 79 20 2a 2f 0a 20 20 70 53 74 6d 74 20 3d  nly */.  pStmt =
38d0: 20 64 62 5f 70 72 65 70 61 72 65 28 22 53 45 4c   db_prepare("SEL
38e0: 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 61 75 78  ECT sql FROM aux
38f0: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a  .sqlite_master".
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3910: 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70       " WHERE typ
3920: 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
3930: 6c 5f 6e 61 6d 65 3d 25 51 20 41 4e 44 20 73 71  l_name=%Q AND sq
3940: 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 2c 0a  l IS NOT NULL",.
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 20 20 20 20 20 7a 54 61 62 29 3b 0a 20 20 77 68       zTab);.  wh
3970: 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
3980: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
3990: 74 6d 74 29 20 29 7b 0a 20 20 20 20 66 70 72 69  tmt) ){.    fpri
39a0: 6e 74 66 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  ntf(out, "%s;\n"
39b0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
39c0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29 29 3b  _text(pStmt,0));
39d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
39e0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
39f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
3a00: 65 20 61 6c 6c 20 64 69 66 66 65 72 65 6e 63 65  e all difference
3a10: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
3a20: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
3a30: 76 6f 69 64 20 64 69 66 66 5f 6f 6e 65 5f 74 61  void diff_one_ta
3a40: 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ble(const char *
3a50: 7a 54 61 62 2c 20 46 49 4c 45 20 2a 6f 75 74 29  zTab, FILE *out)
3a60: 7b 0a 20 20 63 68 61 72 20 2a 7a 49 64 20 3d 20  {.  char *zId = 
3a70: 73 61 66 65 49 64 28 7a 54 61 62 29 3b 20 2f 2a  safeId(zTab); /*
3a80: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 28   Name of table (
3a90: 74 72 61 6e 73 6c 61 74 65 64 20 66 6f 72 20 75  translated for u
3aa0: 73 20 69 6e 20 53 51 4c 29 20 2a 2f 0a 20 20 63  s in SQL) */.  c
3ab0: 68 61 72 20 2a 2a 61 7a 20 3d 20 30 3b 20 20 20  har **az = 0;   
3ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3ad0: 6d 6e 73 20 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20  mns in main */. 
3ae0: 20 63 68 61 72 20 2a 2a 61 7a 32 20 3d 20 30 3b   char **az2 = 0;
3af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3b00: 6c 75 6d 6e 73 20 69 6e 20 61 75 78 20 2a 2f 0a  lumns in aux */.
3b10: 20 20 69 6e 74 20 6e 50 6b 3b 20 20 20 20 20 20    int nPk;      
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3b30: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
3b40: 6e 73 20 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20 20  ns in main */.  
3b50: 69 6e 74 20 6e 50 6b 32 3b 20 20 20 20 20 20 20  int nPk2;       
3b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69            /* Pri
3b70: 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  mary key columns
3b80: 20 69 6e 20 61 75 78 20 2a 2f 0a 20 20 69 6e 74   in aux */.  int
3b90: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
3ba0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3bb0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6d   of columns in m
3bc0: 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 3b  ain */.  int n2;
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3be0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3bf0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 75 78 20 2a  columns in aux *
3c00: 2f 0a 20 20 69 6e 74 20 6e 51 3b 20 20 20 20 20  /.  int nQ;     
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c20: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   Number of outpu
3c30: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
3c40: 20 64 69 66 66 20 71 75 65 72 79 20 2a 2f 0a 20   diff query */. 
3c50: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
3c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
3c70: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
3c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
3c90: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 70  ;         /* Sep
3ca0: 61 72 61 74 6f 72 20 73 74 72 69 6e 67 20 2a 2f  arator string */
3cb0: 0a 20 20 53 74 72 20 73 71 6c 3b 20 20 20 20 20  .  Str sql;     
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3cd0: 43 6f 6d 70 61 72 69 73 6f 6e 20 71 75 65 72 79  Comparison query
3ce0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
3cf0: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
3d00: 2f 2a 20 51 75 65 72 79 20 73 74 61 74 65 6d 65  /* Query stateme
3d10: 6e 74 20 74 6f 20 64 6f 20 74 68 65 20 64 69 66  nt to do the dif
3d20: 66 20 2a 2f 0a 0a 20 20 73 74 72 49 6e 69 74 28  f */..  strInit(
3d30: 26 73 71 6c 29 3b 0a 20 20 69 66 28 20 67 2e 66  &sql);.  if( g.f
3d40: 44 65 62 75 67 3d 3d 44 45 42 55 47 5f 43 4f 4c  Debug==DEBUG_COL
3d50: 55 4d 4e 5f 4e 41 4d 45 53 20 29 7b 0a 20 20 20  UMN_NAMES ){.   
3d60: 20 2f 2a 20 53 69 6d 70 6c 79 20 72 75 6e 20 63   /* Simply run c
3d70: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 6f 6e 20  olumnNames() on 
3d80: 61 6c 6c 20 74 61 62 6c 65 73 20 6f 66 20 74 68  all tables of th
3d90: 65 20 6f 72 69 67 69 6e 0a 20 20 20 20 2a 2a 20  e origin.    ** 
3da0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 73 68 6f  database and sho
3db0: 77 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  w the results.  
3dc0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
3dd0: 20 74 65 73 74 69 6e 67 0a 20 20 20 20 2a 2a 20   testing.    ** 
3de0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 66  and debugging of
3df0: 20 74 68 65 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73   the columnNames
3e00: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  () function..   
3e10: 20 2a 2f 0a 20 20 20 20 61 7a 20 3d 20 63 6f 6c   */.    az = col
3e20: 75 6d 6e 4e 61 6d 65 73 28 22 61 75 78 22 2c 7a  umnNames("aux",z
3e30: 54 61 62 2c 20 26 6e 50 6b 29 3b 0a 20 20 20 20  Tab, &nPk);.    
3e40: 69 66 28 20 61 7a 3d 3d 30 20 29 7b 0a 20 20 20  if( az==0 ){.   
3e50: 20 20 20 70 72 69 6e 74 66 28 22 52 6f 77 69 64     printf("Rowid
3e60: 20 6e 6f 74 20 61 63 63 65 73 73 69 62 6c 65 20   not accessible 
3e70: 66 6f 72 20 25 73 5c 6e 22 2c 20 7a 49 64 29 3b  for %s\n", zId);
3e80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3e90: 20 20 70 72 69 6e 74 66 28 22 25 73 3a 22 2c 20    printf("%s:", 
3ea0: 7a 49 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  zId);.      for(
3eb0: 69 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29  i=0; az[i]; i++)
3ec0: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
3ed0: 28 22 20 25 73 22 2c 20 61 7a 5b 69 5d 29 3b 0a  (" %s", az[i]);.
3ee0: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 31 3d          if( i+1=
3ef0: 3d 6e 50 6b 20 29 20 70 72 69 6e 74 66 28 22 20  =nPk ) printf(" 
3f00: 2a 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  *");.      }.   
3f10: 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
3f20: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
3f30: 65 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f 74 61 62  end_diff_one_tab
3f40: 6c 65 3b 0a 20 20 7d 0a 20 20 20 20 0a 0a 20 20  le;.  }.    ..  
3f50: 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  if( sqlite3_tabl
3f60: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
3f70: 61 28 67 2e 64 62 2c 22 61 75 78 22 2c 7a 54 61  a(g.db,"aux",zTa
3f80: 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 20 29  b,0,0,0,0,0,0) )
3f90: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
3fa0: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
3fb0: 6d 65 74 61 64 61 74 61 28 67 2e 64 62 2c 22 6d  metadata(g.db,"m
3fc0: 61 69 6e 22 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c  ain",zTab,0,0,0,
3fd0: 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  0,0,0) ){.      
3fe0: 2f 2a 20 54 61 62 6c 65 20 6d 69 73 73 69 6e 67  /* Table missing
3ff0: 20 66 72 6f 6d 20 73 65 63 6f 6e 64 20 64 61 74   from second dat
4000: 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  abase. */.      
4010: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 44 52  fprintf(out, "DR
4020: 4f 50 20 54 41 42 4c 45 20 25 73 3b 5c 6e 22 2c  OP TABLE %s;\n",
4030: 20 7a 49 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20   zId);.    }.   
4040: 20 67 6f 74 6f 20 65 6e 64 5f 64 69 66 66 5f 6f   goto end_diff_o
4050: 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  ne_table;.  }.. 
4060: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62   if( sqlite3_tab
4070: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
4080: 74 61 28 67 2e 64 62 2c 22 6d 61 69 6e 22 2c 7a  ta(g.db,"main",z
4090: 54 61 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29  Tab,0,0,0,0,0,0)
40a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 62 6c 65   ){.    /* Table
40b0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
40c0: 75 72 63 65 20 2a 2f 0a 20 20 20 20 64 75 6d 70  urce */.    dump
40d0: 5f 74 61 62 6c 65 28 7a 54 61 62 2c 20 6f 75 74  _table(zTab, out
40e0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
40f0: 64 69 66 66 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a  diff_one_table;.
4100: 20 20 7d 0a 0a 20 20 61 7a 20 3d 20 63 6f 6c 75    }..  az = colu
4110: 6d 6e 4e 61 6d 65 73 28 22 6d 61 69 6e 22 2c 20  mnNames("main", 
4120: 7a 54 61 62 2c 20 26 6e 50 6b 29 3b 0a 20 20 61  zTab, &nPk);.  a
4130: 7a 32 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73  z2 = columnNames
4140: 28 22 61 75 78 22 2c 20 7a 54 61 62 2c 20 26 6e  ("aux", zTab, &n
4150: 50 6b 32 29 3b 0a 20 20 69 66 28 20 61 7a 20 26  Pk2);.  if( az &
4160: 26 20 61 7a 32 20 29 7b 0a 20 20 20 20 66 6f 72  & az2 ){.    for
4170: 28 6e 3d 30 3b 20 61 7a 5b 6e 5d 3b 20 6e 2b 2b  (n=0; az[n]; n++
4180: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
4190: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 5b  ite3_stricmp(az[
41a0: 6e 5d 2c 61 7a 32 5b 6e 5d 29 21 3d 30 20 29 20  n],az2[n])!=0 ) 
41b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
41c0: 0a 20 20 69 66 28 20 61 7a 3d 3d 30 0a 20 20 20  .  if( az==0.   
41d0: 7c 7c 20 61 7a 32 3d 3d 30 0a 20 20 20 7c 7c 20  || az2==0.   || 
41e0: 6e 50 6b 21 3d 6e 50 6b 32 0a 20 20 20 7c 7c 20  nPk!=nPk2.   || 
41f0: 61 7a 5b 6e 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  az[n].  ){.    /
4200: 2a 20 53 63 68 65 6d 61 20 6d 69 73 6d 61 74 63  * Schema mismatc
4210: 68 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66  h */.    fprintf
4220: 28 6f 75 74 2c 20 22 44 52 4f 50 20 54 41 42 4c  (out, "DROP TABL
4230: 45 20 25 73 3b 5c 6e 22 2c 20 7a 49 64 29 3b 0a  E %s;\n", zId);.
4240: 20 20 20 20 64 75 6d 70 5f 74 61 62 6c 65 28 7a      dump_table(z
4250: 54 61 62 2c 20 6f 75 74 29 3b 0a 20 20 20 20 67  Tab, out);.    g
4260: 6f 74 6f 20 65 6e 64 5f 64 69 66 66 5f 6f 6e 65  oto end_diff_one
4270: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _table;.  }..  /
4280: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70  * Build the comp
4290: 61 72 69 73 6f 6e 20 71 75 65 72 79 20 2a 2f 0a  arison query */.
42a0: 20 20 66 6f 72 28 6e 32 3d 6e 3b 20 61 7a 5b 6e    for(n2=n; az[n
42b0: 32 5d 3b 20 6e 32 2b 2b 29 7b 7d 0a 20 20 6e 51  2]; n2++){}.  nQ
42c0: 20 3d 20 6e 50 6b 32 2b 31 2b 32 2a 28 6e 32 2d   = nPk2+1+2*(n2-
42d0: 6e 50 6b 32 29 3b 0a 20 20 69 66 28 20 6e 32 3e  nPk2);.  if( n2>
42e0: 6e 50 6b 32 20 29 7b 0a 20 20 20 20 7a 53 65 70  nPk2 ){.    zSep
42f0: 20 3d 20 22 53 45 4c 45 43 54 20 22 3b 0a 20 20   = "SELECT ";.  
4300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
4310: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
4320: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25  rPrintf(&sql, "%
4330: 73 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a  sB.%s", zSep, az
4340: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7a 53 65 70  [i]);.      zSep
4350: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a 20   = ", ";.    }. 
4360: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
4370: 6c 2c 20 22 2c 20 31 25 73 20 2d 2d 20 63 68 61  l, ", 1%s -- cha
4380: 6e 67 65 64 20 72 6f 77 5c 6e 22 2c 20 6e 50 6b  nged row\n", nPk
4390: 3d 3d 6e 20 3f 20 22 22 20 3a 20 22 2c 22 29 3b  ==n ? "" : ",");
43a0: 0a 20 20 20 20 77 68 69 6c 65 28 20 61 7a 5b 69  .    while( az[i
43b0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 74 72 50 72  ] ){.      strPr
43c0: 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20 20 20  intf(&sql, "    
43d0: 20 20 20 41 2e 25 73 20 49 53 20 4e 4f 54 20 42     A.%s IS NOT B
43e0: 2e 25 73 2c 20 42 2e 25 73 25 73 5c 6e 22 2c 0a  .%s, B.%s%s\n",.
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 2c 20 61 7a  az[i], az[i], az
4410: 5b 69 5d 2c 20 69 3d 3d 6e 32 2d 31 20 3f 20 22  [i], i==n2-1 ? "
4420: 22 20 3a 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  " : ",");.      
4430: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i++;.    }.    s
4440: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
4450: 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41    FROM main.%s A
4460: 2c 20 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a  , aux.%s B\n", z
4470: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 7a 53  Id, zId);.    zS
4480: 65 70 20 3d 20 22 20 57 48 45 52 45 22 3b 0a 20  ep = " WHERE";. 
4490: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50     for(i=0; i<nP
44a0: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  k; i++){.      s
44b0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
44c0: 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a  %s A.%s=B.%s", z
44d0: 53 65 70 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69  Sep, az[i], az[i
44e0: 5d 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d  ]);.      zSep =
44f0: 20 22 20 41 4e 44 22 3b 0a 20 20 20 20 7d 0a 20   " AND";.    }. 
4500: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 20     zSep = "\n   
4510: 41 4e 44 20 28 22 3b 0a 20 20 20 20 77 68 69 6c  AND (";.    whil
4520: 65 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20  e( az[i] ){.    
4530: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
4540: 2c 20 22 25 73 41 2e 25 73 20 49 53 20 4e 4f 54  , "%sA.%s IS NOT
4550: 20 42 2e 25 73 25 73 5c 6e 22 2c 0a 20 20 20 20   B.%s%s\n",.    
4560: 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 65 70              zSep
4570: 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 2c 20  , az[i], az[i], 
4580: 69 3d 3d 6e 32 2d 31 20 3f 20 22 29 22 20 3a 20  i==n2-1 ? ")" : 
4590: 22 22 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20  "");.      zSep 
45a0: 3d 20 22 20 20 20 20 20 20 20 20 4f 52 20 22 3b  = "        OR ";
45b0: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
45c0: 7d 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28  }.    strPrintf(
45d0: 26 73 71 6c 2c 20 22 20 55 4e 49 4f 4e 20 41 4c  &sql, " UNION AL
45e0: 4c 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 53 65  L\n");.  }.  zSe
45f0: 70 20 3d 20 22 53 45 4c 45 43 54 20 22 3b 0a 20  p = "SELECT ";. 
4600: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b   for(i=0; i<nPk;
4610: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72   i++){.    strPr
4620: 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 41 2e  intf(&sql, "%sA.
4630: 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d  %s", zSep, az[i]
4640: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c  );.    zSep = ",
4650: 20 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69   ";.  }.  strPri
4660: 6e 74 66 28 26 73 71 6c 2c 20 22 2c 20 32 25 73  ntf(&sql, ", 2%s
4670: 20 2d 2d 20 64 65 6c 65 74 65 64 20 72 6f 77 5c   -- deleted row\
4680: 6e 22 2c 20 6e 50 6b 3d 3d 6e 20 3f 20 22 22 20  n", nPk==n ? "" 
4690: 3a 20 22 2c 22 29 3b 0a 20 20 77 68 69 6c 65 28  : ",");.  while(
46a0: 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 73 74   az[i] ){.    st
46b0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20  rPrintf(&sql, " 
46c0: 20 20 20 20 20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c        NULL, NULL
46d0: 25 73 5c 6e 22 2c 20 69 3d 3d 6e 32 2d 31 20 3f  %s\n", i==n2-1 ?
46e0: 20 22 22 20 3a 20 22 2c 22 29 3b 0a 20 20 20 20   "" : ",");.    
46f0: 69 2b 2b 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72  i++;.  }.  strPr
4700: 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20 46 52  intf(&sql, "  FR
4710: 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 5c 6e 22 2c  OM main.%s A\n",
4720: 20 7a 49 64 29 3b 0a 20 20 73 74 72 50 72 69 6e   zId);.  strPrin
4730: 74 66 28 26 73 71 6c 2c 20 22 20 57 48 45 52 45  tf(&sql, " WHERE
4740: 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45   NOT EXISTS(SELE
4750: 43 54 20 31 20 46 52 4f 4d 20 61 75 78 2e 25 73  CT 1 FROM aux.%s
4760: 20 42 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 7a   B\n", zId);.  z
4770: 53 65 70 20 3d 20 20 20 20 20 20 20 20 20 20 22  Sep =          "
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 20 57 48 45 52 45 22 3b 0a 20 20 66 6f 72     WHERE";.  for
47a0: 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  (i=0; i<nPk; i++
47b0: 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66  ){.    strPrintf
47c0: 28 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d  (&sql, "%s A.%s=
47d0: 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b  B.%s", zSep, az[
47e0: 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  i], az[i]);.    
47f0: 7a 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20  zSep = " AND";. 
4800: 20 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26   }.  strPrintf(&
4810: 73 71 6c 2c 20 22 29 5c 6e 22 29 3b 0a 20 20 7a  sql, ")\n");.  z
4820: 53 65 70 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c  Sep = " UNION AL
4830: 4c 5c 6e 53 45 4c 45 43 54 20 22 3b 0a 20 20 66  L\nSELECT ";.  f
4840: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  or(i=0; i<nPk; i
4850: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72 69 6e  ++){.    strPrin
4860: 74 66 28 26 73 71 6c 2c 20 22 25 73 42 2e 25 73  tf(&sql, "%sB.%s
4870: 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 29 3b  ", zSep, az[i]);
4880: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22  .    zSep = ", "
4890: 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e 74  ;.  }.  strPrint
48a0: 66 28 26 73 71 6c 2c 20 22 2c 20 33 25 73 20 2d  f(&sql, ", 3%s -
48b0: 2d 20 69 6e 73 65 72 74 65 64 20 72 6f 77 5c 6e  - inserted row\n
48c0: 22 2c 20 6e 50 6b 3d 3d 6e 20 3f 20 22 22 20 3a  ", nPk==n ? "" :
48d0: 20 22 2c 22 29 3b 0a 20 20 77 68 69 6c 65 28 20   ",");.  while( 
48e0: 61 7a 32 5b 69 5d 20 29 7b 0a 20 20 20 20 73 74  az2[i] ){.    st
48f0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20  rPrintf(&sql, " 
4900: 20 20 20 20 20 20 31 2c 20 42 2e 25 73 25 73 5c        1, B.%s%s\
4910: 6e 22 2c 20 61 7a 5b 69 5d 2c 20 69 3d 3d 6e 32  n", az[i], i==n2
4920: 2d 31 20 3f 20 22 22 20 3a 20 22 2c 22 29 3b 0a  -1 ? "" : ",");.
4930: 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 73      i++;.  }.  s
4940: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
4950: 20 20 46 52 4f 4d 20 61 75 78 2e 25 73 20 42 5c    FROM aux.%s B\
4960: 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 73 74 72 50  n", zId);.  strP
4970: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 57 48  rintf(&sql, " WH
4980: 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 28 53  ERE NOT EXISTS(S
4990: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d 61 69  ELECT 1 FROM mai
49a0: 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a 49 64 29 3b  n.%s A\n", zId);
49b0: 0a 20 20 7a 53 65 70 20 3d 20 20 20 20 20 20 20  .  zSep =       
49c0: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20     "            
49d0: 20 20 20 20 20 20 20 57 48 45 52 45 22 3b 0a 20         WHERE";. 
49e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b   for(i=0; i<nPk;
49f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50 72   i++){.    strPr
4a00: 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 20 41  intf(&sql, "%s A
4a10: 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53 65 70 2c  .%s=B.%s", zSep,
4a20: 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a   az[i], az[i]);.
4a30: 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44      zSep = " AND
4a40: 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69 6e  ";.  }.  strPrin
4a50: 74 66 28 26 73 71 6c 2c 20 22 29 5c 6e 20 4f 52  tf(&sql, ")\n OR
4a60: 44 45 52 20 42 59 22 29 3b 0a 20 20 7a 53 65 70  DER BY");.  zSep
4a70: 20 3d 20 22 20 22 3b 0a 20 20 66 6f 72 28 69 3d   = " ";.  for(i=
4a80: 31 3b 20 69 3c 3d 6e 50 6b 3b 20 69 2b 2b 29 7b  1; i<=nPk; i++){
4a90: 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26  .    strPrintf(&
4aa0: 73 71 6c 2c 20 22 25 73 25 64 22 2c 20 7a 53 65  sql, "%s%d", zSe
4ab0: 70 2c 20 69 29 3b 0a 20 20 20 20 7a 53 65 70 20  p, i);.    zSep 
4ac0: 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20 20 73 74  = ", ";.  }.  st
4ad0: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 3b  rPrintf(&sql, ";
4ae0: 5c 6e 22 29 3b 0a 0a 20 20 69 66 28 20 67 2e 66  \n");..  if( g.f
4af0: 44 65 62 75 67 20 26 20 44 45 42 55 47 5f 44 49  Debug & DEBUG_DI
4b00: 46 46 5f 53 51 4c 20 29 7b 20 0a 20 20 20 20 70  FF_SQL ){ .    p
4b10: 72 69 6e 74 66 28 22 53 51 4c 20 66 6f 72 20 25  rintf("SQL for %
4b20: 73 3a 5c 6e 25 73 5c 6e 22 2c 20 7a 49 64 2c 20  s:\n%s\n", zId, 
4b30: 73 71 6c 2e 7a 29 3b 0a 20 20 20 20 67 6f 74 6f  sql.z);.    goto
4b40: 20 65 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f 74 61   end_diff_one_ta
4b50: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ble;.  }..  /* D
4b60: 72 6f 70 20 69 6e 64 65 78 65 73 20 74 68 61 74  rop indexes that
4b70: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 69 6e 20   are missing in 
4b80: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
4b90: 2a 2f 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f  */.  pStmt = db_
4ba0: 70 72 65 70 61 72 65 28 0a 20 20 20 20 22 53 45  prepare(.    "SE
4bb0: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 6d  LECT name FROM m
4bc0: 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  ain.sqlite_maste
4bd0: 72 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 74  r".    " WHERE t
4be0: 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20  ype='index' AND 
4bf0: 74 62 6c 5f 6e 61 6d 65 3d 25 51 22 0a 20 20 20  tbl_name=%Q".   
4c00: 20 22 20 20 20 41 4e 44 20 73 71 6c 20 49 53 20   "   AND sql IS 
4c10: 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 22 20  NOT NULL".    " 
4c20: 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 49 4e    AND sql NOT IN
4c30: 20 28 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   (SELECT sql FRO
4c40: 4d 20 61 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73  M aux.sqlite_mas
4c50: 74 65 72 22 0a 20 20 20 20 22 20 20 20 20 20 20  ter".    "      
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
4c70: 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
4c80: 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 3d 25 51   AND tbl_name=%Q
4c90: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20  ".    "         
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44               AND
4cb0: 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c   sql IS NOT NULL
4cc0: 29 22 2c 0a 20 20 20 20 7a 54 61 62 2c 20 7a 54  )",.    zTab, zT
4cd0: 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51  ab);.  while( SQ
4ce0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
4cf0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
4d00: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73  .    char *z = s
4d10: 61 66 65 49 64 28 28 63 6f 6e 73 74 20 63 68 61  afeId((const cha
4d20: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
4d30: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29 29  n_text(pStmt,0))
4d40: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
4d50: 74 2c 20 22 44 52 4f 50 20 49 4e 44 45 58 20 25  t, "DROP INDEX %
4d60: 73 3b 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 73  s;\n", z);.    s
4d70: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
4d80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
4d90: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 0a  nalize(pStmt);..
4da0: 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 71 75 65    /* Run the que
4db0: 72 79 20 61 6e 64 20 6f 75 74 70 75 74 20 64 69  ry and output di
4dc0: 66 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 69  fferences */.  i
4dd0: 66 28 20 21 67 2e 62 53 63 68 65 6d 61 4f 6e 6c  f( !g.bSchemaOnl
4de0: 79 20 29 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d  y ){.    pStmt =
4df0: 20 64 62 5f 70 72 65 70 61 72 65 28 73 71 6c 2e   db_prepare(sql.
4e00: 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53  z);.    while( S
4e10: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
4e20: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
4e30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 79 70  {.      int iTyp
4e40: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
4e50: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 6e 50  mn_int(pStmt, nP
4e60: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  k);.      if( iT
4e70: 79 70 65 3d 3d 31 20 7c 7c 20 69 54 79 70 65 3d  ype==1 || iType=
4e80: 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =2 ){.        if
4e90: 28 20 69 54 79 70 65 3d 3d 31 20 29 7b 20 20 20  ( iType==1 ){   
4ea0: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
4eb0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 72  e content of a r
4ec0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ow */.          
4ed0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 55 50  fprintf(out, "UP
4ee0: 44 41 54 45 20 25 73 22 2c 20 7a 49 64 29 3b 0a  DATE %s", zId);.
4ef0: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
4f00: 20 22 20 53 45 54 22 3b 0a 20 20 20 20 20 20 20   " SET";.       
4f10: 20 20 20 66 6f 72 28 69 3d 6e 50 6b 2b 31 3b 20     for(i=nPk+1; 
4f20: 69 3c 6e 51 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  i<nQ; i+=2){.   
4f30: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
4f40: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
4f50: 70 53 74 6d 74 2c 69 29 3d 3d 30 20 29 20 63 6f  pStmt,i)==0 ) co
4f60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
4f70: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
4f80: 20 22 25 73 20 25 73 3d 22 2c 20 7a 53 65 70 2c   "%s %s=", zSep,
4f90: 20 61 7a 32 5b 28 69 2b 6e 50 6b 2d 31 29 2f 32   az2[(i+nPk-1)/2
4fa0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
4fb0: 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20  zSep = ",";.    
4fc0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 51 75 6f          printQuo
4fd0: 74 65 64 28 6f 75 74 2c 20 73 71 6c 69 74 65 33  ted(out, sqlite3
4fe0: 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53  _column_value(pS
4ff0: 74 6d 74 2c 69 2b 31 29 29 3b 0a 20 20 20 20 20  tmt,i+1));.     
5000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
5010: 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
5020: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
5030: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
5040: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
5050: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 22 2c  DELETE FROM %s",
5060: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 7d   zId);.        }
5070: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
5080: 22 20 57 48 45 52 45 22 3b 0a 20 20 20 20 20 20  " WHERE";.      
5090: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
50a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
50b0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
50c0: 25 73 20 25 73 3d 22 2c 20 7a 53 65 70 2c 20 61  %s %s=", zSep, a
50d0: 7a 32 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  z2[i]);.        
50e0: 20 20 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75    printQuoted(ou
50f0: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t, sqlite3_colum
5100: 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 69 29  n_value(pStmt,i)
5110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
5120: 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 20 20 20  p = ",";.       
5130: 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   }.        fprin
5140: 74 66 28 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a  tf(out, ";\n");.
5150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20        }else{    
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5170: 20 49 6e 73 65 72 74 20 61 20 72 6f 77 20 2a 2f   Insert a row */
5180: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
5190: 28 6f 75 74 2c 20 22 49 4e 53 45 52 54 20 49 4e  (out, "INSERT IN
51a0: 54 4f 20 25 73 28 25 73 22 2c 20 7a 49 64 2c 20  TO %s(%s", zId, 
51b0: 61 7a 32 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  az2[0]);.       
51c0: 20 66 6f 72 28 69 3d 31 3b 20 61 7a 32 5b 69 5d   for(i=1; az2[i]
51d0: 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66 28 6f  ; i++) fprintf(o
51e0: 75 74 2c 20 22 2c 25 73 22 2c 20 61 7a 32 5b 69  ut, ",%s", az2[i
51f0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  ]);.        fpri
5200: 6e 74 66 28 6f 75 74 2c 20 22 29 20 56 41 4c 55  ntf(out, ") VALU
5210: 45 53 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 53  ES");.        zS
5220: 65 70 20 3d 20 22 28 22 3b 0a 20 20 20 20 20 20  ep = "(";.      
5230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
5240: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
5250: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
5260: 22 25 73 22 2c 20 7a 53 65 70 29 3b 0a 20 20 20  "%s", zSep);.   
5270: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
5280: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  ";.          pri
5290: 6e 74 51 75 6f 74 65 64 28 6f 75 74 2c 20 73 71  ntQuoted(out, sq
52a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
52b0: 75 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  ue(pStmt,i));.  
52c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
52d0: 66 6f 72 28 69 3d 6e 50 6b 32 2b 32 3b 20 69 3c  for(i=nPk2+2; i<
52e0: 6e 51 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  nQ; i+=2){.     
52f0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
5300: 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20  , ",");.        
5310: 20 20 70 72 69 6e 74 51 75 6f 74 65 64 28 6f 75    printQuoted(ou
5320: 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t, sqlite3_colum
5330: 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 69 29  n_value(pStmt,i)
5340: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5350: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
5360: 2c 20 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  , ");\n");.     
5370: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
5380: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
5390: 74 6d 74 29 3b 0a 20 20 7d 20 2f 2a 20 65 6e 64  tmt);.  } /* end
53a0: 69 66 20 21 67 2e 62 53 63 68 65 6d 61 4f 6e 6c  if !g.bSchemaOnl
53b0: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  y */..  /* Creat
53c0: 65 20 69 6e 64 65 78 65 73 20 74 68 61 74 20 61  e indexes that a
53d0: 72 65 20 6d 69 73 73 69 6e 67 20 69 6e 20 74 68  re missing in th
53e0: 65 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 70 53  e source */.  pS
53f0: 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65  tmt = db_prepare
5400: 28 0a 20 20 20 20 22 53 45 4c 45 43 54 20 73 71  (.    "SELECT sq
5410: 6c 20 46 52 4f 4d 20 61 75 78 2e 73 71 6c 69 74  l FROM aux.sqlit
5420: 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 22 20  e_master".    " 
5430: 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
5440: 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 3d  x' AND tbl_name=
5450: 25 51 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20  %Q".    "   AND 
5460: 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  sql IS NOT NULL"
5470: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 73 71 6c  .    "   AND sql
5480: 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43 54 20   NOT IN (SELECT 
5490: 73 71 6c 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71  sql FROM main.sq
54a0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
54b0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
54c0: 20 20 20 20 20 20 57 48 45 52 45 20 74 79 70 65        WHERE type
54d0: 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c  ='index' AND tbl
54e0: 5f 6e 61 6d 65 3d 25 51 22 0a 20 20 20 20 22 20  _name=%Q".    " 
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 20 20 20 20 20 41 4e 44 20 73 71 6c 20 49 53 20       AND sql IS 
5510: 4e 4f 54 20 4e 55 4c 4c 29 22 2c 0a 20 20 20 20  NOT NULL)",.    
5520: 7a 54 61 62 2c 20 7a 54 61 62 29 3b 0a 20 20 77  zTab, zTab);.  w
5530: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
5540: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
5550: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 66 70 72  Stmt) ){.    fpr
5560: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3b 5c 6e  intf(out, "%s;\n
5570: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
5580: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29 29  n_text(pStmt,0))
5590: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
55a0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
55b0: 0a 0a 65 6e 64 5f 64 69 66 66 5f 6f 6e 65 5f 74  ..end_diff_one_t
55c0: 61 62 6c 65 3a 0a 20 20 73 74 72 46 72 65 65 28  able:.  strFree(
55d0: 26 73 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  &sql);.  sqlite3
55e0: 5f 66 72 65 65 28 7a 49 64 29 3b 0a 20 20 6e 61  _free(zId);.  na
55f0: 6d 65 6c 69 73 74 46 72 65 65 28 61 7a 29 3b 0a  melistFree(az);.
5600: 20 20 6e 61 6d 65 6c 69 73 74 46 72 65 65 28 61    namelistFree(a
5610: 7a 32 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  z2);.  return;.}
5620: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
5630: 61 20 73 75 6d 6d 61 72 79 20 6f 66 20 64 69 66  a summary of dif
5640: 66 65 72 65 6e 63 65 73 20 62 65 74 77 65 65 6e  ferences between
5650: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
5660: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 61 62   the same.** tab
5670: 6c 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  le table..**.** 
5680: 20 20 2a 20 20 4e 75 6d 62 65 72 20 6f 66 20 72    *  Number of r
5690: 6f 77 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 20  ows changed.**  
56a0: 20 2a 20 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   *  Number of ro
56b0: 77 73 20 61 64 64 65 64 0a 2a 2a 20 20 20 2a 20  ws added.**   * 
56c0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
56d0: 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 2a 20 20  deleted.**   *  
56e0: 4e 75 6d 62 65 72 20 6f 66 20 69 64 65 6e 74 69  Number of identi
56f0: 63 61 6c 20 72 6f 77 73 0a 2a 2f 0a 73 74 61 74  cal rows.*/.stat
5700: 69 63 20 76 6f 69 64 20 73 75 6d 6d 61 72 69 7a  ic void summariz
5710: 65 5f 6f 6e 65 5f 74 61 62 6c 65 28 63 6f 6e 73  e_one_table(cons
5720: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 46 49  t char *zTab, FI
5730: 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 63 68 61 72  LE *out){.  char
5740: 20 2a 7a 49 64 20 3d 20 73 61 66 65 49 64 28 7a   *zId = safeId(z
5750: 54 61 62 29 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66  Tab); /* Name of
5760: 20 74 61 62 6c 65 20 28 74 72 61 6e 73 6c 61 74   table (translat
5770: 65 64 20 66 6f 72 20 75 73 20 69 6e 20 53 51 4c  ed for us in SQL
5780: 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  ) */.  char **az
5790: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
57a0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 6d   /* Columns in m
57b0: 61 69 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ain */.  char **
57c0: 61 7a 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  az2 = 0;        
57d0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
57e0: 20 61 75 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50   aux */.  int nP
57f0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
5800: 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 6b      /* Primary k
5810: 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6d 61  ey columns in ma
5820: 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 32  in */.  int nPk2
5830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5840: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65 79    /* Primary key
5850: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 75 78 20   columns in aux 
5860: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5880: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
5890: 6d 6e 73 20 69 6e 20 6d 61 69 6e 20 2a 2f 0a 20  mns in main */. 
58a0: 20 69 6e 74 20 6e 32 3b 20 20 20 20 20 20 20 20   int n2;        
58b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
58c0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
58d0: 69 6e 20 61 75 78 20 2a 2f 0a 20 20 69 6e 74 20  in aux */.  int 
58e0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
58f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
5900: 75 6e 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  unter */.  const
5910: 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20 20   char *zSep;    
5920: 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f       /* Separato
5930: 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 53 74  r string */.  St
5940: 72 20 73 71 6c 3b 20 20 20 20 20 20 20 20 20 20  r sql;          
5950: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
5960: 72 69 73 6f 6e 20 71 75 65 72 79 20 2a 2f 0a 20  rison query */. 
5970: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
5980: 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 51 75  Stmt;      /* Qu
5990: 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ery statement to
59a0: 20 64 6f 20 74 68 65 20 64 69 66 66 20 2a 2f 0a   do the diff */.
59b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
59c0: 6e 55 70 64 61 74 65 3b 20 20 20 20 2f 2a 20 4e  nUpdate;    /* N
59d0: 75 6d 62 65 72 20 6f 66 20 75 70 64 61 74 65 64  umber of updated
59e0: 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
59f0: 65 33 5f 69 6e 74 36 34 20 6e 55 6e 63 68 61 6e  e3_int64 nUnchan
5a00: 67 65 64 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ged; /* Number o
5a10: 66 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 6f 77  f unmodified row
5a20: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
5a30: 6e 74 36 34 20 6e 44 65 6c 65 74 65 3b 20 20 20  nt64 nDelete;   
5a40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 65   /* Number of de
5a50: 6c 65 74 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20  leted rows */.  
5a60: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 49  sqlite3_int64 nI
5a70: 6e 73 65 72 74 3b 20 20 20 20 2f 2a 20 4e 75 6d  nsert;    /* Num
5a80: 62 65 72 20 6f 66 20 69 6e 73 65 72 74 65 64 20  ber of inserted 
5a90: 72 6f 77 73 20 2a 2f 0a 0a 20 20 73 74 72 49 6e  rows */..  strIn
5aa0: 69 74 28 26 73 71 6c 29 3b 0a 20 20 69 66 28 20  it(&sql);.  if( 
5ab0: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
5ac0: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 67 2e  lumn_metadata(g.
5ad0: 64 62 2c 22 61 75 78 22 2c 7a 54 61 62 2c 30 2c  db,"aux",zTab,0,
5ae0: 30 2c 30 2c 30 2c 30 2c 30 29 20 29 7b 0a 20 20  0,0,0,0,0) ){.  
5af0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 74    if( !sqlite3_t
5b00: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
5b10: 64 61 74 61 28 67 2e 64 62 2c 22 6d 61 69 6e 22  data(g.db,"main"
5b20: 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c 30 2c 30 2c  ,zTab,0,0,0,0,0,
5b30: 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  0) ){.      /* T
5b40: 61 62 6c 65 20 6d 69 73 73 69 6e 67 20 66 72 6f  able missing fro
5b50: 6d 20 73 65 63 6f 6e 64 20 64 61 74 61 62 61 73  m second databas
5b60: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 66 70 72 69  e. */.      fpri
5b70: 6e 74 66 28 6f 75 74 2c 20 22 25 73 3a 20 6d 69  ntf(out, "%s: mi
5b80: 73 73 69 6e 67 20 66 72 6f 6d 20 73 65 63 6f 6e  ssing from secon
5b90: 64 20 64 61 74 61 62 61 73 65 5c 6e 22 2c 20 7a  d database\n", z
5ba0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
5bb0: 67 6f 74 6f 20 65 6e 64 5f 73 75 6d 6d 61 72 69  goto end_summari
5bc0: 7a 65 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20  ze_one_table;.  
5bd0: 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  }..  if( sqlite3
5be0: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
5bf0: 74 61 64 61 74 61 28 67 2e 64 62 2c 22 6d 61 69  tadata(g.db,"mai
5c00: 6e 22 2c 7a 54 61 62 2c 30 2c 30 2c 30 2c 30 2c  n",zTab,0,0,0,0,
5c10: 30 2c 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  0,0) ){.    /* T
5c20: 61 62 6c 65 20 6d 69 73 73 69 6e 67 20 66 72 6f  able missing fro
5c30: 6d 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20  m source */.    
5c40: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
5c50: 3a 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 66  : missing from f
5c60: 69 72 73 74 20 64 61 74 61 62 61 73 65 5c 6e 22  irst database\n"
5c70: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 67 6f 74  , zTab);.    got
5c80: 6f 20 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f  o end_summarize_
5c90: 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  one_table;.  }..
5ca0: 20 20 61 7a 20 3d 20 63 6f 6c 75 6d 6e 4e 61 6d    az = columnNam
5cb0: 65 73 28 22 6d 61 69 6e 22 2c 20 7a 54 61 62 2c  es("main", zTab,
5cc0: 20 26 6e 50 6b 29 3b 0a 20 20 61 7a 32 20 3d 20   &nPk);.  az2 = 
5cd0: 63 6f 6c 75 6d 6e 4e 61 6d 65 73 28 22 61 75 78  columnNames("aux
5ce0: 22 2c 20 7a 54 61 62 2c 20 26 6e 50 6b 32 29 3b  ", zTab, &nPk2);
5cf0: 0a 20 20 69 66 28 20 61 7a 20 26 26 20 61 7a 32  .  if( az && az2
5d00: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b   ){.    for(n=0;
5d10: 20 61 7a 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20 20   az[n]; n++){.  
5d20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
5d30: 73 74 72 69 63 6d 70 28 61 7a 5b 6e 5d 2c 61 7a  stricmp(az[n],az
5d40: 32 5b 6e 5d 29 21 3d 30 20 29 20 62 72 65 61 6b  2[n])!=0 ) break
5d50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
5d60: 28 20 61 7a 3d 3d 30 0a 20 20 20 7c 7c 20 61 7a  ( az==0.   || az
5d70: 32 3d 3d 30 0a 20 20 20 7c 7c 20 6e 50 6b 21 3d  2==0.   || nPk!=
5d80: 6e 50 6b 32 0a 20 20 20 7c 7c 20 61 7a 5b 6e 5d  nPk2.   || az[n]
5d90: 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 63 68  .  ){.    /* Sch
5da0: 65 6d 61 20 6d 69 73 6d 61 74 63 68 20 2a 2f 0a  ema mismatch */.
5db0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
5dc0: 20 22 25 73 3a 20 69 6e 63 6f 6d 70 61 74 69 62   "%s: incompatib
5dd0: 6c 65 20 73 63 68 65 6d 61 5c 6e 22 2c 20 7a 54  le schema\n", zT
5de0: 61 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ab);.    goto en
5df0: 64 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e 65 5f  d_summarize_one_
5e00: 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  table;.  }..  /*
5e10: 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 61   Build the compa
5e20: 72 69 73 6f 6e 20 71 75 65 72 79 20 2a 2f 0a 20  rison query */. 
5e30: 20 66 6f 72 28 6e 32 3d 6e 3b 20 61 7a 5b 6e 32   for(n2=n; az[n2
5e40: 5d 3b 20 6e 32 2b 2b 29 7b 7d 0a 20 20 73 74 72  ]; n2++){}.  str
5e50: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 53 45  Printf(&sql, "SE
5e60: 4c 45 43 54 20 31 2c 20 63 6f 75 6e 74 28 2a 29  LECT 1, count(*)
5e70: 22 29 3b 0a 20 20 69 66 28 20 6e 32 3d 3d 6e 50  ");.  if( n2==nP
5e80: 6b 32 20 29 7b 0a 20 20 20 20 73 74 72 50 72 69  k2 ){.    strPri
5e90: 6e 74 66 28 26 73 71 6c 2c 20 22 2c 20 30 5c 6e  ntf(&sql, ", 0\n
5ea0: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
5eb0: 20 7a 53 65 70 20 3d 20 22 2c 20 73 75 6d 28 22   zSep = ", sum("
5ec0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 50 6b 3b  ;.    for(i=nPk;
5ed0: 20 61 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20   az[i]; i++){.  
5ee0: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
5ef0: 71 6c 2c 20 22 25 73 41 2e 25 73 20 49 53 20 4e  ql, "%sA.%s IS N
5f00: 4f 54 20 42 2e 25 73 22 2c 20 7a 53 65 70 2c 20  OT B.%s", zSep, 
5f10: 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20  az[i], az[i]);. 
5f20: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52       zSep = " OR
5f30: 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74   ";.    }.    st
5f40: 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 29  rPrintf(&sql, ")
5f50: 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 74 72 50  \n");.  }.  strP
5f60: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20 46  rintf(&sql, "  F
5f70: 52 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 2c 20 61  ROM main.%s A, a
5f80: 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49 64 2c  ux.%s B\n", zId,
5f90: 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20   zId);.  zSep = 
5fa0: 22 20 57 48 45 52 45 22 3b 0a 20 20 66 6f 72 28  " WHERE";.  for(
5fb0: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
5fc0: 7b 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28  {.    strPrintf(
5fd0: 26 73 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42  &sql, "%s A.%s=B
5fe0: 2e 25 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69  .%s", zSep, az[i
5ff0: 5d 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a  ], az[i]);.    z
6000: 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20  Sep = " AND";.  
6010: 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  }.  strPrintf(&s
6020: 71 6c 2c 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 5c  ql, " UNION ALL\
6030: 6e 22 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66  n");.  strPrintf
6040: 28 26 73 71 6c 2c 20 22 53 45 4c 45 43 54 20 32  (&sql, "SELECT 2
6050: 2c 20 63 6f 75 6e 74 28 2a 29 2c 20 30 5c 6e 22  , count(*), 0\n"
6060: 29 3b 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26  );.  strPrintf(&
6070: 73 71 6c 2c 20 22 20 20 46 52 4f 4d 20 6d 61 69  sql, "  FROM mai
6080: 6e 2e 25 73 20 41 5c 6e 22 2c 20 7a 49 64 29 3b  n.%s A\n", zId);
6090: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
60a0: 6c 2c 20 22 20 57 48 45 52 45 20 4e 4f 54 20 45  l, " WHERE NOT E
60b0: 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20 46  XISTS(SELECT 1 F
60c0: 52 4f 4d 20 61 75 78 2e 25 73 20 42 20 22 2c 20  ROM aux.%s B ", 
60d0: 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20 22  zId);.  zSep = "
60e0: 57 48 45 52 45 22 3b 0a 20 20 66 6f 72 28 69 3d  WHERE";.  for(i=
60f0: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
6100: 20 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73      strPrintf(&s
6110: 71 6c 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e 25  ql, "%s A.%s=B.%
6120: 73 22 2c 20 7a 53 65 70 2c 20 61 7a 5b 69 5d 2c  s", zSep, az[i],
6130: 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7a 53 65   az[i]);.    zSe
6140: 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20 7d 0a  p = " AND";.  }.
6150: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
6160: 2c 20 22 29 5c 6e 22 29 3b 0a 20 20 73 74 72 50  , ")\n");.  strP
6170: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 55 4e  rintf(&sql, " UN
6180: 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b 0a 20 20 73  ION ALL\n");.  s
6190: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
61a0: 53 45 4c 45 43 54 20 33 2c 20 63 6f 75 6e 74 28  SELECT 3, count(
61b0: 2a 29 2c 20 30 5c 6e 22 29 3b 0a 20 20 73 74 72  *), 0\n");.  str
61c0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 20  Printf(&sql, "  
61d0: 46 52 4f 4d 20 61 75 78 2e 25 73 20 42 5c 6e 22  FROM aux.%s B\n"
61e0: 2c 20 7a 49 64 29 3b 0a 20 20 73 74 72 50 72 69  , zId);.  strPri
61f0: 6e 74 66 28 26 73 71 6c 2c 20 22 20 57 48 45 52  ntf(&sql, " WHER
6200: 45 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c  E NOT EXISTS(SEL
6210: 45 43 54 20 31 20 46 52 4f 4d 20 6d 61 69 6e 2e  ECT 1 FROM main.
6220: 25 73 20 41 20 22 2c 20 7a 49 64 29 3b 0a 20 20  %s A ", zId);.  
6230: 7a 53 65 70 20 3d 20 22 57 48 45 52 45 22 3b 0a  zSep = "WHERE";.
6240: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
6250: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 50  ; i++){.    strP
6260: 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73 20  rintf(&sql, "%s 
6270: 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53 65 70  A.%s=B.%s", zSep
6280: 2c 20 61 7a 5b 69 5d 2c 20 61 7a 5b 69 5d 29 3b  , az[i], az[i]);
6290: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e  .    zSep = " AN
62a0: 44 22 3b 0a 20 20 7d 0a 20 20 73 74 72 50 72 69  D";.  }.  strPri
62b0: 6e 74 66 28 26 73 71 6c 2c 20 22 29 5c 6e 20 4f  ntf(&sql, ")\n O
62c0: 52 44 45 52 20 42 59 20 31 3b 5c 6e 22 29 3b 0a  RDER BY 1;\n");.
62d0: 0a 20 20 69 66 28 20 28 67 2e 66 44 65 62 75 67  .  if( (g.fDebug
62e0: 20 26 20 44 45 42 55 47 5f 44 49 46 46 5f 53 51   & DEBUG_DIFF_SQ
62f0: 4c 29 21 3d 30 20 29 7b 20 0a 20 20 20 20 70 72  L)!=0 ){ .    pr
6300: 69 6e 74 66 28 22 53 51 4c 20 66 6f 72 20 25 73  intf("SQL for %s
6310: 3a 5c 6e 25 73 5c 6e 22 2c 20 7a 49 64 2c 20 73  :\n%s\n", zId, s
6320: 71 6c 2e 7a 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ql.z);.    goto 
6330: 65 6e 64 5f 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e  end_summarize_on
6340: 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  e_table;.  }..  
6350: 2f 2a 20 52 75 6e 20 74 68 65 20 71 75 65 72 79  /* Run the query
6360: 20 61 6e 64 20 6f 75 74 70 75 74 20 64 69 66 66   and output diff
6370: 65 72 65 6e 63 65 20 73 75 6d 6d 61 72 79 20 2a  erence summary *
6380: 2f 0a 20 20 70 53 74 6d 74 20 3d 20 64 62 5f 70  /.  pStmt = db_p
6390: 72 65 70 61 72 65 28 73 71 6c 2e 7a 29 3b 0a 20  repare(sql.z);. 
63a0: 20 6e 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20   nUpdate = 0;.  
63b0: 6e 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 6e  nInsert = 0;.  n
63c0: 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 6e 55  Delete = 0;.  nU
63d0: 6e 63 68 61 6e 67 65 64 20 3d 20 30 3b 0a 20 20  nchanged = 0;.  
63e0: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
63f0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
6400: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 73 77  pStmt) ){.    sw
6410: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
6420: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30  lumn_int(pStmt,0
6430: 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ) ){.      case 
6440: 31 3a 0a 20 20 20 20 20 20 20 20 6e 55 70 64 61  1:.        nUpda
6450: 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  te = sqlite3_col
6460: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
6470: 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 55 6e 63  2);.        nUnc
6480: 68 61 6e 67 65 64 20 3d 20 73 71 6c 69 74 65 33  hanged = sqlite3
6490: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
64a0: 74 6d 74 2c 31 29 20 2d 20 6e 55 70 64 61 74 65  tmt,1) - nUpdate
64b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
64c0: 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 0a 20  .      case 2:. 
64d0: 20 20 20 20 20 20 20 6e 44 65 6c 65 74 65 20 3d         nDelete =
64e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
64f0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 31 29 3b 0a  int64(pStmt,1);.
6500: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6510: 20 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20       case 3:.   
6520: 20 20 20 20 20 6e 49 6e 73 65 72 74 20 3d 20 73       nInsert = s
6530: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
6540: 74 36 34 28 70 53 74 6d 74 2c 31 29 3b 0a 20 20  t64(pStmt,1);.  
6550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6560: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6570: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
6580: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
6590: 20 22 25 73 3a 20 25 6c 6c 64 20 63 68 61 6e 67   "%s: %lld chang
65a0: 65 73 2c 20 25 6c 6c 64 20 69 6e 73 65 72 74 73  es, %lld inserts
65b0: 2c 20 25 6c 6c 64 20 64 65 6c 65 74 65 73 2c 20  , %lld deletes, 
65c0: 25 6c 6c 64 20 75 6e 63 68 61 6e 67 65 64 5c 6e  %lld unchanged\n
65d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 54 61  ",.          zTa
65e0: 62 2c 20 6e 55 70 64 61 74 65 2c 20 6e 49 6e 73  b, nUpdate, nIns
65f0: 65 72 74 2c 20 6e 44 65 6c 65 74 65 2c 20 6e 55  ert, nDelete, nU
6600: 6e 63 68 61 6e 67 65 64 29 3b 0a 0a 65 6e 64 5f  nchanged);..end_
6610: 73 75 6d 6d 61 72 69 7a 65 5f 6f 6e 65 5f 74 61  summarize_one_ta
6620: 62 6c 65 3a 0a 20 20 73 74 72 46 72 65 65 28 26  ble:.  strFree(&
6630: 73 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  sql);.  sqlite3_
6640: 66 72 65 65 28 7a 49 64 29 3b 0a 20 20 6e 61 6d  free(zId);.  nam
6650: 65 6c 69 73 74 46 72 65 65 28 61 7a 29 3b 0a 20  elistFree(az);. 
6660: 20 6e 61 6d 65 6c 69 73 74 46 72 65 65 28 61 7a   namelistFree(az
6670: 32 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  2);.  return;.}.
6680: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 36  ./*.** Write a 6
6690: 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
66a0: 65 67 65 72 20 61 73 20 61 20 76 61 72 69 6e 74  eger as a varint
66b0: 20 6f 6e 74 6f 20 6f 75 74 0a 2a 2f 0a 73 74 61   onto out.*/.sta
66c0: 74 69 63 20 76 6f 69 64 20 70 75 74 73 56 61 72  tic void putsVar
66d0: 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73  int(FILE *out, s
66e0: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 76 29  qlite3_uint64 v)
66f0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
6700: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 5b  unsigned char p[
6710: 31 32 5d 3b 0a 20 20 69 66 28 20 76 20 26 20 28  12];.  if( v & (
6720: 28 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34  ((sqlite3_uint64
6730: 29 30 78 66 66 30 30 30 30 30 30 29 3c 3c 33 32  )0xff000000)<<32
6740: 29 20 29 7b 0a 20 20 20 20 70 5b 38 5d 20 3d 20  ) ){.    p[8] = 
6750: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 76  (unsigned char)v
6760: 3b 0a 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20  ;.    v >>= 8;. 
6770: 20 20 20 66 6f 72 28 69 3d 37 3b 20 69 3e 3d 30     for(i=7; i>=0
6780: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 5b  ; i--){.      p[
6790: 69 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  i] = (unsigned c
67a0: 68 61 72 29 28 28 76 20 26 20 30 78 37 66 29 20  har)((v & 0x7f) 
67b0: 7c 20 30 78 38 30 29 3b 0a 20 20 20 20 20 20 76  | 0x80);.      v
67c0: 20 3e 3e 3d 20 37 3b 0a 20 20 20 20 7d 0a 20 20   >>= 7;.    }.  
67d0: 20 20 66 77 72 69 74 65 28 70 2c 20 38 2c 20 31    fwrite(p, 8, 1
67e0: 2c 20 6f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  , out);.  }else{
67f0: 0a 20 20 20 20 6e 20 3d 20 39 3b 0a 20 20 20 20  .    n = 9;.    
6800: 64 6f 7b 0a 20 20 20 20 20 20 70 5b 6e 2d 2d 5d  do{.      p[n--]
6810: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
6820: 72 29 28 28 76 20 26 20 30 78 37 66 29 20 7c 20  r)((v & 0x7f) | 
6830: 30 78 38 30 29 3b 0a 20 20 20 20 20 20 76 20 3e  0x80);.      v >
6840: 3e 3d 20 37 3b 0a 20 20 20 20 7d 77 68 69 6c 65  >= 7;.    }while
6850: 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 70 5b  ( v!=0 );.    p[
6860: 39 5d 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  9] &= 0x7f;.    
6870: 66 77 72 69 74 65 28 70 2b 6e 2b 31 2c 20 39 2d  fwrite(p+n+1, 9-
6880: 6e 2c 20 31 2c 20 6f 75 74 29 3b 0a 20 20 7d 0a  n, 1, out);.  }.
6890: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
68a0: 6e 20 53 51 4c 69 74 65 20 76 61 6c 75 65 20 6f  n SQLite value o
68b0: 6e 74 6f 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74  nto out..*/.stat
68c0: 69 63 20 76 6f 69 64 20 70 75 74 56 61 6c 75 65  ic void putValue
68d0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 71 6c 69  (FILE *out, sqli
68e0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29  te3_value *pVal)
68f0: 7b 0a 20 20 69 6e 74 20 69 44 54 79 70 65 20 3d  {.  int iDType =
6900: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6910: 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 73 71 6c  ype(pVal);.  sql
6920: 69 74 65 33 5f 69 6e 74 36 34 20 69 58 3b 0a 20  ite3_int64 iX;. 
6930: 20 64 6f 75 62 6c 65 20 72 58 3b 0a 20 20 73 71   double rX;.  sq
6940: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 58 3b  lite3_uint64 uX;
6950: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 70 75 74  .  int j;..  put
6960: 63 28 69 44 54 79 70 65 2c 20 6f 75 74 29 3b 0a  c(iDType, out);.
6970: 20 20 73 77 69 74 63 68 28 20 69 44 54 79 70 65    switch( iDType
6980: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
6990: 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20  ITE_INTEGER:.   
69a0: 20 20 20 69 58 20 3d 20 73 71 6c 69 74 65 33 5f     iX = sqlite3_
69b0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c  value_int64(pVal
69c0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
69d0: 26 75 58 2c 20 26 69 58 2c 20 38 29 3b 0a 20 20  &uX, &iX, 8);.  
69e0: 20 20 20 20 66 6f 72 28 6a 3d 35 36 3b 20 6a 3e      for(j=56; j>
69f0: 3d 30 3b 20 6a 2d 3d 38 29 20 70 75 74 63 28 28  =0; j-=8) putc((
6a00: 75 58 3e 3e 6a 29 26 30 78 66 66 2c 20 6f 75 74  uX>>j)&0xff, out
6a10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6a20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6a30: 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 72 58 20  FLOAT:.      rX 
6a40: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6a50: 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20  int64(pVal);.   
6a60: 20 20 20 6d 65 6d 63 70 79 28 26 75 58 2c 20 26     memcpy(&uX, &
6a70: 72 58 2c 20 38 29 3b 0a 20 20 20 20 20 20 66 6f  rX, 8);.      fo
6a80: 72 28 6a 3d 35 36 3b 20 6a 3e 3d 30 3b 20 6a 2d  r(j=56; j>=0; j-
6a90: 3d 38 29 20 70 75 74 63 28 28 75 58 3e 3e 6a 29  =8) putc((uX>>j)
6aa0: 26 30 78 66 66 2c 20 6f 75 74 29 3b 0a 20 20 20  &0xff, out);.   
6ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
6ac0: 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a  se SQLITE_TEXT:.
6ad0: 20 20 20 20 20 20 69 58 20 3d 20 73 71 6c 69 74        iX = sqlit
6ae0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
6af0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 75 74 73  Val);.      puts
6b00: 56 61 72 69 6e 74 28 6f 75 74 2c 20 28 73 71 6c  Varint(out, (sql
6b10: 69 74 65 33 5f 75 69 6e 74 36 34 29 69 58 29 3b  ite3_uint64)iX);
6b20: 0a 20 20 20 20 20 20 66 77 72 69 74 65 28 73 71  .      fwrite(sq
6b30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6b40: 28 70 56 61 6c 29 2c 31 2c 69 58 2c 6f 75 74 29  (pVal),1,iX,out)
6b50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6b60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
6b70: 4c 4f 42 3a 0a 20 20 20 20 20 20 69 58 20 3d 20  LOB:.      iX = 
6b80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6b90: 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  tes(pVal);.     
6ba0: 20 70 75 74 73 56 61 72 69 6e 74 28 6f 75 74 2c   putsVarint(out,
6bb0: 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34   (sqlite3_uint64
6bc0: 29 69 58 29 3b 0a 20 20 20 20 20 20 66 77 72 69  )iX);.      fwri
6bd0: 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  te(sqlite3_value
6be0: 5f 62 6c 6f 62 28 70 56 61 6c 29 2c 31 2c 69 58  _blob(pVal),1,iX
6bf0: 2c 6f 75 74 29 3b 0a 20 20 20 20 20 20 62 72 65  ,out);.      bre
6c00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6c10: 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20  ITE_NULL:.      
6c20: 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
6c30: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
6c40: 48 41 4e 47 45 53 45 54 20 66 6f 72 20 61 6c 6c  HANGESET for all
6c50: 20 64 69 66 66 65 72 65 6e 63 65 73 20 66 72 6f   differences fro
6c60: 6d 20 6d 61 69 6e 2e 7a 54 61 62 20 74 6f 20 61  m main.zTab to a
6c70: 75 78 2e 7a 54 61 62 2e 0a 2a 2f 0a 73 74 61 74  ux.zTab..*/.stat
6c80: 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 73 65  ic void changese
6c90: 74 5f 6f 6e 65 5f 74 61 62 6c 65 28 63 6f 6e 73  t_one_table(cons
6ca0: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 46 49  t char *zTab, FI
6cb0: 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 73 71 6c 69  LE *out){.  sqli
6cc0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
6cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
6ce0: 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 63   statment */.  c
6cf0: 68 61 72 20 2a 7a 49 64 20 3d 20 73 61 66 65 49  har *zId = safeI
6d00: 64 28 7a 54 61 62 29 3b 20 20 20 20 20 2f 2a 20  d(zTab);     /* 
6d10: 45 73 63 61 70 65 64 20 6e 61 6d 65 20 6f 66 20  Escaped name of 
6d20: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  the table */.  c
6d30: 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b  har **azCol = 0;
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6d50: 4c 69 73 74 20 6f 66 20 65 73 63 61 70 65 64 20  List of escaped 
6d60: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
6d70: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 20    int nCol = 0; 
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
6da0: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  umns */.  int *a
6db0: 69 46 6c 67 20 3d 20 30 3b 20 20 20 20 20 20 20  iFlg = 0;       
6dc0: 20 20 20 20 20 20 20 20 2f 2a 20 30 20 69 66 20          /* 0 if 
6dd0: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 70 61  column is not pa
6de0: 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e  rt of PK */.  in
6df0: 74 20 2a 61 69 50 6b 20 3d 20 30 3b 20 20 20 20  t *aiPk = 0;    
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
6e10: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 66 6f  olumn numbers fo
6e20: 72 20 65 61 63 68 20 50 4b 20 63 6f 6c 75 6d 6e  r each PK column
6e30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 20 3d 20   */.  int nPk = 
6e40: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6e50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6e60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
6e70: 75 6d 6e 73 20 2a 2f 0a 20 20 53 74 72 20 73 71  umns */.  Str sq
6e80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
6e90: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66          /* SQL f
6ea0: 6f 72 20 74 68 65 20 64 69 66 66 20 71 75 65 72  or the diff quer
6eb0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6b 3b  y */.  int i, k;
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ed0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
6ee0: 6e 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  nters */.  const
6ef0: 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20 20   char *zSep;    
6f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
6f10: 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 0a 20   separator */.. 
6f20: 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70   pStmt = db_prep
6f30: 61 72 65 28 0a 20 20 20 20 20 20 22 53 45 4c 45  are(.      "SELE
6f40: 43 54 20 41 2e 73 71 6c 3d 42 2e 73 71 6c 20 46  CT A.sql=B.sql F
6f50: 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  ROM main.sqlite_
6f60: 6d 61 73 74 65 72 20 41 2c 20 61 75 78 2e 73 71  master A, aux.sq
6f70: 6c 69 74 65 5f 6d 61 73 74 65 72 20 42 22 0a 20  lite_master B". 
6f80: 20 20 20 20 20 22 20 57 48 45 52 45 20 41 2e 6e       " WHERE A.n
6f90: 61 6d 65 3d 25 51 20 41 4e 44 20 42 2e 6e 61 6d  ame=%Q AND B.nam
6fa0: 65 3d 25 51 22 2c 20 7a 54 61 62 2c 20 7a 54 61  e=%Q", zTab, zTa
6fb0: 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  b.  );.  if( SQL
6fc0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
6fd0: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
6fe0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
6ff0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
7000: 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,0)==0 ){.      
7010: 72 75 6e 74 69 6d 65 45 72 72 6f 72 28 22 73 63  runtimeError("sc
7020: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 66 6f 72  hema changes for
7030: 20 74 61 62 6c 65 20 25 73 22 2c 20 73 61 66 65   table %s", safe
7040: 49 64 28 7a 54 61 62 29 29 3b 0a 20 20 20 20 7d  Id(zTab));.    }
7050: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 75  .  }else{.    ru
7060: 6e 74 69 6d 65 45 72 72 6f 72 28 22 74 61 62 6c  ntimeError("tabl
7070: 65 20 25 73 20 6d 69 73 73 69 6e 67 20 66 72 6f  e %s missing fro
7080: 6d 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 64 61  m one or both da
7090: 74 61 62 61 73 65 73 22 2c 20 73 61 66 65 49 64  tabases", safeId
70a0: 28 7a 54 61 62 29 29 3b 0a 20 20 7d 0a 20 20 73  (zTab));.  }.  s
70b0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
70c0: 70 53 74 6d 74 29 3b 0a 20 20 70 53 74 6d 74 20  pStmt);.  pStmt 
70d0: 3d 20 64 62 5f 70 72 65 70 61 72 65 28 22 50 52  = db_prepare("PR
70e0: 41 47 4d 41 20 6d 61 69 6e 2e 74 61 62 6c 65 5f  AGMA main.table_
70f0: 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b  info=%Q", zTab);
7100: 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
7110: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
7120: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
7130: 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 61 7a 43   nCol++;.    azC
7140: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ol = sqlite3_rea
7150: 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 73 69 7a 65  lloc(azCol, size
7160: 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b  of(char*)*nCol);
7170: 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
7180: 30 20 29 20 72 75 6e 74 69 6d 65 45 72 72 6f 72  0 ) runtimeError
7190: 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22  ("out of memory"
71a0: 29 3b 0a 20 20 20 20 61 69 46 6c 67 20 3d 20 73  );.    aiFlg = s
71b0: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
71c0: 69 46 6c 67 2c 20 73 69 7a 65 6f 66 28 69 6e 74  iFlg, sizeof(int
71d0: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  )*nCol);.    if(
71e0: 20 61 69 46 6c 67 3d 3d 30 20 29 20 72 75 6e 74   aiFlg==0 ) runt
71f0: 69 6d 65 45 72 72 6f 72 28 22 6f 75 74 20 6f 66  imeError("out of
7200: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 61   memory");.    a
7210: 7a 43 6f 6c 5b 6e 43 6f 6c 2d 31 5d 20 3d 20 73  zCol[nCol-1] = s
7220: 61 66 65 49 64 28 28 63 6f 6e 73 74 20 63 68 61  afeId((const cha
7230: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
7240: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31 29 29  n_text(pStmt,1))
7250: 3b 0a 20 20 20 20 61 69 46 6c 67 5b 6e 43 6f 6c  ;.    aiFlg[nCol
7260: 2d 31 5d 20 3d 20 69 20 3d 20 73 71 6c 69 74 65  -1] = i = sqlite
7270: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
7280: 6d 74 2c 35 29 3b 0a 20 20 20 20 69 66 28 20 69  mt,5);.    if( i
7290: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
72a0: 69 3e 6e 50 6b 20 29 7b 0a 20 20 20 20 20 20 20  i>nPk ){.       
72b0: 20 6e 50 6b 20 3d 20 69 3b 0a 20 20 20 20 20 20   nPk = i;.      
72c0: 20 20 61 69 50 6b 20 3d 20 73 71 6c 69 74 65 33    aiPk = sqlite3
72d0: 5f 72 65 61 6c 6c 6f 63 28 61 69 50 6b 2c 20 73  _realloc(aiPk, s
72e0: 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 50 6b 29 3b  izeof(int)*nPk);
72f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 69 50  .        if( aiP
7300: 6b 3d 3d 30 20 29 20 72 75 6e 74 69 6d 65 45 72  k==0 ) runtimeEr
7310: 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror("out of memo
7320: 72 79 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ry");.      }.  
7330: 20 20 20 20 61 69 50 6b 5b 69 2d 31 5d 20 3d 20      aiPk[i-1] = 
7340: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  nCol-1;.    }.  
7350: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
7360: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
7370: 66 28 20 6e 50 6b 3d 3d 30 20 29 20 67 6f 74 6f  f( nPk==0 ) goto
7380: 20 65 6e 64 5f 63 68 61 6e 67 65 73 65 74 5f 6f   end_changeset_o
7390: 6e 65 5f 74 61 62 6c 65 3b 20 0a 20 20 73 74 72  ne_table; .  str
73a0: 49 6e 69 74 28 26 73 71 6c 29 3b 0a 20 20 69 66  Init(&sql);.  if
73b0: 28 20 6e 43 6f 6c 3e 6e 50 6b 20 29 7b 0a 20 20  ( nCol>nPk ){.  
73c0: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
73d0: 2c 20 22 53 45 4c 45 43 54 20 25 64 22 2c 20 53  , "SELECT %d", S
73e0: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3b 0a 20  QLITE_UPDATE);. 
73f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
7400: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7410: 69 66 28 20 61 69 46 6c 67 5b 69 5d 20 29 7b 0a  if( aiFlg[i] ){.
7420: 20 20 20 20 20 20 20 20 73 74 72 50 72 69 6e 74          strPrint
7430: 66 28 26 73 71 6c 2c 20 22 2c 5c 6e 20 20 20 20  f(&sql, ",\n    
7440: 20 20 20 41 2e 25 73 22 2c 20 61 7a 43 6f 6c 5b     A.%s", azCol[
7450: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  i]);.      }else
7460: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 50 72 69  {.        strPri
7470: 6e 74 66 28 26 73 71 6c 2c 20 22 2c 5c 6e 20 20  ntf(&sql, ",\n  
7480: 20 20 20 20 20 41 2e 25 73 20 49 53 20 4e 4f 54       A.%s IS NOT
7490: 20 42 2e 25 73 2c 20 41 2e 25 73 2c 20 42 2e 25   B.%s, A.%s, B.%
74a0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
74b0: 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 2c 20        azCol[i], 
74c0: 61 7a 43 6f 6c 5b 69 5d 2c 20 61 7a 43 6f 6c 5b  azCol[i], azCol[
74d0: 69 5d 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  i], azCol[i]);. 
74e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
74f0: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
7500: 22 5c 6e 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 25  "\n  FROM main.%
7510: 73 20 41 2c 20 61 75 78 2e 25 73 20 42 5c 6e 22  s A, aux.%s B\n"
7520: 2c 20 7a 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , zId, zId);.   
7530: 20 7a 53 65 70 20 3d 20 22 20 57 48 45 52 45 22   zSep = " WHERE"
7540: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
7550: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
7560: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
7570: 2c 20 22 25 73 20 41 2e 25 73 3d 42 2e 25 73 22  , "%s A.%s=B.%s"
7580: 2c 20 7a 53 65 70 2c 20 61 7a 43 6f 6c 5b 61 69  , zSep, azCol[ai
7590: 50 6b 5b 69 5d 5d 2c 20 61 7a 43 6f 6c 5b 61 69  Pk[i]], azCol[ai
75a0: 50 6b 5b 69 5d 5d 29 3b 0a 20 20 20 20 20 20 7a  Pk[i]]);.      z
75b0: 53 65 70 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20  Sep = " AND";.  
75c0: 20 20 7d 0a 20 20 20 20 7a 53 65 70 20 3d 20 22    }.    zSep = "
75d0: 5c 6e 20 20 20 41 4e 44 20 28 22 3b 0a 20 20 20  \n   AND (";.   
75e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
75f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
7600: 28 20 61 69 46 6c 67 5b 69 5d 20 29 20 63 6f 6e  ( aiFlg[i] ) con
7610: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 74 72  tinue;.      str
7620: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73  Printf(&sql, "%s
7630: 41 2e 25 73 20 49 53 20 4e 4f 54 20 42 2e 25 73  A.%s IS NOT B.%s
7640: 22 2c 20 7a 53 65 70 2c 20 61 7a 43 6f 6c 5b 69  ", zSep, azCol[i
7650: 5d 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ], azCol[i]);.  
7660: 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 5c      zSep = " OR\
7670: 6e 20 20 20 20 20 20 20 20 22 3b 0a 20 20 20 20  n        ";.    
7680: 7d 0a 20 20 20 20 73 74 72 50 72 69 6e 74 66 28  }.    strPrintf(
7690: 26 73 71 6c 2c 22 29 5c 6e 20 55 4e 49 4f 4e 20  &sql,")\n UNION 
76a0: 41 4c 4c 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73  ALL\n");.  }.  s
76b0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
76c0: 53 45 4c 45 43 54 20 25 64 22 2c 20 53 51 4c 49  SELECT %d", SQLI
76d0: 54 45 5f 44 45 4c 45 54 45 29 3b 0a 20 20 66 6f  TE_DELETE);.  fo
76e0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
76f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 69 46  ++){.    if( aiF
7700: 6c 67 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73  lg[i] ){.      s
7710: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
7720: 2c 5c 6e 20 20 20 20 20 20 20 41 2e 25 73 22 2c  ,\n       A.%s",
7730: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
7740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72  }else{.      str
7750: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 2c 5c  Printf(&sql, ",\
7760: 6e 20 20 20 20 20 20 20 31 2c 20 41 2e 25 73 2c  n       1, A.%s,
7770: 20 4e 55 4c 4c 22 2c 20 61 7a 43 6f 6c 5b 69 5d   NULL", azCol[i]
7780: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
7790: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
77a0: 5c 6e 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 25 73  \n  FROM main.%s
77b0: 20 41 5c 6e 22 2c 20 7a 49 64 29 3b 0a 20 20 73   A\n", zId);.  s
77c0: 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22  trPrintf(&sql, "
77d0: 20 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54   WHERE NOT EXIST
77e0: 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  S(SELECT 1 FROM 
77f0: 61 75 78 2e 25 73 20 42 5c 6e 22 2c 20 7a 49 64  aux.%s B\n", zId
7800: 29 3b 0a 20 20 7a 53 65 70 20 3d 20 20 20 20 20  );.  zSep =     
7810: 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20       "          
7820: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 22 3b           WHERE";
7830: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
7840: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  k; i++){.    str
7850: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 25 73  Printf(&sql, "%s
7860: 20 41 2e 25 73 3d 42 2e 25 73 22 2c 20 7a 53 65   A.%s=B.%s", zSe
7870: 70 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b 5b 69 5d  p, azCol[aiPk[i]
7880: 5d 2c 20 61 7a 43 6f 6c 5b 61 69 50 6b 5b 69 5d  ], azCol[aiPk[i]
7890: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ]);.    zSep = "
78a0: 20 41 4e 44 22 3b 0a 20 20 7d 0a 20 20 73 74 72   AND";.  }.  str
78b0: 50 72 69 6e 74 66 28 26 73 71 6c 2c 20 22 29 5c  Printf(&sql, ")\
78c0: 6e 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 29 3b  n UNION ALL\n");
78d0: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
78e0: 6c 2c 20 22 53 45 4c 45 43 54 20 25 64 22 2c 20  l, "SELECT %d", 
78f0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3b 0a  SQLITE_INSERT);.
7900: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
7910: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
7920: 20 61 69 46 6c 67 5b 69 5d 20 29 7b 0a 20 20 20   aiFlg[i] ){.   
7930: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
7940: 6c 2c 20 22 2c 5c 6e 20 20 20 20 20 20 20 42 2e  l, ",\n       B.
7950: 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  %s", azCol[i]);.
7960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7970: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
7980: 20 22 2c 5c 6e 20 20 20 20 20 20 20 31 2c 20 4e   ",\n       1, N
7990: 55 4c 4c 2c 20 42 2e 25 73 22 2c 20 61 7a 43 6f  ULL, B.%s", azCo
79a0: 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l[i]);.    }.  }
79b0: 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71  .  strPrintf(&sq
79c0: 6c 2c 20 22 5c 6e 20 20 46 52 4f 4d 20 61 75 78  l, "\n  FROM aux
79d0: 2e 25 73 20 42 5c 6e 22 2c 20 7a 49 64 29 3b 0a  .%s B\n", zId);.
79e0: 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c    strPrintf(&sql
79f0: 2c 20 22 20 57 48 45 52 45 20 4e 4f 54 20 45 58  , " WHERE NOT EX
7a00: 49 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52  ISTS(SELECT 1 FR
7a10: 4f 4d 20 6d 61 69 6e 2e 25 73 20 41 5c 6e 22 2c  OM main.%s A\n",
7a20: 20 7a 49 64 29 3b 0a 20 20 7a 53 65 70 20 3d 20   zId);.  zSep = 
7a30: 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20           "      
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
7a50: 52 45 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  RE";.  for(i=0; 
7a60: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
7a70: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
7a80: 20 22 25 73 20 41 2e 25 73 3d 42 2e 25 73 22 2c   "%s A.%s=B.%s",
7a90: 20 7a 53 65 70 2c 20 61 7a 43 6f 6c 5b 61 69 50   zSep, azCol[aiP
7aa0: 6b 5b 69 5d 5d 2c 20 61 7a 43 6f 6c 5b 61 69 50  k[i]], azCol[aiP
7ab0: 6b 5b 69 5d 5d 29 3b 0a 20 20 20 20 7a 53 65 70  k[i]]);.    zSep
7ac0: 20 3d 20 22 20 41 4e 44 22 3b 0a 20 20 7d 0a 20   = " AND";.  }. 
7ad0: 20 73 74 72 50 72 69 6e 74 66 28 26 73 71 6c 2c   strPrintf(&sql,
7ae0: 20 22 29 5c 6e 22 29 3b 0a 20 20 73 74 72 50 72   ")\n");.  strPr
7af0: 69 6e 74 66 28 26 73 71 6c 2c 20 22 20 4f 52 44  intf(&sql, " ORD
7b00: 45 52 20 42 59 22 29 3b 0a 20 20 7a 53 65 70 20  ER BY");.  zSep 
7b10: 3d 20 22 20 22 3b 0a 20 20 66 6f 72 28 69 3d 30  = " ";.  for(i=0
7b20: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
7b30: 20 20 20 73 74 72 50 72 69 6e 74 66 28 26 73 71     strPrintf(&sq
7b40: 6c 2c 20 22 25 73 20 25 64 22 2c 20 7a 53 65 70  l, "%s %d", zSep
7b50: 2c 20 61 69 50 6b 5b 69 5d 2b 32 29 3b 0a 20 20  , aiPk[i]+2);.  
7b60: 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20    zSep = ",";.  
7b70: 7d 0a 20 20 73 74 72 50 72 69 6e 74 66 28 26 73  }.  strPrintf(&s
7b80: 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 0a 20 20 69  ql, ";\n");..  i
7b90: 66 28 20 67 2e 66 44 65 62 75 67 20 26 20 44 45  f( g.fDebug & DE
7ba0: 42 55 47 5f 44 49 46 46 5f 53 51 4c 20 29 7b 20  BUG_DIFF_SQL ){ 
7bb0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
7bc0: 20 66 6f 72 20 25 73 3a 5c 6e 25 73 5c 6e 22 2c   for %s:\n%s\n",
7bd0: 20 7a 49 64 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20   zId, sql.z);.  
7be0: 20 20 67 6f 74 6f 20 65 6e 64 5f 63 68 61 6e 67    goto end_chang
7bf0: 65 73 65 74 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a  eset_one_table;.
7c00: 20 20 7d 0a 0a 20 20 70 75 74 63 28 27 54 27 2c    }..  putc('T',
7c10: 20 6f 75 74 29 3b 0a 20 20 70 75 74 73 56 61 72   out);.  putsVar
7c20: 69 6e 74 28 6f 75 74 2c 20 28 73 71 6c 69 74 65  int(out, (sqlite
7c30: 33 5f 75 69 6e 74 36 34 29 6e 43 6f 6c 29 3b 0a  3_uint64)nCol);.
7c40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
7c50: 6c 3b 20 69 2b 2b 29 20 70 75 74 63 28 61 69 46  l; i++) putc(aiF
7c60: 6c 67 5b 69 5d 21 3d 30 2c 20 6f 75 74 29 3b 0a  lg[i]!=0, out);.
7c70: 20 20 66 77 72 69 74 65 28 7a 54 61 62 2c 20 31    fwrite(zTab, 1
7c80: 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 29 2c 20  , strlen(zTab), 
7c90: 6f 75 74 29 3b 0a 20 20 70 75 74 63 28 30 2c 20  out);.  putc(0, 
7ca0: 6f 75 74 29 3b 0a 0a 20 20 70 53 74 6d 74 20 3d  out);..  pStmt =
7cb0: 20 64 62 5f 70 72 65 70 61 72 65 28 22 25 73 22   db_prepare("%s"
7cc0: 2c 20 73 71 6c 2e 7a 29 3b 0a 20 20 77 68 69 6c  , sql.z);.  whil
7cd0: 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
7ce0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
7cf0: 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54  t) ){.    int iT
7d00: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ype = sqlite3_co
7d10: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30  lumn_int(pStmt,0
7d20: 29 3b 0a 20 20 20 20 70 75 74 63 28 69 54 79 70  );.    putc(iTyp
7d30: 65 2c 20 6f 75 74 29 3b 0a 20 20 20 20 70 75 74  e, out);.    put
7d40: 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73  c(0, out);.    s
7d50: 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
7d60: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
7d70: 30 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  0) ){.      case
7d80: 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 3a 20   SQLITE_UPDATE: 
7d90: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  {.        for(k=
7da0: 31 2c 20 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  1, i=0; i<nCol; 
7db0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7dc0: 69 66 28 20 61 69 46 6c 67 5b 69 5d 20 29 7b 0a  if( aiFlg[i] ){.
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 56              putV
7de0: 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69 74 65  alue(out, sqlite
7df0: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
7e00: 53 74 6d 74 2c 6b 29 29 3b 0a 20 20 20 20 20 20  Stmt,k));.      
7e10: 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20        k++;.     
7e20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7e30: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
7e40: 74 28 70 53 74 6d 74 2c 6b 29 20 29 7b 0a 20 20  t(pStmt,k) ){.  
7e50: 20 20 20 20 20 20 20 20 20 20 70 75 74 56 61 6c            putVal
7e60: 75 65 28 6f 75 74 2c 20 73 71 6c 69 74 65 33 5f  ue(out, sqlite3_
7e70: 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74  column_value(pSt
7e80: 6d 74 2c 6b 2b 31 29 29 3b 0a 20 20 20 20 20 20  mt,k+1));.      
7e90: 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a 20 20        k += 3;.  
7ea0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7eb0: 20 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28             putc(
7ec0: 30 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  0, out);.       
7ed0: 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a 20 20 20       k += 3;.   
7ee0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7ef0: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b   }.        for(k
7f00: 3d 31 2c 20 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  =1, i=0; i<nCol;
7f10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
7f20: 20 69 66 28 20 61 69 46 6c 67 5b 69 5d 20 29 7b   if( aiFlg[i] ){
7f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
7f40: 63 28 30 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  c(0, out);.     
7f50: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
7f60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7f70: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
7f80: 6e 74 28 70 53 74 6d 74 2c 6b 29 20 29 7b 0a 20  nt(pStmt,k) ){. 
7f90: 20 20 20 20 20 20 20 20 20 20 20 70 75 74 56 61             putVa
7fa0: 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69 74 65 33  lue(out, sqlite3
7fb0: 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53  _column_value(pS
7fc0: 74 6d 74 2c 6b 2b 32 29 29 3b 0a 20 20 20 20 20  tmt,k+2));.     
7fd0: 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a 20         k += 3;. 
7fe0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 63              putc
8000: 28 30 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (0, out);.      
8010: 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b 0a 20 20        k += 3;.  
8020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8030: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
8040: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
8050: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53   case SQLITE_INS
8060: 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 66  ERT: {.        f
8070: 6f 72 28 6b 3d 31 2c 20 69 3d 30 3b 20 69 3c 6e  or(k=1, i=0; i<n
8080: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
8090: 20 20 20 20 20 69 66 28 20 61 69 46 6c 67 5b 69       if( aiFlg[i
80a0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
80b0: 20 70 75 74 56 61 6c 75 65 28 6f 75 74 2c 20 73   putValue(out, s
80c0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
80d0: 6c 75 65 28 70 53 74 6d 74 2c 6b 29 29 3b 0a 20  lue(pStmt,k));. 
80e0: 20 20 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b 0a             k++;.
80f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
8110: 56 61 6c 75 65 28 6f 75 74 2c 20 73 71 6c 69 74  Value(out, sqlit
8120: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
8130: 70 53 74 6d 74 2c 6b 2b 32 29 29 3b 0a 20 20 20  pStmt,k+2));.   
8140: 20 20 20 20 20 20 20 20 20 6b 20 2b 3d 20 33 3b           k += 3;
8150: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
8170: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8180: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8190: 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 20 20  DELETE: {.      
81a0: 20 20 66 6f 72 28 6b 3d 31 2c 20 69 3d 30 3b 20    for(k=1, i=0; 
81b0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
81c0: 20 20 20 20 20 20 20 20 69 66 28 20 61 69 46 6c          if( aiFl
81d0: 67 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  g[i] ){.        
81e0: 20 20 20 20 70 75 74 56 61 6c 75 65 28 6f 75 74      putValue(out
81f0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
8200: 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 6b 29 29  _value(pStmt,k))
8210: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 2b  ;.            k+
8220: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
8230: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8240: 70 75 74 56 61 6c 75 65 28 6f 75 74 2c 20 73 71  putValue(out, sq
8250: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
8260: 75 65 28 70 53 74 6d 74 2c 6b 2b 31 29 29 3b 0a  ue(pStmt,k+1));.
8270: 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 2b 3d              k +=
8280: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   3;.          }.
8290: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
82a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
82b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
82c0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
82d0: 74 6d 74 29 3b 0a 20 20 0a 65 6e 64 5f 63 68 61  tmt);.  .end_cha
82e0: 6e 67 65 73 65 74 5f 6f 6e 65 5f 74 61 62 6c 65  ngeset_one_table
82f0: 3a 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 3e  :.  while( nCol>
8300: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
8310: 28 61 7a 43 6f 6c 5b 2d 2d 6e 43 6f 6c 5d 29 3b  (azCol[--nCol]);
8320: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8330: 61 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  azCol);.  sqlite
8340: 33 5f 66 72 65 65 28 61 69 50 6b 29 3b 0a 20 20  3_free(aiPk);.  
8350: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 64  sqlite3_free(zId
8360: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  );.}../*.** Prin
8370: 74 20 73 6b 65 74 63 68 79 20 64 6f 63 75 6d 65  t sketchy docume
8380: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ntation for this
8390: 20 75 74 69 6c 69 74 79 20 70 72 6f 67 72 61 6d   utility program
83a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
83b0: 73 68 6f 77 48 65 6c 70 28 76 6f 69 64 29 7b 0a  showHelp(void){.
83c0: 20 20 70 72 69 6e 74 66 28 22 55 73 61 67 65 3a    printf("Usage:
83d0: 20 25 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 44 42   %s [options] DB
83e0: 31 20 44 42 32 5c 6e 22 2c 20 67 2e 7a 41 72 67  1 DB2\n", g.zArg
83f0: 76 30 29 3b 0a 20 20 70 72 69 6e 74 66 28 0a 22  v0);.  printf(."
8400: 4f 75 74 70 75 74 20 53 51 4c 20 74 65 78 74 20  Output SQL text 
8410: 74 68 61 74 20 77 6f 75 6c 64 20 74 72 61 6e 73  that would trans
8420: 66 6f 72 6d 20 44 42 31 20 69 6e 74 6f 20 44 42  form DB1 into DB
8430: 32 2e 5c 6e 22 0a 22 4f 70 74 69 6f 6e 73 3a 5c  2.\n"."Options:\
8440: 6e 22 0a 22 20 20 2d 2d 63 68 61 6e 67 65 73 65  n"."  --changese
8450: 74 20 46 49 4c 45 20 20 20 20 20 20 57 72 69 74  t FILE      Writ
8460: 65 20 61 20 43 48 41 4e 47 45 53 45 54 20 69 6e  e a CHANGESET in
8470: 74 6f 20 46 49 4c 45 5c 6e 22 0a 22 20 20 2d 2d  to FILE\n"."  --
8480: 70 72 69 6d 61 72 79 6b 65 79 20 20 20 20 20 20  primarykey      
8490: 20 20 20 20 55 73 65 20 73 63 68 65 6d 61 2d 64      Use schema-d
84a0: 65 66 69 6e 65 64 20 50 52 49 4d 41 52 59 20 4b  efined PRIMARY K
84b0: 45 59 73 5c 6e 22 0a 22 20 20 2d 2d 73 63 68 65  EYs\n"."  --sche
84c0: 6d 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ma              
84d0: 53 68 6f 77 20 6f 6e 6c 79 20 64 69 66 66 65 72  Show only differ
84e0: 65 6e 63 65 73 20 69 6e 20 74 68 65 20 73 63 68  ences in the sch
84f0: 65 6d 61 5c 6e 22 0a 22 20 20 2d 2d 73 75 6d 6d  ema\n"."  --summ
8500: 61 72 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ary             
8510: 53 68 6f 77 20 6f 6e 6c 79 20 61 20 73 75 6d 6d  Show only a summ
8520: 61 72 79 20 6f 66 20 74 68 65 20 64 69 66 66 65  ary of the diffe
8530: 72 65 6e 63 65 73 5c 6e 22 0a 22 20 20 2d 2d 74  rences\n"."  --t
8540: 61 62 6c 65 20 54 41 42 20 20 20 20 20 20 20 20  able TAB        
8550: 20 20 20 53 68 6f 77 20 6f 6e 6c 79 20 64 69 66     Show only dif
8560: 66 65 72 65 6e 63 65 73 20 69 6e 20 74 61 62 6c  ferences in tabl
8570: 65 20 54 41 42 5c 6e 22 0a 20 20 29 3b 0a 7d 0a  e TAB\n".  );.}.
8580: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
8590: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
85a0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
85b0: 7a 44 62 31 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  zDb1 = 0;.  cons
85c0: 74 20 63 68 61 72 20 2a 7a 44 62 32 20 3d 20 30  t char *zDb2 = 0
85d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
85e0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
85f0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 63 68 61 72  rMsg = 0;.  char
8600: 20 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65   *zSql;.  sqlite
8610: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
8620: 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b   char *zTab = 0;
8630: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 73  .  FILE *out = s
8640: 74 64 6f 75 74 3b 0a 20 20 76 6f 69 64 20 28 2a  tdout;.  void (*
8650: 78 44 69 66 66 29 28 63 6f 6e 73 74 20 63 68 61  xDiff)(const cha
8660: 72 2a 2c 46 49 4c 45 2a 29 20 3d 20 64 69 66 66  r*,FILE*) = diff
8670: 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 0a 20 20 67  _one_table;..  g
8680: 2e 7a 41 72 67 76 30 20 3d 20 61 72 67 76 5b 30  .zArgv0 = argv[0
8690: 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  ];.  for(i=1; i<
86a0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
86b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
86c0: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28  argv[i];.    if(
86d0: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
86e0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69      z++;.      i
86f0: 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  f( z[0]=='-' ) z
8700: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
8710: 72 63 6d 70 28 7a 2c 22 63 68 61 6e 67 65 73 65  rcmp(z,"changese
8720: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
8730: 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 72    out = fopen(ar
8740: 67 76 5b 2b 2b 69 5d 2c 20 22 77 62 22 29 3b 0a  gv[++i], "wb");.
8750: 20 20 20 20 20 20 20 20 69 66 28 20 6f 75 74 3d          if( out=
8760: 3d 30 20 29 20 63 6d 64 6c 69 6e 65 45 72 72 6f  =0 ) cmdlineErro
8770: 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 3a 20  r("cannot open: 
8780: 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  %s", argv[i]);. 
8790: 20 20 20 20 20 20 20 78 44 69 66 66 20 3d 20 63         xDiff = c
87a0: 68 61 6e 67 65 73 65 74 5f 6f 6e 65 5f 74 61 62  hangeset_one_tab
87b0: 6c 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  le;.      }else.
87c0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
87d0: 28 7a 2c 22 64 65 62 75 67 22 29 3d 3d 30 20 29  (z,"debug")==0 )
87e0: 7b 0a 20 20 20 20 20 20 20 20 67 2e 66 44 65 62  {.        g.fDeb
87f0: 75 67 20 3d 20 73 74 72 74 6f 6c 28 61 72 67 76  ug = strtol(argv
8800: 5b 2b 2b 69 5d 2c 20 30 2c 20 30 29 3b 0a 20 20  [++i], 0, 0);.  
8810: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
8820: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 68 65  if( strcmp(z,"he
8830: 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
8840: 20 20 20 73 68 6f 77 48 65 6c 70 28 29 3b 0a 20     showHelp();. 
8850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
8860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
8870: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
8880: 22 70 72 69 6d 61 72 79 6b 65 79 22 29 3d 3d 30  "primarykey")==0
8890: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 2e 62 53   ){.        g.bS
88a0: 63 68 65 6d 61 50 4b 20 3d 20 31 3b 0a 20 20 20  chemaPK = 1;.   
88b0: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
88c0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 63 68  f( strcmp(z,"sch
88d0: 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ema")==0 ){.    
88e0: 20 20 20 20 67 2e 62 53 63 68 65 6d 61 4f 6e 6c      g.bSchemaOnl
88f0: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  y = 1;.      }el
8900: 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
8910: 63 6d 70 28 7a 2c 22 73 75 6d 6d 61 72 79 22 29  cmp(z,"summary")
8920: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ==0 ){.        x
8930: 44 69 66 66 20 3d 20 73 75 6d 6d 61 72 69 7a 65  Diff = summarize
8940: 5f 6f 6e 65 5f 74 61 62 6c 65 3b 0a 20 20 20 20  _one_table;.    
8950: 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
8960: 28 20 73 74 72 63 6d 70 28 7a 2c 22 74 61 62 6c  ( strcmp(z,"tabl
8970: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
8980: 20 20 7a 54 61 62 20 3d 20 61 72 67 76 5b 2b 2b    zTab = argv[++
8990: 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  i];.      }else.
89a0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
89b0: 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 75 6e  cmdlineError("un
89c0: 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
89d0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
89e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
89f0: 66 28 20 7a 44 62 31 3d 3d 30 20 29 7b 0a 20 20  f( zDb1==0 ){.  
8a00: 20 20 20 20 7a 44 62 31 20 3d 20 61 72 67 76 5b      zDb1 = argv[
8a10: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  i];.    }else if
8a20: 28 20 7a 44 62 32 3d 3d 30 20 29 7b 0a 20 20 20  ( zDb2==0 ){.   
8a30: 20 20 20 7a 44 62 32 20 3d 20 61 72 67 76 5b 69     zDb2 = argv[i
8a40: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
8a50: 20 20 20 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72      cmdlineError
8a60: 28 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65  ("unknown argume
8a70: 6e 74 3a 20 25 73 22 2c 20 61 72 67 76 5b 69 5d  nt: %s", argv[i]
8a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
8a90: 66 28 20 7a 44 62 32 3d 3d 30 20 29 7b 0a 20 20  f( zDb2==0 ){.  
8aa0: 20 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22    cmdlineError("
8ab0: 74 77 6f 20 64 61 74 61 62 61 73 65 20 61 72 67  two database arg
8ac0: 75 6d 65 6e 74 73 20 72 65 71 75 69 72 65 64 22  uments required"
8ad0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
8ae0: 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62 31 2c  lite3_open(zDb1,
8af0: 20 26 67 2e 64 62 29 3b 0a 20 20 69 66 28 20 72   &g.db);.  if( r
8b00: 63 20 29 7b 0a 20 20 20 20 63 6d 64 6c 69 6e 65  c ){.    cmdline
8b10: 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70  Error("cannot op
8b20: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
8b30: 20 5c 22 25 73 5c 22 22 2c 20 7a 44 62 31 29 3b   \"%s\"", zDb1);
8b40: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
8b50: 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 22  te3_exec(g.db, "
8b60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
8b70: 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 2c  lite_master", 0,
8b80: 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
8b90: 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d   if( rc || zErrM
8ba0: 73 67 20 29 7b 0a 20 20 20 20 63 6d 64 6c 69 6e  sg ){.    cmdlin
8bb0: 65 45 72 72 6f 72 28 22 5c 22 25 73 5c 22 20 64  eError("\"%s\" d
8bc0: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74  oes not appear t
8bd0: 6f 20 62 65 20 61 20 76 61 6c 69 64 20 53 51 4c  o be a valid SQL
8be0: 69 74 65 20 64 61 74 61 62 61 73 65 22 2c 20 7a  ite database", z
8bf0: 44 62 31 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  Db1);.  }.  zSql
8c00: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8c10: 74 66 28 22 41 54 54 41 43 48 20 25 51 20 61 73  tf("ATTACH %Q as
8c20: 20 61 75 78 3b 22 2c 20 7a 44 62 32 29 3b 0a 20   aux;", zDb2);. 
8c30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
8c40: 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 30  ec(g.db, zSql, 0
8c50: 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , 0, &zErrMsg);.
8c60: 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72    if( rc || zErr
8c70: 4d 73 67 20 29 7b 0a 20 20 20 20 63 6d 64 6c 69  Msg ){.    cmdli
8c80: 6e 65 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20  neError("cannot 
8c90: 61 74 74 61 63 68 20 64 61 74 61 62 61 73 65 20  attach database 
8ca0: 5c 22 25 73 5c 22 22 2c 20 7a 44 62 32 29 3b 0a  \"%s\"", zDb2);.
8cb0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
8cc0: 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 22 53  e3_exec(g.db, "S
8cd0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 75 78  ELECT * FROM aux
8ce0: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c  .sqlite_master",
8cf0: 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29   0, 0, &zErrMsg)
8d00: 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45  ;.  if( rc || zE
8d10: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 6d 64  rrMsg ){.    cmd
8d20: 6c 69 6e 65 45 72 72 6f 72 28 22 5c 22 25 73 5c  lineError("\"%s\
8d30: 22 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  " does not appea
8d40: 72 20 74 6f 20 62 65 20 61 20 76 61 6c 69 64 20  r to be a valid 
8d50: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 22  SQLite database"
8d60: 2c 20 7a 44 62 32 29 3b 0a 20 20 7d 0a 0a 20 20  , zDb2);.  }..  
8d70: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
8d80: 78 44 69 66 66 28 7a 54 61 62 2c 20 6f 75 74 29  xDiff(zTab, out)
8d90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
8da0: 2a 20 48 61 6e 64 6c 65 20 74 61 62 6c 65 73 20  * Handle tables 
8db0: 6f 6e 65 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20  one by one */.  
8dc0: 20 20 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65    pStmt = db_pre
8dd0: 70 61 72 65 28 0a 20 20 20 20 20 20 22 53 45 4c  pare(.      "SEL
8de0: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 6d 61  ECT name FROM ma
8df0: 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in.sqlite_master
8e00: 5c 6e 22 0a 20 20 20 20 20 20 22 20 57 48 45 52  \n".      " WHER
8e10: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41  E type='table' A
8e20: 4e 44 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20  ND sql NOT LIKE 
8e30: 27 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 25  'CREATE VIRTUAL%
8e40: 25 27 5c 6e 22 0a 20 20 20 20 20 20 22 20 55 4e  %'\n".      " UN
8e50: 49 4f 4e 5c 6e 22 0a 20 20 20 20 20 20 22 53 45  ION\n".      "SE
8e60: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61  LECT name FROM a
8e70: 75 78 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ux.sqlite_master
8e80: 5c 6e 22 0a 20 20 20 20 20 20 22 20 57 48 45 52  \n".      " WHER
8e90: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41  E type='table' A
8ea0: 4e 44 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20  ND sql NOT LIKE 
8eb0: 27 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 25  'CREATE VIRTUAL%
8ec0: 25 27 5c 6e 22 0a 20 20 20 20 20 20 22 20 4f 52  %'\n".      " OR
8ed0: 44 45 52 20 42 59 20 6e 61 6d 65 22 0a 20 20 20  DER BY name".   
8ee0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53   );.    while( S
8ef0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
8f00: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
8f10: 7b 0a 20 20 20 20 20 20 78 44 69 66 66 28 28 63  {.      xDiff((c
8f20: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
8f30: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
8f40: 53 74 6d 74 2c 30 29 2c 20 6f 75 74 29 3b 0a 20  Stmt,0), out);. 
8f50: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8f60: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
8f70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 42 44 3a  ;.  }..  /* TBD:
8f80: 20 48 61 6e 64 6c 65 20 74 72 69 67 67 65 72 20   Handle trigger 
8f90: 64 69 66 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20  differences */. 
8fa0: 20 2f 2a 20 54 42 44 3a 20 48 61 6e 64 6c 65 20   /* TBD: Handle 
8fb0: 76 69 65 77 20 64 69 66 66 65 72 65 6e 63 65 73  view differences
8fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c   */.  sqlite3_cl
8fd0: 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20 72 65 74  ose(g.db);.  ret
8fe0: 75 72 6e 20 30 3b 0a 7d 0a                       urn 0;.}.