/ Hex Artifact Content
Login

Artifact baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 30 33 2d 31 33  /*.** 2016-03-13
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 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0190: 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 75 62  a C-language sub
01a0: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63 6f 6e  routine that con
01b0: 76 65 72 74 73 20 74 68 65 20 63 6f 6e 74 65 6e  verts the conten
01c0: 74 0a 2a 2a 20 6f 66 20 61 6e 20 53 51 4c 69 74  t.** of an SQLit
01d0: 65 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  e database into 
01e0: 55 54 46 2d 38 20 74 65 78 74 20 53 51 4c 20 73  UTF-8 text SQL s
01f0: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 63  tatements that c
0200: 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 74 6f  an be used.** to
0210: 20 65 78 61 63 74 6c 79 20 72 65 63 72 65 61 74   exactly recreat
0220: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  e the original d
0230: 61 74 61 62 61 73 65 2e 20 20 52 4f 57 49 44 20  atabase.  ROWID 
0240: 76 61 6c 75 65 73 20 61 72 65 20 70 72 65 73 65  values are prese
0250: 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 72  rved..**.** A pr
0260: 6f 74 6f 74 79 70 65 20 6f 66 20 74 68 65 20 69  ototype of the i
0270: 6d 70 6c 65 6d 65 6e 74 65 64 20 73 75 62 72 6f  mplemented subro
0280: 75 74 69 6e 65 20 69 73 20 74 68 69 73 3a 0a 2a  utine is this:.*
0290: 2a 0a 2a 2a 20 20 20 69 6e 74 20 73 71 6c 69 74  *.**   int sqlit
02a0: 65 33 5f 64 62 5f 64 75 6d 70 28 0a 2a 2a 20 20  e3_db_dump(.**  
02b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
02c0: 2a 64 62 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  *db,.**         
02d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
02e0: 68 65 6d 61 2c 0a 2a 2a 20 20 20 20 20 20 20 20  hema,.**        
02f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
0300: 61 62 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  able,.**        
0310: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
0320: 63 6b 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74  ck)(void*, const
0330: 20 63 68 61 72 2a 29 2c 0a 2a 2a 20 20 20 20 20   char*),.**     
0340: 20 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 0a       void *pArg.
0350: 2a 2a 20 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  **   );.**.** Th
0360: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
0370: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
0380: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 7a 53 63 68  onnection.  zSch
0390: 65 6d 61 20 69 73 20 74 68 65 20 73 63 68 65 6d  ema is the schem
03a0: 61 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 61 74  a within.** that
03b0: 20 64 61 74 61 62 61 73 65 20 77 68 69 63 68 20   database which 
03c0: 69 73 20 74 6f 20 62 65 20 64 75 6d 70 65 64 2e  is to be dumped.
03d0: 20 20 55 73 75 61 6c 6c 79 20 74 68 65 20 7a 53    Usually the zS
03e0: 63 68 65 6d 61 20 69 73 20 22 6d 61 69 6e 22 20  chema is "main" 
03f0: 62 75 74 0a 2a 2a 20 63 61 6e 20 61 6c 73 6f 20  but.** can also 
0400: 62 65 20 22 74 65 6d 70 22 20 6f 72 20 61 6e 79  be "temp" or any
0410: 20 41 54 54 41 43 48 2d 65 64 20 64 61 74 61 62   ATTACH-ed datab
0420: 61 73 65 2e 20 20 49 66 20 7a 54 61 62 6c 65 20  ase.  If zTable 
0430: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
0440: 6e 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 63 6f  n.** only the co
0450: 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20 6f 6e  ntent of that on
0460: 65 20 74 61 62 6c 65 20 69 73 20 64 75 6d 70 65  e table is dumpe
0470: 64 2e 20 20 49 66 20 7a 54 61 62 6c 65 20 69 73  d.  If zTable is
0480: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 0a   NULL, then all.
0490: 2a 2a 20 74 61 62 6c 65 73 20 61 72 65 20 64 75  ** tables are du
04a0: 6d 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mped..**.** The 
04b0: 67 65 6e 65 72 61 74 65 20 74 65 78 74 20 69 73  generate text is
04c0: 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c   passed to xCall
04d0: 62 61 63 6b 28 29 20 69 6e 20 6d 75 6c 74 69 70  back() in multip
04e0: 6c 65 20 63 61 6c 6c 73 2e 20 20 54 68 65 20 73  le calls.  The s
04f0: 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
0500: 74 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  t to xCallback()
0510: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
0520: 65 20 70 41 72 67 20 70 61 72 61 6d 65 74 65 72  e pArg parameter
0530: 2e 20 20 54 68 65 20 66 69 72 73 74 0a 2a 2a 20  .  The first.** 
0540: 61 72 67 75 6d 65 6e 74 20 69 73 20 73 6f 6d 65  argument is some
0550: 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 74   of the output t
0560: 65 78 74 20 74 68 61 74 20 74 68 69 73 20 72 6f  ext that this ro
0570: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 2e  utine generates.
0580: 20 20 54 68 65 0a 2a 2a 20 73 69 67 6e 61 74 75    The.** signatu
0590: 72 65 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28  re to xCallback(
05a0: 29 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  ) is designed to
05b0: 20 6d 61 6b 65 20 69 74 20 63 6f 6d 70 61 74 69   make it compati
05c0: 62 6c 65 20 77 69 74 68 20 66 70 75 74 73 28 29  ble with fputs()
05d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
05e0: 74 65 33 5f 64 62 5f 64 75 6d 70 28 29 20 73 75  te3_db_dump() su
05f0: 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73  broutine returns
0600: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
0610: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 20 65 72  ccess or some er
0620: 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 66 20 69  ror.** code if i
0630: 74 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 20 70  t encounters a p
0640: 72 6f 62 6c 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  roblem..**.** If
0650: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 63 6f   this file is co
0660: 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 44 42  mpiled with -DDB
0670: 44 55 4d 50 5f 53 54 41 4e 44 41 4c 4f 4e 45 20  DUMP_STANDALONE 
0680: 74 68 65 6e 20 61 20 22 6d 61 69 6e 28 29 22 20  then a "main()" 
0690: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 69 6e  routine.** is in
06a0: 63 6c 75 64 65 64 20 73 6f 20 74 68 61 74 20 74  cluded so that t
06b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 63 6f  his routine beco
06c0: 6d 65 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69  mes a command-li
06d0: 6e 65 20 75 74 69 6c 69 74 79 2e 20 20 54 68 65  ne utility.  The
06e0: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
06f0: 20 75 74 69 6c 69 74 79 20 74 61 6b 65 73 20 74   utility takes t
0700: 77 6f 20 6f 72 20 74 68 72 65 65 20 61 72 67 75  wo or three argu
0710: 6d 65 6e 74 73 20 77 68 69 63 68 20 61 72 65 20  ments which are 
0720: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0740: 2c 20 74 68 65 20 73 63 68 65 6d 61 2c 20 61 6e  , the schema, an
0750: 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 74 68 65  d optionally the
0760: 20 74 61 62 6c 65 2c 20 66 6f 72 6d 69 6e 67 20   table, forming 
0770: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 68 72  the.** first thr
0780: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20  ee arguments of 
0790: 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f  a single call to
07a0: 20 74 68 65 20 6c 69 62 72 61 72 79 20 72 6f 75   the library rou
07b0: 74 69 6e 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tine..*/.#includ
07c0: 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69  e "sqlite3.h".#i
07d0: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07e0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
07f0: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
0800: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0810: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
0820: 20 64 75 6d 70 20 70 72 6f 63 65 73 73 2e 0a 2a   dump process..*
0830: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0840: 20 44 53 74 61 74 65 20 44 53 74 61 74 65 3b 0a   DState DState;.
0850: 73 74 72 75 63 74 20 44 53 74 61 74 65 20 7b 0a  struct DState {.
0860: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0880: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
0890: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
08a0: 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
08b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
08c0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
08d0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69  en so far */.  i
08e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
08f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
0900: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  ror code */.  in
0910: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
0920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0930: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0940: 69 6e 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  in writable_sche
0950: 6d 61 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  ma mode */.  int
0960: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 63 6f   (*xCallback)(co
0970: 6e 73 74 20 63 68 61 72 2a 2c 76 6f 69 64 2a 29  nst char*,void*)
0980: 3b 20 20 20 2f 2a 20 53 65 6e 64 20 6f 75 74 70  ;   /* Send outp
0990: 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 76 6f 69  ut here */.  voi
09a0: 64 20 2a 70 41 72 67 3b 20 20 20 20 20 20 20 20  d *pArg;        
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
09d0: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
09e0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 61  /.};../*.** A va
09f0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 73 74  riable length st
0a00: 72 69 6e 67 20 74 6f 20 77 68 69 63 68 20 6f 6e  ring to which on
0a10: 65 20 63 61 6e 20 61 70 70 65 6e 64 20 74 65 78  e can append tex
0a20: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
0a30: 72 75 63 74 20 44 54 65 78 74 20 44 54 65 78 74  ruct DText DText
0a40: 3b 0a 73 74 72 75 63 74 20 44 54 65 78 74 20 7b  ;.struct DText {
0a50: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
0a60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
0a70: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  t */.  int n;   
0a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0a90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
0aa0: 63 6f 6e 74 65 6e 74 20 69 6e 20 7a 5b 5d 20 2a  content in z[] *
0ab0: 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
0ac0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0ad0: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
0ae0: 74 65 64 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 7d 3b  ted to z[] */.};
0af0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b00: 7a 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61  ze and destroy a
0b10: 20 44 54 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f   DText object.*/
0b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69  .static void ini
0b30: 74 54 65 78 74 28 44 54 65 78 74 20 2a 70 29 7b  tText(DText *p){
0b40: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
0b50: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 73  sizeof(*p));.}.s
0b60: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
0b70: 65 78 74 28 44 54 65 78 74 20 2a 70 29 7b 0a 20  ext(DText *p){. 
0b80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
0b90: 3e 7a 29 3b 0a 20 20 69 6e 69 74 54 65 78 74 28  >z);.  initText(
0ba0: 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73  p);.}../* zIn is
0bb0: 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
0bc0: 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d  r to a NULL-term
0bd0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
0be0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
0bf0: 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  .** from malloc(
0c00: 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69  ), or a NULL poi
0c10: 6e 74 65 72 2e 20 54 68 65 20 73 74 72 69 6e 67  nter. The string
0c20: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
0c30: 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64  Append is.** add
0c40: 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74  ed to zIn, and t
0c50: 68 65 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e  he result return
0c60: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ed in memory obt
0c70: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
0c80: 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20  c()..** zIn, if 
0c90: 69 74 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c  it was not NULL,
0ca0: 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a   is freed..**.**
0cb0: 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72   If the third ar
0cc0: 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69  gument, quote, i
0cd0: 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e  s not '\0', then
0ce0: 20 69 74 20 69 73 20 75 73 65 64 20 61 73 20 61   it is used as a
0cf0: 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63  .** quote charac
0d00: 74 65 72 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e  ter for zAppend.
0d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0d20: 61 70 70 65 6e 64 54 65 78 74 28 44 54 65 78 74  appendText(DText
0d30: 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74 20   *p, char const 
0d40: 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20 71  *zAppend, char q
0d50: 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  uote){.  int len
0d60: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
0d70: 20 6e 41 70 70 65 6e 64 20 3d 20 28 69 6e 74 29   nAppend = (int)
0d80: 28 73 74 72 6c 65 6e 28 7a 41 70 70 65 6e 64 29  (strlen(zAppend)
0d90: 20 26 20 30 78 33 66 66 66 66 66 66 66 29 3b 0a   & 0x3fffffff);.
0da0: 0a 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64  .  len = nAppend
0db0: 2b 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71  +p->n+1;.  if( q
0dc0: 75 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20  uote ){.    len 
0dd0: 2b 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d  += 2;.    for(i=
0de0: 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b  0; i<nAppend; i+
0df0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  +){.      if( zA
0e00: 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20  ppend[i]==quote 
0e10: 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) len++;.    }. 
0e20: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c   }..  if( p->n+l
0e30: 65 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  en>=p->nAlloc ){
0e40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  .    char *zNew;
0e50: 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d  .    p->nAlloc =
0e60: 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c   p->nAlloc*2 + l
0e70: 65 6e 20 2b 20 32 30 3b 0a 20 20 20 20 7a 4e 65  en + 20;.    zNe
0e80: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
0e90: 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  loc(p->z, p->nAl
0ea0: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  loc);.    if( zN
0eb0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ew==0 ){.      f
0ec0: 72 65 65 54 65 78 74 28 70 29 3b 0a 20 20 20 20  reeText(p);.    
0ed0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
0ee0: 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b      p->z = zNew;
0ef0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f 74  .  }..  if( quot
0f00: 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  e ){.    char *z
0f10: 43 73 72 20 3d 20 70 2d 3e 7a 2b 70 2d 3e 6e 3b  Csr = p->z+p->n;
0f20: 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71  .    *zCsr++ = q
0f30: 75 6f 74 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  uote;.    for(i=
0f40: 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b  0; i<nAppend; i+
0f50: 2b 29 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72 2b  +){.      *zCsr+
0f60: 2b 20 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a  + = zAppend[i];.
0f70: 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e        if( zAppen
0f80: 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a 7a  d[i]==quote ) *z
0f90: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
0fa0: 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b 2b     }.    *zCsr++
0fb0: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 70 2d   = quote;.    p-
0fc0: 3e 6e 20 3d 20 28 69 6e 74 29 28 7a 43 73 72 20  >n = (int)(zCsr 
0fd0: 2d 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 2a 7a 43  - p->z);.    *zC
0fe0: 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c  sr = '\0';.  }el
0ff0: 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  se{.    memcpy(p
1000: 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a 41 70 70 65 6e  ->z+p->n, zAppen
1010: 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20  d, nAppend);.   
1020: 20 70 2d 3e 6e 20 2b 3d 20 6e 41 70 70 65 6e 64   p->n += nAppend
1030: 3b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d  ;.    p->z[p->n]
1040: 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 7d 0a 0a   = '\0';.  }.}..
1050: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1060: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 69 64   determine if id
1070: 65 6e 74 69 66 69 65 72 20 7a 4e 61 6d 65 20 6e  entifier zName n
1080: 65 65 64 73 20 74 6f 20 62 65 20 71 75 6f 74 65  eeds to be quote
1090: 64 2c 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 63  d, either.** bec
10a0: 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69 6e 73  ause it contains
10b0: 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75 6d 65 72 69   non-alphanumeri
10c0: 63 20 63 68 61 72 61 63 74 65 72 73 2c 20 6f 72  c characters, or
10d0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
10e0: 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 6b 65 79 77  n.** SQLite keyw
10f0: 6f 72 64 2e 20 20 42 65 20 63 6f 6e 73 65 72 76  ord.  Be conserv
1100: 61 74 69 76 65 20 69 6e 20 74 68 69 73 20 65 73  ative in this es
1110: 74 69 6d 61 74 65 3a 20 20 57 68 65 6e 20 69 6e  timate:  When in
1120: 20 64 6f 75 62 74 20 61 73 73 75 6d 65 0a 2a 2a   doubt assume.**
1130: 20 74 68 61 74 20 71 75 6f 74 69 6e 67 20 69 73   that quoting is
1140: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
1150: 20 52 65 74 75 72 6e 20 27 22 27 20 69 66 20 71   Return '"' if q
1160: 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72  uoting is requir
1170: 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
1180: 20 6e 6f 20 71 75 6f 74 69 6e 67 20 69 73 20 72   no quoting is r
1190: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
11a0: 69 63 20 63 68 61 72 20 71 75 6f 74 65 43 68 61  ic char quoteCha
11b0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  r(const char *zN
11c0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
11d0: 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 28 75   if( !isalpha((u
11e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4e 61  nsigned char)zNa
11f0: 6d 65 5b 30 5d 29 20 26 26 20 7a 4e 61 6d 65 5b  me[0]) && zName[
1200: 30 5d 21 3d 27 5f 27 20 29 20 72 65 74 75 72 6e  0]!='_' ) return
1210: 20 27 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   '"';.  for(i=0;
1220: 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b   zName[i]; i++){
1230: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75  .    if( !isalnu
1240: 6d 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  m((unsigned char
1250: 29 7a 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e  )zName[i]) && zN
1260: 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 72 65  ame[i]!='_' ) re
1270: 74 75 72 6e 20 27 22 27 3b 0a 20 20 7d 0a 20 20  turn '"';.  }.  
1280: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6b  return sqlite3_k
1290: 65 79 77 6f 72 64 5f 63 68 65 63 6b 28 7a 4e 61  eyword_check(zNa
12a0: 6d 65 2c 20 69 29 20 3f 20 27 22 27 20 3a 20 30  me, i) ? '"' : 0
12b0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  ;.}.../*.** Rele
12c0: 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 69  ase memory previ
12d0: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
12e0: 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69  by tableColumnLi
12f0: 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st()..*/.static 
1300: 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  void freeColumnL
1310: 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  ist(char **azCol
1320: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1330: 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b  r(i=1; azCol[i];
1340: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1350: 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 69 5d  e3_free(azCol[i]
1360: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f  );.  }.  /* azCo
1370: 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74 69 63  l[0] is a static
1380: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c   string */.  sql
1390: 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29  ite3_free(azCol)
13a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13b0: 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f 69 6e  n a list of poin
13c0: 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20  ters to strings 
13d0: 77 68 69 63 68 20 61 72 65 20 74 68 65 20 6e 61  which are the na
13e0: 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f  mes of all.** co
13f0: 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a  lumns in table z
1400: 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d 6f 72  Tab.   The memor
1410: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  y to hold the na
1420: 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63 61 6c  mes is dynamical
1430: 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
1440: 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65  and must be rele
1450: 61 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ased by the call
1460: 65 72 20 75 73 69 6e 67 20 61 20 73 75 62 73 65  er using a subse
1470: 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
1480: 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28   freeColumnList(
1490: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a 43  )..**.** The azC
14a0: 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73 20 75  ol[0] entry is u
14b0: 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f  sually NULL.  Ho
14c0: 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62 20 63  wever, if zTab c
14d0: 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69 64 0a  ontains a rowid.
14e0: 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20 6e 65  ** value that ne
14f0: 65 64 73 20 74 6f 20 62 65 20 70 72 65 73 65 72  eds to be preser
1500: 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f 6c 5b  ved, then azCol[
1510: 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20  0] is filled in 
1520: 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  with the.** name
1530: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f   of the rowid co
1540: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lumn..**.** The 
1550: 66 69 72 73 74 20 72 65 67 75 6c 61 72 20 63 6f  first regular co
1560: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
1570: 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20  e is azCol[1].  
1580: 54 68 65 20 6c 69 73 74 20 69 73 20 74 65 72 6d  The list is term
1590: 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20  inated.** by an 
15a0: 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43 6f 6c  entry with azCol
15b0: 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69  [i]==0..*/.stati
15c0: 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65 43 6f  c char **tableCo
15d0: 6c 75 6d 6e 4c 69 73 74 28 44 53 74 61 74 65 20  lumnList(DState 
15e0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
15f0: 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a 2a  zTab){.  char **
1600: 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  azCol = 0;.  sql
1610: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1620: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
1630: 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  ql;.  int nCol =
1640: 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   0;.  int nAlloc
1650: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 4b 20   = 0;.  int nPK 
1660: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
1670: 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20  mber of PRIMARY 
1680: 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65 65 6e  KEY columns seen
1690: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50 4b 20   */.  int isIPK 
16a0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
16b0: 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52 59 20   if one PRIMARY 
16c0: 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 79  KEY column of ty
16d0: 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a 20 20  pe INTEGER */.  
16e0: 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f 77 69  int preserveRowi
16f0: 64 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 3b  d = 1;.  int rc;
1700: 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
1710: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
1720: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51  MA table_info=%Q
1730: 22 2c 20 7a 54 61 62 29 3b 0a 20 20 69 66 28 20  ", zTab);.  if( 
1740: 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
1750: 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
1760: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1770: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
1780: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
1790: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
17a0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
17b0: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73  rn 0;.  while( s
17c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
17d0: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
17e0: 7b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d  {.    if( nCol>=
17f0: 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20  nAlloc-2 ){.    
1800: 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a    char **azNew;.
1810: 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e        nAlloc = n
1820: 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b  Alloc*2 + nCol +
1830: 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 4e 65 77   10;.      azNew
1840: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
1850: 6f 63 36 34 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c  oc64(azCol, nAll
1860: 6f 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b  oc*sizeof(azCol[
1870: 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0]));.      if( 
1880: 61 7a 4e 65 77 3d 3d 30 20 29 20 67 6f 74 6f 20  azNew==0 ) goto 
1890: 63 6f 6c 5f 6f 6f 6d 3b 0a 20 20 20 20 20 20 61  col_oom;.      a
18a0: 7a 43 6f 6c 20 3d 20 61 7a 4e 65 77 3b 0a 20 20  zCol = azNew;.  
18b0: 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30      azCol[0] = 0
18c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  ;.    }.    azCo
18d0: 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69  l[++nCol] = sqli
18e0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
18f0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1900: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 29  _text(pStmt, 1))
1910: 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b  ;.    if( azCol[
1920: 6e 43 6f 6c 5d 3d 3d 30 20 29 20 67 6f 74 6f 20  nCol]==0 ) goto 
1930: 63 6f 6c 5f 6f 6f 6d 3b 0a 20 20 20 20 69 66 28  col_oom;.    if(
1940: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1950: 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
1960: 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
1970: 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
1980: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1990: 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
19a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
19b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
19c0: 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
19e0: 4e 54 45 47 45 52 22 29 3d 3d 30 20 0a 20 20 20  NTEGER")==0 .   
19f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73     ){.        is
1a00: 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  IPK = 1;.      }
1a10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
1a20: 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  IPK = 0;.      }
1a30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1a40: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
1a50: 74 6d 74 29 3b 0a 20 20 70 53 74 6d 74 20 3d 20  tmt);.  pStmt = 
1a60: 30 3b 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b  0;.  azCol[nCol+
1a70: 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  1] = 0;..  /* Th
1a80: 65 20 64 65 63 69 73 69 6f 6e 20 6f 66 20 77 68  e decision of wh
1a90: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 72  ether or not a r
1aa0: 6f 77 69 64 20 72 65 61 6c 6c 79 20 6e 65 65 64  owid really need
1ab0: 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65  s to be preserve
1ac0: 64 0a 20 20 2a 2a 20 69 73 20 74 72 69 63 6b 79  d.  ** is tricky
1ad0: 2e 20 20 57 65 20 6e 65 76 65 72 20 6e 65 65 64  .  We never need
1ae0: 20 74 6f 20 70 72 65 73 65 72 76 65 20 61 20 72   to preserve a r
1af0: 6f 77 69 64 20 66 6f 72 20 61 20 57 49 54 48 4f  owid for a WITHO
1b00: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 20  UT ROWID table. 
1b10: 20 2a 2a 20 6f 72 20 61 20 74 61 62 6c 65 20 77   ** or a table w
1b20: 69 74 68 20 61 6e 20 49 4e 54 45 47 45 52 20 50  ith an INTEGER P
1b30: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 57 65 20  RIMARY KEY.  We 
1b40: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 70 72  are unable to pr
1b50: 65 73 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69  eserve.  ** rowi
1b60: 64 73 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65  ds on tables whe
1b70: 72 65 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  re the rowid is 
1b80: 69 6e 61 63 63 65 73 73 69 62 6c 65 20 62 65 63  inaccessible bec
1b90: 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20 6f  ause there are o
1ba0: 74 68 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e  ther.  ** column
1bb0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e  s in the table n
1bc0: 61 6d 65 64 20 22 72 6f 77 69 64 22 2c 20 22 5f  amed "rowid", "_
1bd0: 72 6f 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69  rowid_", and "oi
1be0: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  d"..  */.  if( i
1bf0: 73 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  sIPK ){.    /* I
1c00: 66 20 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41  f a single PRIMA
1c10: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69  RY KEY column wi
1c20: 74 68 20 74 79 70 65 20 49 4e 54 45 47 45 52 20  th type INTEGER 
1c30: 77 61 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69  was seen, then i
1c40: 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62  t.    ** might b
1c50: 65 20 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74  e an alise for t
1c60: 68 65 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69  he ROWID.  But i
1c70: 74 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  t might also be 
1c80: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a  a WITHOUT ROWID.
1c90: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20      ** table or 
1ca0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
1cb0: 59 20 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d  Y KEY DESC colum
1cc0: 6e 2c 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68  n, neither of wh
1cd0: 69 63 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52  ich are.    ** R
1ce0: 4f 57 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54  OWID aliases.  T
1cf0: 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68  o distinguish th
1d00: 65 73 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b  ese cases, check
1d10: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a   to see if.    *
1d20: 2a 20 74 68 65 72 65 20 69 73 20 61 20 22 70 6b  * there is a "pk
1d30: 22 20 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47  " entry in "PRAG
1d40: 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20  MA index_list". 
1d50: 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20   There will be. 
1d60: 20 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e     ** no "pk" in
1d70: 64 65 78 20 69 66 20 74 68 65 20 50 52 49 4d 41  dex if the PRIMA
1d80: 52 59 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73  RY KEY really is
1d90: 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68   an alias for th
1da0: 65 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a  e ROWID..    */.
1db0: 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1dc0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1dd0: 43 54 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61  CT 1 FROM pragma
1de0: 5f 69 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22  _index_list(%Q)"
1df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
1e10: 45 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22  ERE origin='pk'"
1e20: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 69 66 28  , zTab);.    if(
1e30: 20 7a 53 71 6c 3d 3d 30 20 29 20 67 6f 74 6f 20   zSql==0 ) goto 
1e40: 63 6f 6c 5f 6f 6f 6d 3b 0a 20 20 20 20 72 63 20  col_oom;.    rc 
1e50: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1e60: 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
1e70: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
1e80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1e90: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
1ea0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72  ( rc ){.      fr
1eb0: 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43  eeColumnList(azC
1ec0: 6f 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ol);.      retur
1ed0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
1ee0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
1ef0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
1f00: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
1f10: 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
1f20: 3d 20 30 3b 0a 20 20 20 20 70 72 65 73 65 72 76  = 0;.    preserv
1f30: 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c  eRowid = rc==SQL
1f40: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69  ITE_ROW;.  }.  i
1f50: 66 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64  f( preserveRowid
1f60: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   ){.    /* Only 
1f70: 70 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77  preserve the row
1f80: 69 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e  id if we can fin
1f90: 64 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  d a name to use 
1fa0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  for the.    ** r
1fb0: 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74  owid */.    stat
1fc0: 69 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64  ic char *azRowid
1fd0: 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20  [] = { "rowid", 
1fe0: 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22  "_rowid_", "oid"
1ff0: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   };.    int i, j
2000: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
2010: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
2020: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c  for(i=1; i<=nCol
2030: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2040: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2050: 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61  cmp(azRowid[j],a
2060: 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72  zCol[i])==0 ) br
2070: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2080: 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b     if( i>nCol ){
2090: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
20a0: 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
20b0: 6f 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  ow that azRowid[
20c0: 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  j] is not the na
20d0: 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20  me of any.      
20e0: 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f    ** ordinary co
20f0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
2100: 65 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  e.  Verify that 
2110: 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20  azRowid[j] is a 
2120: 76 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a  valid.        **
2130: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f   name for the ro
2140: 77 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e  wid before addin
2150: 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d  g it to azCol[0]
2160: 2e 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  .  WITHOUT ROWID
2170: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
2180: 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69  es will fail thi
2190: 73 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a  s last check */.
21a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21b0: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
21c0: 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62  n_metadata(p->db
21d0: 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b  ,0,zTab,azRowid[
21e0: 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20  j],0,0,0,0,0);. 
21f0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2200: 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c  QLITE_OK ) azCol
2210: 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d  [0] = azRowid[j]
2220: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f   }.  return azCo
2250: 6c 3b 0a 0a 63 6f 6c 5f 6f 6f 6d 3a 0a 20 20 73  l;..col_oom:.  s
2260: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2270: 70 53 74 6d 74 29 3b 0a 20 20 66 72 65 65 43 6f  pStmt);.  freeCo
2280: 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
2290: 0a 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  .  p->nErr++;.  
22a0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
22b0: 4f 4d 45 4d 3b 0a 20 20 72 65 74 75 72 6e 20 30  OMEM;.  return 0
22c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20  ;.}../*.** Send 
22d0: 6d 70 72 69 6e 74 66 2d 66 6f 72 6d 61 74 74 65  mprintf-formatte
22e0: 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65  d content to the
22f0: 20 6f 75 74 70 75 74 20 63 61 6c 6c 62 61 63 6b   output callback
2300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2310: 20 6f 75 74 70 75 74 5f 66 6f 72 6d 61 74 74 65   output_formatte
2320: 64 28 44 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  d(DState *p, con
2330: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2340: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2350: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
2360: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2370: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20  zFormat);.  z = 
2380: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
2390: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
23a0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 70   va_end(ap);.  p
23b0: 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 7a 2c 20 70  ->xCallback(z, p
23c0: 2d 3e 70 41 72 67 29 3b 0a 20 20 73 71 6c 69 74  ->pArg);.  sqlit
23d0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 0a 2f  e3_free(z);.}../
23e0: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72 69  *.** Find a stri
23f0: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66  ng that is not f
2400: 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69 6e  ound anywhere in
2410: 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61 20   z[].  Return a 
2420: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
2430: 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  at string..**.**
2440: 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20 61   Try to use zA a
2450: 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49 66  nd zB first.  If
2460: 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20 61   both of those a
2470: 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e 64  re already found
2480: 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20   in z[].** then 
2490: 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74 72  make up some str
24a0: 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ing and store it
24b0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 7a   in the buffer z
24c0: 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  Buf..*/.static c
24d0: 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73 65  onst char *unuse
24e0: 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73  d_string(.  cons
24f0: 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20  t char *z,      
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2510: 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74   Result must not
2520: 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 65   appear anywhere
2530: 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74   in z */.  const
2540: 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74   char *zA, const
2550: 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20   char *zB,   /* 
2560: 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74 20  Try these first 
2570: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20  */.  char *zBuf 
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
25a0: 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65 72  to store a gener
25b0: 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  ated string */.)
25c0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20 3d  {.  unsigned i =
25d0: 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72   0;.  if( strstr
25e0: 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65 74  (z, zA)==0 ) ret
25f0: 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73 74  urn zA;.  if( st
2600: 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29  rstr(z, zB)==0 )
2610: 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f   return zB;.  do
2620: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2630: 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22  printf(20,zBuf,"
2640: 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b  (%s%u)", zA, i++
2650: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74 72  );.  }while( str
2660: 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29  str(z,zBuf)!=0 )
2670: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b  ;.  return zBuf;
2680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
2690: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
26a0: 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74  g as a quoted st
26b0: 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71  ring using SQL q
26c0: 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  uoting conventio
26d0: 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  ns..** Additiona
26e0: 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68  llly , escape th
26f0: 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20  e "\n" and "\r" 
2700: 63 68 61 72 61 63 74 65 72 73 20 73 6f 20 74 68  characters so th
2710: 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a  at they do not.*
2720: 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 20  * get corrupted 
2730: 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74  by end-of-line t
2740: 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c  ranslation facil
2750: 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70  ities in some op
2760: 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65  erating.** syste
2770: 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ms..*/.static vo
2780: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
2790: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
27a0: 44 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  DState *p, const
27b0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
27c0: 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   i;.  char c;.  
27d0: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
27e0: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
27f0: 27 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20  ' && c!='\n' && 
2800: 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a  c!='\r'; i++){}.
2810: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
2820: 20 20 6f 75 74 70 75 74 5f 66 6f 72 6d 61 74 74    output_formatt
2830: 65 64 28 70 2c 22 27 25 73 27 22 2c 7a 29 3b 0a  ed(p,"'%s'",z);.
2840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
2850: 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30  st char *zNL = 0
2860: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2870: 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69   *zCR = 0;.    i
2880: 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  nt nNL = 0;.    
2890: 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20  int nCR = 0;.   
28a0: 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c   char zBuf1[20],
28b0: 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20   zBuf2[20];.    
28c0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
28d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
28e0: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b  [i]=='\n' ) nNL+
28f0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  +;.      if( z[i
2900: 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b  ]=='\r' ) nCR++;
2910: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2920: 4e 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 78  NL ){.      p->x
2930: 43 61 6c 6c 62 61 63 6b 28 22 72 65 70 6c 61 63  Callback("replac
2940: 65 28 22 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20  e(", p->pArg);. 
2950: 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65       zNL = unuse
2960: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e  d_string(z, "\\n
2970: 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66  ", "\\012", zBuf
2980: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
2990: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 70  ( nCR ){.      p
29a0: 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 22 72 65 70  ->xCallback("rep
29b0: 6c 61 63 65 28 22 2c 20 70 2d 3e 70 41 72 67 29  lace(", p->pArg)
29c0: 3b 0a 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e  ;.      zCR = un
29d0: 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22  used_string(z, "
29e0: 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a  \\r", "\\015", z
29f0: 42 75 66 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Buf2);.    }.   
2a00: 20 70 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 22 27   p->xCallback("'
2a10: 22 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20 20 20  ", p->pArg);.   
2a20: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
2a30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
2a40: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
2a50: 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27  ='\n' && c!='\r'
2a60: 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b   && c!='\''; i++
2a70: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ){}.      if( c=
2a80: 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\'' ) i++;.   
2a90: 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20     if( i ){.    
2aa0: 20 20 20 20 6f 75 74 70 75 74 5f 66 6f 72 6d 61      output_forma
2ab0: 74 74 65 64 28 70 2c 20 22 25 2e 2a 73 22 2c 20  tted(p, "%.*s", 
2ac0: 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a  i, z);.        z
2ad0: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
2ae0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
2af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 78   ){.        p->x
2b00: 43 61 6c 6c 62 61 63 6b 28 22 27 22 2c 20 70 2d  Callback("'", p-
2b10: 3e 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  >pArg);.        
2b20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2b30: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
2b40: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
2b50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2b60: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
2b70: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
2b80: 20 20 20 70 2d 3e 78 43 61 6c 6c 62 61 63 6b 28     p->xCallback(
2b90: 7a 4e 4c 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20  zNL, p->pArg);. 
2ba0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2bb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2bc0: 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 7a 43 52 2c  ->xCallback(zCR,
2bd0: 20 70 2d 3e 70 41 72 67 29 3b 0a 20 20 20 20 7d   p->pArg);.    }
2be0: 0a 20 20 20 20 70 2d 3e 78 43 61 6c 6c 62 61 63  .    p->xCallbac
2bf0: 6b 28 22 27 22 2c 20 70 2d 3e 70 41 72 67 29 3b  k("'", p->pArg);
2c00: 0a 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a  .    if( nCR ){.
2c10: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 66 6f 72        output_for
2c20: 6d 61 74 74 65 64 28 70 2c 20 22 2c 27 25 73 27  matted(p, ",'%s'
2c30: 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43 52  ,char(13))", zCR
2c40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2c50: 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 6f 75   nNL ){.      ou
2c60: 74 70 75 74 5f 66 6f 72 6d 61 74 74 65 64 28 70  tput_formatted(p
2c70: 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30  , ",'%s',char(10
2c80: 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d  ))", zNL);.    }
2c90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2ca0: 69 73 20 69 73 20 61 6e 20 73 71 6c 69 74 65 33  is is an sqlite3
2cb0: 5f 65 78 65 63 20 63 61 6c 6c 62 61 63 6b 20 72  _exec callback r
2cc0: 6f 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72 20  outine used for 
2cd0: 64 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74 61  dumping the data
2ce0: 62 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f  base..** Each ro
2cf0: 77 20 72 65 63 65 69 76 65 64 20 62 79 20 74 68  w received by th
2d00: 69 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73  is callback cons
2d10: 69 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ists of a table 
2d20: 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62  name,.** the tab
2d30: 6c 65 20 74 79 70 65 20 28 22 69 6e 64 65 78 22  le type ("index"
2d40: 20 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e 64   or "table") and
2d50: 20 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20 74   SQL to create t
2d60: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  he table..** Thi
2d70: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2d80: 20 70 72 69 6e 74 20 74 65 78 74 20 73 75 66 66   print text suff
2d90: 69 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65 61  icient to recrea
2da0: 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  te the table..*/
2db0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d 70  .static int dump
2dc0: 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _callback(void *
2dd0: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
2de0: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
2df0: 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69  ar **azCol){.  i
2e00: 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
2e10: 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63  har *zTable;.  c
2e20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
2e30: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2e40: 7a 53 71 6c 3b 0a 20 20 44 53 74 61 74 65 20 2a  zSql;.  DState *
2e50: 70 20 3d 20 28 44 53 74 61 74 65 2a 29 70 41 72  p = (DState*)pAr
2e60: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  g;.  sqlite3_stm
2e70: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 28 76 6f  t *pStmt;..  (vo
2e80: 69 64 29 61 7a 43 6f 6c 3b 0a 20 20 69 66 28 20  id)azCol;.  if( 
2e90: 6e 41 72 67 21 3d 33 20 29 20 72 65 74 75 72 6e  nArg!=3 ) return
2ea0: 20 31 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61   1;.  zTable = a
2eb0: 7a 41 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65  zArg[0];.  zType
2ec0: 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a   = azArg[1];.  z
2ed0: 53 71 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  Sql = azArg[2];.
2ee0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
2ef0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  able, "sqlite_se
2f00: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
2f10: 20 20 20 70 2d 3e 78 43 61 6c 6c 62 61 63 6b 28     p->xCallback(
2f20: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c  "DELETE FROM sql
2f30: 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22  ite_sequence;\n"
2f40: 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20 20 7d 65  , p->pArg);.  }e
2f50: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
2f60: 73 74 72 67 6c 6f 62 28 22 73 71 6c 69 74 65 5f  strglob("sqlite_
2f70: 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c 65 29 3d  stat?", zTable)=
2f80: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 78 43 61  =0 ){.    p->xCa
2f90: 6c 6c 62 61 63 6b 28 22 41 4e 41 4c 59 5a 45 20  llback("ANALYZE 
2fa0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
2fb0: 22 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20 20 7d  ", p->pArg);.  }
2fc0: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
2fd0: 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65  (zTable, "sqlite
2fe0: 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
2ff0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
3000: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
3010: 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52  Sql, "CREATE VIR
3020: 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29  TUAL TABLE", 20)
3030: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ==0 ){.    if( !
3040: 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
3050: 61 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 78 43  a ){.      p->xC
3060: 61 6c 6c 62 61 63 6b 28 22 50 52 41 47 4d 41 20  allback("PRAGMA 
3070: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
3080: 4f 4e 3b 5c 6e 22 2c 20 70 2d 3e 70 41 72 67 29  ON;\n", p->pArg)
3090: 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61  ;.      p->writa
30a0: 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  bleSchema = 1;. 
30b0: 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 5f     }.    output_
30c0: 66 6f 72 6d 61 74 74 65 64 28 70 2c 0a 20 20 20  formatted(p,.   
30d0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
30e0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28 74   sqlite_master(t
30f0: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
3100: 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29 22  e,rootpage,sql)"
3110: 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28  .       "VALUES(
3120: 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25 71  'table','%q','%q
3130: 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20 20  ',0,'%q');",.   
3140: 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61 62      zTable, zTab
3150: 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 72  le, zSql);.    r
3160: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
3170: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
3180: 33 5f 73 74 72 67 6c 6f 62 28 22 43 52 45 41 54  3_strglob("CREAT
3190: 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c  E TABLE ['\"]*",
31a0: 20 7a 53 71 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zSql)==0 ){.   
31b0: 20 20 20 70 2d 3e 78 43 61 6c 6c 62 61 63 6b 28     p->xCallback(
31c0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
31d0: 20 4e 4f 54 20 45 58 49 53 54 53 20 22 2c 20 70   NOT EXISTS ", p
31e0: 2d 3e 70 41 72 67 29 3b 0a 20 20 20 20 20 20 70  ->pArg);.      p
31f0: 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 7a 53 71 6c  ->xCallback(zSql
3200: 2b 31 33 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20  +13, p->pArg);. 
3210: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3220: 70 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 7a 53 71  p->xCallback(zSq
3230: 6c 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20 20 20  l, p->pArg);.   
3240: 20 7d 0a 20 20 20 20 70 2d 3e 78 43 61 6c 6c 62   }.    p->xCallb
3250: 61 63 6b 28 22 3b 5c 6e 22 2c 20 70 2d 3e 70 41  ack(";\n", p->pA
3260: 72 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rg);.  }..  if( 
3270: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74  strcmp(zType, "t
3280: 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  able")==0 ){.   
3290: 20 44 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a   DText sSelect;.
32a0: 20 20 20 20 44 54 65 78 74 20 73 54 61 62 6c 65      DText sTable
32b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 54  ;.    char **azT
32c0: 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  Col;.    int i;.
32d0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a 20      int nCol;.. 
32e0: 20 20 20 61 7a 54 43 6f 6c 20 3d 20 74 61 62 6c     azTCol = tabl
32f0: 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20 7a  eColumnList(p, z
3300: 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
3310: 61 7a 54 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  azTCol==0 ) retu
3320: 72 6e 20 30 3b 0a 0a 20 20 20 20 69 6e 69 74 54  rn 0;..    initT
3330: 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20 20  ext(&sTable);.  
3340: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
3350: 61 62 6c 65 2c 20 22 49 4e 53 45 52 54 20 49 4e  able, "INSERT IN
3360: 54 4f 20 22 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  TO ", 0);..    /
3370: 2a 20 41 6c 77 61 79 73 20 71 75 6f 74 65 20 74  * Always quote t
3380: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65  he table name, e
3390: 76 65 6e 20 69 66 20 69 74 20 61 70 70 65 61 72  ven if it appear
33a0: 73 20 74 6f 20 62 65 20 70 75 72 65 20 61 73 63  s to be pure asc
33b0: 69 69 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  ii,.    ** in ca
33c0: 73 65 20 69 74 20 69 73 20 61 20 6b 65 79 77 6f  se it is a keywo
33d0: 72 64 2e 20 45 78 3a 20 20 49 4e 53 45 52 54 20  rd. Ex:  INSERT 
33e0: 49 4e 54 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e  INTO "table" ...
33f0: 20 2a 2f 0a 20 20 20 20 61 70 70 65 6e 64 54 65   */.    appendTe
3400: 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61 62  xt(&sTable, zTab
3410: 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
3420: 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  able));..    /* 
3430: 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68  If preserving th
3440: 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63  e rowid, add a c
3450: 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72  olumn list after
3460: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
3470: 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72  .    ** In other
3480: 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54   words:  "INSERT
3490: 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c   INTO tab(rowid,
34a0: 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45  a,b,c,...) VALUE
34b0: 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69  S(...)".    ** i
34c0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
34d0: 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ual "INSERT INTO
34e0: 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29   tab VALUES(...)
34f0: 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
3500: 28 20 61 7a 54 43 6f 6c 5b 30 5d 20 29 7b 0a 20  ( azTCol[0] ){. 
3510: 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
3520: 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29  &sTable, "(", 0)
3530: 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
3540: 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 54 43  xt(&sTable, azTC
3550: 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
3560: 20 66 6f 72 28 69 3d 31 3b 20 61 7a 54 43 6f 6c   for(i=1; azTCol
3570: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
3580: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
3590: 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a  Table, ",", 0);.
35a0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
35b0: 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 54 43  xt(&sTable, azTC
35c0: 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72  ol[i], quoteChar
35d0: 28 61 7a 54 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20  (azTCol[i]));.  
35e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
35f0: 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
3600: 22 29 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ")", 0);.    }. 
3610: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
3620: 54 61 62 6c 65 2c 20 22 20 56 41 4c 55 45 53 28  Table, " VALUES(
3630: 22 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42  ", 0);..    /* B
3640: 75 69 6c 64 20 61 6e 20 61 70 70 72 6f 70 72 69  uild an appropri
3650: 61 74 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ate SELECT state
3660: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74  ment */.    init
3670: 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
3680: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
3690: 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54  sSelect, "SELECT
36a0: 20 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   ", 0);.    if( 
36b0: 61 7a 54 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20  azTCol[0] ){.   
36c0: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
36d0: 53 65 6c 65 63 74 2c 20 61 7a 54 43 6f 6c 5b 30  Select, azTCol[0
36e0: 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70  ], 0);.      app
36f0: 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
3700: 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 7d  , ",", 0);.    }
3710: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a  .    for(i=1; az
3720: 54 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  TCol[i]; i++){. 
3730: 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
3740: 26 73 53 65 6c 65 63 74 2c 20 61 7a 54 43 6f 6c  &sSelect, azTCol
3750: 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
3760: 7a 54 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  zTCol[i]));.    
3770: 20 20 69 66 28 20 61 7a 54 43 6f 6c 5b 69 2b 31    if( azTCol[i+1
3780: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ] ){.        app
3790: 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
37a0: 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20  , ",", 0);.     
37b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f   }.    }.    nCo
37c0: 6c 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20 61  l = i;.    if( a
37d0: 7a 54 43 6f 6c 5b 30 5d 3d 3d 30 20 29 20 6e 43  zTCol[0]==0 ) nC
37e0: 6f 6c 2d 2d 3b 0a 20 20 20 20 66 72 65 65 43 6f  ol--;.    freeCo
37f0: 6c 75 6d 6e 4c 69 73 74 28 61 7a 54 43 6f 6c 29  lumnList(azTCol)
3800: 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
3810: 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f  (&sSelect, " FRO
3820: 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70  M ", 0);.    app
3830: 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
3840: 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43  , zTable, quoteC
3850: 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20  har(zTable));.. 
3860: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
3870: 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
3880: 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 2d 31 2c  , sSelect.z, -1,
3890: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
38a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
38b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  OK ){.      p->n
38c0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Err++;.      if(
38d0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
38e0: 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  K ) p->rc = rc;.
38f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3900: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
3910: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
3920: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
3930: 20 20 20 70 2d 3e 78 43 61 6c 6c 62 61 63 6b 28     p->xCallback(
3940: 73 54 61 62 6c 65 2e 7a 2c 20 70 2d 3e 70 41 72  sTable.z, p->pAr
3950: 67 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  g);.        for(
3960: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
3970: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
3980: 20 69 20 29 20 70 2d 3e 78 43 61 6c 6c 62 61 63   i ) p->xCallbac
3990: 6b 28 22 2c 22 2c 20 70 2d 3e 70 41 72 67 29 3b  k(",", p->pArg);
39a0: 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
39b0: 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
39c0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 69 29 20  n_type(pStmt,i) 
39d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
39e0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
39f0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
3a00: 20 20 20 20 6f 75 74 70 75 74 5f 66 6f 72 6d 61      output_forma
3a10: 74 74 65 64 28 70 2c 20 22 25 6c 6c 64 22 2c 20  tted(p, "%lld", 
3a20: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
3a30: 6e 74 36 34 28 70 53 74 6d 74 2c 69 29 29 3b 0a  nt64(pStmt,i));.
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
3a50: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
3a60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
3a70: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
3a80: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
3a90: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
3aa0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
3ab0: 6c 65 28 70 53 74 6d 74 2c 69 29 3b 0a 20 20 20  le(pStmt,i);.   
3ac0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
3ad0: 65 33 5f 75 69 6e 74 36 34 20 75 72 3b 0a 20 20  e3_uint64 ur;.  
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
3af0: 70 79 28 26 75 72 2c 26 72 2c 73 69 7a 65 6f 66  py(&ur,&r,sizeof
3b00: 28 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (r));.          
3b10: 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78 37 66      if( ur==0x7f
3b20: 66 30 30 30 30 30 30 30 30 30 30 30 30 30 4c 4c  f0000000000000LL
3b30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3b40: 20 20 20 20 70 2d 3e 78 43 61 6c 6c 62 61 63 6b      p->xCallback
3b50: 28 22 31 65 39 39 39 22 2c 20 70 2d 3e 70 41 72  ("1e999", p->pAr
3b60: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
3b70: 20 20 7d 65 6c 73 65 20 69 66 28 20 75 72 3d 3d    }else if( ur==
3b80: 30 78 66 66 66 30 30 30 30 30 30 30 30 30 30 30  0xfff00000000000
3b90: 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  00LL ){.        
3ba0: 20 20 20 20 20 20 20 20 70 2d 3e 78 43 61 6c 6c          p->xCall
3bb0: 62 61 63 6b 28 22 2d 31 65 39 39 39 22 2c 20 70  back("-1e999", p
3bc0: 2d 3e 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20  ->pArg);.       
3bd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 75                ou
3bf0: 74 70 75 74 5f 66 6f 72 6d 61 74 74 65 64 28 70  tput_formatted(p
3c00: 2c 20 22 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a  , "%!.20g", r);.
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
3c30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
3c40: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
3c50: 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
3c60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3c70: 20 70 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 22 4e   p->xCallback("N
3c80: 55 4c 4c 22 2c 20 70 2d 3e 70 41 72 67 29 3b 0a  ULL", p->pArg);.
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
3ca0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
3cb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
3cc0: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
3cd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3ce0: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
3cf0: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2c  scaped_string(p,
3d00: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
3d10: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
3d20: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
3d30: 5f 74 65 78 74 28 70 53 74 6d 74 2c 69 29 29 3b  _text(pStmt,i));
3d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
3d50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
3d60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3d70: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
3d80: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
3d90: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71    int nByte = sq
3da0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
3db0: 65 73 28 70 53 74 6d 74 2c 69 29 3b 0a 20 20 20  es(pStmt,i);.   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
3dd0: 6e 65 64 20 63 68 61 72 20 2a 61 20 3d 20 28 75  ned char *a = (u
3de0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 73 71  nsigned char*)sq
3df0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
3e00: 62 28 70 53 74 6d 74 2c 69 29 3b 0a 20 20 20 20  b(pStmt,i);.    
3e10: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
3e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3e30: 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 22 78 27 22  ->xCallback("x'"
3e40: 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20 20 20 20  , p->pArg);.    
3e50: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3e60: 30 3b 20 6a 3c 6e 42 79 74 65 3b 20 6a 2b 2b 29  0; j<nByte; j++)
3e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3e80: 20 20 63 68 61 72 20 7a 57 6f 72 64 5b 33 5d 3b    char zWord[3];
3e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ea0: 20 7a 57 6f 72 64 5b 30 5d 20 3d 20 22 30 31 32   zWord[0] = "012
3eb0: 33 34 35 36 37 38 39 61 62 63 64 65 66 22 5b 28  3456789abcdef"[(
3ec0: 61 5b 6a 5d 3e 3e 34 29 26 31 35 5d 3b 0a 20 20  a[j]>>4)&15];.  
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 57                zW
3ee0: 6f 72 64 5b 31 5d 20 3d 20 22 30 31 32 33 34 35  ord[1] = "012345
3ef0: 36 37 38 39 61 62 63 64 65 66 22 5b 61 5b 6a 5d  6789abcdef"[a[j]
3f00: 26 31 35 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  &15];.          
3f10: 20 20 20 20 20 20 7a 57 6f 72 64 5b 32 5d 20 3d        zWord[2] =
3f20: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
3f30: 20 20 20 20 70 2d 3e 78 43 61 6c 6c 62 61 63 6b      p->xCallback
3f40: 28 7a 57 6f 72 64 2c 20 70 2d 3e 70 41 72 67 29  (zWord, p->pArg)
3f50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3f60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3f70: 70 2d 3e 78 43 61 6c 6c 62 61 63 6b 28 22 27 22  p->xCallback("'"
3f80: 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20 20 20 20  , p->pArg);.    
3f90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3fb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3fc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
3fd0: 78 43 61 6c 6c 62 61 63 6b 28 22 29 3b 5c 6e 22  xCallback(");\n"
3fe0: 2c 20 70 2d 3e 70 41 72 67 29 3b 0a 20 20 20 20  , p->pArg);.    
3ff0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
4000: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
4010: 53 74 6d 74 29 3b 0a 20 20 20 20 66 72 65 65 54  Stmt);.    freeT
4020: 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20 20  ext(&sTable);.  
4030: 20 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c    freeText(&sSel
4040: 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ect);.  }.  retu
4050: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
4060: 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20  Execute a query 
4070: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
4080: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c  ill generate SQL
4090: 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a   output.  Print.
40a0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
40b0: 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70  lumns, comma-sep
40c0: 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e  arated, on a lin
40d0: 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61  e and then add a
40e0: 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65  .** semicolon te
40f0: 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20  rminator to the 
4100: 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65  end of that line
4110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
4120: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
4130: 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20 63   is 1 and that c
4140: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74  olumn contains t
4150: 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e  ext "--".** then
4160: 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69 63   write the semic
4170: 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61  olon on a separa
4180: 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77  te line.  That w
4190: 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22  ay, if a.** "--"
41a0: 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20   comment occurs 
41b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
41c0: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
41d0: 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27   comment.** won'
41e0: 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65  t consume the se
41f0: 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74  micolon terminat
4200: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
4210: 69 64 20 6f 75 74 70 75 74 5f 73 71 6c 5f 66 72  id output_sql_fr
4220: 6f 6d 5f 71 75 65 72 79 28 0a 20 20 44 53 74 61  om_query(.  DSta
4230: 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  te *p,          
4240: 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f       /* Query co
4250: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
4260: 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20   char *zSelect, 
4270: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
4280: 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61  atement to extra
4290: 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ct content */.  
42a0: 2e 2e 2e 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ....){.  sqlite3
42b0: 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a  _stmt *pSelect;.
42c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
42d0: 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  nResult;.  int i
42e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
42f0: 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  z;.  char *zSql;
4300: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
4310: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53   va_start(ap, zS
4320: 65 6c 65 63 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  elect);.  zSql =
4330: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
4340: 66 28 7a 53 65 6c 65 63 74 2c 20 61 70 29 3b 0a  f(zSelect, ap);.
4350: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
4360: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
4370: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
4380: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 2d 3e  E_NOMEM;.    p->
4390: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
43a0: 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rn;.  }.  rc = s
43b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
43c0: 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
43d0: 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b  1, &pSelect, 0);
43e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
43f0: 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  zSql);.  if( rc!
4400: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70  =SQLITE_OK || !p
4410: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 6f 75  Select ){.    ou
4420: 74 70 75 74 5f 66 6f 72 6d 61 74 74 65 64 28 70  tput_formatted(p
4430: 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20  , "/**** ERROR: 
4440: 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e  (%d) %s *****/\n
4450: 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20  ", rc,.         
4460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
4470: 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
4480: 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20     p->nErr++;.  
4490: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
44a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
44b0: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52  p(pSelect);.  nR
44c0: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f  esult = sqlite3_
44d0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65  column_count(pSe
44e0: 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  lect);.  while( 
44f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
4500: 7b 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74  {.    z = (const
4510: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
4520: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
4530: 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 78  ct, 0);.    p->x
4540: 43 61 6c 6c 62 61 63 6b 28 7a 2c 20 70 2d 3e 70  Callback(z, p->p
4550: 41 72 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Arg);.    for(i=
4560: 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b  1; i<nResult; i+
4570: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 78 43 61  +){.      p->xCa
4580: 6c 6c 62 61 63 6b 28 22 2c 22 2c 20 70 2d 3e 70  llback(",", p->p
4590: 41 72 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 78  Arg);.      p->x
45a0: 43 61 6c 6c 62 61 63 6b 28 28 63 6f 6e 73 74 20  Callback((const 
45b0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
45c0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63  lumn_text(pSelec
45d0: 74 2c 69 29 2c 20 70 2d 3e 70 41 72 67 29 3b 0a  t,i), p->pArg);.
45e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d      }.    if( z=
45f0: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20  =0 ) z = "";.   
4600: 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20   while( z[0] && 
4610: 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]!='-' || z[
4620: 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a  1]!='-') ) z++;.
4630: 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a      if( z[0] ){.
4640: 20 20 20 20 20 20 70 2d 3e 78 43 61 6c 6c 62 61        p->xCallba
4650: 63 6b 28 22 5c 6e 3b 5c 6e 22 2c 20 70 2d 3e 70  ck("\n;\n", p->p
4660: 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Arg);.    }else{
4670: 0a 20 20 20 20 20 20 70 2d 3e 78 43 61 6c 6c 62  .      p->xCallb
4680: 61 63 6b 28 22 3b 5c 6e 22 2c 20 70 2d 3e 70 41  ack(";\n", p->pA
4690: 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rg);.    }.    r
46a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
46b0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20  (pSelect);.  }. 
46c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
46d0: 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74 29 3b  nalize(pSelect);
46e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
46f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6f 75 74 70  E_OK ){.    outp
4700: 75 74 5f 66 6f 72 6d 61 74 74 65 64 28 70 2c 20  ut_formatted(p, 
4710: 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25  "/**** ERROR: (%
4720: 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  d) %s *****/\n",
4730: 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20   rc,.           
4740: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4750: 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
4760: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78  ;.    if( (rc&0x
4770: 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ff)!=SQLITE_CORR
4780: 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b  UPT ) p->nErr++;
4790: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  .  }.}../*.** Ru
47a0: 6e 20 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64  n zQuery.  Use d
47b0: 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61  ump_callback() a
47c0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
47d0: 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a  outine so that.*
47e0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
47f0: 66 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20  f the query are 
4800: 6f 75 74 70 75 74 20 61 73 20 53 51 4c 20 73 74  output as SQL st
4810: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
4820: 49 66 20 77 65 20 67 65 74 20 61 20 53 51 4c 49  If we get a SQLI
4830: 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
4840: 2c 20 72 65 72 75 6e 20 74 68 65 20 71 75 65 72  , rerun the quer
4850: 79 20 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e  y after appendin
4860: 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72  g.** "ORDER BY r
4870: 6f 77 69 64 20 44 45 53 43 22 20 74 6f 20 74 68  owid DESC" to th
4880: 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  e end..*/.static
4890: 20 76 6f 69 64 20 72 75 6e 5f 73 63 68 65 6d 61   void run_schema
48a0: 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 44  _dump_query(.  D
48b0: 53 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e 73  State *p,.  cons
48c0: 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 2c 0a  t char *zQuery,.
48d0: 20 20 2e 2e 2e 0a 29 7b 0a 20 20 63 68 61 72 20    ....){.  char 
48e0: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61  *zErr = 0;.  cha
48f0: 72 20 2a 7a 3b 0a 20 20 76 61 5f 6c 69 73 74 20  r *z;.  va_list 
4900: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
4910: 70 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 7a 20  p, zQuery);.  z 
4920: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
4930: 74 66 28 7a 51 75 65 72 79 2c 20 61 70 29 3b 0a  tf(zQuery, ap);.
4940: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 20 0a 20    va_end(ap); . 
4950: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
4960: 3e 64 62 2c 20 7a 2c 20 64 75 6d 70 5f 63 61 6c  >db, z, dump_cal
4970: 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
4980: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
4990: 28 7a 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  (z);.  if( zErr 
49a0: 29 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 6f  ){.    output_fo
49b0: 72 6d 61 74 74 65 64 28 70 2c 20 22 2f 2a 2a 2a  rmatted(p, "/***
49c0: 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e  *** %s ******/\n
49d0: 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 73 71  ", zErr);.    sq
49e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
49f0: 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b  ;.    p->nErr++;
4a00: 0a 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20  .    zErr = 0;. 
4a10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76   }.}../*.** Conv
4a20: 65 72 74 20 61 6e 20 53 51 4c 69 74 65 20 64 61  ert an SQLite da
4a30: 74 61 62 61 73 65 20 69 6e 74 6f 20 53 51 4c 20  tabase into SQL 
4a40: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
4a50: 77 69 6c 6c 20 72 65 63 72 65 61 74 65 20 74 68  will recreate th
4a60: 61 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  at.** database..
4a70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
4a80: 62 5f 64 75 6d 70 28 0a 20 20 73 71 6c 69 74 65  b_dump(.  sqlite
4a90: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
4aa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
4ab0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
4ac0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4ad0: 2a 7a 53 63 68 65 6d 61 2c 20 20 20 20 20 20 20  *zSchema,       
4ae0: 2f 2a 20 57 68 69 63 68 20 73 63 68 65 6d 61 20  /* Which schema 
4af0: 74 6f 20 64 75 6d 70 2e 20 20 55 73 75 61 6c 6c  to dump.  Usuall
4b00: 79 20 22 6d 61 69 6e 22 2e 20 2a 2f 0a 20 20 63  y "main". */.  c
4b10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
4b20: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69  e,        /* Whi
4b30: 63 68 20 74 61 62 6c 65 20 74 6f 20 64 75 6d 70  ch table to dump
4b40: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 65 76  .  NULL means ev
4b50: 65 72 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69  erything. */.  i
4b60: 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  nt (*xCallback)(
4b70: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 76 6f 69 64  const char*,void
4b80: 2a 29 2c 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  *),   /* Output 
4b90: 73 65 6e 74 20 74 6f 20 74 68 69 73 20 63 61 6c  sent to this cal
4ba0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20  lback */.  void 
4bb0: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61 72 67 75    /* Second argu
4be0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  ment of the call
4bf0: 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 44 53 74  back */.){.  DSt
4c00: 61 74 65 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28  ate x;.  memset(
4c10: 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29  &x, 0, sizeof(x)
4c20: 29 3b 0a 20 20 78 2e 72 63 20 3d 20 73 71 6c 69  );.  x.rc = sqli
4c30: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 42 45  te3_exec(db, "BE
4c40: 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
4c50: 20 20 69 66 28 20 78 2e 72 63 20 29 20 72 65 74    if( x.rc ) ret
4c60: 75 72 6e 20 78 2e 72 63 3b 0a 20 20 78 2e 64 62  urn x.rc;.  x.db
4c70: 20 3d 20 64 62 3b 0a 20 20 78 2e 78 43 61 6c 6c   = db;.  x.xCall
4c80: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
4c90: 3b 0a 20 20 78 2e 70 41 72 67 20 3d 20 70 41 72  ;.  x.pArg = pAr
4ca0: 67 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b 28 22  g;.  xCallback("
4cb0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
4cc0: 65 79 73 3d 4f 46 46 3b 5c 6e 42 45 47 49 4e 20  eys=OFF;\nBEGIN 
4cd0: 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 2c  TRANSACTION;\n",
4ce0: 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 7a 54   pArg);.  if( zT
4cf0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  able==0 ){.    r
4d00: 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
4d10: 75 65 72 79 28 26 78 2c 0a 20 20 20 20 20 20 22  uery(&x,.      "
4d20: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
4d30: 65 2c 20 73 71 6c 20 46 52 4f 4d 20 5c 22 25 77  e, sql FROM \"%w
4d40: 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  \".sqlite_master
4d50: 20 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20   ".      "WHERE 
4d60: 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  sql NOT NULL AND
4d70: 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41   type=='table' A
4d80: 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65  ND name!='sqlite
4d90: 5f 73 65 71 75 65 6e 63 65 27 22 2c 0a 20 20 20  _sequence'",.   
4da0: 20 20 20 7a 53 63 68 65 6d 61 0a 20 20 20 20 29     zSchema.    )
4db0: 3b 0a 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61  ;.    run_schema
4dc0: 5f 64 75 6d 70 5f 71 75 65 72 79 28 26 78 2c 0a  _dump_query(&x,.
4dd0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
4de0: 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52  me, type, sql FR
4df0: 4f 4d 20 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65  OM \"%w\".sqlite
4e00: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
4e10: 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71  "WHERE name=='sq
4e20: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 2c  lite_sequence'",
4e30: 20 7a 53 63 68 65 6d 61 0a 20 20 20 20 29 3b 0a   zSchema.    );.
4e40: 20 20 20 20 6f 75 74 70 75 74 5f 73 71 6c 5f 66      output_sql_f
4e50: 72 6f 6d 5f 71 75 65 72 79 28 26 78 2c 0a 20 20  rom_query(&x,.  
4e60: 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
4e70: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
4e80: 65 72 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  er ".      "WHER
4e90: 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41  E sql NOT NULL A
4ea0: 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64  ND type IN ('ind
4eb0: 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76  ex','trigger','v
4ec0: 69 65 77 27 29 22 2c 20 30 0a 20 20 20 20 29 3b  iew')", 0.    );
4ed0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 75  .  }else{.    ru
4ee0: 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
4ef0: 65 72 79 28 26 78 2c 0a 20 20 20 20 20 20 22 53  ery(&x,.      "S
4f00: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
4f10: 2c 20 73 71 6c 20 46 52 4f 4d 20 5c 22 25 77 5c  , sql FROM \"%w\
4f20: 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  ".sqlite_master 
4f30: 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74  ".      "WHERE t
4f40: 62 6c 5f 6e 61 6d 65 3d 25 51 20 43 4f 4c 4c 41  bl_name=%Q COLLA
4f50: 54 45 20 6e 6f 63 61 73 65 20 41 4e 44 20 74 79  TE nocase AND ty
4f60: 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20 20  pe=='table'".   
4f70: 20 20 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f     "  AND sql NO
4f80: 54 20 4e 55 4c 4c 22 2c 0a 20 20 20 20 20 20 7a  T NULL",.      z
4f90: 53 63 68 65 6d 61 2c 20 7a 54 61 62 6c 65 0a 20  Schema, zTable. 
4fa0: 20 20 20 29 3b 0a 20 20 20 20 6f 75 74 70 75 74     );.    output
4fb0: 5f 73 71 6c 5f 66 72 6f 6d 5f 71 75 65 72 79 28  _sql_from_query(
4fc0: 26 78 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  &x,.      "SELEC
4fd0: 54 20 73 71 6c 20 46 52 4f 4d 20 5c 22 25 77 5c  T sql FROM \"%w\
4fe0: 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  ".sqlite_master 
4ff0: 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 73  ".      "WHERE s
5000: 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20  ql NOT NULL".   
5010: 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49     "  AND type I
5020: 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67  N ('index','trig
5030: 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20  ger','view')".  
5040: 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e      "  AND tbl_n
5050: 61 6d 65 3d 25 51 20 43 4f 4c 4c 41 54 45 20 6e  ame=%Q COLLATE n
5060: 6f 63 61 73 65 22 2c 0a 20 20 20 20 20 20 7a 53  ocase",.      zS
5070: 63 68 65 6d 61 2c 20 7a 54 61 62 6c 65 0a 20 20  chema, zTable.  
5080: 20 20 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20    ); .  }.  if( 
5090: 78 2e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  x.writableSchema
50a0: 20 29 7b 0a 20 20 20 20 78 43 61 6c 6c 62 61 63   ){.    xCallbac
50b0: 6b 28 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  k("PRAGMA writab
50c0: 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e  le_schema=OFF;\n
50d0: 22 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 20 20  ", pArg);.  }.  
50e0: 78 43 61 6c 6c 62 61 63 6b 28 78 2e 6e 45 72 72  xCallback(x.nErr
50f0: 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d   ? "ROLLBACK; --
5100: 20 64 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e   due to errors\n
5110: 22 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 2c  " : "COMMIT;\n",
5120: 20 70 41 72 67 29 3b 0a 20 20 73 71 6c 69 74 65   pArg);.  sqlite
5130: 33 5f 65 78 65 63 28 64 62 2c 20 22 43 4f 4d 4d  3_exec(db, "COMM
5140: 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IT", 0, 0, 0);. 
5150: 20 72 65 74 75 72 6e 20 78 2e 72 63 3b 0a 7d 0a   return x.rc;.}.
5160: 0a 0a 0a 2f 2a 20 54 68 65 20 67 65 6e 65 72 69  .../* The generi
5170: 63 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  c subroutine is 
5180: 61 62 6f 76 65 2e 20 20 54 68 65 20 63 6f 64 65  above.  The code
5190: 20 74 68 65 20 66 6f 6c 6c 6f 77 73 20 69 6d 70   the follows imp
51a0: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 63  lements.** the c
51b0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 69 6e 74 65  ommand-line inte
51c0: 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  rface..*/.#ifdef
51d0: 20 44 42 44 55 4d 50 5f 53 54 41 4e 44 41 4c 4f   DBDUMP_STANDALO
51e0: 4e 45 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  NE.#include <std
51f0: 69 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  io.h>../*.** Com
5200: 6d 61 6e 64 2d 6c 69 6e 65 20 69 6e 74 65 72 66  mand-line interf
5210: 61 63 65 0a 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28  ace.*/.int main(
5220: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
5230: 2a 61 72 67 76 29 7b 0a 20 20 73 71 6c 69 74 65  *argv){.  sqlite
5240: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
5250: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73  har *zDb;.  cons
5260: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 3b  t char *zSchema;
5270: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5280: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Table = 0;.  int
5290: 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63   rc;..  if( argc
52a0: 3c 32 20 7c 7c 20 61 72 67 63 3e 34 20 29 7b 0a  <2 || argc>4 ){.
52b0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
52c0: 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 44  rr, "Usage: %s D
52d0: 41 54 41 42 41 53 45 20 3f 53 43 48 45 4d 41 3f  ATABASE ?SCHEMA?
52e0: 20 3f 54 41 42 4c 45 3f 5c 6e 22 2c 20 61 72 67   ?TABLE?\n", arg
52f0: 76 5b 30 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  v[0]);.    retur
5300: 6e 20 31 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  n 1;.  }.  zDb =
5310: 20 61 72 67 76 5b 31 5d 3b 0a 20 20 7a 53 63 68   argv[1];.  zSch
5320: 65 6d 61 20 3d 20 61 72 67 63 3e 3d 33 20 3f 20  ema = argc>=3 ? 
5330: 61 72 67 76 5b 32 5d 20 3a 20 22 6d 61 69 6e 22  argv[2] : "main"
5340: 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 72 67  ;.  zTable = arg
5350: 63 3d 3d 34 20 3f 20 61 72 67 76 5b 33 5d 20 3a  c==4 ? argv[3] :
5360: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
5370: 74 65 33 5f 6f 70 65 6e 28 7a 44 62 2c 20 26 64  te3_open(zDb, &d
5380: 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  b);.  if( rc ){.
5390: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
53a0: 72 72 2c 20 22 43 61 6e 6e 6f 74 20 6f 70 65 6e  rr, "Cannot open
53b0: 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 20   \"%s\": %s\n", 
53c0: 7a 44 62 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  zDb, sqlite3_err
53d0: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 73 71  msg(db));.    sq
53e0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
53f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
5400: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
5410: 33 5f 64 62 5f 64 75 6d 70 28 64 62 2c 20 7a 53  3_db_dump(db, zS
5420: 63 68 65 6d 61 2c 20 7a 54 61 62 6c 65 2c 20 0a  chema, zTable, .
5430: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a            (int(*
5440: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 76 6f  )(const char*,vo
5450: 69 64 2a 29 29 66 70 75 74 73 2c 20 28 76 6f 69  id*))fputs, (voi
5460: 64 2a 29 73 74 64 6f 75 74 29 3b 0a 20 20 69 66  d*)stdout);.  if
5470: 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69  ( rc ){.    fpri
5480: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
5490: 6f 72 3a 20 73 71 6c 69 74 65 33 5f 64 62 5f 64  or: sqlite3_db_d
54a0: 75 6d 70 28 29 20 72 65 74 75 72 6e 73 20 25 64  ump() returns %d
54b0: 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  \n", rc);.  }.  
54c0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
54d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d  );.  return rc!=
54e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 23  SQLITE_OK;  .}.#
54f0: 65 6e 64 69 66 20 2f 2a 20 44 42 44 55 4d 50 5f  endif /* DBDUMP_
5500: 53 54 41 4e 44 41 4c 4f 4e 45 20 2a 2f 0a        STANDALONE */.