/ Hex Artifact Content
Login

Artifact 0a11f831603f17fea20ca97133c0f64e716af4a7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 73  es..**.** $Id: s
01f0: 68 65 6c 6c 2e 63 2c 76 20 31 2e 32 30 37 20 32  hell.c,v 1.207 2
0200: 30 30 39 2f 30 33 2f 31 36 20 31 30 3a 35 39 3a  009/03/16 10:59:
0210: 34 34 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  44 drh Exp $.*/.
0220: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
0230: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
0240: 49 4e 33 32 29 0a 2f 2a 20 54 68 69 73 20 6e 65  IN32)./* This ne
0250: 65 64 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f  eds to come befo
0260: 72 65 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20  re any includes 
0270: 66 6f 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65  for MSVC compile
0280: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52  r */.#define _CR
0290: 54 5f 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e  T_SECURE_NO_WARN
02a0: 49 4e 47 53 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  INGS.#endif..#in
02b0: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
02c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
02d0: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  g.h>.#include <s
02e0: 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  tdio.h>.#include
02f0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
0300: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0310: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
0320: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0330: 64 61 72 67 2e 68 3e 0a 0a 23 69 66 20 21 64 65  darg.h>..#if !de
0340: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26  fined(_WIN32) &&
0350: 20 21 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29   !defined(WIN32)
0360: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f   && !defined(__O
0370: 53 32 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20  S2__).# include 
0380: 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23 20 69 66 20  <signal.h>.# if 
0390: 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f  !defined(__RTP__
03a0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
03b0: 52 53 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 69 6e  RS_KERNEL).#  in
03c0: 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a 23 20  clude <pwd.h>.# 
03d0: 65 6e 64 69 66 0a 23 20 69 6e 63 6c 75 64 65 20  endif.# include 
03e0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63  <unistd.h>.# inc
03f0: 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e  lude <sys/types.
0400: 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  h>.#endif..#ifde
0410: 66 20 5f 5f 4f 53 32 5f 5f 0a 23 20 69 6e 63 6c  f __OS2__.# incl
0420: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0430: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
0440: 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  ed(HAVE_READLINE
0450: 29 20 26 26 20 48 41 56 45 5f 52 45 41 44 4c 49  ) && HAVE_READLI
0460: 4e 45 3d 3d 31 0a 23 20 69 6e 63 6c 75 64 65 20  NE==1.# include 
0470: 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c 69  <readline/readli
0480: 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  ne.h>.# include 
0490: 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f 72  <readline/histor
04a0: 79 2e 68 3e 0a 23 65 6c 73 65 0a 23 20 64 65 66  y.h>.#else.# def
04b0: 69 6e 65 20 72 65 61 64 6c 69 6e 65 28 70 29 20  ine readline(p) 
04c0: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 70 2c  local_getline(p,
04d0: 73 74 64 69 6e 29 0a 23 20 64 65 66 69 6e 65 20  stdin).# define 
04e0: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
04f0: 20 64 65 66 69 6e 65 20 72 65 61 64 5f 68 69 73   define read_his
0500: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0510: 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 58   write_history(X
0520: 29 0a 23 20 64 65 66 69 6e 65 20 73 74 69 66 6c  ).# define stifl
0530: 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 65 6e  e_history(X).#en
0540: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
0550: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
0560: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
0570: 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 64 65 66  lude <io.h>.#def
0580: 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f 69  ine isatty(h) _i
0590: 73 61 74 74 79 28 68 29 0a 23 64 65 66 69 6e 65  satty(h).#define
05a0: 20 61 63 63 65 73 73 28 66 2c 6d 29 20 5f 61 63   access(f,m) _ac
05b0: 63 65 73 73 28 28 66 29 2c 28 6d 29 29 0a 23 65  cess((f),(m)).#e
05c0: 6c 73 65 0a 2f 2a 20 4d 61 6b 65 20 73 75 72 65  lse./* Make sure
05d0: 20 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20   isatty() has a 
05e0: 70 72 6f 74 6f 74 79 70 65 2e 0a 2a 2f 0a 65 78  prototype..*/.ex
05f0: 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28  tern int isatty(
0600: 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  );.#endif..#if d
0610: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
0620: 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43 45  E)./* Windows CE
0630: 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67   (arm-wince-ming
0640: 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73 20  w32ce-gcc) does 
0650: 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61 74  not provide isat
0660: 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65 20  ty(). * thus we 
0670: 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74 68  always assume th
0680: 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f 6e  at we have a con
0690: 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20 62  sole. That can b
06a0: 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e 20  e. * overridden 
06b0: 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68 20  with the -batch 
06c0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
06d0: 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  ion.. */.#define
06e0: 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65 6e   isatty(x) 1.#en
06f0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0700: 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65  d(_WIN32) && !de
0710: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20  fined(WIN32) && 
0720: 21 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f 5f  !defined(__OS2__
0730: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
0740: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0750: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0760: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69  #include <sys/ti
0770: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
0780: 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a  sys/resource.h>.
0790: 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75 72  ./* Saved resour
07a0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
07b0: 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  or the beginning
07c0: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
07d0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
07e0: 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e 3b  t rusage sBegin;
07f0: 0a 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ../* True if the
0800: 20 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65   timer is enable
0810: 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d */.static int 
0820: 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b  enableTimer = 0;
0830: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69  ../*.** Begin ti
0840: 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  ming an operatio
0850: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
0860: 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64   beginTimer(void
0870: 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54  ){.  if( enableT
0880: 69 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72  imer ){.    getr
0890: 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c  usage(RUSAGE_SEL
08a0: 46 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 7d  F, &sBegin);.  }
08b0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
08c0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20  e difference of 
08d0: 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74 73  two time_structs
08e0: 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73   in seconds */.s
08f0: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d  tatic double tim
0900: 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69 6d  eDiff(struct tim
0910: 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73 74  eval *pStart, st
0920: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 45  ruct timeval *pE
0930: 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  nd){.  return (p
0940: 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20 70  End->tv_usec - p
0950: 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29 2a  Start->tv_usec)*
0960: 30 2e 30 30 30 30 30 31 20 2b 20 0a 20 20 20 20  0.000001 + .    
0970: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45       (double)(pE
0980: 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74  nd->tv_sec - pSt
0990: 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a  art->tv_sec);.}.
09a0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
09b0: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
09c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
09d0: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
09e0: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
09f0: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
0a00: 72 75 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20  rusage sEnd;.   
0a10: 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47   getrusage(RUSAG
0a20: 45 5f 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a  E_SELF, &sEnd);.
0a30: 20 20 20 20 70 72 69 6e 74 66 28 22 43 50 55 20      printf("CPU 
0a40: 54 69 6d 65 3a 20 75 73 65 72 20 25 66 20 73 79  Time: user %f sy
0a50: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
0a60: 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e  timeDiff(&sBegin
0a70: 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64  .ru_utime, &sEnd
0a80: 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20  .ru_utime),.    
0a90: 20 20 20 74 69 6d 65 44 69 66 66 28 26 73 42 65     timeDiff(&sBe
0aa0: 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73  gin.ru_stime, &s
0ab0: 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a  End.ru_stime));.
0ac0: 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 42 45    }.}.#define BE
0ad0: 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54  GIN_TIMER beginT
0ae0: 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45  imer().#define E
0af0: 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65  ND_TIMER endTime
0b00: 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f  r().#define HAS_
0b10: 54 49 4d 45 52 20 31 0a 23 65 6c 73 65 0a 23 64  TIMER 1.#else.#d
0b20: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
0b30: 52 20 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54  R .#define END_T
0b40: 49 4d 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53  IMER.#define HAS
0b50: 5f 54 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a  _TIMER 0.#endif.
0b60: 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70  ./*.** Used to p
0b70: 72 65 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20  revent warnings 
0b80: 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72  about unused par
0b90: 61 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69  ameters.*/.#defi
0ba0: 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ne UNUSED_PARAME
0bb0: 54 45 52 28 78 29 20 28 76 6f 69 64 29 28 78 29  TER(x) (void)(x)
0bc0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
0bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
0c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
0c60: 67 69 6e 20 67 65 6e 66 6b 65 79 20 6c 6f 67 69  gin genfkey logi
0c70: 63 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  c..*/.#if !defin
0c80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
0c90: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
0ca0: 21 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f  !defined SQLITE_
0cb0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a 23  OMIT_SUBQUERY..#
0cc0: 64 65 66 69 6e 65 20 47 45 4e 46 4b 45 59 5f 45  define GENFKEY_E
0cd0: 52 52 4f 52 20 20 20 20 20 20 20 20 20 31 0a 23  RROR         1.#
0ce0: 64 65 66 69 6e 65 20 47 45 4e 46 4b 45 59 5f 44  define GENFKEY_D
0cf0: 52 4f 50 54 52 49 47 47 45 52 20 20 20 32 0a 23  ROPTRIGGER   2.#
0d00: 64 65 66 69 6e 65 20 47 45 4e 46 4b 45 59 5f 43  define GENFKEY_C
0d10: 52 45 41 54 45 54 52 49 47 47 45 52 20 33 0a 73  REATETRIGGER 3.s
0d20: 74 61 74 69 63 20 69 6e 74 20 67 65 6e 66 6b 65  tatic int genfke
0d30: 79 5f 63 72 65 61 74 65 5f 74 72 69 67 67 65 72  y_create_trigger
0d40: 73 28 73 71 6c 69 74 65 33 20 2a 2c 20 63 6f 6e  s(sqlite3 *, con
0d50: 73 74 20 63 68 61 72 20 2a 2c 20 76 6f 69 64 20  st char *, void 
0d60: 2a 2c 0a 20 20 69 6e 74 20 28 2a 29 28 76 6f 69  *,.  int (*)(voi
0d70: 64 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20  d *, int, const 
0d80: 63 68 61 72 20 2a 29 0a 29 3b 0a 0a 73 74 72 75  char *).);..stru
0d90: 63 74 20 47 65 6e 66 6b 65 79 43 62 20 7b 0a 20  ct GenfkeyCb {. 
0da0: 20 76 6f 69 64 20 2a 70 43 74 78 3b 0a 20 20 69   void *pCtx;.  i
0db0: 6e 74 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20  nt eType;.  int 
0dc0: 28 2a 78 44 61 74 61 29 28 76 6f 69 64 20 2a 2c  (*xData)(void *,
0dd0: 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72   int, const char
0de0: 20 2a 29 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20   *);.};.typedef 
0df0: 73 74 72 75 63 74 20 47 65 6e 66 6b 65 79 43 62  struct GenfkeyCb
0e00: 20 47 65 6e 66 6b 65 79 43 62 3b 0a 0a 2f 2a 20   GenfkeyCb;../* 
0e10: 54 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  The code in this
0e20: 20 66 69 6c 65 20 64 65 66 69 6e 65 73 20 61 20   file defines a 
0e30: 73 71 6c 69 74 65 33 20 76 69 72 74 75 61 6c 2d  sqlite3 virtual-
0e40: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68 61  table module tha
0e50: 74 0a 2a 2a 20 70 72 6f 76 69 64 65 73 20 61 20  t.** provides a 
0e60: 72 65 61 64 2d 6f 6e 6c 79 20 76 69 65 77 20 6f  read-only view o
0e70: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  f the current da
0e80: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 54  tabase schema. T
0e90: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2a 20 72  here is one.** r
0ea0: 6f 77 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ow in the schema
0eb0: 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68 20   table for each 
0ec0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 64 61  column in the da
0ed0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
0ee0: 2f 0a 23 64 65 66 69 6e 65 20 53 43 48 45 4d 41  /.#define SCHEMA
0ef0: 20 5c 0a 22 43 52 45 41 54 45 20 54 41 42 4c 45   \."CREATE TABLE
0f00: 20 78 28 22 20 20 20 20 20 20 20 20 20 20 20 20   x("            
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 5c 0a 20 20 22 64 61 74 61 62 61 73 65 2c 22 20  \.  "database," 
0f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0f60: 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 2e   of database (i.
0f70: 65 2e 20 6d 61 69 6e 2c 20 74 65 6d 70 20 65 74  e. main, temp et
0f80: 63 2e 29 20 2a 2f 20 20 20 20 20 20 20 20 20 5c  c.) */         \
0f90: 0a 20 20 22 74 61 62 6c 65 6e 61 6d 65 2c 22 20  .  "tablename," 
0fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
0fb0: 6f 66 20 74 61 62 6c 65 20 2a 2f 20 20 20 20 20  of table */     
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0fe0: 20 20 22 63 69 64 2c 22 20 20 20 20 20 20 20 20    "cid,"        
0ff0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
1000: 20 6e 75 6d 62 65 72 20 28 66 72 6f 6d 20 6c 65   number (from le
1010: 66 74 2d 74 6f 2d 72 69 67 68 74 2c 20 30 20 75  ft-to-right, 0 u
1020: 70 77 61 72 64 29 20 2a 2f 20 20 20 20 5c 0a 20  pward) */    \. 
1030: 20 22 6e 61 6d 65 2c 22 20 20 20 20 20 20 20 20   "name,"        
1040: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
1050: 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  name */         
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1070: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1080: 22 74 79 70 65 2c 22 20 20 20 20 20 20 20 20 20  "type,"         
1090: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 69 65       /* Specifie
10a0: 64 20 74 79 70 65 20 28 69 2e 65 2e 20 56 41 52  d type (i.e. VAR
10b0: 43 48 41 52 28 33 32 29 29 20 2a 2f 20 20 20 20  CHAR(32)) */    
10c0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22             \.  "
10d0: 6e 6f 74 5f 6e 75 6c 6c 2c 22 20 20 20 20 20 20  not_null,"      
10e0: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
10f0: 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c  True if NOT NULL
1100: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 2a   was specified *
1110: 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 64  /         \.  "d
1120: 66 6c 74 5f 76 61 6c 75 65 2c 22 20 20 20 20 20  flt_value,"     
1130: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61     /* Default va
1140: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 63 6f 6c  lue for this col
1150: 75 6d 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  umn */          
1160: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 70 6b           \.  "pk
1170: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
1180: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1190: 73 20 63 6f 6c 75 6d 6e 20 69 73 20 70 61 72 74  s column is part
11a0: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
11b0: 6b 65 79 20 2a 2f 20 20 5c 0a 22 29 22 0a 0a 23  key */  \.")"..#
11c0: 64 65 66 69 6e 65 20 53 43 48 45 4d 41 32 20 5c  define SCHEMA2 \
11d0: 0a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  ."CREATE TABLE x
11e0: 28 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ("              
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1220: 20 20 22 64 61 74 61 62 61 73 65 2c 22 20 20 20    "database,"   
1230: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1240: 66 20 64 61 74 61 62 61 73 65 20 28 69 2e 65 2e  f database (i.e.
1250: 20 6d 61 69 6e 2c 20 74 65 6d 70 20 65 74 63 2e   main, temp etc.
1260: 29 20 2a 2f 20 20 20 20 20 20 20 20 20 5c 0a 20  ) */         \. 
1270: 20 22 66 72 6f 6d 5f 74 62 6c 2c 22 20 20 20 20   "from_tbl,"    
1280: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1290: 20 74 61 62 6c 65 20 2a 2f 20 20 20 20 20 20 20   table */       
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
12c0: 22 66 6b 69 64 2c 22 20 20 20 20 20 20 20 20 20  "fkid,"         
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22             \.  "
1310: 73 65 71 2c 22 20 20 20 20 20 20 20 20 20 20 20  seq,"           
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74            \.  "t
1360: 6f 5f 74 62 6c 2c 22 20 20 20 20 20 20 20 20 20  o_tbl,"         
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 66 72           \.  "fr
13b0: 6f 6d 5f 63 6f 6c 2c 22 20 20 20 20 20 20 20 20  om_col,"        
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74 6f 5f          \.  "to_
1400: 63 6f 6c 2c 22 20 20 20 20 20 20 20 20 20 20 20  col,"           
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 5c 0a 20 20 22 6f 6e 5f 75         \.  "on_u
1450: 70 64 61 74 65 2c 22 20 20 20 20 20 20 20 20 20  pdate,"         
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 5c 0a 20 20 22 6f 6e 5f 64 65        \.  "on_de
14a0: 6c 65 74 65 2c 22 20 20 20 20 20 20 20 20 20 20  lete,"          
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 20 20 20 20 5c 0a 20 20 22 6d 61 74 63 68 22       \.  "match"
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 5c 0a 22 29 22 0a 0a 23 64 65 66 69      \.")"..#defi
1540: 6e 65 20 53 43 48 45 4d 41 33 20 5c 0a 22 43 52  ne SCHEMA3 \."CR
1550: 45 41 54 45 20 54 41 42 4c 45 20 78 28 22 20 20  EATE TABLE x("  
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 64            \.  "d
15a0: 61 74 61 62 61 73 65 2c 22 20 20 20 20 20 20 20  atabase,"       
15b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61     /* Name of da
15c0: 74 61 62 61 73 65 20 28 69 2e 65 2e 20 6d 61 69  tabase (i.e. mai
15d0: 6e 2c 20 74 65 6d 70 20 65 74 63 2e 29 20 2a 2f  n, temp etc.) */
15e0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74 61           \.  "ta
15f0: 62 6c 65 6e 61 6d 65 2c 22 20 20 20 20 20 20 20  blename,"       
1600: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
1610: 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  le */           
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 73 65 71          \.  "seq
1640: 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,"              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 5c 0a 20 20 22 6e 61 6d 65         \.  "name
1690: 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,"              
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 20 5c 0a 20 20 22 69 73 75 6e 69        \.  "isuni
16e0: 71 75 65 22 20 20 20 20 20 20 20 20 20 20 20 20  que"            
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 20 20 20 5c 0a 22 29 22 0a 0a 23 64 65 66       \.")"..#def
1730: 69 6e 65 20 53 43 48 45 4d 41 34 20 5c 0a 22 43  ine SCHEMA4 \."C
1740: 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 22 20  REATE TABLE x(" 
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22             \.  "
1790: 64 61 74 61 62 61 73 65 2c 22 20 20 20 20 20 20  database,"      
17a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
17b0: 61 74 61 62 61 73 65 20 28 69 2e 65 2e 20 6d 61  atabase (i.e. ma
17c0: 69 6e 2c 20 74 65 6d 70 20 65 74 63 2e 29 20 2a  in, temp etc.) *
17d0: 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 69  /         \.  "i
17e0: 6e 64 65 78 6e 61 6d 65 2c 22 20 20 20 20 20 20  ndexname,"      
17f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
1800: 62 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ble */          
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 73 65           \.  "se
1830: 71 6e 6f 2c 22 20 20 20 20 20 20 20 20 20 20 20  qno,"           
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 63 69 64          \.  "cid
1880: 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,"              
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 20 20 20 5c 0a 20 20 22 6e 61 6d 65         \.  "name
18d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 20 20 20 5c 0a 22 29 22 0a 0a 23 64 65        \.")"..#de
1920: 66 69 6e 65 20 53 43 48 45 4d 41 35 20 5c 0a 22  fine SCHEMA5 \."
1930: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 22  CREATE TABLE x("
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1980: 22 64 61 74 61 62 61 73 65 2c 22 20 20 20 20 20  "database,"     
1990: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
19a0: 64 61 74 61 62 61 73 65 20 28 69 2e 65 2e 20 6d  database (i.e. m
19b0: 61 69 6e 2c 20 74 65 6d 70 20 65 74 63 2e 29 20  ain, temp etc.) 
19c0: 2a 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22  */         \.  "
19d0: 74 72 69 67 67 65 72 6e 61 6d 65 2c 22 20 20 20  triggername,"   
19e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
19f0: 72 69 67 67 65 72 20 2a 2f 20 20 20 20 20 20 20  rigger */       
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 64            \.  "d
1a20: 75 6d 6d 79 22 20 20 20 20 20 20 20 20 20 20 20  ummy"           
1a30: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 20     /* Unused */ 
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 5c 0a 22 29 22 0a 0a           \.")"..
1a70: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1a80: 63 68 65 6d 61 54 61 62 6c 65 20 53 63 68 65 6d  chemaTable Schem
1a90: 61 54 61 62 6c 65 3b 0a 73 74 72 75 63 74 20 53  aTable;.struct S
1aa0: 63 68 65 6d 61 54 61 62 6c 65 20 7b 0a 20 20 63  chemaTable {.  c
1ab0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1ac0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1ad0: 7a 4f 62 6a 65 63 74 3b 0a 20 20 63 6f 6e 73 74  zObject;.  const
1ae0: 20 63 68 61 72 20 2a 7a 50 72 61 67 6d 61 3b 0a   char *zPragma;.
1af0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1b00: 63 68 65 6d 61 3b 0a 7d 20 61 53 63 68 65 6d 61  chema;.} aSchema
1b10: 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 7b 20  Table[] = {.  { 
1b20: 22 74 61 62 6c 65 5f 69 6e 66 6f 22 2c 20 20 20  "table_info",   
1b30: 20 20 20 20 22 74 61 62 6c 65 22 2c 20 22 50 52      "table", "PR
1b40: 41 47 4d 41 20 25 51 2e 74 61 62 6c 65 5f 69 6e  AGMA %Q.table_in
1b50: 66 6f 28 25 51 29 22 2c 20 20 20 20 20 20 20 53  fo(%Q)",       S
1b60: 43 48 45 4d 41 20 7d 2c 0a 20 20 7b 20 22 66 6f  CHEMA },.  { "fo
1b70: 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 22 2c  reign_key_list",
1b80: 20 22 74 61 62 6c 65 22 2c 20 22 50 52 41 47 4d   "table", "PRAGM
1b90: 41 20 25 51 2e 66 6f 72 65 69 67 6e 5f 6b 65 79  A %Q.foreign_key
1ba0: 5f 6c 69 73 74 28 25 51 29 22 2c 20 53 43 48 45  _list(%Q)", SCHE
1bb0: 4d 41 32 20 7d 2c 0a 20 20 7b 20 22 69 6e 64 65  MA2 },.  { "inde
1bc0: 78 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20 22  x_list",       "
1bd0: 74 61 62 6c 65 22 2c 20 22 50 52 41 47 4d 41 20  table", "PRAGMA 
1be0: 25 51 2e 69 6e 64 65 78 5f 6c 69 73 74 28 25 51  %Q.index_list(%Q
1bf0: 29 22 2c 20 20 20 20 20 20 20 53 43 48 45 4d 41  )",       SCHEMA
1c00: 33 20 7d 2c 0a 20 20 7b 20 22 69 6e 64 65 78 5f  3 },.  { "index_
1c10: 69 6e 66 6f 22 2c 20 20 20 20 20 20 20 22 69 6e  info",       "in
1c20: 64 65 78 22 2c 20 22 50 52 41 47 4d 41 20 25 51  dex", "PRAGMA %Q
1c30: 2e 69 6e 64 65 78 5f 69 6e 66 6f 28 25 51 29 22  .index_info(%Q)"
1c40: 2c 20 20 20 20 20 20 20 53 43 48 45 4d 41 34 20  ,       SCHEMA4 
1c50: 7d 2c 0a 20 20 7b 20 22 74 72 69 67 67 65 72 5f  },.  { "trigger_
1c60: 6c 69 73 74 22 2c 20 20 20 20 20 22 74 72 69 67  list",     "trig
1c70: 67 65 72 22 2c 20 22 53 45 4c 45 43 54 20 31 22  ger", "SELECT 1"
1c80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c90: 20 20 20 20 20 20 53 43 48 45 4d 41 35 20 7d 2c        SCHEMA5 },
1ca0: 0a 20 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30 20  .  { 0, 0, 0, 0 
1cb0: 7d 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  }.};..typedef st
1cc0: 72 75 63 74 20 73 63 68 65 6d 61 5f 76 74 61 62  ruct schema_vtab
1cd0: 20 73 63 68 65 6d 61 5f 76 74 61 62 3b 0a 74 79   schema_vtab;.ty
1ce0: 70 65 64 65 66 20 73 74 72 75 63 74 20 73 63 68  pedef struct sch
1cf0: 65 6d 61 5f 63 75 72 73 6f 72 20 73 63 68 65 6d  ema_cursor schem
1d00: 61 5f 63 75 72 73 6f 72 3b 0a 0a 2f 2a 20 41 20  a_cursor;../* A 
1d10: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 6f 62 6a  schema table obj
1d20: 65 63 74 20 2a 2f 0a 73 74 72 75 63 74 20 73 63  ect */.struct sc
1d30: 68 65 6d 61 5f 76 74 61 62 20 7b 0a 20 20 73 71  hema_vtab {.  sq
1d40: 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b  lite3_vtab base;
1d50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1d60: 20 20 53 63 68 65 6d 61 54 61 62 6c 65 20 2a 70    SchemaTable *p
1d70: 54 79 70 65 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73  Type;.};../* A s
1d80: 63 68 65 6d 61 20 74 61 62 6c 65 20 63 75 72 73  chema table curs
1d90: 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72  or object */.str
1da0: 75 63 74 20 73 63 68 65 6d 61 5f 63 75 72 73 6f  uct schema_curso
1db0: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  r {.  sqlite3_vt
1dc0: 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 0a  ab_cursor base;.
1dd0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1de0: 70 44 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  pDbList;.  sqlit
1df0: 65 33 5f 73 74 6d 74 20 2a 70 54 61 62 6c 65 4c  e3_stmt *pTableL
1e00: 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ist;.  sqlite3_s
1e10: 74 6d 74 20 2a 70 43 6f 6c 75 6d 6e 4c 69 73 74  tmt *pColumnList
1e20: 3b 0a 20 20 69 6e 74 20 72 6f 77 69 64 3b 0a 7d  ;.  int rowid;.}
1e30: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 64  ;../*.** Table d
1e40: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
1e50: 65 20 73 63 68 65 6d 61 20 6d 6f 64 75 6c 65 2e  e schema module.
1e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1e70: 63 68 65 6d 61 44 65 73 74 72 6f 79 28 73 71 6c  chemaDestroy(sql
1e80: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1e90: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
1ea0: 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75  e(pVtab);.  retu
1eb0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
1ec0: 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72  able constructor
1ed0: 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20   for the schema 
1ee0: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
1ef0: 63 20 69 6e 74 20 73 63 68 65 6d 61 43 72 65 61  c int schemaCrea
1f00: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
1f10: 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
1f20: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
1f30: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
1f40: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
1f50: 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20  tab **ppVtab,.  
1f60: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
1f70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f80: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 63 68 65 6d  E_NOMEM;.  schem
1f90: 61 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20  a_vtab *pVtab;. 
1fa0: 20 53 63 68 65 6d 61 54 61 62 6c 65 20 2a 70 54   SchemaTable *pT
1fb0: 79 70 65 20 3d 20 26 61 53 63 68 65 6d 61 54 61  ype = &aSchemaTa
1fc0: 62 6c 65 5b 30 5d 3b 0a 0a 20 20 55 4e 55 53 45  ble[0];..  UNUSE
1fd0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 7a 45 72  D_PARAMETER(pzEr
1fe0: 72 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 33  r);.  if( argc>3
1ff0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2000: 20 20 20 70 54 79 70 65 20 3d 20 30 3b 0a 20 20     pType = 0;.  
2010: 20 20 66 6f 72 28 69 3d 30 3b 20 61 53 63 68 65    for(i=0; aSche
2020: 6d 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d 65  maTable[i].zName
2030: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
2040: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 61 72 67  f( 0==strcmp(arg
2050: 76 5b 33 5d 2c 20 61 53 63 68 65 6d 61 54 61 62  v[3], aSchemaTab
2060: 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  le[i].zName) ){.
2070: 20 20 20 20 20 20 20 20 70 54 79 70 65 20 3d 20          pType = 
2080: 26 61 53 63 68 65 6d 61 54 61 62 6c 65 5b 69 5d  &aSchemaTable[i]
2090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20a0: 20 20 20 20 69 66 28 20 21 70 54 79 70 65 20 29      if( !pType )
20b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20c0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
20d0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 56 74 61 62 20   }.  }..  pVtab 
20e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
20f0: 28 73 69 7a 65 6f 66 28 73 63 68 65 6d 61 5f 76  (sizeof(schema_v
2100: 74 61 62 29 29 3b 0a 20 20 69 66 28 20 70 56 74  tab));.  if( pVt
2110: 61 62 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  ab ){.    memset
2120: 28 70 56 74 61 62 2c 20 30 2c 20 73 69 7a 65 6f  (pVtab, 0, sizeo
2130: 66 28 73 63 68 65 6d 61 5f 76 74 61 62 29 29 3b  f(schema_vtab));
2140: 0a 20 20 20 20 70 56 74 61 62 2d 3e 64 62 20 3d  .    pVtab->db =
2150: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41 75 78   (sqlite3 *)pAux
2160: 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 70 54 79  ;.    pVtab->pTy
2170: 70 65 20 3d 20 70 54 79 70 65 3b 0a 20 20 20 20  pe = pType;.    
2180: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63  rc = sqlite3_dec
2190: 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 70 54  lare_vtab(db, pT
21a0: 79 70 65 2d 3e 7a 53 63 68 65 6d 61 29 3b 0a 20  ype->zSchema);. 
21b0: 20 7d 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28   }.  *ppVtab = (
21c0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70  sqlite3_vtab *)p
21d0: 56 74 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72  Vtab;.  return r
21e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
21f0: 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 6f 6e   a new cursor on
2200: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
2210: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2220: 20 73 63 68 65 6d 61 4f 70 65 6e 28 73 71 6c 69   schemaOpen(sqli
2230: 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c  te3_vtab *pVTab,
2240: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
2250: 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
2260: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2270: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 63 68  ITE_NOMEM;.  sch
2280: 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ema_cursor *pCur
2290: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
22a0: 45 54 45 52 28 70 56 54 61 62 29 3b 0a 20 20 70  ETER(pVTab);.  p
22b0: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Cur = sqlite3_ma
22c0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73 63 68 65  lloc(sizeof(sche
22d0: 6d 61 5f 63 75 72 73 6f 72 29 29 3b 0a 20 20 69  ma_cursor));.  i
22e0: 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 6d  f( pCur ){.    m
22f0: 65 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73  emset(pCur, 0, s
2300: 69 7a 65 6f 66 28 73 63 68 65 6d 61 5f 63 75 72  izeof(schema_cur
2310: 73 6f 72 29 29 3b 0a 20 20 20 20 2a 70 70 43 75  sor));.    *ppCu
2320: 72 73 6f 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  rsor = (sqlite3_
2330: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 29 70 43  vtab_cursor *)pC
2340: 75 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ur;.    rc = SQL
2350: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
2360: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2370: 2a 20 43 6c 6f 73 65 20 61 20 73 63 68 65 6d 61  * Close a schema
2380: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a   table cursor..*
2390: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
23a0: 65 6d 61 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  emaClose(sqlite3
23b0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
23c0: 72 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72  r){.  schema_cur
23d0: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68  sor *pCur = (sch
23e0: 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72  ema_cursor *)cur
23f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
2400: 6c 69 7a 65 28 70 43 75 72 2d 3e 70 44 62 4c 69  lize(pCur->pDbLi
2410: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  st);.  sqlite3_f
2420: 69 6e 61 6c 69 7a 65 28 70 43 75 72 2d 3e 70 54  inalize(pCur->pT
2430: 61 62 6c 65 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ableList);.  sql
2440: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
2450: 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 29  ur->pColumnList)
2460: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2470: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
2480: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
2490: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6c 75 6d  tatic void colum
24a0: 6e 54 6f 52 65 73 75 6c 74 28 73 71 6c 69 74 65  nToResult(sqlite
24b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
24c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
24d0: 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  tmt, int iCol){.
24e0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
24f0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
2500: 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20  tmt, iCol) ){.  
2510: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
2520: 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL:.      sqlite
2530: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 74  3_result_null(ct
2540: 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
2550: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2560: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
2570: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2580: 6e 74 36 34 28 63 74 78 2c 20 73 71 6c 69 74 65  nt64(ctx, sqlite
2590: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
25a0: 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20  Stmt, iCol));.  
25b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
25c0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
25d0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
25e0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 74  result_double(ct
25f0: 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  x, sqlite3_colum
2600: 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  n_double(pStmt, 
2610: 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 62 72  iCol));.      br
2620: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2630: 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20  LITE_TEXT: {.   
2640: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2650: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2660: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2670: 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c  text(pStmt, iCol
2680: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2690: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
26a0: 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
26b0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
26c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72   }.}../*.** Retr
26e0: 69 65 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  ieve a column of
26f0: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
2700: 20 69 6e 74 20 73 63 68 65 6d 61 43 6f 6c 75 6d   int schemaColum
2710: 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  n(sqlite3_vtab_c
2720: 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69  ursor *cur, sqli
2730: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
2740: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 73 63 68 65  , int i){.  sche
2750: 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  ma_cursor *pCur 
2760: 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  = (schema_cursor
2770: 20 2a 29 63 75 72 3b 0a 20 20 73 77 69 74 63 68   *)cur;.  switch
2780: 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ( i ){.    case 
2790: 30 3a 0a 20 20 20 20 20 20 63 6f 6c 75 6d 6e 54  0:.      columnT
27a0: 6f 52 65 73 75 6c 74 28 63 74 78 2c 20 70 43 75  oResult(ctx, pCu
27b0: 72 2d 3e 70 44 62 4c 69 73 74 2c 20 31 29 3b 0a  r->pDbList, 1);.
27c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27d0: 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 63   case 1:.      c
27e0: 6f 6c 75 6d 6e 54 6f 52 65 73 75 6c 74 28 63 74  olumnToResult(ct
27f0: 78 2c 20 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c  x, pCur->pTableL
2800: 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ist, 0);.      b
2810: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
2820: 74 3a 0a 20 20 20 20 20 20 63 6f 6c 75 6d 6e 54  t:.      columnT
2830: 6f 52 65 73 75 6c 74 28 63 74 78 2c 20 70 43 75  oResult(ctx, pCu
2840: 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 2c 20  r->pColumnList, 
2850: 69 2d 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  i-2);.      brea
2860: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2870: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2880: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 74 68 65  .** Retrieve the
2890: 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a   current rowid..
28a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63  */.static int sc
28b0: 68 65 6d 61 52 6f 77 69 64 28 73 71 6c 69 74 65  hemaRowid(sqlite
28c0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
28d0: 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ur, sqlite_int64
28e0: 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 73 63 68   *pRowid){.  sch
28f0: 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ema_cursor *pCur
2900: 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f   = (schema_curso
2910: 72 20 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77  r *)cur;.  *pRow
2920: 69 64 20 3d 20 70 43 75 72 2d 3e 72 6f 77 69 64  id = pCur->rowid
2930: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2940: 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
2950: 69 6e 74 20 66 69 6e 61 6c 69 7a 65 28 73 71 6c  int finalize(sql
2960: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
2970: 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  mt){.  int rc = 
2980: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2990: 28 2a 70 70 53 74 6d 74 29 3b 0a 20 20 2a 70 70  (*ppStmt);.  *pp
29a0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  Stmt = 0;.  retu
29b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
29c0: 20 69 6e 74 20 73 63 68 65 6d 61 45 6f 66 28 73   int schemaEof(s
29d0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
29e0: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 63 68 65  or *cur){.  sche
29f0: 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  ma_cursor *pCur 
2a00: 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  = (schema_cursor
2a10: 20 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e   *)cur;.  return
2a20: 20 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 20   (pCur->pDbList 
2a30: 3f 20 30 20 3a 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  ? 0 : 1);.}../*.
2a40: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
2a50: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
2a60: 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
2a70: 20 69 6e 74 20 73 63 68 65 6d 61 4e 65 78 74 28   int schemaNext(
2a80: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
2a90: 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 69 6e 74  sor *cur){.  int
2aa0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ab0: 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  .  schema_cursor
2ac0: 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61   *pCur = (schema
2ad0: 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  _cursor *)cur;. 
2ae0: 20 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 70 56   schema_vtab *pV
2af0: 74 61 62 20 3d 20 28 73 63 68 65 6d 61 5f 76 74  tab = (schema_vt
2b00: 61 62 20 2a 29 28 63 75 72 2d 3e 70 56 74 61 62  ab *)(cur->pVtab
2b10: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  );.  char *zSql 
2b20: 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 21  = 0;..  while( !
2b30: 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73  pCur->pColumnLis
2b40: 74 20 7c 7c 20 53 51 4c 49 54 45 5f 52 4f 57 21  t || SQLITE_ROW!
2b50: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43  =sqlite3_step(pC
2b60: 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 29  ur->pColumnList)
2b70: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
2b80: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 69 6e  TE_OK!=(rc = fin
2b90: 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70 43 6f  alize(&pCur->pCo
2ba0: 6c 75 6d 6e 4c 69 73 74 29 29 20 29 20 67 6f 74  lumnList)) ) got
2bb0: 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a 0a 20 20  o next_exit;..  
2bc0: 20 20 77 68 69 6c 65 28 20 21 70 43 75 72 2d 3e    while( !pCur->
2bd0: 70 54 61 62 6c 65 4c 69 73 74 20 7c 7c 20 53 51  pTableList || SQ
2be0: 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65  LITE_ROW!=sqlite
2bf0: 33 5f 73 74 65 70 28 70 43 75 72 2d 3e 70 54 61  3_step(pCur->pTa
2c00: 62 6c 65 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  bleList) ){.    
2c10: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
2c20: 3d 28 72 63 20 3d 20 66 69 6e 61 6c 69 7a 65 28  =(rc = finalize(
2c30: 26 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73  &pCur->pTableLis
2c40: 74 29 29 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f  t)) ) goto next_
2c50: 65 78 69 74 3b 0a 0a 20 20 20 20 20 20 61 73 73  exit;..      ass
2c60: 65 72 74 28 70 43 75 72 2d 3e 70 44 62 4c 69 73  ert(pCur->pDbLis
2c70: 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
2c80: 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c   SQLITE_ROW!=sql
2c90: 69 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d 3e  ite3_step(pCur->
2ca0: 70 44 62 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  pDbList) ){.    
2cb0: 20 20 20 20 72 63 20 3d 20 66 69 6e 61 6c 69 7a      rc = finaliz
2cc0: 65 28 26 70 43 75 72 2d 3e 70 44 62 4c 69 73 74  e(&pCur->pDbList
2cd0: 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
2ce0: 6e 65 78 74 5f 65 78 69 74 3b 0a 20 20 20 20 20  next_exit;.     
2cf0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
2d00: 20 7a 53 71 6c 20 74 6f 20 74 68 65 20 53 51 4c   zSql to the SQL
2d10: 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 6c 69 73   to pull the lis
2d20: 74 20 6f 66 20 74 61 62 6c 65 73 20 66 72 6f 6d  t of tables from
2d30: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
2d40: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 28 6f 72  qlite_master (or
2d50: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
2d60: 74 65 72 29 20 74 61 62 6c 65 20 6f 66 20 74 68  ter) table of th
2d70: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
2d80: 20 2a 2a 20 69 64 65 6e 74 66 69 65 64 20 62 79   ** identfied by
2d90: 20 74 68 65 20 72 6f 77 20 70 6f 69 6e 74 65 64   the row pointed
2da0: 20 74 6f 20 62 79 20 74 68 65 20 53 51 4c 20 73   to by the SQL s
2db0: 74 61 74 65 6d 65 6e 74 20 70 43 75 72 2d 3e 70  tatement pCur->p
2dc0: 44 62 4c 69 73 74 0a 20 20 20 20 20 20 2a 2a 20  DbList.      ** 
2dd0: 28 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75  (iterating throu
2de0: 67 68 20 61 20 22 50 52 41 47 4d 41 20 64 61 74  gh a "PRAGMA dat
2df0: 61 62 61 73 65 5f 6c 69 73 74 3b 22 20 73 74 61  abase_list;" sta
2e00: 74 65 6d 65 6e 74 29 2e 0a 20 20 20 20 20 20 2a  tement)..      *
2e10: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
2e20: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
2e30: 43 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20 30 29  Cur->pDbList, 0)
2e40: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==1 ){.        z
2e50: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2e60: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2e70: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
2e80: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
2e90: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79  _master WHERE ty
2ea0: 70 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  pe=%Q",.        
2eb0: 20 20 20 20 70 56 74 61 62 2d 3e 70 54 79 70 65      pVtab->pType
2ec0: 2d 3e 7a 4f 62 6a 65 63 74 0a 20 20 20 20 20 20  ->zObject.      
2ed0: 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65    );.      }else
2ee0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2ef0: 33 5f 73 74 6d 74 20 2a 70 44 62 4c 69 73 74 20  3_stmt *pDbList 
2f00: 3d 20 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 3b  = pCur->pDbList;
2f10: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
2f20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45  .            "SE
2f40: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25  LECT name FROM %
2f50: 51 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  Q.sqlite_master 
2f60: 57 48 45 52 45 20 74 79 70 65 3d 25 51 22 2c 0a  WHERE type=%Q",.
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2f80: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2f90: 28 70 44 62 4c 69 73 74 2c 20 31 29 2c 20 70 56  (pDbList, 1), pV
2fa0: 74 61 62 2d 3e 70 54 79 70 65 2d 3e 7a 4f 62 6a  tab->pType->zObj
2fb0: 65 63 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ect.        );. 
2fc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2fd0: 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20   !zSql ){.      
2fe0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2ff0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
3000: 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a 20 20 20  o next_exit;.   
3010: 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
3020: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
3030: 28 70 56 74 61 62 2d 3e 64 62 2c 20 7a 53 71 6c  (pVtab->db, zSql
3040: 2c 20 2d 31 2c 20 26 70 43 75 72 2d 3e 70 54 61  , -1, &pCur->pTa
3050: 62 6c 65 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  bleList, 0);.   
3060: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3070: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  zSql);.      if(
3080: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3090: 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b   goto next_exit;
30a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
30b0: 65 74 20 7a 53 71 6c 20 74 6f 20 74 68 65 20 53  et zSql to the S
30c0: 51 4c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 5f  QL to the table_
30d0: 69 6e 66 6f 20 70 72 61 67 6d 61 20 66 6f 72 20  info pragma for 
30e0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
30f0: 74 6c 79 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74  tly.    ** ident
3100: 69 66 69 65 64 20 62 79 20 74 68 65 20 72 6f 77  ified by the row
3110: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
3120: 73 74 61 74 65 6d 65 6e 74 73 20 70 43 75 72 2d  statements pCur-
3130: 3e 70 44 62 4c 69 73 74 20 61 6e 64 0a 20 20 20  >pDbList and.   
3140: 20 2a 2a 20 70 43 75 72 2d 3e 70 54 61 62 6c 65   ** pCur->pTable
3150: 4c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  List..    */.   
3160: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
3170: 6d 70 72 69 6e 74 66 28 70 56 74 61 62 2d 3e 70  mprintf(pVtab->p
3180: 54 79 70 65 2d 3e 7a 50 72 61 67 6d 61 2c 0a 20  Type->zPragma,. 
3190: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
31a0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 75 72 2d  olumn_text(pCur-
31b0: 3e 70 44 62 4c 69 73 74 2c 20 31 29 2c 0a 20 20  >pDbList, 1),.  
31c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
31d0: 6c 75 6d 6e 5f 74 65 78 74 28 70 43 75 72 2d 3e  lumn_text(pCur->
31e0: 70 54 61 62 6c 65 4c 69 73 74 2c 20 30 29 0a 20  pTableList, 0). 
31f0: 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 21     );..    if( !
3200: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  zSql ){.      rc
3210: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
3220: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 65 78 74  .      goto next
3230: 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
3240: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
3250: 65 70 61 72 65 28 70 56 74 61 62 2d 3e 64 62 2c  epare(pVtab->db,
3260: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72   zSql, -1, &pCur
3270: 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 2c 20 30  ->pColumnList, 0
3280: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
3290: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
32a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32b0: 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69   ) goto next_exi
32c0: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 72  t;.  }.  pCur->r
32d0: 6f 77 69 64 2b 2b 3b 0a 0a 6e 65 78 74 5f 65 78  owid++;..next_ex
32e0: 69 74 3a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 48  it:.  /* TODO: H
32f0: 61 6e 64 6c 65 20 72 63 20 2a 2f 0a 20 20 72 65  andle rc */.  re
3300: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3310: 2a 20 52 65 73 65 74 20 61 20 73 63 68 65 6d 61  * Reset a schema
3320: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a   table cursor..*
3330: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
3340: 65 6d 61 46 69 6c 74 65 72 28 0a 20 20 73 71 6c  emaFilter(.  sql
3350: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
3360: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a   *pVtabCursor, .
3370: 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f    int idxNum, co
3380: 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72  nst char *idxStr
3390: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71  ,.  int argc, sq
33a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
33b0: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gv.){.  int rc;.
33c0: 20 20 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 70    schema_vtab *p
33d0: 56 74 61 62 20 3d 20 28 73 63 68 65 6d 61 5f 76  Vtab = (schema_v
33e0: 74 61 62 20 2a 29 28 70 56 74 61 62 43 75 72 73  tab *)(pVtabCurs
33f0: 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 73 63  or->pVtab);.  sc
3400: 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75  hema_cursor *pCu
3410: 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73  r = (schema_curs
3420: 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72  or *)pVtabCursor
3430: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
3440: 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20  ETER(idxNum);.  
3450: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3460: 28 69 64 78 53 74 72 29 3b 0a 20 20 55 4e 55 53  (idxStr);.  UNUS
3470: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
3480: 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
3490: 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a 20 20  AMETER(argv);.  
34a0: 70 43 75 72 2d 3e 72 6f 77 69 64 20 3d 20 30 3b  pCur->rowid = 0;
34b0: 0a 20 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75  .  finalize(&pCu
34c0: 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 29 3b 0a  r->pTableList);.
34d0: 20 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72    finalize(&pCur
34e0: 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 29 3b 0a  ->pColumnList);.
34f0: 20 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72    finalize(&pCur
3500: 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 72 63  ->pDbList);.  rc
3510: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
3520: 72 65 28 70 56 74 61 62 2d 3e 64 62 2c 22 53 45  re(pVtab->db,"SE
3530: 4c 45 43 54 20 30 2c 20 27 6d 61 69 6e 27 22 2c  LECT 0, 'main'",
3540: 20 2d 31 2c 20 26 70 43 75 72 2d 3e 70 44 62 4c   -1, &pCur->pDbL
3550: 69 73 74 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ist, 0);.  retur
3560: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
3570: 20 3f 20 73 63 68 65 6d 61 4e 65 78 74 28 70 56   ? schemaNext(pV
3580: 74 61 62 43 75 72 73 6f 72 29 20 3a 20 72 63 29  tabCursor) : rc)
3590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
35a0: 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6f 6e  se the WHERE con
35b0: 64 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  dition..*/.stati
35c0: 63 20 69 6e 74 20 73 63 68 65 6d 61 42 65 73 74  c int schemaBest
35d0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74  Index(sqlite3_vt
35e0: 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33  ab *tab, sqlite3
35f0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
3600: 78 49 6e 66 6f 29 7b 0a 20 20 55 4e 55 53 45 44  xInfo){.  UNUSED
3610: 5f 50 41 52 41 4d 45 54 45 52 28 74 61 62 29 3b  _PARAMETER(tab);
3620: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
3630: 54 45 52 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20  TER(pIdxInfo);. 
3640: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3650: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 69  K;.}../*.** A vi
3660: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
3670: 6c 65 20 74 68 61 74 20 6d 65 72 65 6c 79 20 65  le that merely e
3680: 63 68 6f 73 20 6d 65 74 68 6f 64 20 63 61 6c 6c  chos method call
3690: 73 20 69 6e 74 6f 20 54 43 4c 0a 2a 2a 20 76 61  s into TCL.** va
36a0: 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  riables..*/.stat
36b0: 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  ic sqlite3_modul
36c0: 65 20 73 63 68 65 6d 61 4d 6f 64 75 6c 65 20 3d  e schemaModule =
36d0: 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20   {.  0,         
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
3700: 0a 20 20 73 63 68 65 6d 61 43 72 65 61 74 65 2c  .  schemaCreate,
3710: 0a 20 20 73 63 68 65 6d 61 43 72 65 61 74 65 2c  .  schemaCreate,
3720: 0a 20 20 73 63 68 65 6d 61 42 65 73 74 49 6e 64  .  schemaBestInd
3730: 65 78 2c 0a 20 20 73 63 68 65 6d 61 44 65 73 74  ex,.  schemaDest
3740: 72 6f 79 2c 0a 20 20 73 63 68 65 6d 61 44 65 73  roy,.  schemaDes
3750: 74 72 6f 79 2c 0a 20 20 73 63 68 65 6d 61 4f 70  troy,.  schemaOp
3760: 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
3770: 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
3780: 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
3790: 0a 20 20 73 63 68 65 6d 61 43 6c 6f 73 65 2c 20  .  schemaClose, 
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b0: 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73  /* xClose - clos
37c0: 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
37d0: 73 63 68 65 6d 61 46 69 6c 74 65 72 2c 20 20 20  schemaFilter,   
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37f0: 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67  xFilter - config
3800: 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61  ure scan constra
3810: 69 6e 74 73 20 2a 2f 0a 20 20 73 63 68 65 6d 61  ints */.  schema
3820: 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
3830: 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
3840: 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
3850: 6f 72 20 2a 2f 0a 20 20 73 63 68 65 6d 61 45 6f  or */.  schemaEo
3860: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
3870: 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a       /* xEof */.
3880: 20 20 73 63 68 65 6d 61 43 6f 6c 75 6d 6e 2c 20    schemaColumn, 
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38a0: 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
38b0: 20 64 61 74 61 20 2a 2f 0a 20 20 73 63 68 65 6d   data */.  schem
38c0: 61 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  aRowid,         
38d0: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
38e0: 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
38f0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3910: 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20  /* xUpdate */.  
3920: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3940: 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20  xBegin */.  0,  
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
3970: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a      /* xCommit *
39a0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f   /* xRollback */
39d0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39f0: 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a  /* xFindMethod *
3a00: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 7d   /* xRename */.}
3a30: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 73 69  ;../*.** Extensi
3a40: 6f 6e 20 6c 6f 61 64 20 66 75 6e 63 74 69 6f 6e  on load function
3a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3a60: 69 6e 73 74 61 6c 6c 53 63 68 65 6d 61 4d 6f 64  installSchemaMod
3a70: 75 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ule(sqlite3 *db,
3a80: 20 73 71 6c 69 74 65 33 20 2a 73 64 62 29 7b 0a   sqlite3 *sdb){.
3a90: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
3aa0: 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73 63 68  _module(db, "sch
3ab0: 65 6d 61 22 2c 20 26 73 63 68 65 6d 61 4d 6f 64  ema", &schemaMod
3ac0: 75 6c 65 2c 20 28 76 6f 69 64 20 2a 29 73 64 62  ule, (void *)sdb
3ad0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
3ae0: 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 6a 28 7a 56 61  ../*.**   sj(zVa
3af0: 6c 75 65 2c 20 7a 4a 6f 69 6e 29 0a 2a 2a 0a 2a  lue, zJoin).**.*
3b00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3b10: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
3b20: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
3b30: 6e 20 6f 66 20 61 6e 20 61 67 67 72 65 67 61 74  n of an aggregat
3b40: 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74  e .** function t
3b50: 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 73 74  hat returns a st
3b60: 72 69 6e 67 2e 20 45 61 63 68 20 74 69 6d 65 20  ring. Each time 
3b70: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
3b80: 73 74 65 70 70 65 64 2c 20 0a 2a 2a 20 69 74 20  stepped, .** it 
3b90: 61 70 70 65 6e 64 73 20 64 61 74 61 20 74 6f 20  appends data to 
3ba0: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 62 75 66 66  an internal buff
3bb0: 65 72 2e 20 57 68 65 6e 20 74 68 65 20 61 67 67  er. When the agg
3bc0: 72 65 67 61 74 65 20 69 73 20 66 69 6e 61 6c 69  regate is finali
3bd0: 7a 65 64 2c 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  zed,.** the cont
3be0: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  ents of the buff
3bf0: 65 72 20 61 72 65 20 72 65 74 75 72 6e 65 64 2e  er are returned.
3c00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
3c10: 20 74 69 6d 65 20 74 68 65 20 61 67 67 72 65 67   time the aggreg
3c20: 61 74 65 20 69 73 20 73 74 65 70 70 65 64 20 74  ate is stepped t
3c30: 68 65 20 62 75 66 66 65 72 20 69 73 20 73 65 74  he buffer is set
3c40: 20 74 6f 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66   to a copy.** of
3c50: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
3c60: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
3c70: 74 69 6d 65 20 61 6e 64 20 73 75 62 73 65 71 75  time and subsequ
3c80: 65 6e 74 20 74 69 6d 65 73 20 69 74 20 69 73 0a  ent times it is.
3c90: 2a 2a 20 73 74 65 70 70 65 64 20 61 20 63 6f 70  ** stepped a cop
3ca0: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
3cb0: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 70 70 65  argument is appe
3cc0: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
3cd0: 65 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 20 63 6f  er, then.** a co
3ce0: 70 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 2e  py of the first.
3cf0: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  .**.** Example:.
3d00: 2a 2a 0a 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  **.**   INSERT I
3d10: 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55 45 53  NTO t1(a) VALUES
3d20: 28 27 31 27 29 3b 0a 2a 2a 20 20 20 49 4e 53 45  ('1');.**   INSE
3d30: 52 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41  RT INTO t1(a) VA
3d40: 4c 55 45 53 28 27 32 27 29 3b 0a 2a 2a 20 20 20  LUES('2');.**   
3d50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
3d60: 29 20 56 41 4c 55 45 53 28 27 33 27 29 3b 0a 2a  ) VALUES('3');.*
3d70: 2a 20 20 20 53 45 4c 45 43 54 20 73 6a 28 61 2c  *   SELECT sj(a,
3d80: 20 27 2c 20 27 29 20 46 52 4f 4d 20 74 31 3b 0a   ', ') FROM t1;.
3d90: 2a 2a 0a 2a 2a 20 20 20 20 20 3d 3e 20 20 22 31  **.**     =>  "1
3da0: 2c 20 32 2c 20 33 22 0a 2a 2a 0a 2a 2f 0a 73 74  , 2, 3".**.*/.st
3db0: 72 75 63 74 20 53 74 72 42 75 66 66 65 72 20 7b  ruct StrBuffer {
3dc0: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 7d  .  char *zBuf;.}
3dd0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
3de0: 20 53 74 72 42 75 66 66 65 72 20 53 74 72 42 75   StrBuffer StrBu
3df0: 66 66 65 72 3b 0a 73 74 61 74 69 63 20 76 6f 69  ffer;.static voi
3e00: 64 20 6a 6f 69 6e 46 69 6e 61 6c 69 7a 65 28 73  d joinFinalize(s
3e10: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3e20: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 53 74 72 42  context){.  StrB
3e30: 75 66 66 65 72 20 2a 70 3b 0a 20 20 70 20 3d 20  uffer *p;.  p = 
3e40: 28 53 74 72 42 75 66 66 65 72 20 2a 29 73 71 6c  (StrBuffer *)sql
3e50: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3e60: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
3e70: 73 69 7a 65 6f 66 28 53 74 72 42 75 66 66 65 72  sizeof(StrBuffer
3e80: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ));.  sqlite3_re
3e90: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
3ea0: 74 2c 20 70 2d 3e 7a 42 75 66 2c 20 2d 31 2c 20  t, p->zBuf, -1, 
3eb0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
3ec0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3ed0: 65 28 70 2d 3e 7a 42 75 66 29 3b 0a 7d 0a 73 74  e(p->zBuf);.}.st
3ee0: 61 74 69 63 20 76 6f 69 64 20 6a 6f 69 6e 53 74  atic void joinSt
3ef0: 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ep(.  sqlite3_co
3f00: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
3f10: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
3f20: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
3f30: 67 76 0a 29 7b 0a 20 20 53 74 72 42 75 66 66 65  gv.){.  StrBuffe
3f40: 72 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50  r *p;.  UNUSED_P
3f50: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
3f60: 20 20 70 20 3d 20 28 53 74 72 42 75 66 66 65 72    p = (StrBuffer
3f70: 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65   *)sqlite3_aggre
3f80: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
3f90: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 53 74 72  text, sizeof(Str
3fa0: 42 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28 20  Buffer));.  if( 
3fb0: 70 2d 3e 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20  p->zBuf==0 ){.  
3fc0: 20 20 70 2d 3e 7a 42 75 66 20 3d 20 73 71 6c 69    p->zBuf = sqli
3fd0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
3fe0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
3ff0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 3b 0a  text(argv[0]));.
4000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
4010: 72 20 2a 7a 54 6d 70 20 3d 20 70 2d 3e 7a 42 75  r *zTmp = p->zBu
4020: 66 3b 0a 20 20 20 20 70 2d 3e 7a 42 75 66 20 3d  f;.    p->zBuf =
4030: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
4040: 28 22 25 73 25 73 25 73 22 2c 20 0a 20 20 20 20  ("%s%s%s", .    
4050: 20 20 20 20 7a 54 6d 70 2c 20 73 71 6c 69 74 65      zTmp, sqlite
4060: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
4070: 76 5b 31 5d 29 2c 20 73 71 6c 69 74 65 33 5f 76  v[1]), sqlite3_v
4080: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
4090: 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  ]).    );.    sq
40a0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 29  lite3_free(zTmp)
40b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  ;.  }.}../*.**  
40c0: 20 64 71 28 7a 53 74 72 69 6e 67 29 0a 2a 2a 0a   dq(zString).**.
40d0: 2a 2a 20 54 68 69 73 20 73 63 61 6c 61 72 20 66  ** This scalar f
40e0: 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20  unction accepts 
40f0: 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
4100: 74 20 61 6e 64 20 69 6e 74 65 72 70 72 65 74 73  t and interprets
4110: 20 69 74 20 61 73 0a 2a 2a 20 61 20 74 65 78 74   it as.** a text
4120: 20 76 61 6c 75 65 2e 20 54 68 65 20 72 65 74 75   value. The retu
4130: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
4140: 61 72 67 75 6d 65 6e 74 20 65 6e 63 6c 6f 73 65  argument enclose
4150: 64 20 69 6e 20 64 6f 75 62 6c 65 0a 2a 2a 20 71  d in double.** q
4160: 75 6f 74 65 73 2e 20 49 66 20 61 6e 79 20 64 6f  uotes. If any do
4170: 75 62 6c 65 20 71 75 6f 74 65 20 63 68 61 72 61  uble quote chara
4180: 63 74 65 72 73 20 61 72 65 20 70 72 65 73 65 6e  cters are presen
4190: 74 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  t in the argumen
41a0: 74 2c 20 0a 2a 2a 20 74 68 65 73 65 20 61 72 65  t, .** these are
41b0: 20 65 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   escaped..**.** 
41c0: 20 20 64 71 28 27 74 68 65 20 72 61 76 65 6e 20    dq('the raven 
41d0: 22 4e 65 76 65 72 6d 6f 72 65 2e 22 27 29 20 3d  "Nevermore."') =
41e0: 3d 20 27 22 74 68 65 20 72 61 76 65 6e 20 22 22  = '"the raven ""
41f0: 4e 65 76 65 72 6d 6f 72 65 2e 22 22 22 27 0a 2a  Nevermore."""'.*
4200: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f  /.static void do
4210: 75 62 6c 65 71 75 6f 74 65 28 0a 20 20 73 71 6c  ublequote(.  sql
4220: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
4230: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
4240: 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  gc, .  sqlite3_v
4250: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
4260: 20 69 6e 74 20 69 69 3b 0a 20 20 63 68 61 72 20   int ii;.  char 
4270: 2a 7a 4f 75 74 3b 0a 20 20 63 68 61 72 20 2a 7a  *zOut;.  char *z
4280: 43 73 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Csr;.  const cha
4290: 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20  r *zIn = (const 
42a0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
42b0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
42c0: 5d 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20  ]);.  int nIn = 
42d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
42e0: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20  tes(argv[0]);.. 
42f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4300: 52 28 61 72 67 63 29 3b 0a 20 20 7a 4f 75 74 20  R(argc);.  zOut 
4310: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
4320: 28 6e 49 6e 2a 32 2b 33 29 3b 0a 20 20 7a 43 73  (nIn*2+3);.  zCs
4330: 72 20 3d 20 7a 4f 75 74 3b 0a 20 20 2a 7a 43 73  r = zOut;.  *zCs
4340: 72 2b 2b 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72  r++ = '"';.  for
4350: 28 69 69 3d 30 3b 20 69 69 3c 6e 49 6e 3b 20 69  (ii=0; ii<nIn; i
4360: 69 2b 2b 29 7b 0a 20 20 20 20 2a 7a 43 73 72 2b  i++){.    *zCsr+
4370: 2b 20 3d 20 7a 49 6e 5b 69 69 5d 3b 0a 20 20 20  + = zIn[ii];.   
4380: 20 69 66 28 20 7a 49 6e 5b 69 69 5d 3d 3d 27 22   if( zIn[ii]=='"
4390: 27 20 29 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72  ' ){.      *zCsr
43a0: 2b 2b 20 3d 20 27 22 27 3b 0a 20 20 20 20 7d 0a  ++ = '"';.    }.
43b0: 20 20 7d 0a 20 20 2a 7a 43 73 72 2b 2b 20 3d 20    }.  *zCsr++ = 
43c0: 27 22 27 3b 0a 20 20 2a 7a 43 73 72 2b 2b 20 3d  '"';.  *zCsr++ =
43d0: 20 27 5c 30 27 3b 0a 0a 20 20 73 71 6c 69 74 65   '\0';..  sqlite
43e0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
43f0: 6e 74 65 78 74 2c 20 7a 4f 75 74 2c 20 2d 31 2c  ntext, zOut, -1,
4400: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4410: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  T);.  sqlite3_fr
4420: 65 65 28 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  ee(zOut);.}../*.
4430: 2a 2a 20 20 20 6d 75 6c 74 69 72 65 70 6c 61 63  **   multireplac
4440: 65 28 7a 53 74 72 69 6e 67 2c 20 7a 53 65 61 72  e(zString, zSear
4450: 63 68 31 2c 20 7a 52 65 70 6c 61 63 65 31 2c 20  ch1, zReplace1, 
4460: 2e 2e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ...).*/.static v
4470: 6f 69 64 20 6d 75 6c 74 69 72 65 70 6c 61 63 65  oid multireplace
4480: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
4490: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
44a0: 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71   int argc, .  sq
44b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
44c0: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  gv.){.  int i = 
44d0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  0;.  char *zOut 
44e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20  = 0;.  int nOut 
44f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4d 61 6c 6c  = 0;.  int nMall
4500: 6f 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  oc = 0;.  const 
4510: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e  char *zIn = (con
4520: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
4530: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
4540: 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 49 6e  v[0]);.  int nIn
4550: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4560: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
4570: 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e  ..  while( i<nIn
4580: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
4590: 61 72 20 2a 7a 43 6f 70 79 20 3d 20 26 7a 49 6e  ar *zCopy = &zIn
45a0: 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  [i];.    int nCo
45b0: 70 79 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  py = 1;.    int 
45c0: 6e 52 65 70 6c 61 63 65 20 3d 20 31 3b 0a 20 20  nReplace = 1;.  
45d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72    int j;.    for
45e0: 28 6a 3d 31 3b 20 6a 3c 28 61 72 67 63 2d 31 29  (j=1; j<(argc-1)
45f0: 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 63  ; j+=2){.      c
4600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
4610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
4620: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
4630: 61 72 67 76 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  argv[j]);.      
4640: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  int n = sqlite3_
4650: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
4660: 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [j]);.      if( 
4670: 6e 3c 3d 28 6e 49 6e 2d 69 29 20 26 26 20 30 3d  n<=(nIn-i) && 0=
4680: 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 43 6f 70  =strncmp(z, zCop
4690: 79 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  y, n) ){.       
46a0: 20 7a 43 6f 70 79 20 3d 20 28 63 6f 6e 73 74 20   zCopy = (const 
46b0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
46c0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 6a  alue_text(argv[j
46d0: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  +1]);.        nC
46e0: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  opy = sqlite3_va
46f0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 6a  lue_bytes(argv[j
4700: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 52  +1]);.        nR
4710: 65 70 6c 61 63 65 20 3d 20 6e 3b 0a 20 20 20 20  eplace = n;.    
4720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4730: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4740: 20 28 6e 4f 75 74 2b 6e 43 6f 70 79 29 3e 6e 4d   (nOut+nCopy)>nM
4750: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 6e  alloc ){.      n
4760: 4d 61 6c 6c 6f 63 20 3d 20 31 36 20 2b 20 28 6e  Malloc = 16 + (n
4770: 4f 75 74 2b 6e 43 6f 70 79 29 2a 32 3b 0a 20 20  Out+nCopy)*2;.  
4780: 20 20 20 20 7a 4f 75 74 20 3d 20 28 63 68 61 72      zOut = (char
4790: 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   *)sqlite3_reall
47a0: 6f 63 28 7a 4f 75 74 2c 20 6e 4d 61 6c 6c 6f 63  oc(zOut, nMalloc
47b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
47c0: 65 72 74 28 20 6e 4d 61 6c 6c 6f 63 3e 3d 28 6e  ert( nMalloc>=(n
47d0: 4f 75 74 2b 6e 43 6f 70 79 29 20 29 3b 0a 20 20  Out+nCopy) );.  
47e0: 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 6e    memcpy(&zOut[n
47f0: 4f 75 74 5d 2c 20 7a 43 6f 70 79 2c 20 6e 43 6f  Out], zCopy, nCo
4800: 70 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 52  py);.    i += nR
4810: 65 70 6c 61 63 65 3b 0a 20 20 20 20 6e 4f 75 74  eplace;.    nOut
4820: 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 7d 0a 0a   += nCopy;.  }..
4830: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4840: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
4850: 4f 75 74 2c 20 6e 4f 75 74 2c 20 53 51 4c 49 54  Out, nOut, SQLIT
4860: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
4870: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
4880: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  t);.}../*.** A c
4890: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69  allback for sqli
48a0: 74 65 33 5f 65 78 65 63 28 29 20 69 6e 76 6f 6b  te3_exec() invok
48b0: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
48c0: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
48d0: 0a 2a 2a 20 47 65 6e 66 6b 65 79 43 62 20 73 74  .** GenfkeyCb st
48e0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
48f0: 74 6f 20 62 79 20 74 68 65 20 76 6f 69 64 2a 20  to by the void* 
4900: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
4910: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
4920: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76 6f  .static int invo
4930: 6b 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  keCallback(void 
4940: 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  *p, int nArg, ch
4950: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
4960: 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 47 65 6e   **azCol){.  Gen
4970: 66 6b 65 79 43 62 20 2a 70 43 62 20 3d 20 28 47  fkeyCb *pCb = (G
4980: 65 6e 66 6b 65 79 43 62 20 2a 29 70 3b 0a 20 20  enfkeyCb *)p;.  
4990: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
49a0: 28 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44  (nArg);.  UNUSED
49b0: 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 43 6f 6c  _PARAMETER(azCol
49c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 62 2d  );.  return pCb-
49d0: 3e 78 44 61 74 61 28 70 43 62 2d 3e 70 43 74 78  >xData(pCb->pCtx
49e0: 2c 20 70 43 62 2d 3e 65 54 79 70 65 2c 20 61 7a  , pCb->eType, az
49f0: 41 72 67 5b 30 5d 29 3b 0a 7d 0a 0a 69 6e 74 20  Arg[0]);.}..int 
4a00: 64 65 74 65 63 74 53 63 68 65 6d 61 50 72 6f 62  detectSchemaProb
4a10: 6c 65 6d 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  lem(.  sqlite3 *
4a20: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
4a30: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4a40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
4a50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
4a60: 65 73 73 61 67 65 2c 20 20 20 20 20 20 20 20 20  essage,         
4a70: 20 2f 2a 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   /* English lang
4a80: 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61  uage error messa
4a90: 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ge */.  const ch
4aa0: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
4ab0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
4ac0: 61 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a  atement to run *
4ad0: 2f 0a 20 20 47 65 6e 66 6b 65 79 43 62 20 2a 70  /.  GenfkeyCb *p
4ae0: 43 62 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Cb.){.  sqlite3_
4af0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
4b00: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
4b10: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
4b20: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
4b30: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
4b40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4b50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
4b60: 7d 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  }.  while( SQLIT
4b70: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
4b80: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
4b90: 20 20 63 68 61 72 20 2a 7a 44 65 6c 3b 0a 20 20    char *zDel;.  
4ba0: 20 20 69 6e 74 20 69 46 6b 20 3d 20 73 71 6c 69    int iFk = sqli
4bb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
4bc0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 63 6f  Stmt, 0);.    co
4bd0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
4be0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
4bf0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4c00: 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
4c10: 20 20 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65 33    zDel = sqlite3
4c20: 5f 6d 70 72 69 6e 74 66 28 22 45 72 72 6f 72 20  _mprintf("Error 
4c30: 69 6e 20 74 61 62 6c 65 20 25 73 3a 20 25 73 22  in table %s: %s"
4c40: 2c 20 7a 54 61 62 2c 20 7a 4d 65 73 73 61 67 65  , zTab, zMessage
4c50: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 62 2d  );.    rc = pCb-
4c60: 3e 78 44 61 74 61 28 70 43 62 2d 3e 70 43 74 78  >xData(pCb->pCtx
4c70: 2c 20 70 43 62 2d 3e 65 54 79 70 65 2c 20 7a 44  , pCb->eType, zD
4c80: 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
4c90: 5f 66 72 65 65 28 7a 44 65 6c 29 3b 0a 20 20 20  _free(zDel);.   
4ca0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4cb0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
4cc0: 20 20 20 20 7a 44 65 6c 20 3d 20 73 71 6c 69 74      zDel = sqlit
4cd0: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
4ce0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
4cf0: 20 74 65 6d 70 2e 66 6b 65 79 20 57 48 45 52 45   temp.fkey WHERE
4d00: 20 66 72 6f 6d 5f 74 62 6c 20 3d 20 25 51 20 41   from_tbl = %Q A
4d10: 4e 44 20 66 6b 69 64 20 3d 20 25 64 22 0a 20 20  ND fkid = %d".  
4d20: 20 20 20 20 20 20 2c 20 7a 54 61 62 2c 20 69 46        , zTab, iF
4d30: 6b 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  k.    );.    sql
4d40: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 44  ite3_exec(db, zD
4d50: 65 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  el, 0, 0, 0);.  
4d60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4d70: 44 65 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Del);.  }.  sqli
4d80: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
4d90: 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mt);.  return SQ
4da0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4db0: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70  * Create and pop
4dc0: 75 6c 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20  ulate temporary 
4dd0: 74 61 62 6c 65 20 22 66 6b 65 79 22 2e 0a 2a 2f  table "fkey"..*/
4de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 70 75  .static int popu
4df0: 6c 61 74 65 54 65 6d 70 54 61 62 6c 65 28 73 71  lateTempTable(sq
4e00: 6c 69 74 65 33 20 2a 64 62 2c 20 47 65 6e 66 6b  lite3 *db, Genfk
4e10: 65 79 43 62 20 2a 70 43 61 6c 6c 62 61 63 6b 29  eyCb *pCallback)
4e20: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20  {.  int rc;.  . 
4e30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
4e40: 65 63 28 64 62 2c 20 0a 20 20 20 20 20 20 22 43  ec(db, .      "C
4e50: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
4e60: 42 4c 45 20 74 65 6d 70 2e 76 5f 66 6b 65 79 20  BLE temp.v_fkey 
4e70: 55 53 49 4e 47 20 73 63 68 65 6d 61 28 66 6f 72  USING schema(for
4e80: 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 29 3b 22  eign_key_list);"
4e90: 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20 56  .      "CREATE V
4ea0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d  IRTUAL TABLE tem
4eb0: 70 2e 76 5f 63 6f 6c 20 55 53 49 4e 47 20 73 63  p.v_col USING sc
4ec0: 68 65 6d 61 28 74 61 62 6c 65 5f 69 6e 66 6f 29  hema(table_info)
4ed0: 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41 54 45  ;".      "CREATE
4ee0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
4ef0: 65 6d 70 2e 76 5f 69 64 78 6c 69 73 74 20 55 53  emp.v_idxlist US
4f00: 49 4e 47 20 73 63 68 65 6d 61 28 69 6e 64 65 78  ING schema(index
4f10: 5f 6c 69 73 74 29 3b 22 0a 20 20 20 20 20 20 22  _list);".      "
4f20: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
4f30: 41 42 4c 45 20 74 65 6d 70 2e 76 5f 69 64 78 69  ABLE temp.v_idxi
4f40: 6e 66 6f 20 55 53 49 4e 47 20 73 63 68 65 6d 61  nfo USING schema
4f50: 28 69 6e 64 65 78 5f 69 6e 66 6f 29 3b 22 0a 20  (index_info);". 
4f60: 20 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52       "CREATE VIR
4f70: 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e  TUAL TABLE temp.
4f80: 76 5f 74 72 69 67 67 65 72 73 20 55 53 49 4e 47  v_triggers USING
4f90: 20 73 63 68 65 6d 61 28 74 72 69 67 67 65 72 5f   schema(trigger_
4fa0: 6c 69 73 74 29 3b 22 0a 20 20 20 20 20 20 22 43  list);".      "C
4fb0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 6d 70  REATE TABLE temp
4fc0: 2e 66 6b 65 79 20 41 53 20 22 0a 20 20 20 20 20  .fkey AS ".     
4fd0: 20 20 20 22 53 45 4c 45 43 54 20 66 72 6f 6d 5f     "SELECT from_
4fe0: 74 62 6c 2c 20 74 6f 5f 74 62 6c 2c 20 66 6b 69  tbl, to_tbl, fki
4ff0: 64 2c 20 66 72 6f 6d 5f 63 6f 6c 2c 20 74 6f 5f  d, from_col, to_
5000: 63 6f 6c 2c 20 6f 6e 5f 75 70 64 61 74 65 2c 20  col, on_update, 
5010: 6f 6e 5f 64 65 6c 65 74 65 20 22 0a 20 20 20 20  on_delete ".    
5020: 20 20 20 20 22 46 52 4f 4d 20 74 65 6d 70 2e 76      "FROM temp.v
5030: 5f 66 6b 65 79 20 57 48 45 52 45 20 64 61 74 61  _fkey WHERE data
5040: 62 61 73 65 20 3d 20 27 6d 61 69 6e 27 3b 22 0a  base = 'main';".
5050: 20 20 20 20 20 20 2c 20 30 2c 20 30 2c 20 30 0a        , 0, 0, 0.
5060: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
5070: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5080: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 64 65  n rc;..  rc = de
5090: 74 65 63 74 53 63 68 65 6d 61 50 72 6f 62 6c 65  tectSchemaProble
50a0: 6d 28 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b  m(db, "foreign k
50b0: 65 79 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f  ey columns do no
50c0: 74 20 65 78 69 73 74 22 2c 0a 20 20 20 20 22 53  t exist",.    "S
50d0: 45 4c 45 43 54 20 66 6b 69 64 2c 20 66 72 6f 6d  ELECT fkid, from
50e0: 5f 74 62 6c 20 22 0a 20 20 20 20 22 46 52 4f 4d  _tbl ".    "FROM
50f0: 20 74 65 6d 70 2e 66 6b 65 79 20 22 0a 20 20 20   temp.fkey ".   
5100: 20 22 57 48 45 52 45 20 74 6f 5f 63 6f 6c 20 49   "WHERE to_col I
5110: 53 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 4e  S NOT NULL AND N
5120: 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c 45 43  OT EXISTS (SELEC
5130: 54 20 31 20 22 0a 20 20 20 20 20 20 20 20 22 46  T 1 ".        "F
5140: 52 4f 4d 20 74 65 6d 70 2e 76 5f 63 6f 6c 20 57  ROM temp.v_col W
5150: 48 45 52 45 20 74 61 62 6c 65 6e 61 6d 65 3d 74  HERE tablename=t
5160: 6f 5f 74 62 6c 20 41 4e 44 20 6e 61 6d 65 3d 3d  o_tbl AND name==
5170: 74 6f 5f 63 6f 6c 22 0a 20 20 20 20 22 29 22 2c  to_col".    ")",
5180: 20 70 43 61 6c 6c 62 61 63 6b 0a 20 20 29 3b 0a   pCallback.  );.
5190: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
51a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
51b0: 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
51c0: 6f 69 6e 74 20 74 68 65 20 74 65 6d 70 2e 66 6b  oint the temp.fk
51d0: 65 79 20 74 61 62 6c 65 20 69 73 20 6d 6f 73 74  ey table is most
51e0: 6c 79 20 70 6f 70 75 6c 61 74 65 64 2e 20 49 66  ly populated. If
51f0: 20 61 6e 79 20 66 6f 72 65 69 67 6e 0a 20 20 2a   any foreign.  *
5200: 2a 20 6b 65 79 73 20 77 65 72 65 20 73 70 65 63  * keys were spec
5210: 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68  ified so that th
5220: 65 79 20 69 6d 70 6c 69 63 69 74 6c 79 20 72 65  ey implicitly re
5230: 66 65 72 20 74 6f 20 74 68 65 79 20 70 72 69 6d  fer to they prim
5240: 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 66 20  ary.  ** key of 
5250: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
5260: 2c 20 74 68 65 20 22 74 6f 5f 63 6f 6c 22 20 76  , the "to_col" v
5270: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 74 65 6d  alues of the tem
5280: 70 2e 66 6b 65 79 20 72 6f 77 73 0a 20 20 2a 2a  p.fkey rows.  **
5290: 20 61 72 65 20 73 74 69 6c 6c 20 73 65 74 20 74   are still set t
52a0: 6f 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  o NULL..  **.  *
52b0: 2a 20 54 68 69 73 20 69 73 20 65 61 73 69 6c 79  * This is easily
52c0: 20 66 69 78 65 64 20 66 6f 72 20 73 69 6e 67 6c   fixed for singl
52d0: 65 20 63 6f 6c 75 6d 6e 20 70 72 69 6d 61 72 79  e column primary
52e0: 20 6b 65 79 73 2c 20 62 75 74 20 6e 6f 74 20 66   keys, but not f
52f0: 6f 72 0a 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74  or.  ** composit
5300: 65 73 2e 20 57 69 74 68 20 61 20 63 6f 6d 70 6f  es. With a compo
5310: 73 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79  site primary key
5320: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  , there is no wa
5330: 79 20 74 6f 20 72 65 6c 69 61 62 6c 79 0a 20 20  y to reliably.  
5340: 2a 2a 20 71 75 65 72 79 20 73 71 6c 69 74 65 20  ** query sqlite 
5350: 66 6f 72 20 74 68 65 20 6f 72 64 65 72 20 69 6e  for the order in
5360: 20 77 68 69 63 68 20 74 68 65 20 63 6f 6c 75 6d   which the colum
5370: 6e 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ns that make up 
5380: 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 70 6f 73 69  the.  ** composi
5390: 74 65 20 6b 65 79 20 77 65 72 65 20 64 65 63 6c  te key were decl
53a0: 61 72 65 64 20 69 2e 65 2e 20 74 68 65 72 65 20  ared i.e. there 
53b0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 6c  is no way to tel
53c0: 6c 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73 63  l if the.  ** sc
53d0: 68 65 6d 61 20 61 63 74 75 61 6c 6c 79 20 63 6f  hema actually co
53e0: 6e 74 61 69 6e 73 20 22 50 52 49 4d 41 52 59 20  ntains "PRIMARY 
53f0: 4b 45 59 28 61 2c 20 62 29 22 20 6f 72 20 22 50  KEY(a, b)" or "P
5400: 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 61 29  RIMARY KEY(b, a)
5410: 22 2e 0a 20 20 2a 2a 20 54 68 65 72 65 66 6f 72  "..  ** Therefor
5420: 65 2c 20 74 68 69 73 20 63 61 73 65 20 69 73 20  e, this case is 
5430: 6e 6f 74 20 68 61 6e 64 6c 65 64 2e 20 54 68 65  not handled. The
5440: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
5450: 69 6f 6e 20 63 61 6c 6c 0a 20 20 2a 2a 20 64 65  ion call.  ** de
5460: 74 65 63 74 73 20 69 6e 73 74 61 6e 63 65 73 20  tects instances 
5470: 6f 66 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  of this case..  
5480: 2a 2f 0a 20 20 72 63 20 3d 20 64 65 74 65 63 74  */.  rc = detect
5490: 53 63 68 65 6d 61 50 72 6f 62 6c 65 6d 28 64 62  SchemaProblem(db
54a0: 2c 20 22 69 6d 70 6c 69 63 69 74 20 6d 61 70 70  , "implicit mapp
54b0: 69 6e 67 20 74 6f 20 63 6f 6d 70 6f 73 69 74 65  ing to composite
54c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 0a 20   primary key",. 
54d0: 20 20 20 22 53 45 4c 45 43 54 20 66 6b 69 64 2c     "SELECT fkid,
54e0: 20 66 72 6f 6d 5f 74 62 6c 20 22 0a 20 20 20 20   from_tbl ".    
54f0: 22 46 52 4f 4d 20 74 65 6d 70 2e 66 6b 65 79 20  "FROM temp.fkey 
5500: 22 0a 20 20 20 20 22 57 48 45 52 45 20 74 6f 5f  ".    "WHERE to_
5510: 63 6f 6c 20 49 53 20 4e 55 4c 4c 20 22 0a 20 20  col IS NULL ".  
5520: 20 20 22 47 52 4f 55 50 20 42 59 20 66 6b 69 64    "GROUP BY fkid
5530: 2c 20 66 72 6f 6d 5f 74 62 6c 20 48 41 56 49 4e  , from_tbl HAVIN
5540: 47 20 63 6f 75 6e 74 28 2a 29 20 3e 20 31 22 2c  G count(*) > 1",
5550: 20 70 43 61 6c 6c 62 61 63 6b 0a 20 20 29 3b 0a   pCallback.  );.
5560: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5570: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5580: 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74 20 61 74  ..  /* Detect at
5590: 74 65 6d 70 74 73 20 74 6f 20 69 6d 70 6c 69 63  tempts to implic
55a0: 69 74 6c 79 20 6d 61 70 20 74 6f 20 74 68 65 20  itly map to the 
55b0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 61  primary key of a
55c0: 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 74 68 61   table .  ** tha
55d0: 74 20 68 61 73 20 6e 6f 20 70 72 69 6d 61 72 79  t has no primary
55e0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a   key column..  *
55f0: 2f 0a 20 20 72 63 20 3d 20 64 65 74 65 63 74 53  /.  rc = detectS
5600: 63 68 65 6d 61 50 72 6f 62 6c 65 6d 28 64 62 2c  chemaProblem(db,
5610: 20 22 69 6d 70 6c 69 63 69 74 20 6d 61 70 70 69   "implicit mappi
5620: 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61  ng to non-exista
5630: 6e 74 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  nt primary key",
5640: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 66 6b 69  .    "SELECT fki
5650: 64 2c 20 66 72 6f 6d 5f 74 62 6c 20 22 0a 20 20  d, from_tbl ".  
5660: 20 20 22 46 52 4f 4d 20 74 65 6d 70 2e 66 6b 65    "FROM temp.fke
5670: 79 20 22 0a 20 20 20 20 22 57 48 45 52 45 20 74  y ".    "WHERE t
5680: 6f 5f 63 6f 6c 20 49 53 20 4e 55 4c 4c 20 41 4e  o_col IS NULL AN
5690: 44 20 4e 4f 54 20 45 58 49 53 54 53 20 22 0a 20  D NOT EXISTS ". 
56a0: 20 20 20 20 20 22 28 53 45 4c 45 43 54 20 31 20       "(SELECT 1 
56b0: 46 52 4f 4d 20 74 65 6d 70 2e 76 5f 63 6f 6c 20  FROM temp.v_col 
56c0: 57 48 45 52 45 20 70 6b 20 41 4e 44 20 74 61 62  WHERE pk AND tab
56d0: 6c 65 6e 61 6d 65 20 3d 20 74 65 6d 70 2e 66 6b  lename = temp.fk
56e0: 65 79 2e 74 6f 5f 74 62 6c 29 22 0a 20 20 20 20  ey.to_tbl)".    
56f0: 2c 20 70 43 61 6c 6c 62 61 63 6b 0a 20 20 29 3b  , pCallback.  );
5700: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5710: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
5720: 3b 0a 0a 20 20 2f 2a 20 46 69 78 20 61 6c 6c 20  ;..  /* Fix all 
5730: 74 68 65 20 69 6d 70 6c 69 63 69 74 20 70 72 69  the implicit pri
5740: 6d 61 72 79 20 6b 65 79 20 6d 61 70 70 69 6e 67  mary key mapping
5750: 73 20 69 6e 20 74 68 65 20 74 65 6d 70 2e 66 6b  s in the temp.fk
5760: 65 79 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 72  ey table. */.  r
5770: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
5780: 28 64 62 2c 20 0a 20 20 20 20 22 55 50 44 41 54  (db, .    "UPDAT
5790: 45 20 74 65 6d 70 2e 66 6b 65 79 20 53 45 54 20  E temp.fkey SET 
57a0: 74 6f 5f 63 6f 6c 20 3d 20 22 0a 20 20 20 20 20  to_col = ".     
57b0: 20 22 28 53 45 4c 45 43 54 20 6e 61 6d 65 20 46   "(SELECT name F
57c0: 52 4f 4d 20 74 65 6d 70 2e 76 5f 63 6f 6c 20 57  ROM temp.v_col W
57d0: 48 45 52 45 20 70 6b 20 41 4e 44 20 74 61 62 6c  HERE pk AND tabl
57e0: 65 6e 61 6d 65 3d 74 65 6d 70 2e 66 6b 65 79 2e  ename=temp.fkey.
57f0: 74 6f 5f 74 62 6c 29 22 0a 20 20 20 20 22 20 57  to_tbl)".    " W
5800: 48 45 52 45 20 74 6f 5f 63 6f 6c 20 49 53 20 4e  HERE to_col IS N
5810: 55 4c 4c 3b 22 0a 20 20 20 20 2c 20 30 2c 20 30  ULL;".    , 0, 0
5820: 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
5830: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5840: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
5850: 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 61  Now check that a
5860: 6c 6c 20 61 6c 6c 20 70 61 72 65 6e 74 20 6b 65  ll all parent ke
5870: 79 73 20 61 72 65 20 65 69 74 68 65 72 20 70 72  ys are either pr
5880: 69 6d 61 72 79 20 6b 65 79 73 20 6f 72 20 0a 20  imary keys or . 
5890: 20 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 61   ** subject to a
58a0: 20 75 6e 69 71 75 65 20 63 6f 6e 73 74 72 61 69   unique constrai
58b0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  nt..  */.  rc = 
58c0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
58d0: 20 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41   .    "CREATE TA
58e0: 42 4c 45 20 74 65 6d 70 2e 69 64 78 32 20 41 53  BLE temp.idx2 AS
58f0: 20 53 45 4c 45 43 54 20 22 0a 20 20 20 20 20 20   SELECT ".      
5900: 22 69 6c 2e 74 61 62 6c 65 6e 61 6d 65 20 41 53  "il.tablename AS
5910: 20 74 61 62 6c 65 6e 61 6d 65 2c 22 0a 20 20 20   tablename,".   
5920: 20 20 20 22 69 69 2e 69 6e 64 65 78 6e 61 6d 65     "ii.indexname
5930: 20 41 53 20 69 6e 64 65 78 6e 61 6d 65 2c 22 0a   AS indexname,".
5940: 20 20 20 20 20 20 22 69 69 2e 6e 61 6d 65 20 41        "ii.name A
5950: 53 20 63 6f 6c 20 22 0a 20 20 20 20 20 20 22 46  S col ".      "F
5960: 52 4f 4d 20 74 65 6d 70 2e 76 5f 69 64 78 6c 69  ROM temp.v_idxli
5970: 73 74 20 41 53 20 69 6c 2c 20 74 65 6d 70 2e 76  st AS il, temp.v
5980: 5f 69 64 78 69 6e 66 6f 20 41 53 20 69 69 20 22  _idxinfo AS ii "
5990: 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 69 6c  .      "WHERE il
59a0: 2e 69 73 75 6e 69 71 75 65 20 41 4e 44 20 69 6c  .isunique AND il
59b0: 2e 64 61 74 61 62 61 73 65 3d 27 6d 61 69 6e 27  .database='main'
59c0: 20 41 4e 44 20 69 69 2e 69 6e 64 65 78 6e 61 6d   AND ii.indexnam
59d0: 65 20 3d 20 69 6c 2e 6e 61 6d 65 3b 22 0a 20 20  e = il.name;".  
59e0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
59f0: 65 6d 70 2e 69 64 78 32 20 22 0a 20 20 20 20 20  emp.idx2 ".     
5a00: 20 22 53 45 4c 45 43 54 20 74 61 62 6c 65 6e 61   "SELECT tablena
5a10: 6d 65 2c 20 27 70 6b 27 2c 20 6e 61 6d 65 20 46  me, 'pk', name F
5a20: 52 4f 4d 20 74 65 6d 70 2e 76 5f 63 6f 6c 20 57  ROM temp.v_col W
5a30: 48 45 52 45 20 70 6b 3b 22 0a 0a 20 20 20 20 22  HERE pk;"..    "
5a40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 6d  CREATE TABLE tem
5a50: 70 2e 69 64 78 20 41 53 20 53 45 4c 45 43 54 20  p.idx AS SELECT 
5a60: 22 0a 20 20 20 20 20 20 22 74 61 62 6c 65 6e 61  ".      "tablena
5a70: 6d 65 2c 20 69 6e 64 65 78 6e 61 6d 65 2c 20 73  me, indexname, s
5a80: 6a 28 64 71 28 63 6f 6c 29 2c 27 2c 27 29 20 41  j(dq(col),',') A
5a90: 53 20 63 6f 6c 73 20 22 0a 20 20 20 20 20 20 22  S cols ".      "
5aa0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2a 20 46  FROM (SELECT * F
5ab0: 52 4f 4d 20 74 65 6d 70 2e 69 64 78 32 20 4f 52  ROM temp.idx2 OR
5ac0: 44 45 52 20 42 59 20 63 6f 6c 29 20 22 20 0a 20  DER BY col) " . 
5ad0: 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 74       "GROUP BY t
5ae0: 61 62 6c 65 6e 61 6d 65 2c 20 69 6e 64 65 78 6e  ablename, indexn
5af0: 61 6d 65 3b 22 0a 0a 20 20 20 20 22 43 52 45 41  ame;"..    "CREA
5b00: 54 45 20 54 41 42 4c 45 20 74 65 6d 70 2e 66 6b  TE TABLE temp.fk
5b10: 65 79 32 20 41 53 20 53 45 4c 45 43 54 20 22 0a  ey2 AS SELECT ".
5b20: 20 20 20 20 20 20 20 20 22 66 6b 69 64 2c 20 66          "fkid, f
5b30: 72 6f 6d 5f 74 62 6c 2c 20 74 6f 5f 74 62 6c 2c  rom_tbl, to_tbl,
5b40: 20 73 6a 28 64 71 28 74 6f 5f 63 6f 6c 29 2c 27   sj(dq(to_col),'
5b50: 2c 27 29 20 41 53 20 63 6f 6c 73 20 22 0a 20 20  ,') AS cols ".  
5b60: 20 20 20 20 20 20 22 46 52 4f 4d 20 28 53 45 4c        "FROM (SEL
5b70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e  ECT * FROM temp.
5b80: 66 6b 65 79 20 4f 52 44 45 52 20 42 59 20 74 6f  fkey ORDER BY to
5b90: 5f 63 6f 6c 29 20 22 20 0a 20 20 20 20 20 20 20  _col) " .       
5ba0: 20 22 47 52 4f 55 50 20 42 59 20 66 6b 69 64 2c   "GROUP BY fkid,
5bb0: 20 66 72 6f 6d 5f 74 62 6c 3b 22 0a 0a 20 20 20   from_tbl;"..   
5bc0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
5bd0: 65 6d 70 2e 74 72 69 67 67 65 72 73 20 41 53 20  emp.triggers AS 
5be0: 53 45 4c 45 43 54 20 22 0a 20 20 20 20 20 20 20  SELECT ".       
5bf0: 20 22 74 72 69 67 67 65 72 6e 61 6d 65 20 46 52   "triggername FR
5c00: 4f 4d 20 74 65 6d 70 2e 76 5f 74 72 69 67 67 65  OM temp.v_trigge
5c10: 72 73 20 57 48 45 52 45 20 64 61 74 61 62 61 73  rs WHERE databas
5c20: 65 3d 27 6d 61 69 6e 27 20 41 4e 44 20 22 0a 20  e='main' AND ". 
5c30: 20 20 20 20 20 20 20 22 74 72 69 67 67 65 72 6e         "triggern
5c40: 61 6d 65 20 4c 49 4b 45 20 27 67 65 6e 66 6b 65  ame LIKE 'genfke
5c50: 79 25 27 3b 22 0a 20 20 20 20 2c 20 30 2c 20 30  y%';".    , 0, 0
5c60: 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
5c70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5c80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
5c90: 20 64 65 74 65 63 74 53 63 68 65 6d 61 50 72 6f   detectSchemaPro
5ca0: 62 6c 65 6d 28 64 62 2c 20 22 66 6f 72 65 69 67  blem(db, "foreig
5cb0: 6e 20 6b 65 79 20 69 73 20 6e 6f 74 20 75 6e 69  n key is not uni
5cc0: 71 75 65 22 2c 0a 20 20 20 20 22 53 45 4c 45 43  que",.    "SELEC
5cd0: 54 20 66 6b 69 64 2c 20 66 72 6f 6d 5f 74 62 6c  T fkid, from_tbl
5ce0: 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 74 65 6d   ".    "FROM tem
5cf0: 70 2e 66 6b 65 79 32 20 22 0a 20 20 20 20 22 57  p.fkey2 ".    "W
5d00: 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 20  HERE NOT EXISTS 
5d10: 28 53 45 4c 45 43 54 20 31 20 22 0a 20 20 20 20  (SELECT 1 ".    
5d20: 20 20 20 20 22 46 52 4f 4d 20 74 65 6d 70 2e 69      "FROM temp.i
5d30: 64 78 20 57 48 45 52 45 20 74 61 62 6c 65 6e 61  dx WHERE tablena
5d40: 6d 65 3d 74 6f 5f 74 62 6c 20 41 4e 44 20 66 6b  me=to_tbl AND fk
5d50: 65 79 32 2e 63 6f 6c 73 3d 3d 69 64 78 2e 63 6f  ey2.cols==idx.co
5d60: 6c 73 22 0a 20 20 20 20 22 29 22 2c 20 70 43 61  ls".    ")", pCa
5d70: 6c 6c 62 61 63 6b 0a 20 20 29 3b 0a 20 20 69 66  llback.  );.  if
5d80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5d90: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5da0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
5db0: 65 66 69 6e 65 20 47 45 4e 46 4b 45 59 5f 45 52  efine GENFKEY_ER
5dc0: 52 4f 52 20 20 20 20 20 20 20 20 20 31 0a 23 64  ROR         1.#d
5dd0: 65 66 69 6e 65 20 47 45 4e 46 4b 45 59 5f 44 52  efine GENFKEY_DR
5de0: 4f 50 54 52 49 47 47 45 52 20 20 20 32 0a 23 64  OPTRIGGER   2.#d
5df0: 65 66 69 6e 65 20 47 45 4e 46 4b 45 59 5f 43 52  efine GENFKEY_CR
5e00: 45 41 54 45 54 52 49 47 47 45 52 20 33 0a 73 74  EATETRIGGER 3.st
5e10: 61 74 69 63 20 69 6e 74 20 67 65 6e 66 6b 65 79  atic int genfkey
5e20: 5f 63 72 65 61 74 65 5f 74 72 69 67 67 65 72 73  _create_triggers
5e30: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 73 64 62  (.  sqlite3 *sdb
5e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
5e60: 65 63 74 69 6f 6e 20 74 6f 20 72 65 61 64 20 73  ection to read s
5e70: 63 68 65 6d 61 20 66 72 6f 6d 20 2a 2f 0a 20 20  chema from */.  
5e80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ea0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
5eb0: 64 62 20 74 6f 20 72 65 61 64 20 28 22 6d 61 69  db to read ("mai
5ec0: 6e 22 2c 20 22 74 65 6d 70 22 29 20 2a 2f 0a 20  n", "temp") */. 
5ed0: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
5f00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 73 73   pointer to pass
5f10: 20 74 6f 20 78 44 61 74 61 20 2a 2f 0a 20 20 69   to xData */.  i
5f20: 6e 74 20 28 2a 78 44 61 74 61 29 28 76 6f 69 64  nt (*xData)(void
5f30: 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63   *, int, const c
5f40: 68 61 72 20 2a 29 0a 29 7b 0a 20 20 63 6f 6e 73  har *).){.  cons
5f50: 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20  t char *zSql =. 
5f60: 20 20 20 22 53 45 4c 45 43 54 20 6d 75 6c 74 69     "SELECT multi
5f70: 72 65 70 6c 61 63 65 28 27 22 0a 0a 20 20 20 20  replace('"..    
5f80: 20 20 22 2d 2d 20 54 72 69 67 67 65 72 73 20 66    "-- Triggers f
5f90: 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6d  or foreign key m
5fa0: 61 70 70 69 6e 67 3a 5c 6e 22 0a 20 20 20 20 20  apping:\n".     
5fb0: 20 22 2d 2d 5c 6e 22 0a 20 20 20 20 20 20 22 2d   "--\n".      "-
5fc0: 2d 20 20 20 20 20 2f 66 72 6f 6d 5f 72 65 61 64  -     /from_read
5fd0: 61 62 6c 65 2f 20 52 45 46 45 52 45 4e 43 45 53  able/ REFERENCES
5fe0: 20 2f 74 6f 5f 72 65 61 64 61 62 6c 65 2f 5c 6e   /to_readable/\n
5ff0: 22 0a 20 20 20 20 20 20 22 2d 2d 20 20 20 20 20  ".      "--     
6000: 6f 6e 20 64 65 6c 65 74 65 20 2f 6f 6e 5f 64 65  on delete /on_de
6010: 6c 65 74 65 2f 5c 6e 22 0a 20 20 20 20 20 20 22  lete/\n".      "
6020: 2d 2d 20 20 20 20 20 6f 6e 20 75 70 64 61 74 65  --     on update
6030: 20 2f 6f 6e 5f 75 70 64 61 74 65 2f 5c 6e 22 0a   /on_update/\n".
6040: 20 20 20 20 20 20 22 2d 2d 5c 6e 22 0a 0a 20 20        "--\n"..  
6050: 20 20 20 20 2f 2a 20 54 68 65 20 22 42 45 46 4f      /* The "BEFO
6060: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 3c 72 65  RE INSERT ON <re
6070: 66 65 72 65 6e 63 69 6e 67 3e 22 20 74 72 69 67  ferencing>" trig
6080: 67 65 72 2e 20 54 68 69 73 20 74 72 69 67 67 65  ger. This trigge
6090: 72 27 73 20 6a 6f 62 20 69 73 20 74 6f 0a 20 20  r's job is to.  
60a0: 20 20 20 20 2a 2a 20 74 68 72 6f 77 20 61 6e 20      ** throw an 
60b0: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65  exception if the
60c0: 20 75 73 65 72 20 74 72 69 65 73 20 74 6f 20 69   user tries to i
60d0: 6e 73 65 72 74 20 61 20 72 6f 77 20 69 6e 74 6f  nsert a row into
60e0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 65   the.      ** re
60f0: 66 65 72 65 6e 63 69 6e 67 20 74 61 62 6c 65 20  ferencing table 
6100: 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
6110: 69 73 20 6e 6f 20 63 6f 72 72 65 73 70 6f 6e 64  is no correspond
6120: 69 6e 67 20 72 6f 77 20 69 6e 0a 20 20 20 20 20  ing row in.     
6130: 20 2a 2a 20 74 68 65 20 72 65 66 65 72 65 6e 63   ** the referenc
6140: 65 64 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  ed table..      
6150: 2a 2f 0a 20 20 20 20 20 20 22 43 52 45 41 54 45  */.      "CREATE
6160: 20 54 52 49 47 47 45 52 20 2f 6e 61 6d 65 2f 5f   TRIGGER /name/_
6170: 69 6e 73 65 72 74 5f 72 65 66 65 72 65 6e 63 69  insert_referenci
6180: 6e 67 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54  ng BEFORE INSERT
6190: 20 4f 4e 20 2f 74 62 6c 2f 20 57 48 45 4e 20 5c   ON /tbl/ WHEN \
61a0: 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20 2f 6b  n".      "    /k
61b0: 65 79 5f 6e 6f 74 6e 75 6c 6c 2f 20 41 4e 44 20  ey_notnull/ AND 
61c0: 4e 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c 45  NOT EXISTS (SELE
61d0: 43 54 20 31 20 46 52 4f 4d 20 2f 72 65 66 2f 20  CT 1 FROM /ref/ 
61e0: 57 48 45 52 45 20 2f 63 6f 6e 64 31 2f 29 5c 6e  WHERE /cond1/)\n
61f0: 22 20 0a 20 20 20 20 20 20 22 42 45 47 49 4e 5c  " .      "BEGIN\
6200: 6e 22 0a 20 20 20 20 20 20 20 20 22 20 20 53 45  n".        "  SE
6210: 4c 45 43 54 20 52 41 49 53 45 28 41 42 4f 52 54  LECT RAISE(ABORT
6220: 2c 20 27 27 63 6f 6e 73 74 72 61 69 6e 74 20 66  , ''constraint f
6230: 61 69 6c 65 64 27 27 29 3b 5c 6e 22 0a 20 20 20  ailed'');\n".   
6240: 20 20 20 22 45 4e 44 3b 5c 6e 22 0a 0a 20 20 20     "END;\n"..   
6250: 20 20 20 2f 2a 20 54 68 65 20 22 42 45 46 4f 52     /* The "BEFOR
6260: 45 20 55 50 44 41 54 45 20 4f 4e 20 3c 72 65 66  E UPDATE ON <ref
6270: 65 72 65 6e 63 69 6e 67 3e 22 20 74 72 69 67 67  erencing>" trigg
6280: 65 72 2e 20 54 68 69 73 20 74 72 69 67 67 65 72  er. This trigger
6290: 27 73 20 6a 6f 62 20 0a 20 20 20 20 20 20 2a 2a  's job .      **
62a0: 20 69 73 20 74 6f 20 74 68 72 6f 77 20 61 6e 20   is to throw an 
62b0: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65  exception if the
62c0: 20 75 73 65 72 20 74 72 69 65 73 20 74 6f 20 75   user tries to u
62d0: 70 64 61 74 65 20 61 20 72 6f 77 20 69 6e 20 74  pdate a row in t
62e0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 66 65  he.      ** refe
62f0: 72 65 6e 63 69 6e 67 20 74 61 62 6c 65 20 63 61  rencing table ca
6300: 75 73 69 6e 67 20 69 74 20 74 6f 20 63 6f 72 72  using it to corr
6310: 65 73 70 6f 6e 64 20 74 6f 20 6e 6f 20 72 6f 77  espond to no row
6320: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
6330: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
6340: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
6350: 20 20 22 43 52 45 41 54 45 20 54 52 49 47 47 45    "CREATE TRIGGE
6360: 52 20 2f 6e 61 6d 65 2f 5f 75 70 64 61 74 65 5f  R /name/_update_
6370: 72 65 66 65 72 65 6e 63 69 6e 67 20 42 45 46 4f  referencing BEFO
6380: 52 45 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20  RE\n".      "   
6390: 20 55 50 44 41 54 45 20 4f 46 20 2f 72 6b 65 79   UPDATE OF /rkey
63a0: 5f 6c 69 73 74 2f 20 4f 4e 20 2f 74 62 6c 2f 20  _list/ ON /tbl/ 
63b0: 57 48 45 4e 20 5c 6e 22 0a 20 20 20 20 20 20 22  WHEN \n".      "
63c0: 20 20 20 20 2f 6b 65 79 5f 6e 6f 74 6e 75 6c 6c      /key_notnull
63d0: 2f 20 41 4e 44 20 5c 6e 22 0a 20 20 20 20 20 20  / AND \n".      
63e0: 22 20 20 20 20 4e 4f 54 20 45 58 49 53 54 53 20  "    NOT EXISTS 
63f0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 2f  (SELECT 1 FROM /
6400: 72 65 66 2f 20 57 48 45 52 45 20 2f 63 6f 6e 64  ref/ WHERE /cond
6410: 31 2f 29 5c 6e 22 20 0a 20 20 20 20 20 20 22 42  1/)\n" .      "B
6420: 45 47 49 4e 5c 6e 22 0a 20 20 20 20 20 20 20 20  EGIN\n".        
6430: 22 20 20 53 45 4c 45 43 54 20 52 41 49 53 45 28  "  SELECT RAISE(
6440: 41 42 4f 52 54 2c 20 27 27 63 6f 6e 73 74 72 61  ABORT, ''constra
6450: 69 6e 74 20 66 61 69 6c 65 64 27 27 29 3b 5c 6e  int failed'');\n
6460: 22 0a 20 20 20 20 20 20 22 45 4e 44 3b 5c 6e 22  ".      "END;\n"
6470: 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ...      /* The 
6480: 22 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f  "BEFORE DELETE O
6490: 4e 20 3c 72 65 66 65 72 65 6e 63 65 64 3e 22 20  N <referenced>" 
64a0: 74 72 69 67 67 65 72 2e 20 54 68 69 73 20 74 72  trigger. This tr
64b0: 69 67 67 65 72 27 73 20 6a 6f 62 20 0a 20 20 20  igger's job .   
64c0: 20 20 20 2a 2a 20 69 73 20 74 6f 20 64 65 74 65     ** is to dete
64d0: 63 74 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73  ct when a row is
64e0: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
64f0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
6500: 6c 65 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  le to .      ** 
6510: 77 68 69 63 68 20 72 6f 77 73 20 69 6e 20 74 68  which rows in th
6520: 65 20 72 65 66 65 72 65 6e 63 69 6e 67 20 74 61  e referencing ta
6530: 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 2e 20  ble correspond. 
6540: 54 68 65 20 61 63 74 69 6f 6e 20 74 61 6b 65 6e  The action taken
6550: 0a 20 20 20 20 20 20 2a 2a 20 64 65 70 65 6e 64  .      ** depend
6560: 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
6570: 66 20 74 68 65 20 27 4f 4e 20 44 45 4c 45 54 45  f the 'ON DELETE
6580: 27 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  ' clause..      
6590: 2a 2f 0a 20 20 20 20 20 20 22 43 52 45 41 54 45  */.      "CREATE
65a0: 20 54 52 49 47 47 45 52 20 2f 6e 61 6d 65 2f 5f   TRIGGER /name/_
65b0: 64 65 6c 65 74 65 5f 72 65 66 65 72 65 6e 63 65  delete_reference
65c0: 64 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20  d BEFORE DELETE 
65d0: 4f 4e 20 2f 72 65 66 2f 20 57 48 45 4e 5c 6e 22  ON /ref/ WHEN\n"
65e0: 0a 20 20 20 20 20 20 22 20 20 20 20 45 58 49 53  .      "    EXIS
65f0: 54 53 20 28 53 45 4c 45 43 54 20 31 20 46 52 4f  TS (SELECT 1 FRO
6600: 4d 20 2f 74 62 6c 2f 20 57 48 45 52 45 20 2f 63  M /tbl/ WHERE /c
6610: 6f 6e 64 32 2f 29 5c 6e 22 0a 20 20 20 20 20 20  ond2/)\n".      
6620: 22 42 45 47 49 4e 5c 6e 22 0a 20 20 20 20 20 20  "BEGIN\n".      
6630: 22 20 20 2f 64 65 6c 65 74 65 5f 61 63 74 69 6f  "  /delete_actio
6640: 6e 2f 5c 6e 22 0a 20 20 20 20 20 20 22 45 4e 44  n/\n".      "END
6650: 3b 5c 6e 22 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ;\n"..      /* T
6660: 68 65 20 22 42 45 46 4f 52 45 20 44 45 4c 45 54  he "BEFORE DELET
6670: 45 20 4f 4e 20 3c 72 65 66 65 72 65 6e 63 65 64  E ON <referenced
6680: 3e 22 20 74 72 69 67 67 65 72 2e 20 54 68 69 73  >" trigger. This
6690: 20 74 72 69 67 67 65 72 27 73 20 6a 6f 62 20 0a   trigger's job .
66a0: 20 20 20 20 20 20 2a 2a 20 69 73 20 74 6f 20 64        ** is to d
66b0: 65 74 65 63 74 20 77 68 65 6e 20 74 68 65 20 6b  etect when the k
66c0: 65 79 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20  ey columns of a 
66d0: 72 6f 77 20 69 6e 20 74 68 65 20 72 65 66 65 72  row in the refer
66e0: 65 6e 63 65 64 20 74 61 62 6c 65 20 0a 20 20 20  enced table .   
66f0: 20 20 20 2a 2a 20 74 6f 20 77 68 69 63 68 20 6f     ** to which o
6700: 6e 65 20 6f 72 20 6d 6f 72 65 20 72 6f 77 73 20  ne or more rows 
6710: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 69  in the referenci
6720: 6e 67 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  ng table corresp
6730: 6f 6e 64 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  ond are.      **
6740: 20 75 70 64 61 74 65 64 2e 20 54 68 65 20 61 63   updated. The ac
6750: 74 69 6f 6e 20 74 61 6b 65 6e 20 64 65 70 65 6e  tion taken depen
6760: 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
6770: 6f 66 20 74 68 65 20 27 4f 4e 20 55 50 44 41 54  of the 'ON UPDAT
6780: 45 27 20 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  E' .      ** cla
6790: 75 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  use..      */.  
67a0: 20 20 20 20 22 43 52 45 41 54 45 20 54 52 49 47      "CREATE TRIG
67b0: 47 45 52 20 2f 6e 61 6d 65 2f 5f 75 70 64 61 74  GER /name/_updat
67c0: 65 5f 72 65 66 65 72 65 6e 63 65 64 20 41 46 54  e_referenced AFT
67d0: 45 52 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20  ER\n".      "   
67e0: 20 55 50 44 41 54 45 20 4f 46 20 2f 66 6b 65 79   UPDATE OF /fkey
67f0: 5f 6c 69 73 74 2f 20 4f 4e 20 2f 72 65 66 2f 20  _list/ ON /ref/ 
6800: 57 48 45 4e 20 5c 6e 22 0a 20 20 20 20 20 20 22  WHEN \n".      "
6810: 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
6820: 43 54 20 31 20 46 52 4f 4d 20 2f 74 62 6c 2f 20  CT 1 FROM /tbl/ 
6830: 57 48 45 52 45 20 2f 63 6f 6e 64 32 2f 29 5c 6e  WHERE /cond2/)\n
6840: 22 0a 20 20 20 20 20 20 22 42 45 47 49 4e 5c 6e  ".      "BEGIN\n
6850: 22 0a 20 20 20 20 20 20 22 20 20 2f 75 70 64 61  ".      "  /upda
6860: 74 65 5f 61 63 74 69 6f 6e 2f 5c 6e 22 0a 20 20  te_action/\n".  
6870: 20 20 20 20 22 45 4e 44 3b 5c 6e 22 0a 20 20 20      "END;\n".   
6880: 20 22 27 22 0a 0a 20 20 20 20 2f 2a 20 54 68 65   "'"..    /* The
6890: 73 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  se are used in t
68a0: 68 65 20 53 51 4c 20 63 6f 6d 6d 65 6e 74 20 77  he SQL comment w
68b0: 72 69 74 74 65 6e 20 61 62 6f 76 65 20 65 61 63  ritten above eac
68c0: 68 20 73 65 74 20 6f 66 20 74 72 69 67 67 65 72  h set of trigger
68d0: 73 20 2a 2f 0a 20 20 20 20 22 2c 20 27 2f 66 72  s */.    ", '/fr
68e0: 6f 6d 5f 72 65 61 64 61 62 6c 65 2f 27 2c 20 20  om_readable/',  
68f0: 66 72 6f 6d 5f 74 62 6c 20 7c 7c 20 27 28 27 20  from_tbl || '(' 
6900: 7c 7c 20 73 6a 28 66 72 6f 6d 5f 63 6f 6c 2c 20  || sj(from_col, 
6910: 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20  ', ') || ')'".  
6920: 20 20 22 2c 20 27 2f 74 6f 5f 72 65 61 64 61 62    ", '/to_readab
6930: 6c 65 2f 27 2c 20 20 20 20 74 6f 5f 74 62 6c 20  le/',    to_tbl 
6940: 7c 7c 20 27 28 27 20 7c 7c 20 73 6a 28 74 6f 5f  || '(' || sj(to_
6950: 63 6f 6c 2c 20 27 2c 20 27 29 20 7c 7c 20 27 29  col, ', ') || ')
6960: 27 22 0a 20 20 20 20 22 2c 20 27 2f 6f 6e 5f 64  '".    ", '/on_d
6970: 65 6c 65 74 65 2f 27 2c 20 6f 6e 5f 64 65 6c 65  elete/', on_dele
6980: 74 65 22 0a 20 20 20 20 22 2c 20 27 2f 6f 6e 5f  te".    ", '/on_
6990: 75 70 64 61 74 65 2f 27 2c 20 6f 6e 5f 75 70 64  update/', on_upd
69a0: 61 74 65 22 0a 0a 20 20 20 20 22 2c 20 27 2f 6e  ate"..    ", '/n
69b0: 61 6d 65 2f 27 2c 20 20 20 27 67 65 6e 66 6b 65  ame/',   'genfke
69c0: 79 27 20 7c 7c 20 6d 69 6e 28 72 6f 77 69 64 29  y' || min(rowid)
69d0: 22 0a 20 20 20 20 22 2c 20 27 2f 74 62 6c 2f 27  ".    ", '/tbl/'
69e0: 2c 20 20 20 20 64 71 28 66 72 6f 6d 5f 74 62 6c  ,    dq(from_tbl
69f0: 29 22 0a 20 20 20 20 22 2c 20 27 2f 72 65 66 2f  )".    ", '/ref/
6a00: 27 2c 20 20 20 20 64 71 28 74 6f 5f 74 62 6c 29  ',    dq(to_tbl)
6a10: 22 0a 20 20 20 20 22 2c 20 27 2f 6b 65 79 5f 6e  ".    ", '/key_n
6a20: 6f 74 6e 75 6c 6c 2f 27 2c 20 73 6a 28 27 6e 65  otnull/', sj('ne
6a30: 77 2e 27 20 7c 7c 20 64 71 28 66 72 6f 6d 5f 63  w.' || dq(from_c
6a40: 6f 6c 29 20 7c 7c 20 27 20 49 53 20 4e 4f 54 20  ol) || ' IS NOT 
6a50: 4e 55 4c 4c 27 2c 20 27 20 41 4e 44 20 27 29 22  NULL', ' AND ')"
6a60: 0a 0a 20 20 20 20 22 2c 20 27 2f 66 6b 65 79 5f  ..    ", '/fkey_
6a70: 6c 69 73 74 2f 27 2c 20 73 6a 28 74 6f 5f 63 6f  list/', sj(to_co
6a80: 6c 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 2c  l, ', ')".    ",
6a90: 20 27 2f 72 6b 65 79 5f 6c 69 73 74 2f 27 2c 20   '/rkey_list/', 
6aa0: 73 6a 28 66 72 6f 6d 5f 63 6f 6c 2c 20 27 2c 20  sj(from_col, ', 
6ab0: 27 29 22 0a 0a 20 20 20 20 22 2c 20 27 2f 63 6f  ')"..    ", '/co
6ac0: 6e 64 31 2f 27 2c 20 20 73 6a 28 6d 75 6c 74 69  nd1/',  sj(multi
6ad0: 72 65 70 6c 61 63 65 28 27 6e 65 77 2e 2f 66 72  replace('new./fr
6ae0: 6f 6d 2f 20 3d 3d 20 2f 74 6f 2f 27 22 0a 20 20  om/ == /to/'".  
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 22 2c 20 27 2f 66 72 6f 6d 2f 27 2c 20 64 71   ", '/from/', dq
6b10: 28 66 72 6f 6d 5f 63 6f 6c 29 22 0a 20 20 20 20  (from_col)".    
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
6b30: 2c 20 27 2f 74 6f 2f 27 2c 20 20 20 64 71 28 74  , '/to/',   dq(t
6b40: 6f 5f 63 6f 6c 29 22 0a 20 20 20 20 20 20 20 20  o_col)".        
6b50: 20 20 20 20 20 20 20 20 20 20 20 22 29 2c 20 27             "), '
6b60: 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20   AND ')".    ", 
6b70: 27 2f 63 6f 6e 64 32 2f 27 2c 20 20 73 6a 28 6d  '/cond2/',  sj(m
6b80: 75 6c 74 69 72 65 70 6c 61 63 65 28 27 6f 6c 64  ultireplace('old
6b90: 2e 2f 74 6f 2f 20 3d 3d 20 2f 66 72 6f 6d 2f 27  ./to/ == /from/'
6ba0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
6bb0: 20 20 20 20 20 22 2c 20 27 2f 66 72 6f 6d 2f 27       ", '/from/'
6bc0: 2c 20 64 71 28 66 72 6f 6d 5f 63 6f 6c 29 22 0a  , dq(from_col)".
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 20 20 20 22 2c 20 27 2f 74 6f 2f 27 2c 20 20 20     ", '/to/',   
6bf0: 64 71 28 74 6f 5f 63 6f 6c 29 22 0a 20 20 20 20  dq(to_col)".    
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
6c10: 29 2c 20 27 20 41 4e 44 20 27 29 22 0a 0a 20 20  ), ' AND ')"..  
6c20: 20 20 22 2c 20 27 2f 75 70 64 61 74 65 5f 61 63    ", '/update_ac
6c30: 74 69 6f 6e 2f 27 2c 20 43 41 53 45 20 6f 6e 5f  tion/', CASE on_
6c40: 75 70 64 61 74 65 20 22 0a 20 20 20 20 20 20 22  update ".      "
6c50: 57 48 45 4e 20 27 53 45 54 20 4e 55 4c 4c 27 20  WHEN 'SET NULL' 
6c60: 54 48 45 4e 20 22 0a 20 20 20 20 20 20 20 20 22  THEN ".        "
6c70: 6d 75 6c 74 69 72 65 70 6c 61 63 65 28 27 55 50  multireplace('UP
6c80: 44 41 54 45 20 2f 74 62 6c 2f 20 53 45 54 20 2f  DATE /tbl/ SET /
6c90: 73 65 74 6c 69 73 74 2f 20 57 48 45 52 45 20 2f  setlist/ WHERE /
6ca0: 77 68 65 72 65 2f 3b 27 20 22 0a 20 20 20 20 20  where/;' ".     
6cb0: 20 20 20 22 2c 20 27 2f 73 65 74 6c 69 73 74 2f     ", '/setlist/
6cc0: 27 2c 20 73 6a 28 66 72 6f 6d 5f 63 6f 6c 7c 7c  ', sj(from_col||
6cd0: 27 20 3d 20 4e 55 4c 4c 27 2c 27 2c 20 27 29 22  ' = NULL',', ')"
6ce0: 0a 20 20 20 20 20 20 20 20 22 2c 20 27 2f 74 62  .        ", '/tb
6cf0: 6c 2f 27 2c 20 20 20 20 20 64 71 28 66 72 6f 6d  l/',     dq(from
6d00: 5f 74 62 6c 29 22 0a 20 20 20 20 20 20 20 20 22  _tbl)".        "
6d10: 2c 20 27 2f 77 68 65 72 65 2f 27 2c 20 20 20 73  , '/where/',   s
6d20: 6a 28 66 72 6f 6d 5f 63 6f 6c 7c 7c 27 20 3d 20  j(from_col||' = 
6d30: 6f 6c 64 2e 27 7c 7c 64 71 28 74 6f 5f 63 6f 6c  old.'||dq(to_col
6d40: 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20  ),' AND ')".    
6d50: 20 20 20 20 22 29 22 0a 20 20 20 20 20 20 22 57      ")".      "W
6d60: 48 45 4e 20 27 43 41 53 43 41 44 45 27 20 54 48  HEN 'CASCADE' TH
6d70: 45 4e 20 22 0a 20 20 20 20 20 20 20 20 22 6d 75  EN ".        "mu
6d80: 6c 74 69 72 65 70 6c 61 63 65 28 27 55 50 44 41  ltireplace('UPDA
6d90: 54 45 20 2f 74 62 6c 2f 20 53 45 54 20 2f 73 65  TE /tbl/ SET /se
6da0: 74 6c 69 73 74 2f 20 57 48 45 52 45 20 2f 77 68  tlist/ WHERE /wh
6db0: 65 72 65 2f 3b 27 20 22 0a 20 20 20 20 20 20 20  ere/;' ".       
6dc0: 20 22 2c 20 27 2f 73 65 74 6c 69 73 74 2f 27 2c   ", '/setlist/',
6dd0: 20 73 6a 28 64 71 28 66 72 6f 6d 5f 63 6f 6c 29   sj(dq(from_col)
6de0: 7c 7c 27 20 3d 20 6e 65 77 2e 27 7c 7c 64 71 28  ||' = new.'||dq(
6df0: 74 6f 5f 63 6f 6c 29 2c 27 2c 20 27 29 22 0a 20  to_col),', ')". 
6e00: 20 20 20 20 20 20 20 22 2c 20 27 2f 74 62 6c 2f         ", '/tbl/
6e10: 27 2c 20 20 20 20 20 64 71 28 66 72 6f 6d 5f 74  ',     dq(from_t
6e20: 62 6c 29 22 0a 20 20 20 20 20 20 20 20 22 2c 20  bl)".        ", 
6e30: 27 2f 77 68 65 72 65 2f 27 2c 20 20 20 73 6a 28  '/where/',   sj(
6e40: 64 71 28 66 72 6f 6d 5f 63 6f 6c 29 7c 7c 27 20  dq(from_col)||' 
6e50: 3d 20 6f 6c 64 2e 27 7c 7c 64 71 28 74 6f 5f 63  = old.'||dq(to_c
6e60: 6f 6c 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20  ol),' AND ')".  
6e70: 20 20 20 20 20 20 22 29 22 0a 20 20 20 20 20 20        ")".      
6e80: 22 45 4c 53 45 20 22 0a 20 20 20 20 20 20 22 20  "ELSE ".      " 
6e90: 20 27 53 45 4c 45 43 54 20 52 41 49 53 45 28 41   'SELECT RAISE(A
6ea0: 42 4f 52 54 2c 20 27 27 63 6f 6e 73 74 72 61 69  BORT, ''constrai
6eb0: 6e 74 20 66 61 69 6c 65 64 27 27 29 3b 27 22 0a  nt failed'');'".
6ec0: 20 20 20 20 20 20 22 45 4e 44 20 22 0a 0a 20 20        "END "..  
6ed0: 20 20 22 2c 20 27 2f 64 65 6c 65 74 65 5f 61 63    ", '/delete_ac
6ee0: 74 69 6f 6e 2f 27 2c 20 43 41 53 45 20 6f 6e 5f  tion/', CASE on_
6ef0: 64 65 6c 65 74 65 20 22 0a 20 20 20 20 20 20 22  delete ".      "
6f00: 57 48 45 4e 20 27 53 45 54 20 4e 55 4c 4c 27 20  WHEN 'SET NULL' 
6f10: 54 48 45 4e 20 22 0a 20 20 20 20 20 20 20 20 22  THEN ".        "
6f20: 6d 75 6c 74 69 72 65 70 6c 61 63 65 28 27 55 50  multireplace('UP
6f30: 44 41 54 45 20 2f 74 62 6c 2f 20 53 45 54 20 2f  DATE /tbl/ SET /
6f40: 73 65 74 6c 69 73 74 2f 20 57 48 45 52 45 20 2f  setlist/ WHERE /
6f50: 77 68 65 72 65 2f 3b 27 20 22 0a 20 20 20 20 20  where/;' ".     
6f60: 20 20 20 22 2c 20 27 2f 73 65 74 6c 69 73 74 2f     ", '/setlist/
6f70: 27 2c 20 73 6a 28 66 72 6f 6d 5f 63 6f 6c 7c 7c  ', sj(from_col||
6f80: 27 20 3d 20 4e 55 4c 4c 27 2c 27 2c 20 27 29 22  ' = NULL',', ')"
6f90: 0a 20 20 20 20 20 20 20 20 22 2c 20 27 2f 74 62  .        ", '/tb
6fa0: 6c 2f 27 2c 20 20 20 20 20 64 71 28 66 72 6f 6d  l/',     dq(from
6fb0: 5f 74 62 6c 29 22 0a 20 20 20 20 20 20 20 20 22  _tbl)".        "
6fc0: 2c 20 27 2f 77 68 65 72 65 2f 27 2c 20 20 20 73  , '/where/',   s
6fd0: 6a 28 66 72 6f 6d 5f 63 6f 6c 7c 7c 27 20 3d 20  j(from_col||' = 
6fe0: 6f 6c 64 2e 27 7c 7c 64 71 28 74 6f 5f 63 6f 6c  old.'||dq(to_col
6ff0: 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20  ),' AND ')".    
7000: 20 20 20 20 22 29 22 0a 20 20 20 20 20 20 22 57      ")".      "W
7010: 48 45 4e 20 27 43 41 53 43 41 44 45 27 20 54 48  HEN 'CASCADE' TH
7020: 45 4e 20 22 0a 20 20 20 20 20 20 20 20 22 6d 75  EN ".        "mu
7030: 6c 74 69 72 65 70 6c 61 63 65 28 27 44 45 4c 45  ltireplace('DELE
7040: 54 45 20 46 52 4f 4d 20 2f 74 62 6c 2f 20 57 48  TE FROM /tbl/ WH
7050: 45 52 45 20 2f 77 68 65 72 65 2f 3b 27 20 22 0a  ERE /where/;' ".
7060: 20 20 20 20 20 20 20 20 22 2c 20 27 2f 74 62 6c          ", '/tbl
7070: 2f 27 2c 20 20 20 20 20 64 71 28 66 72 6f 6d 5f  /',     dq(from_
7080: 74 62 6c 29 22 0a 20 20 20 20 20 20 20 20 22 2c  tbl)".        ",
7090: 20 27 2f 77 68 65 72 65 2f 27 2c 20 20 20 73 6a   '/where/',   sj
70a0: 28 64 71 28 66 72 6f 6d 5f 63 6f 6c 29 7c 7c 27  (dq(from_col)||'
70b0: 20 3d 20 6f 6c 64 2e 27 7c 7c 64 71 28 74 6f 5f   = old.'||dq(to_
70c0: 63 6f 6c 29 2c 27 20 41 4e 44 20 27 29 22 0a 20  col),' AND ')". 
70d0: 20 20 20 20 20 20 20 22 29 22 0a 20 20 20 20 20         ")".     
70e0: 20 22 45 4c 53 45 20 22 0a 20 20 20 20 20 20 22   "ELSE ".      "
70f0: 20 20 27 53 45 4c 45 43 54 20 52 41 49 53 45 28    'SELECT RAISE(
7100: 41 42 4f 52 54 2c 20 27 27 63 6f 6e 73 74 72 61  ABORT, ''constra
7110: 69 6e 74 20 66 61 69 6c 65 64 27 27 29 3b 27 22  int failed'');'"
7120: 0a 20 20 20 20 20 20 22 45 4e 44 20 22 0a 0a 20  .      "END ".. 
7130: 20 20 20 22 29 20 46 52 4f 4d 20 74 65 6d 70 2e     ") FROM temp.
7140: 66 6b 65 79 20 22 0a 20 20 20 20 22 47 52 4f 55  fkey ".    "GROU
7150: 50 20 42 59 20 66 72 6f 6d 5f 74 62 6c 2c 20 66  P BY from_tbl, f
7160: 6b 69 64 22 0a 20 20 3b 0a 0a 20 20 69 6e 74 20  kid".  ;..  int 
7170: 72 63 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  rc;.  const int 
7180: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
7190: 38 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  8;.  sqlite3 *db
71a0: 20 3d 20 30 3b 0a 0a 20 20 47 65 6e 66 6b 65 79   = 0;..  Genfkey
71b0: 43 62 20 63 62 3b 0a 20 20 63 62 2e 78 44 61 74  Cb cb;.  cb.xDat
71c0: 61 20 3d 20 78 44 61 74 61 3b 0a 20 20 63 62 2e  a = xData;.  cb.
71d0: 70 43 74 78 20 3d 20 70 43 74 78 3b 0a 0a 20 20  pCtx = pCtx;..  
71e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
71f0: 28 7a 44 62 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  (zDb);..  /* Ope
7200: 6e 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 61  n the working da
7210: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a  tabase handle. *
7220: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
7230: 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22  _open(":memory:"
7240: 2c 20 26 64 62 29 3b 0a 20 20 69 66 28 20 72 63  , &db);.  if( rc
7250: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
7260: 74 6f 20 67 65 6e 66 6b 65 79 5f 65 78 69 74 3b  to genfkey_exit;
7270: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
7280: 65 20 73 70 65 63 69 61 6c 20 73 63 61 6c 61 72  e special scalar
7290: 20 61 6e 64 20 61 67 67 72 65 67 61 74 65 20 66   and aggregate f
72a0: 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 62 79  unctions used by
72b0: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 20 2a   this program. *
72c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  /.  sqlite3_crea
72d0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
72e0: 22 64 71 22 2c 20 31 2c 20 65 6e 63 2c 20 30 2c  "dq", 1, enc, 0,
72f0: 20 64 6f 75 62 6c 65 71 75 6f 74 65 2c 20 30 2c   doublequote, 0,
7300: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63   0);.  sqlite3_c
7310: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
7320: 62 2c 20 22 6d 75 6c 74 69 72 65 70 6c 61 63 65  b, "multireplace
7330: 22 2c 20 2d 31 2c 20 65 6e 63 2c 20 64 62 2c 20  ", -1, enc, db, 
7340: 6d 75 6c 74 69 72 65 70 6c 61 63 65 2c 20 30 2c  multireplace, 0,
7350: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63   0);.  sqlite3_c
7360: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
7370: 62 2c 20 22 73 6a 22 2c 20 32 2c 20 65 6e 63 2c  b, "sj", 2, enc,
7380: 20 30 2c 20 30 2c 20 6a 6f 69 6e 53 74 65 70 2c   0, 0, joinStep,
7390: 20 6a 6f 69 6e 46 69 6e 61 6c 69 7a 65 29 3b 0a   joinFinalize);.
73a0: 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 74 68  .  /* Install th
73b0: 65 20 22 73 63 68 65 6d 61 22 20 76 69 72 74 75  e "schema" virtu
73c0: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
73d0: 2a 2f 0a 20 20 69 6e 73 74 61 6c 6c 53 63 68 65  */.  installSche
73e0: 6d 61 4d 6f 64 75 6c 65 28 64 62 2c 20 73 64 62  maModule(db, sdb
73f0: 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
7400: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 20 74  and populate a t
7410: 65 6d 70 20 74 61 62 6c 65 20 77 69 74 68 20 74  emp table with t
7420: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72  he information r
7430: 65 71 75 69 72 65 64 20 74 6f 0a 20 20 2a 2a 20  equired to.  ** 
7440: 62 75 69 6c 64 20 74 68 65 20 66 6f 72 65 69 67  build the foreig
7450: 6e 20 6b 65 79 20 74 72 69 67 67 65 72 73 2e 20  n key triggers. 
7460: 53 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  See function pop
7470: 75 6c 61 74 65 54 65 6d 70 54 61 62 6c 65 28 29  ulateTempTable()
7480: 0a 20 20 2a 2a 20 66 6f 72 20 64 65 74 61 69 6c  .  ** for detail
7490: 73 2e 0a 20 20 2a 2f 0a 20 20 63 62 2e 65 54 79  s..  */.  cb.eTy
74a0: 70 65 20 3d 20 47 45 4e 46 4b 45 59 5f 45 52 52  pe = GENFKEY_ERR
74b0: 4f 52 3b 0a 20 20 72 63 20 3d 20 70 6f 70 75 6c  OR;.  rc = popul
74c0: 61 74 65 54 65 6d 70 54 61 62 6c 65 28 64 62 2c  ateTempTable(db,
74d0: 20 26 63 62 29 3b 0a 20 20 69 66 28 20 72 63 21   &cb);.  if( rc!
74e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
74f0: 6f 20 67 65 6e 66 6b 65 79 5f 65 78 69 74 3b 0a  o genfkey_exit;.
7500: 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
7510: 20 2d 2d 6e 6f 2d 64 72 6f 70 20 6f 70 74 69 6f   --no-drop optio
7520: 6e 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  n was specified,
7530: 20 67 65 6e 65 72 61 74 65 20 44 52 4f 50 20 54   generate DROP T
7540: 52 49 47 47 45 52 0a 20 20 2a 2a 20 73 74 61 74  RIGGER.  ** stat
7550: 65 6d 65 6e 74 73 20 74 6f 20 64 72 6f 70 20 61  ements to drop a
7560: 6e 79 20 74 72 69 67 67 65 72 73 20 69 6e 20 74  ny triggers in t
7570: 68 65 20 64 61 74 61 62 61 73 65 20 67 65 6e 65  he database gene
7580: 72 61 74 65 64 20 62 79 20 61 0a 20 20 2a 2a 20  rated by a.  ** 
7590: 70 72 65 76 69 6f 75 73 20 72 75 6e 20 6f 66 20  previous run of 
75a0: 74 68 69 73 20 70 72 6f 67 72 61 6d 2e 0a 20 20  this program..  
75b0: 2a 2f 0a 20 20 63 62 2e 65 54 79 70 65 20 3d 20  */.  cb.eType = 
75c0: 47 45 4e 46 4b 45 59 5f 44 52 4f 50 54 52 49 47  GENFKEY_DROPTRIG
75d0: 47 45 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  GER;.  rc = sqli
75e0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 0a 20 20  te3_exec(db, .  
75f0: 20 20 22 53 45 4c 45 43 54 20 27 44 52 4f 50 20    "SELECT 'DROP 
7600: 54 52 49 47 47 45 52 20 6d 61 69 6e 2e 27 20 7c  TRIGGER main.' |
7610: 7c 20 64 71 28 74 72 69 67 67 65 72 6e 61 6d 65  | dq(triggername
7620: 29 20 7c 7c 20 27 3b 27 20 46 52 4f 4d 20 74 72  ) || ';' FROM tr
7630: 69 67 67 65 72 73 22 0a 20 20 20 20 2c 69 6e 76  iggers".    ,inv
7640: 6f 6b 65 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  okeCallback, (vo
7650: 69 64 20 2a 29 26 63 62 2c 20 30 0a 20 20 29 3b  id *)&cb, 0.  );
7660: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7670: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 67 65 6e 66  E_OK ) goto genf
7680: 6b 65 79 5f 65 78 69 74 3b 0a 0a 20 20 2f 2a 20  key_exit;..  /* 
7690: 52 75 6e 20 74 68 65 20 6d 61 69 6e 20 71 75 65  Run the main que
76a0: 72 79 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ry to create the
76b0: 20 74 72 69 67 67 65 72 20 64 65 66 69 6e 69 74   trigger definit
76c0: 69 6f 6e 73 2e 20 2a 2f 0a 20 20 63 62 2e 65 54  ions. */.  cb.eT
76d0: 79 70 65 20 3d 20 47 45 4e 46 4b 45 59 5f 43 52  ype = GENFKEY_CR
76e0: 45 41 54 45 54 52 49 47 47 45 52 3b 0a 20 20 72  EATETRIGGER;.  r
76f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
7700: 28 64 62 2c 20 7a 53 71 6c 2c 20 69 6e 76 6f 6b  (db, zSql, invok
7710: 65 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  eCallback, (void
7720: 20 2a 29 26 63 62 2c 20 30 29 3b 0a 20 20 69 66   *)&cb, 0);.  if
7730: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7740: 29 20 67 6f 74 6f 20 67 65 6e 66 6b 65 79 5f 65  ) goto genfkey_e
7750: 78 69 74 3b 0a 0a 67 65 6e 66 6b 65 79 5f 65 78  xit;..genfkey_ex
7760: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  it:.  sqlite3_cl
7770: 6f 73 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  ose(db);.  retur
7780: 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66  n rc;.}...#endif
7790: 0a 2f 2a 20 45 6e 64 20 67 65 6e 66 6b 65 79 20  ./* End genfkey 
77a0: 6c 6f 67 69 63 2e 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  logic. */./*****
77b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****/./*********
7800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7840: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
7850: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20 69  following flag i
7860: 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d 6d  s set, then comm
7870: 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73 74  and execution st
7880: 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72 72  ops.** at an err
7890: 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  or if we are not
78a0: 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a 2f   interactive..*/
78b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 69 6c  .static int bail
78c0: 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a 0a  _on_error = 0;..
78d0: 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74 64  /*.** Threat std
78e0: 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61 63  in as an interac
78f0: 74 69 76 65 20 69 6e 70 75 74 20 69 66 20 74 68  tive input if th
7900: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
7910: 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65 2e  able.** is true.
7920: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73    Otherwise, ass
7930: 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f 6e  ume stdin is con
7940: 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c 65  nected to a file
7950: 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74 61   or pipe..*/.sta
7960: 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69 73  tic int stdin_is
7970: 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20 31  _interactive = 1
7980: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
7990: 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f 70  lowing is the op
79a0: 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  en SQLite databa
79b0: 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20 70  se.  We make a p
79c0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69  ointer.** to thi
79d0: 73 20 64 61 74 61 62 61 73 65 20 61 20 73 74 61  s database a sta
79e0: 74 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f 20  tic variable so 
79f0: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 61  that it can be a
7a00: 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74 68  ccessed.** by th
7a10: 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65 72  e SIGINT handler
7a20: 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64 61   to interrupt da
7a30: 74 61 62 61 73 65 20 70 72 6f 63 65 73 73 69 6e  tabase processin
7a40: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  g..*/.static sql
7a50: 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 2f  ite3 *db = 0;../
7a60: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20  *.** True if an 
7a70: 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72  interrupt (Contr
7a80: 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72  ol-C) has been r
7a90: 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  eceived..*/.stat
7aa0: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
7ab0: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
7ac0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  0;../*.** This i
7ad0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75  s the name of ou
7ae0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  r program. It is
7af0: 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20   set in main(), 
7b00: 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d  used.** in a num
7b10: 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61  ber of other pla
7b20: 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20  ces, mostly for 
7b30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
7b40: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
7b50: 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  Argv0;../*.** Pr
7b60: 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e  ompt strings. In
7b70: 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69  itialized in mai
7b80: 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68  n. Settable with
7b90: 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61  .**   .prompt ma
7ba0: 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73  in continue.*/.s
7bb0: 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50  tatic char mainP
7bc0: 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f  rompt[20];     /
7bd0: 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f  * First line pro
7be0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73  mpt. default: "s
7bf0: 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69  qlite> "*/.stati
7c00: 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50  c char continueP
7c10: 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f  rompt[20]; /* Co
7c20: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
7c30: 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20  t. default: "   
7c40: 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ...> " */../*.**
7c50: 20 57 72 69 74 65 20 49 2f 4f 20 74 72 61 63 65   Write I/O trace
7c60: 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s to the followi
7c70: 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69  ng stream..*/.#i
7c80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7c90: 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69  LE_IOTRACE.stati
7ca0: 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65 20  c FILE *iotrace 
7cb0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
7cc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7cd0: 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69 6e 74  works like print
7ce0: 66 20 69 6e 20 74 68 61 74 20 69 74 73 20 66 69  f in that its fi
7cf0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
7d00: 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72 69  a.** format stri
7d10: 6e 67 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ng and subsequen
7d20: 74 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  t arguments are 
7d30: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62  values to be sub
7d40: 73 74 69 74 75 74 65 64 0a 2a 2a 20 69 6e 20 70  stituted.** in p
7d50: 6c 61 63 65 20 6f 66 20 25 20 66 69 65 6c 64 73  lace of % fields
7d60: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  .  The result of
7d70: 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 68 69 73   formatting this
7d80: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 77 72   string.** is wr
7d90: 69 74 74 65 6e 20 74 6f 20 69 6f 74 72 61 63 65  itten to iotrace
7da0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
7db0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
7dc0: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6f  E.static void io
7dd0: 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f 6e 73  tracePrintf(cons
7de0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
7df0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
7e00: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   ap;.  char *z;.
7e10: 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30    if( iotrace==0
7e20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f   ) return;.  va_
7e30: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
7e40: 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  t);.  z = sqlite
7e50: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
7e60: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
7e70: 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66  d(ap);.  fprintf
7e80: 28 69 6f 74 72 61 63 65 2c 20 22 25 73 22 2c 20  (iotrace, "%s", 
7e90: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  z);.  sqlite3_fr
7ea0: 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ee(z);.}.#endif.
7eb0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
7ec0: 65 73 20 69 66 20 61 20 73 74 72 69 6e 67 20 69  es if a string i
7ed0: 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  s a number of no
7ee0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
7ef0: 20 69 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20   isNumber(const 
7f00: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65  char *z, int *re
7f10: 61 6c 6e 75 6d 29 7b 0a 20 20 69 66 28 20 2a 7a  alnum){.  if( *z
7f20: 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27  =='-' || *z=='+'
7f30: 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 21 69   ) z++;.  if( !i
7f40: 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20  sdigit(*z) ){.  
7f50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7f60: 20 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 72 65 61    z++;.  if( rea
7f70: 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20  lnum ) *realnum 
7f80: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  = 0;.  while( is
7f90: 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  digit(*z) ){ z++
7fa0: 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e  ; }.  if( *z=='.
7fb0: 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  ' ){.    z++;.  
7fc0: 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a    if( !isdigit(*
7fd0: 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
7fe0: 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69     while( isdigi
7ff0: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
8000: 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20      if( realnum 
8010: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a  ) *realnum = 1;.
8020: 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65    }.  if( *z=='e
8030: 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a  ' || *z=='E' ){.
8040: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
8050: 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d   *z=='+' || *z==
8060: 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69  '-' ) z++;.    i
8070: 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a 29 20  f( !isdigit(*z) 
8080: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
8090: 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a  while( isdigit(*
80a0: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  z) ){ z++; }.   
80b0: 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a   if( realnum ) *
80c0: 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d  realnum = 1;.  }
80d0: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b  .  return *z==0;
80e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62  .}../*.** A glob
80f0: 61 6c 20 63 68 61 72 2a 20 61 6e 64 20 61 6e 20  al char* and an 
8100: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  SQL function to 
8110: 61 63 63 65 73 73 20 69 74 73 20 63 75 72 72 65  access its curre
8120: 6e 74 20 76 61 6c 75 65 20 0a 2a 2a 20 66 72 6f  nt value .** fro
8130: 6d 20 77 69 74 68 69 6e 20 61 6e 20 53 51 4c 20  m within an SQL 
8140: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
8150: 70 72 6f 67 72 61 6d 20 75 73 65 64 20 74 6f 20  program used to 
8160: 75 73 65 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69  use the .** sqli
8170: 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29  te_exec_printf()
8180: 20 41 50 49 20 74 6f 20 73 75 62 73 74 69 74 75   API to substitu
8190: 65 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  e a string into 
81a0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
81b0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74  ..** The correct
81c0: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 69 73 20   way to do this 
81d0: 77 69 74 68 20 73 71 6c 69 74 65 33 20 69 73 20  with sqlite3 is 
81e0: 74 6f 20 75 73 65 20 74 68 65 20 62 69 6e 64 20  to use the bind 
81f0: 41 50 49 2c 20 62 75 74 0a 2a 2a 20 73 69 6e 63  API, but.** sinc
8200: 65 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20 62  e the shell is b
8210: 75 69 6c 74 20 61 72 6f 75 6e 64 20 74 68 65 20  uilt around the 
8220: 63 61 6c 6c 62 61 63 6b 20 70 61 72 61 64 69 67  callback paradig
8230: 6d 20 69 74 20 77 6f 75 6c 64 20 62 65 20 61 20  m it would be a 
8240: 6c 6f 74 0a 2a 2a 20 6f 66 20 77 6f 72 6b 2e 20  lot.** of work. 
8250: 49 6e 73 74 65 61 64 20 6a 75 73 74 20 75 73 65  Instead just use
8260: 20 74 68 69 73 20 68 61 63 6b 2c 20 77 68 69 63   this hack, whic
8270: 68 20 69 73 20 71 75 69 74 65 20 68 61 72 6d 6c  h is quite harml
8280: 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ess..*/.static c
8290: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 68 65 6c  onst char *zShel
82a0: 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 73 74 61  lStatic = 0;.sta
82b0: 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 73 74  tic void shellst
82c0: 61 74 69 63 46 75 6e 63 28 0a 20 20 73 71 6c 69  aticFunc(.  sqli
82d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
82e0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
82f0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
8300: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 61 73  e **argv.){.  as
8310: 73 65 72 74 28 20 30 3d 3d 61 72 67 63 20 29 3b  sert( 0==argc );
8320: 0a 20 20 61 73 73 65 72 74 28 20 7a 53 68 65 6c  .  assert( zShel
8330: 6c 53 74 61 74 69 63 20 29 3b 0a 20 20 55 4e 55  lStatic );.  UNU
8340: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
8350: 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gc);.  UNUSED_PA
8360: 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a 20  RAMETER(argv);. 
8370: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8380: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 53  text(context, zS
8390: 68 65 6c 6c 53 74 61 74 69 63 2c 20 2d 31 2c 20  hellStatic, -1, 
83a0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
83b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
83c0: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
83d0: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
83e0: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
83f0: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
8400: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
8410: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
8420: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
8430: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
8440: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
8450: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
8460: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
8470: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
8480: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
8490: 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64  ce is like "read
84a0: 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d  line" but no com
84b0: 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e  mand-line editin
84c0: 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f  g.** is done..*/
84d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f  .static char *lo
84e0: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72  cal_getline(char
84f0: 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20   *zPrompt, FILE 
8500: 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  *in){.  char *zL
8510: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ine;.  int nLine
8520: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
8530: 20 65 6f 6c 3b 0a 0a 20 20 69 66 28 20 7a 50 72   eol;..  if( zPr
8540: 6f 6d 70 74 20 26 26 20 2a 7a 50 72 6f 6d 70 74  ompt && *zPrompt
8550: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
8560: 25 73 22 2c 7a 50 72 6f 6d 70 74 29 3b 0a 20 20  %s",zPrompt);.  
8570: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
8580: 3b 0a 20 20 7d 0a 20 20 6e 4c 69 6e 65 20 3d 20  ;.  }.  nLine = 
8590: 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d  100;.  zLine = m
85a0: 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a  alloc( nLine );.
85b0: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
85c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d   return 0;.  n =
85d0: 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20   0;.  eol = 0;. 
85e0: 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a   while( !eol ){.
85f0: 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c      if( n+100>nL
8600: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69  ine ){.      nLi
8610: 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31  ne = nLine*2 + 1
8620: 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20  00;.      zLine 
8630: 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c  = realloc(zLine,
8640: 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69   nLine);.      i
8650: 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65  f( zLine==0 ) re
8660: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
8670: 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69    if( fgets(&zLi
8680: 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e  ne[n], nLine - n
8690: 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , in)==0 ){.    
86a0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
86b0: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
86c0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
86d0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
86e0: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
86f0: 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a  .      eol = 1;.
8700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8710: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c   }.    while( zL
8720: 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d  ine[n] ){ n++; }
8730: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
8740: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
8750: 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20   ){.      n--;. 
8760: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
8770: 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31  0;.      eol = 1
8780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c  ;.    }.  }.  zL
8790: 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a  ine = realloc( z
87a0: 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72  Line, n+1 );.  r
87b0: 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a  eturn zLine;.}..
87c0: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
87d0: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
87e0: 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a 2a 0a 2a  input text..**.*
87f0: 2a 20 7a 50 72 69 6f 72 20 69 73 20 61 20 73 74  * zPrior is a st
8800: 72 69 6e 67 20 6f 66 20 70 72 69 6f 72 20 74 65  ring of prior te
8810: 78 74 20 72 65 74 72 69 65 76 65 64 2e 20 20 49  xt retrieved.  I
8820: 66 20 6e 6f 74 20 74 68 65 20 65 6d 70 74 79 0a  f not the empty.
8830: 2a 2a 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20  ** string, then 
8840: 69 73 73 75 65 20 61 20 63 6f 6e 74 69 6e 75 61  issue a continua
8850: 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 0a 2a 2f 0a  tion prompt..*/.
8860: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e 65  static char *one
8870: 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 63 6f 6e 73  _input_line(cons
8880: 74 20 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20  t char *zPrior, 
8890: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
88a0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
88b0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
88c0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
88d0: 72 65 74 75 72 6e 20 6c 6f 63 61 6c 5f 67 65 74  return local_get
88e0: 6c 69 6e 65 28 30 2c 20 69 6e 29 3b 0a 20 20 7d  line(0, in);.  }
88f0: 0a 20 20 69 66 28 20 7a 50 72 69 6f 72 20 26 26  .  if( zPrior &&
8900: 20 7a 50 72 69 6f 72 5b 30 5d 20 29 7b 0a 20 20   zPrior[0] ){.  
8910: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 63 6f 6e 74    zPrompt = cont
8920: 69 6e 75 65 50 72 6f 6d 70 74 3b 0a 20 20 7d 65  inuePrompt;.  }e
8930: 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74  lse{.    zPrompt
8940: 20 3d 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 20   = mainPrompt;. 
8950: 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20 3d 20 72   }.  zResult = r
8960: 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29  eadline(zPrompt)
8970: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ;.#if defined(HA
8980: 56 45 5f 52 45 41 44 4c 49 4e 45 29 20 26 26 20  VE_READLINE) && 
8990: 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d 31  HAVE_READLINE==1
89a0: 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20 26  .  if( zResult &
89b0: 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 61 64 64  & *zResult ) add
89c0: 5f 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74  _history(zResult
89d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
89e0: 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 73  rn zResult;.}..s
89f0: 74 72 75 63 74 20 70 72 65 76 69 6f 75 73 5f 6d  truct previous_m
8a00: 6f 64 65 5f 64 61 74 61 20 7b 0a 20 20 69 6e 74  ode_data {.  int
8a10: 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 2f   valid;        /
8a20: 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67 69 74  * Is there legit
8a30: 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f 20 2a   data in here? *
8a40: 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20  /.  int mode;.  
8a50: 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 0a  int showHeader;.
8a60: 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31    int colWidth[1
8a70: 30 30 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  00];.};../*.** A
8a80: 6e 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  n pointer to an 
8a90: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
8aa0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 70 61   structure is pa
8ab0: 73 73 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ssed from.** the
8ac0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 74 6f   main program to
8ad0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
8ae0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
8af0: 63 6f 6d 6d 75 6e 69 63 61 74 65 0a 2a 2a 20 73  communicate.** s
8b00: 74 61 74 65 20 61 6e 64 20 6d 6f 64 65 20 69 6e  tate and mode in
8b10: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
8b20: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
8b30: 74 61 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ta {.  sqlite3 *
8b40: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  db;            /
8b50: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
8b60: 2f 0a 20 20 69 6e 74 20 65 63 68 6f 4f 6e 3b 20  /.  int echoOn; 
8b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8b80: 75 65 20 74 6f 20 65 63 68 6f 20 69 6e 70 75 74  ue to echo input
8b90: 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 20 20 69   commands */.  i
8ba0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
8bb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8bc0: 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c  of records displ
8bd0: 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ayed so far */. 
8be0: 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20   FILE *out;     
8bf0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
8c00: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
8c10: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
8c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
8c30: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
8c40: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69  ing */.  int wri
8c50: 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20 20  tableSchema;    
8c60: 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d  /* True if PRAGM
8c70: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
8c80: 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73 68  a=ON */.  int sh
8c90: 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20 20 20  owHeader;       
8ca0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f 77   /* True to show
8cb0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
8cc0: 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e 20   List or Column 
8cd0: 6d 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mode */.  char *
8ce0: 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20  zDestTable;     
8cf0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74   /* Name of dest
8d00: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68  ination table wh
8d10: 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a  en MODE_Insert *
8d20: 2f 0a 20 20 63 68 61 72 20 73 65 70 61 72 61 74  /.  char separat
8d30: 6f 72 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 53 65  or[20];    /* Se
8d40: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
8d50: 72 20 66 6f 72 20 4d 4f 44 45 5f 4c 69 73 74 20  r for MODE_List 
8d60: 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74  */.  int colWidt
8d70: 68 5b 31 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52  h[100];     /* R
8d80: 65 71 75 65 73 74 65 64 20 77 69 64 74 68 20 6f  equested width o
8d90: 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68  f each column wh
8da0: 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64  en in column mod
8db0: 65 2a 2f 0a 20 20 69 6e 74 20 61 63 74 75 61 6c  e*/.  int actual
8dc0: 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20  Width[100];  /* 
8dd0: 41 63 74 75 61 6c 20 77 69 64 74 68 20 6f 66 20  Actual width of 
8de0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  each column */. 
8df0: 20 63 68 61 72 20 6e 75 6c 6c 76 61 6c 75 65 5b   char nullvalue[
8e00: 32 30 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  20];    /* The t
8e10: 65 78 74 20 74 6f 20 70 72 69 6e 74 20 77 68 65  ext to print whe
8e20: 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62  n a NULL comes b
8e30: 61 63 6b 20 66 72 6f 6d 0a 20 20 20 20 20 20 20  ack from.       
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
8e60: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 72  e */.  struct pr
8e70: 65 76 69 6f 75 73 5f 6d 6f 64 65 5f 64 61 74 61  evious_mode_data
8e80: 20 65 78 70 6c 61 69 6e 50 72 65 76 3b 0a 20 20   explainPrev;.  
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 20 20 20 20 20 20 2f 2a 20 48 6f 6c 64 73 20         /* Holds 
8eb0: 74 68 65 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61  the mode informa
8ec0: 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65  tion just before
8ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ee0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2e 65 78            ** .ex
8ef0: 70 6c 61 69 6e 20 4f 4e 20 2a 2f 0a 20 20 63 68  plain ON */.  ch
8f00: 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e  ar outfile[FILEN
8f10: 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c  AME_MAX]; /* Fil
8f20: 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a  ename for *out *
8f30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
8f40: 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  zDbFilename;    
8f50: 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
8f60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
8f70: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  };../*.** These 
8f80: 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  are the allowed 
8f90: 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  modes..*/.#defin
8fa0: 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20  e MODE_Line     
8fb0: 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e  0  /* One column
8fc0: 20 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e   per line.  Blan
8fd0: 6b 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72  k line between r
8fe0: 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e  ecords */.#defin
8ff0: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20  e MODE_Column   
9000: 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64  1  /* One record
9010: 20 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61   per line in nea
9020: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65  t columns */.#de
9030: 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20  fine MODE_List  
9040: 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63     2  /* One rec
9050: 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74  ord per line wit
9060: 68 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f  h a separator */
9070: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65  .#define MODE_Se
9080: 6d 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d  mi     3  /* Sam
9090: 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62  e as MODE_List b
90a0: 75 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f  ut append ";" to
90b0: 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64   each line */.#d
90c0: 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20  efine MODE_Html 
90d0: 20 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61      4  /* Genera
90e0: 74 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c  te an XHTML tabl
90f0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  e */.#define MOD
9100: 45 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a  E_Insert   5  /*
9110: 20 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69   Generate SQL "i
9120: 6e 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74  nsert" statement
9130: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  s */.#define MOD
9140: 45 5f 54 63 6c 20 20 20 20 20 20 36 20 20 2f 2a  E_Tcl      6  /*
9150: 20 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43   Generate ANSI-C
9160: 20 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65   or TCL quoted e
9170: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  lements */.#defi
9180: 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20  ne MODE_Csv     
9190: 20 37 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72   7  /* Quote str
91a0: 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72  ings, numbers ar
91b0: 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69  e plain */.#defi
91c0: 6e 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  ne MODE_Explain 
91d0: 20 38 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45   8  /* Like MODE
91e0: 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20  _Column, but do 
91f0: 6e 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74  not truncate dat
9200: 61 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  a */..static con
9210: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
9220: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
9230: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
9240: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
9250: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
9260: 69 6e 73 65 72 74 22 2c 0a 20 20 22 74 63 6c 22  insert",.  "tcl"
9270: 2c 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78  ,.  "csv",.  "ex
9280: 70 6c 61 69 6e 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  plain",.};../*.*
9290: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
92a0: 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61 79  ents in an array
92b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 72 72 61  .*/.#define Arra
92c0: 79 53 69 7a 65 28 58 29 20 20 28 69 6e 74 29 28  ySize(X)  (int)(
92d0: 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66  sizeof(X)/sizeof
92e0: 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 43  (X[0]))../*.** C
92f0: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
9300: 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c  length that is l
9310: 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20 63  imited to what c
9320: 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a  an be stored in.
9330: 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73  ** lower 30 bits
9340: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69 67   of a 32-bit sig
9350: 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  ned integer..*/.
9360: 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65  static int strle
9370: 6e 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  n30(const char *
9380: 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z){.  const char
9390: 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c   *z2 = z;.  whil
93a0: 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20  e( *z2 ){ z2++; 
93b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66 66  }.  return 0x3ff
93c0: 66 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32  fffff & (int)(z2
93d0: 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - z);.}../*.** 
93e0: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
93f0: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
9400: 74 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67  ted string using
9410: 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e   SQL quoting con
9420: 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  ventions..*/.sta
9430: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
9440: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49  quoted_string(FI
9450: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
9460: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
9470: 3b 0a 20 20 69 6e 74 20 6e 53 69 6e 67 6c 65 20  ;.  int nSingle 
9480: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
9490: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
94a0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29  if( z[i]=='\'' )
94b0: 20 6e 53 69 6e 67 6c 65 2b 2b 3b 0a 20 20 7d 0a   nSingle++;.  }.
94c0: 20 20 69 66 28 20 6e 53 69 6e 67 6c 65 3d 3d 30    if( nSingle==0
94d0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
94e0: 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20  out,"'%s'",z);. 
94f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
9500: 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20  ntf(out,"'");.  
9510: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
9520: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
9530: 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27  i] && z[i]!='\''
9540: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69  ; i++){}.      i
9550: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
9560: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
9570: 27 27 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 2b  ''");.        z+
9580: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
9590: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  f( z[i]=='\'' ){
95a0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
95b0: 28 6f 75 74 2c 22 25 2e 2a 73 27 27 22 2c 69 2c  (out,"%.*s''",i,
95c0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d  z);.        z +=
95d0: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   i+1;.      }els
95e0: 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
95f0: 74 66 28 6f 75 74 2c 22 25 73 22 2c 7a 29 3b 0a  tf(out,"%s",z);.
9600: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9610: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9620: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22   fprintf(out,"'"
9630: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9640: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
9650: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
9660: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ted according to
9670: 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e   C or TCL quotin
9680: 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  g rules..*/.stat
9690: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
96a0: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
96b0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
96c0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
96d0: 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27  t c;.  fputc('"'
96e0: 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28  , out);.  while(
96f0: 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30   (c = *(z++))!=0
9700: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ){.    if( c=='
9710: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \\' ){.      fpu
9720: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
9730: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
9740: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
9750: 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20  =='\t' ){.      
9760: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
9770: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 74  ;.      fputc('t
9780: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
9790: 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29  se if( c=='\n' )
97a0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
97b0: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
97c0: 66 70 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b  fputc('n', out);
97d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
97e0: 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  =='\r' ){.      
97f0: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
9800: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 72  ;.      fputc('r
9810: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
9820: 73 65 20 69 66 28 20 21 69 73 70 72 69 6e 74 28  se if( !isprint(
9830: 63 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  c) ){.      fpri
9840: 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f  ntf(out, "\\%03o
9850: 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20  ", c&0xff);.    
9860: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75  }else{.      fpu
9870: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
9880: 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22  }.  }.  fputc('"
9890: 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ', out);.}../*.*
98a0: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
98b0: 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63  en string with c
98c0: 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61  haracters that a
98d0: 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a  re special to.**
98e0: 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a   HTML escaped..*
98f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
9900: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
9910: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
9920: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
9930: 74 20 69 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  t i;.  while( *z
9940: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
9950: 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27   z[i] && z[i]!='
9960: 3c 27 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 3b  <' && z[i]!='&';
9970: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20   i++){}.    if( 
9980: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  i>0 ){.      fpr
9990: 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c  intf(out,"%.*s",
99a0: 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i,z);.    }.    
99b0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b  if( z[i]=='<' ){
99c0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
99d0: 75 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20  ut,"&lt;");.    
99e0: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
99f0: 27 26 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72  '&' ){.      fpr
9a00: 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22  intf(out,"&amp;"
9a10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9a20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9a30: 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b  .    z += i + 1;
9a40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
9a50: 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e   a field contain
9a60: 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20  s any character 
9a70: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20  identified by a 
9a80: 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  1 in the followi
9a90: 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65  ng.** array, the
9aa0: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73  n the string mus
9ab0: 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20  t be quoted for 
9ac0: 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  CSV..*/.static c
9ad0: 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73  onst char needCs
9ae0: 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31  vQuote[] = {.  1
9af0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9b00: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
9b10: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9b20: 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31     .  1, 1, 1, 1
9b30: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
9b40: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9b50: 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20  , 1, 1,   .  1, 
9b60: 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 1, 0, 0, 0, 0
9b70: 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 1,   0, 0, 0, 
9b80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  0, 0, 0, 0, 0, .
9b90: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
9ba0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
9bb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9bc0: 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20   0, .  0, 0, 0, 
9bd0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
9be0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9bf0: 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30  0, 0, 0, .  0, 0
9c00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9c10: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
9c20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20  , 0, 0, 0, 0, . 
9c30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9c40: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
9c50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9c60: 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30  0, .  0, 0, 0, 0
9c70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
9c80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9c90: 2c 20 30 2c 20 31 2c 20 0a 20 20 31 2c 20 31 2c  , 0, 1, .  1, 1,
9ca0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9cb0: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
9cc0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
9cd0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
9ce0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
9cf0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9d00: 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31   1,   .  1, 1, 1
9d10: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9d20: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
9d30: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20  , 1, 1, 1,   .  
9d40: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9d50: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
9d60: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9d70: 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20  ,   .  1, 1, 1, 
9d80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
9d90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9da0: 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c  1, 1, 1,   .  1,
9db0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9dc0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
9dd0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9de0: 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c    .  1, 1, 1, 1,
9df0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
9e00: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9e10: 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31   1, 1,   .  1, 1
9e20: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9e30: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
9e40: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
9e50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  .};../*.** Outpu
9e60: 74 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  t a single term 
9e70: 6f 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c  of CSV.  Actuall
9e80: 79 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 20  y, p->separator 
9e90: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
9ea0: 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68  he separator, wh
9eb0: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
9ec0: 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20  ot be a comma.  
9ed0: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 20 69 73 0a  p->nullvalue is.
9ee0: 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75  ** the null valu
9ef0: 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20  e.  Strings are 
9f00: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 41 4e 53  quoted using ANS
9f10: 49 2d 43 20 72 75 6c 65 73 2e 20 20 4e 75 6d 62  I-C rules.  Numb
9f20: 65 72 73 0a 2a 2a 20 61 70 70 65 61 72 20 6f 75  ers.** appear ou
9f30: 74 73 69 64 65 20 6f 66 20 71 75 6f 74 65 73 2e  tside of quotes.
9f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9f50: 6f 75 74 70 75 74 5f 63 73 76 28 73 74 72 75 63  output_csv(struc
9f60: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
9f70: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
9f80: 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20  z, int bSep){.  
9f90: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f  FILE *out = p->o
9fa0: 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  ut;.  if( z==0 )
9fb0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
9fc0: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 76 61  t,"%s",p->nullva
9fd0: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
9fe0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
9ff0: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
a000: 30 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  0(p->separator);
a010: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
a020: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
a030: 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65  if( needCsvQuote
a040: 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [((unsigned char
a050: 2a 29 7a 29 5b 69 5d 5d 20 0a 20 20 20 20 20 20  *)z)[i]] .      
a060: 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e     || (z[i]==p->
a070: 73 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26 20  separator[0] && 
a080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e  .             (n
a090: 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70  Sep==1 || memcmp
a0a0: 28 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  (z, p->separator
a0b0: 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a  , nSep)==0)) ){.
a0c0: 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20          i = 0;. 
a0d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a0e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a0f0: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
a100: 20 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29    putc('"', out)
a110: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a120: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
a130: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
a140: 22 27 20 29 20 70 75 74 63 28 27 22 27 2c 20 6f  "' ) putc('"', o
a150: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ut);.        put
a160: 63 28 7a 5b 69 5d 2c 20 6f 75 74 29 3b 0a 20 20  c(z[i], out);.  
a170: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 63      }.      putc
a180: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
a190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
a1a0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
a1b0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
a1c0: 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20  if( bSep ){.    
a1d0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
a1e0: 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61 74  "%s", p->separat
a1f0: 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64  or);.  }.}..#ifd
a200: 65 66 20 53 49 47 49 4e 54 0a 2f 2a 0a 2a 2a 20  ef SIGINT./*.** 
a210: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
a220: 73 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  s when the user 
a230: 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a  presses Ctrl-C.*
a240: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
a250: 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28  terrupt_handler(
a260: 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20  int NotUsed){.  
a270: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a280: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65  (NotUsed);.  see
a290: 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 31 3b 0a  nInterrupt = 1;.
a2a0: 20 20 69 66 28 20 64 62 20 29 20 73 71 6c 69 74    if( db ) sqlit
a2b0: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
a2c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
a2d0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
a2e0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
a2f0: 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c  hat the SQLite l
a300: 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65  ibrary.** invoke
a310: 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  s for each row o
a320: 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74  f a query result
a330: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a340: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
a350: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
a360: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
a370: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e  r **azCol){.  in
a380: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 61  t i;.  struct ca
a390: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d  llback_data *p =
a3a0: 20 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63   (struct callbac
a3b0: 6b 5f 64 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  k_data*)pArg;.  
a3c0: 73 77 69 74 63 68 28 20 70 2d 3e 6d 6f 64 65 20  switch( p->mode 
a3d0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  ){.    case MODE
a3e0: 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  _Line: {.      i
a3f0: 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20  nt w = 5;.      
a400: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
a410: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
a420: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
a430: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
a440: 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a  en = strlen30(az
a450: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
a460: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
a470: 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d   if( len>w ) w =
a480: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   len;.      }.  
a490: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
a4a0: 3e 30 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e  >0 ) fprintf(p->
a4b0: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
a4c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
a4d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a4e0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
a4f0: 25 2a 73 20 3d 20 25 73 5c 6e 22 2c 20 77 2c 20  %*s = %s\n", w, 
a500: 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20  azCol[i],.      
a510: 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
a520: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
a530: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
a540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
a550: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a560: 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a  se MODE_Explain:
a570: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43  .    case MODE_C
a580: 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 69  olumn: {.      i
a590: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
a5a0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
a5b0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
a5c0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
a5d0: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
a5e0: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
a5f0: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
a600: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70             w = p
a610: 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ->colWidth[i];. 
a620: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
a630: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
a640: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
a650: 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 3d           if( w<=
a660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
a670: 20 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   w = strlen30(az
a680: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
a690: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
a6a0: 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20       if( w<10 ) 
a6b0: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
a6c0: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
a6d0: 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b  (azArg && azArg[
a6e0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
a6f0: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
a700: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
a710: 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20  <n ) w = n;.    
a720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a730: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
a740: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
a750: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
a760: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
a770: 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20  i] = w;.        
a780: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
a790: 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  ( p->showHeader 
a7a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
a7b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
a7c0: 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 61 7a 43  -*.*s%s",w,w,azC
a7d0: 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d 31  ol[i], i==nArg-1
a7e0: 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a   ? "\n": "  ");.
a7f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a800: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
a810: 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  ( p->showHeader 
a820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
a830: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
a840: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
a850: 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20  int w;.         
a860: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
a870: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
a880: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
a890: 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75       w = p->actu
a8a0: 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  alWidth[i];.    
a8b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
a8d0: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
a8e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a8f0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
a900: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 22 2d  %-*.*s%s",w,w,"-
a910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a930: 2d 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  --".            
a940: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d         "--------
a950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a980: 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  --",.           
a990: 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67           i==nArg
a9a0: 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29  -1 ? "\n": "  ")
a9b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a9d0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
a9e0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
a9f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
aa00: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
aa10: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
aa20: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
aa30: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
aa40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  ){.           w 
aa50: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
aa60: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  [i];.        }el
aa70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77  se{.           w
aa80: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d   = 10;.        }
aa90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
aaa0: 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
aab0: 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26  in && azArg[i] &
aac0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 73 74  & .           st
aad0: 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29  rlen30(azArg[i])
aae0: 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >w ){.          
aaf0: 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  w = strlen30(azA
ab00: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
ab10: 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  }.        fprint
ab20: 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73  f(p->out,"%-*.*s
ab30: 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20  %s",w,w,.       
ab40: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
ab50: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
ab60: 6c 6c 76 61 6c 75 65 2c 20 69 3d 3d 6e 41 72 67  llvalue, i==nArg
ab70: 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29  -1 ? "\n": "  ")
ab80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ab90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
aba0: 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a   case MODE_Semi:
abb0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c  .    case MODE_L
abc0: 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ist: {.      if(
abd0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
abe0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
abf0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
ac00: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
ac10: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
ac20: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c  f(p->out,"%s%s",
ac30: 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72  azCol[i], i==nAr
ac40: 67 2d 31 20 3f 20 22 5c 6e 22 20 3a 20 70 2d 3e  g-1 ? "\n" : p->
ac50: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
ac60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ac70: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
ac80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ac90: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
aca0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
acb0: 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
acc0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
acd0: 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c  ==0 ) z = p->nul
ace0: 6c 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  lvalue;.        
acf0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
ad00: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  "%s", z);.      
ad10: 20 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20 29    if( i<nArg-1 )
ad20: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
ad30: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
ad40: 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  , p->separator);
ad50: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ad60: 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
ad70: 5f 53 65 6d 69 20 29 7b 0a 20 20 20 20 20 20 20  _Semi ){.       
ad80: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
ad90: 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  t, ";\n");.     
ada0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
adb0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
adc0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
add0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ade0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
adf0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74      case MODE_Ht
ae00: 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ml: {.      if( 
ae10: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
ae20: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
ae30: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
ae40: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
ae50: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
ae60: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
ae70: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
ae80: 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 25 73 3c  (p->out,"<TH>%s<
ae90: 2f 54 48 3e 22 2c 61 7a 43 6f 6c 5b 69 5d 29 3b  /TH>",azCol[i]);
aea0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aeb0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
aec0: 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20  t,"</TR>\n");.  
aed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
aee0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
aef0: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
af00: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
af10: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
af20: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
af30: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
af40: 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20  out,"<TD>");.   
af50: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
af60: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
af70: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
af80: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c  [i] : p->nullval
af90: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  ue);.        fpr
afa0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
afb0: 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  D>\n");.      }.
afc0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
afd0: 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b  >out,"</TR>\n");
afe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
aff0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
b000: 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20 69  E_Tcl: {.      i
b010: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
b020: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
b030: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
b040: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
b050: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
b060: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
b070: 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  ut,azCol[i] ? az
b080: 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20  Col[i] : "");.  
b090: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
b0a0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
b0b0: 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  >separator);.   
b0c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
b0d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c  printf(p->out,"\
b0e0: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
b0f0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
b100: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
b110: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
b120: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75  i++){.        ou
b130: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
b140: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
b150: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
b160: 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullvalue);.     
b170: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
b180: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61  t, "%s", p->sepa
b190: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
b1a0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
b1b0: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
b1c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b1d0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76     case MODE_Csv
b1e0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
b1f0: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
b200: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
b210: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
b220: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
b230: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
b240: 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20  v(p, azCol[i] ? 
b250: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69  azCol[i] : "", i
b260: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
b270: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69    }.        fpri
b280: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
b290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2a0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
b2b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
b2c0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
b2d0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  ){.        outpu
b2e0: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
b2f0: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
b300: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
b310: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
b320: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b330: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
b340: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
b350: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
b360: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
b370: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49  printf(p->out,"I
b380: 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 20 56 41  NSERT INTO %s VA
b390: 4c 55 45 53 28 22 2c 70 2d 3e 7a 44 65 73 74 54  LUES(",p->zDestT
b3a0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  able);.      for
b3b0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
b3c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
b3d0: 20 2a 7a 53 65 70 20 3d 20 69 3e 30 20 3f 20 22   *zSep = i>0 ? "
b3e0: 2c 22 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20  ,": "";.        
b3f0: 69 66 28 20 61 7a 41 72 67 5b 69 5d 3d 3d 30 20  if( azArg[i]==0 
b400: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
b410: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 4e  intf(p->out,"%sN
b420: 55 4c 4c 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20  ULL",zSep);.    
b430: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
b440: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
b450: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
b460: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
b470: 22 25 73 25 73 22 2c 7a 53 65 70 2c 20 61 7a 41  "%s%s",zSep, azA
b480: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
b490: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b4a0: 20 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66   if( zSep[0] ) f
b4b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
b4c0: 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20  s",zSep);.      
b4d0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
b4e0: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
b4f0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
b500: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b510: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
b520: 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut,");\n");.    
b530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b540: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
b550: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
b560: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
b570: 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
b580: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 73 74 72  allback_data str
b590: 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65  ucture to.** the
b5a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
b5b0: 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70  le given.  Escap
b5c0: 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72  e any quote char
b5d0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a  acters in the.**
b5e0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a   table name..*/.
b5f0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f  static void set_
b600: 74 61 62 6c 65 5f 6e 61 6d 65 28 73 74 72 75 63  table_name(struc
b610: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
b620: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
b630: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c  zName){.  int i,
b640: 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75   n;.  int needQu
b650: 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ote;.  char *z;.
b660: 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54  .  if( p->zDestT
b670: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65  able ){.    free
b680: 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  (p->zDestTable);
b690: 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62  .    p->zDestTab
b6a0: 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  le = 0;.  }.  if
b6b0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
b6c0: 75 72 6e 3b 0a 20 20 6e 65 65 64 51 75 6f 74 65  urn;.  needQuote
b6d0: 20 3d 20 21 69 73 61 6c 70 68 61 28 28 75 6e 73   = !isalpha((uns
b6e0: 69 67 6e 65 64 20 63 68 61 72 29 2a 7a 4e 61 6d  igned char)*zNam
b6f0: 65 29 20 26 26 20 2a 7a 4e 61 6d 65 21 3d 27 5f  e) && *zName!='_
b700: 27 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20  ';.  for(i=n=0; 
b710: 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 2c 20 6e  zName[i]; i++, n
b720: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
b730: 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20  alnum((unsigned 
b740: 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26  char)zName[i]) &
b750: 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20  & zName[i]!='_' 
b760: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 51 75 6f  ){.      needQuo
b770: 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  te = 1;.      if
b780: 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27  ( zName[i]=='\''
b790: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
b7a0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
b7b0: 65 20 29 20 6e 20 2b 3d 20 32 3b 0a 20 20 7a 20  e ) n += 2;.  z 
b7c0: 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20  = p->zDestTable 
b7d0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b  = malloc( n+1 );
b7e0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
b7f0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
b800: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
b810: 21 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  !\n");.    exit(
b820: 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b  1);.  }.  n = 0;
b830: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
b840: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[n++] = '\''
b850: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
b860: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  me[i]; i++){.   
b870: 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b   z[n++] = zName[
b880: 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  i];.    if( zNam
b890: 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 6e  e[i]=='\'' ) z[n
b8a0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a  ++] = '\'';.  }.
b8b0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
b8c0: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[n++] = '\'';
b8d0: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[n] = 0;.}..
b8e0: 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74 68 65 72  /* zIn is either
b8f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
b900: 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20  NULL-terminated 
b910: 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79  string in memory
b920: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
b930: 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72 20 61  m malloc(), or a
b940: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 54   NULL pointer. T
b950: 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  he string pointe
b960: 64 20 74 6f 20 62 79 20 7a 41 70 70 65 6e 64 20  d to by zAppend 
b970: 69 73 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 7a  is.** added to z
b980: 49 6e 2c 20 61 6e 64 20 74 68 65 20 72 65 73 75  In, and the resu
b990: 6c 74 20 72 65 74 75 72 6e 65 64 20 69 6e 20 6d  lt returned in m
b9a0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
b9b0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  rom malloc()..**
b9c0: 20 7a 49 6e 2c 20 69 66 20 69 74 20 77 61 73 20   zIn, if it was 
b9d0: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20 66 72 65  not NULL, is fre
b9e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
b9f0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2c   third argument,
ba00: 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f 74 20 27   quote, is not '
ba10: 5c 30 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20  \0', then it is 
ba20: 75 73 65 64 20 61 73 20 61 20 0a 2a 2a 20 71 75  used as a .** qu
ba30: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 66 6f  ote character fo
ba40: 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a 73 74  r zAppend..*/.st
ba50: 61 74 69 63 20 63 68 61 72 20 2a 61 70 70 65 6e  atic char *appen
ba60: 64 54 65 78 74 28 63 68 61 72 20 2a 7a 49 6e 2c  dText(char *zIn,
ba70: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70   char const *zAp
ba80: 70 65 6e 64 2c 20 63 68 61 72 20 71 75 6f 74 65  pend, char quote
ba90: 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ){.  int len;.  
baa0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70  int i;.  int nAp
bab0: 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e 33 30 28  pend = strlen30(
bac0: 7a 41 70 70 65 6e 64 29 3b 0a 20 20 69 6e 74 20  zAppend);.  int 
bad0: 6e 49 6e 20 3d 20 28 7a 49 6e 3f 73 74 72 6c 65  nIn = (zIn?strle
bae0: 6e 33 30 28 7a 49 6e 29 3a 30 29 3b 0a 0a 20 20  n30(zIn):0);..  
baf0: 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 6e 49  len = nAppend+nI
bb00: 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f 74 65  n+1;.  if( quote
bb10: 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 32   ){.    len += 2
bb20: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
bb30: 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a  <nAppend; i++){.
bb40: 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e        if( zAppen
bb50: 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 6c 65  d[i]==quote ) le
bb60: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
bb70: 20 20 7a 49 6e 20 3d 20 28 63 68 61 72 20 2a 29    zIn = (char *)
bb80: 72 65 61 6c 6c 6f 63 28 7a 49 6e 2c 20 6c 65 6e  realloc(zIn, len
bb90: 29 3b 0a 20 20 69 66 28 20 21 7a 49 6e 20 29 7b  );.  if( !zIn ){
bba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
bbb0: 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f 74 65 20   }..  if( quote 
bbc0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 73  ){.    char *zCs
bbd0: 72 20 3d 20 26 7a 49 6e 5b 6e 49 6e 5d 3b 0a 20  r = &zIn[nIn];. 
bbe0: 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f     *zCsr++ = quo
bbf0: 74 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  te;.    for(i=0;
bc00: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
bc10: 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20  {.      *zCsr++ 
bc20: 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20  = zAppend[i];.  
bc30: 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64 5b      if( zAppend[
bc40: 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73  i]==quote ) *zCs
bc50: 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  r++ = quote;.   
bc60: 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d   }.    *zCsr++ =
bc70: 20 71 75 6f 74 65 3b 0a 20 20 20 20 2a 7a 43 73   quote;.    *zCs
bc80: 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  r++ = '\0';.    
bc90: 61 73 73 65 72 74 28 20 28 7a 43 73 72 2d 7a 49  assert( (zCsr-zI
bca0: 6e 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 7d 65 6c  n)==len );.  }el
bcb0: 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  se{.    memcpy(&
bcc0: 7a 49 6e 5b 6e 49 6e 5d 2c 20 7a 41 70 70 65 6e  zIn[nIn], zAppen
bcd0: 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20  d, nAppend);.   
bce0: 20 7a 49 6e 5b 6c 65 6e 2d 31 5d 20 3d 20 27 5c   zIn[len-1] = '\
bcf0: 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0';.  }..  retur
bd00: 6e 20 7a 49 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n zIn;.}.../*.**
bd10: 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
bd20: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
bd30: 68 61 73 20 61 20 73 69 6e 67 6c 65 20 72 65 73  has a single res
bd40: 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 50 72 69  ult column.  Pri
bd50: 6e 74 0a 2a 2a 20 74 68 61 74 20 72 65 73 75 6c  nt.** that resul
bd60: 74 20 63 6f 6c 75 6d 6e 20 6f 6e 20 61 20 6c 69  t column on a li
bd70: 6e 65 20 62 79 20 69 74 73 65 6c 66 20 77 69 74  ne by itself wit
bd80: 68 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65  h a semicolon te
bd90: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
bda0: 54 68 69 73 20 69 73 20 75 73 65 64 2c 20 66 6f  This is used, fo
bdb0: 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 68  r example, to sh
bdc0: 6f 77 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  ow the schema of
bdd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79   the database by
bde0: 0a 2a 2a 20 71 75 65 72 79 69 6e 67 20 74 68 65  .** querying the
bdf0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
be00: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
be10: 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75  int run_table_du
be20: 6d 70 5f 71 75 65 72 79 28 46 49 4c 45 20 2a 6f  mp_query(FILE *o
be30: 75 74 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ut, sqlite3 *db,
be40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
be50: 6c 65 63 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  lect){.  sqlite3
be60: 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a  _stmt *pSelect;.
be70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
be80: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
be90: 28 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31  (db, zSelect, -1
bea0: 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  , &pSelect, 0);.
beb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bec0: 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  _OK || !pSelect 
bed0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
bee0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
bef0: 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
bf00: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  t);.  while( rc=
bf10: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
bf20: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
bf30: 22 25 73 3b 5c 6e 22 2c 20 73 71 6c 69 74 65 33  "%s;\n", sqlite3
bf40: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65  _column_text(pSe
bf50: 6c 65 63 74 2c 20 30 29 29 3b 0a 20 20 20 20 72  lect, 0));.    r
bf60: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
bf70: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20  (pSelect);.  }. 
bf80: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
bf90: 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74  finalize(pSelect
bfa0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
bfb0: 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
bfc0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
bfd0: 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
bfe0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
bff0: 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
c000: 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
c010: 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
c020: 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
c030: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
c040: 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
c050: 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
c060: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
c070: 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
c080: 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
c090: 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
c0a0: 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
c0b0: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
c0c0: 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
c0d0: 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
c0e0: 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
c0f0: 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
c100: 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 72 63  azCol){.  int rc
c110: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c120: 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20  zTable;.  const 
c130: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63  char *zType;.  c
c140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
c150: 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61  .  struct callba
c160: 63 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74  ck_data *p = (st
c170: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
c180: 74 61 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  ta *)pArg;..  UN
c190: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
c1a0: 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 6e 41 72  zCol);.  if( nAr
c1b0: 67 21 3d 33 20 29 20 72 65 74 75 72 6e 20 31 3b  g!=3 ) return 1;
c1c0: 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
c1d0: 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
c1e0: 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
c1f0: 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 0a   = azArg[2];.  .
c200: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61    if( strcmp(zTa
c210: 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ble, "sqlite_seq
c220: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
c230: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
c240: 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  , "DELETE FROM s
c250: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c  qlite_sequence;\
c260: 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
c270: 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20   strcmp(zTable, 
c280: 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 29 3d  "sqlite_stat1")=
c290: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
c2a0: 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59  f(p->out, "ANALY
c2b0: 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
c2c0: 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ;\n");.  }else i
c2d0: 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c  f( strncmp(zTabl
c2e0: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
c2f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c300: 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 0;.  }else if(
c310: 20 73 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22   strncmp(zSql, "
c320: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
c330: 41 42 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b  ABLE", 20)==0 ){
c340: 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b  .    char *zIns;
c350: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69  .    if( !p->wri
c360: 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20  tableSchema ){. 
c370: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
c380: 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
c390: 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
c3a0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
c3b0: 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
c3c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
c3d0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
c3e0: 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
c3f0: 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
c400: 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
c410: 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
c420: 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
c430: 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
c440: 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
c450: 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
c460: 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
c470: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
c480: 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a  ->out, "%s\n", z
c490: 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Ins);.    sqlite
c4a0: 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20  3_free(zIns);.  
c4b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
c4c0: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
c4d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  (p->out, "%s;\n"
c4e0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , zSql);.  }..  
c4f0: 69 66 28 20 73 74 72 63 6d 70 28 7a 54 79 70 65  if( strcmp(zType
c500: 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b  , "table")==0 ){
c510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
c520: 74 20 2a 70 54 61 62 6c 65 49 6e 66 6f 20 3d 20  t *pTableInfo = 
c530: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  0;.    char *zSe
c540: 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 63 68  lect = 0;.    ch
c550: 61 72 20 2a 7a 54 61 62 6c 65 49 6e 66 6f 20 3d  ar *zTableInfo =
c560: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   0;.    char *zT
c570: 6d 70 20 3d 20 30 3b 0a 20 20 20 0a 20 20 20 20  mp = 0;.   .    
c580: 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70  zTableInfo = app
c590: 65 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e  endText(zTableIn
c5a0: 66 6f 2c 20 22 50 52 41 47 4d 41 20 74 61 62 6c  fo, "PRAGMA tabl
c5b0: 65 5f 69 6e 66 6f 28 22 2c 20 30 29 3b 0a 20 20  e_info(", 0);.  
c5c0: 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61    zTableInfo = a
c5d0: 70 70 65 6e 64 54 65 78 74 28 7a 54 61 62 6c 65  ppendText(zTable
c5e0: 49 6e 66 6f 2c 20 7a 54 61 62 6c 65 2c 20 27 22  Info, zTable, '"
c5f0: 27 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e  ');.    zTableIn
c600: 66 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  fo = appendText(
c610: 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 22 29 3b 22  zTableInfo, ");"
c620: 2c 20 30 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  , 0);..    rc = 
c630: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
c640: 70 2d 3e 64 62 2c 20 7a 54 61 62 6c 65 49 6e 66  p->db, zTableInf
c650: 6f 2c 20 2d 31 2c 20 26 70 54 61 62 6c 65 49 6e  o, -1, &pTableIn
c660: 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fo, 0);.    if( 
c670: 7a 54 61 62 6c 65 49 6e 66 6f 20 29 20 66 72 65  zTableInfo ) fre
c680: 65 28 7a 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20  e(zTableInfo);. 
c690: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c6a0: 45 5f 4f 4b 20 7c 7c 20 21 70 54 61 62 6c 65 49  E_OK || !pTableI
c6b0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nfo ){.      ret
c6c0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
c6d0: 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65    zSelect = appe
c6e0: 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20  ndText(zSelect, 
c6f0: 22 53 45 4c 45 43 54 20 27 49 4e 53 45 52 54 20  "SELECT 'INSERT 
c700: 49 4e 54 4f 20 27 20 7c 7c 20 22 2c 20 30 29 3b  INTO ' || ", 0);
c710: 0a 20 20 20 20 7a 54 6d 70 20 3d 20 61 70 70 65  .    zTmp = appe
c720: 6e 64 54 65 78 74 28 7a 54 6d 70 2c 20 7a 54 61  ndText(zTmp, zTa
c730: 62 6c 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 69  ble, '"');.    i
c740: 66 28 20 7a 54 6d 70 20 29 7b 0a 20 20 20 20 20  f( zTmp ){.     
c750: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
c760: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a  dText(zSelect, z
c770: 54 6d 70 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20  Tmp, '\'');.    
c780: 7d 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20  }.    zSelect = 
c790: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
c7a0: 63 74 2c 20 22 20 7c 7c 20 27 20 56 41 4c 55 45  ct, " || ' VALUE
c7b0: 53 28 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20  S(' || ", 0);.  
c7c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
c7d0: 74 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b  tep(pTableInfo);
c7e0: 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
c7f0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
c800: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c810: 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
c820: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
c830: 6c 75 6d 6e 5f 74 65 78 74 28 70 54 61 62 6c 65  lumn_text(pTable
c840: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20  Info, 1);.      
c850: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
c860: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 71  Text(zSelect, "q
c870: 75 6f 74 65 28 22 2c 20 30 29 3b 0a 20 20 20 20  uote(", 0);.    
c880: 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65    zSelect = appe
c890: 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20  ndText(zSelect, 
c8a0: 7a 54 65 78 74 2c 20 27 22 27 29 3b 0a 20 20 20  zText, '"');.   
c8b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
c8c0: 73 74 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29  step(pTableInfo)
c8d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
c8e0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
c8f0: 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20        zSelect = 
c900: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
c910: 63 74 2c 20 22 29 20 7c 7c 20 27 2c 27 20 7c 7c  ct, ") || ',' ||
c920: 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   ", 0);.      }e
c930: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  lse{.        zSe
c940: 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78  lect = appendTex
c950: 74 28 7a 53 65 6c 65 63 74 2c 20 22 29 20 22 2c  t(zSelect, ") ",
c960: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c970: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
c980: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 54 61  te3_finalize(pTa
c990: 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  bleInfo);.    if
c9a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c9b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 65  ){.      if( zSe
c9c0: 6c 65 63 74 20 29 20 66 72 65 65 28 7a 53 65 6c  lect ) free(zSel
c9d0: 65 63 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ect);.      retu
c9e0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
c9f0: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
ca00: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 7c  Text(zSelect, "|
ca10: 7c 20 27 29 27 20 46 52 4f 4d 20 20 22 2c 20 30  | ')' FROM  ", 0
ca20: 29 3b 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d  );.    zSelect =
ca30: 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c   appendText(zSel
ca40: 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27  ect, zTable, '"'
ca50: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 72 75 6e  );..    rc = run
ca60: 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
ca70: 79 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c  y(p->out, p->db,
ca80: 20 7a 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69   zSelect);.    i
ca90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
caa0: 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 7a  RRUPT ){.      z
cab0: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
cac0: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 20 4f  ext(zSelect, " O
cad0: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
cae0: 53 43 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  SC", 0);.      r
caf0: 63 20 3d 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75  c = run_table_du
cb00: 6d 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c  mp_query(p->out,
cb10: 20 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 29   p->db, zSelect)
cb20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cb30: 7a 53 65 6c 65 63 74 20 29 20 66 72 65 65 28 7a  zSelect ) free(z
cb40: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72  Select);.  }.  r
cb50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
cb60: 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55  * Run zQuery.  U
cb70: 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  se dump_callback
cb80: 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61  () as the callba
cb90: 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ck routine so th
cba0: 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  at.** the conten
cbb0: 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ts of the query 
cbc0: 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51  are output as SQ
cbd0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
cbe0: 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20  .** If we get a 
cbf0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
cc00: 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20  rror, rerun the 
cc10: 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65  query after appe
cc20: 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20  nding.** "ORDER 
cc30: 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74  BY rowid DESC" t
cc40: 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74  o the end..*/.st
cc50: 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68  atic int run_sch
cc60: 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a  ema_dump_query(.
cc70: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
cc80: 6b 5f 64 61 74 61 20 2a 70 2c 20 0a 20 20 63 6f  k_data *p, .  co
cc90: 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79  nst char *zQuery
cca0: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
ccb0: 4d 73 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Msg.){.  int rc;
ccc0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
ccd0: 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65  exec(p->db, zQue
cce0: 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  ry, dump_callbac
ccf0: 6b 2c 20 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b  k, p, pzErrMsg);
cd00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
cd10: 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
cd20: 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
cd30: 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
cd40: 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
cd50: 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 20 73  if( pzErrMsg ) s
cd60: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 45  qlite3_free(*pzE
cd70: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 51 32 20  rrMsg);.    zQ2 
cd80: 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30  = malloc( len+10
cd90: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32  0 );.    if( zQ2
cda0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ==0 ) return rc;
cdb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
cdc0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 51 32  rintf(sizeof(zQ2
cdd0: 29 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52 44 45  ), zQ2, "%s ORDE
cde0: 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
cdf0: 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72  , zQuery);.    r
ce00: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
ce10: 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d  (p->db, zQ2, dum
ce20: 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 70  p_callback, p, p
ce30: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 66 72  zErrMsg);.    fr
ce40: 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72  ee(zQ2);.  }.  r
ce50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
ce60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ce70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
ce80: 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  LE) && !defined(
ce90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cea0: 55 45 52 59 29 0a 73 74 72 75 63 74 20 47 65 6e  UERY).struct Gen
ceb0: 66 6b 65 79 43 6d 64 20 7b 0a 20 20 73 71 6c 69  fkeyCmd {.  sqli
cec0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
ced0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
cee0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
cef0: 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61  .  struct callba
cf00: 63 6b 5f 64 61 74 61 20 2a 70 43 62 3b 20 20 20  ck_data *pCb;   
cf10: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 64 61    /* Callback da
cf20: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 67  ta */.  int isIg
cf30: 6e 6f 72 65 45 72 72 6f 72 73 3b 20 20 20 20 20  noreErrors;     
cf40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
cf50: 6f 72 20 2d 2d 69 67 6e 6f 72 65 2d 65 72 72 6f  or --ignore-erro
cf60: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78  rs */.  int isEx
cf70: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
cf80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
cf90: 6f 72 20 2d 2d 65 78 65 63 20 2a 2f 0a 20 20 69  or --exec */.  i
cfa0: 6e 74 20 69 73 4e 6f 44 72 6f 70 3b 20 20 20 20  nt isNoDrop;    
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cfc0: 20 54 72 75 65 20 66 6f 72 20 2d 2d 6e 6f 2d 64   True for --no-d
cfd0: 72 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  rop */.  int nEr
cfe0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
cff0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d000: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
d010: 20 73 6f 20 66 61 72 20 2a 2f 0a 7d 3b 0a 74 79   so far */.};.ty
d020: 70 65 64 65 66 20 73 74 72 75 63 74 20 47 65 6e  pedef struct Gen
d030: 66 6b 65 79 43 6d 64 20 47 65 6e 66 6b 65 79 43  fkeyCmd GenfkeyC
d040: 6d 64 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  md;..static int 
d050: 67 65 6e 66 6b 65 79 50 61 72 73 65 41 72 67 73  genfkeyParseArgs
d060: 28 47 65 6e 66 6b 65 79 43 6d 64 20 2a 70 2c 20  (GenfkeyCmd *p, 
d070: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 69 6e  char **azArg, in
d080: 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69  t nArg){.  int i
d090: 69 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  i;.  memset(p, 0
d0a0: 2c 20 73 69 7a 65 6f 66 28 47 65 6e 66 6b 65 79  , sizeof(Genfkey
d0b0: 43 6d 64 29 29 3b 0a 0a 20 20 66 6f 72 28 69 69  Cmd));..  for(ii
d0c0: 3d 30 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69 2b  =0; ii<nArg; ii+
d0d0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  +){.    int n = 
d0e0: 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69  strlen30(azArg[i
d0f0: 69 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3e  i]);..    if( n>
d100: 32 20 26 26 20 6e 3c 31 30 20 26 26 20 30 3d 3d  2 && n<10 && 0==
d110: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 69 69  strncmp(azArg[ii
d120: 5d 2c 20 22 2d 2d 6e 6f 2d 64 72 6f 70 22 2c 20  ], "--no-drop", 
d130: 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  n) ){.      p->i
d140: 73 4e 6f 44 72 6f 70 20 3d 20 31 3b 0a 20 20 20  sNoDrop = 1;.   
d150: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 32 20 26   }else if( n>2 &
d160: 26 20 6e 3c 31 36 20 26 26 20 30 3d 3d 73 74 72  & n<16 && 0==str
d170: 6e 63 6d 70 28 61 7a 41 72 67 5b 69 69 5d 2c 20  ncmp(azArg[ii], 
d180: 22 2d 2d 69 67 6e 6f 72 65 2d 65 72 72 6f 72 73  "--ignore-errors
d190: 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70  ", n) ){.      p
d1a0: 2d 3e 69 73 49 67 6e 6f 72 65 45 72 72 6f 72 73  ->isIgnoreErrors
d1b0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
d1c0: 69 66 28 20 6e 3e 32 20 26 26 20 6e 3c 37 20 26  if( n>2 && n<7 &
d1d0: 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 61 7a 41  & 0==strncmp(azA
d1e0: 72 67 5b 69 69 5d 2c 20 22 2d 2d 65 78 65 63 22  rg[ii], "--exec"
d1f0: 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 2d  , n) ){.      p-
d200: 3e 69 73 45 78 65 63 20 3d 20 31 3b 0a 20 20 20  >isExec = 1;.   
d210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
d220: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
d230: 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
d240: 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 69 5d 29  s\n", azArg[ii])
d250: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
d260: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
d270: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d280: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
d290: 67 65 6e 66 6b 65 79 43 6d 64 43 62 28 76 6f 69  genfkeyCmdCb(voi
d2a0: 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 65 54 79  d *pCtx, int eTy
d2b0: 70 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  pe, const char *
d2c0: 7a 29 7b 0a 20 20 47 65 6e 66 6b 65 79 43 6d 64  z){.  GenfkeyCmd
d2d0: 20 2a 70 20 3d 20 28 47 65 6e 66 6b 65 79 43 6d   *p = (GenfkeyCm
d2e0: 64 20 2a 29 70 43 74 78 3b 0a 20 20 69 66 28 20  d *)pCtx;.  if( 
d2f0: 65 54 79 70 65 3d 3d 47 45 4e 46 4b 45 59 5f 45  eType==GENFKEY_E
d300: 52 52 4f 52 20 26 26 20 21 70 2d 3e 69 73 49 67  RROR && !p->isIg
d310: 6e 6f 72 65 45 72 72 6f 72 73 20 29 7b 0a 20 20  noreErrors ){.  
d320: 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20    p->nErr++;.   
d330: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d340: 20 22 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d   "%s\n", z);.  }
d350: 20 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 45 72 72   ..  if( p->nErr
d360: 3d 3d 30 20 26 26 20 28 0a 20 20 20 20 20 20 20  ==0 && (.       
d370: 20 28 65 54 79 70 65 3d 3d 47 45 4e 46 4b 45 59   (eType==GENFKEY
d380: 5f 43 52 45 41 54 45 54 52 49 47 47 45 52 29 0a  _CREATETRIGGER).
d390: 20 20 20 20 20 7c 7c 20 28 65 54 79 70 65 3d 3d       || (eType==
d3a0: 47 45 4e 46 4b 45 59 5f 44 52 4f 50 54 52 49 47  GENFKEY_DROPTRIG
d3b0: 47 45 52 20 26 26 20 21 70 2d 3e 69 73 4e 6f 44  GER && !p->isNoD
d3c0: 72 6f 70 29 0a 20 20 29 29 7b 0a 20 20 20 20 69  rop).  )){.    i
d3d0: 66 28 20 70 2d 3e 69 73 45 78 65 63 20 29 7b 0a  f( p->isExec ){.
d3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
d3f0: 65 63 28 70 2d 3e 64 62 2c 20 7a 2c 20 30 2c 20  ec(p->db, z, 0, 
d400: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
d410: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
d420: 6f 6c 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20  ol = "sql";.    
d430: 20 20 63 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64    callback((void
d440: 20 2a 29 70 2d 3e 70 43 62 2c 20 31 2c 20 28 63   *)p->pCb, 1, (c
d450: 68 61 72 20 2a 2a 29 26 7a 2c 20 28 63 68 61 72  har **)&z, (char
d460: 20 2a 2a 29 26 7a 43 6f 6c 29 3b 0a 20 20 20 20   **)&zCol);.    
d470: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
d480: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
d490: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20  dif../*.** Text 
d4a0: 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67  of a help messag
d4b0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
d4c0: 20 7a 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 62   zHelp[] =.  ".b
d4d0: 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20  ackup ?DB? FILE 
d4e0: 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28       Backup DB (
d4f0: 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
d500: 29 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22  ) to FILE\n".  "
d510: 2e 62 61 69 6c 20 4f 4e 7c 4f 46 46 20 20 20 20  .bail ON|OFF    
d520: 20 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65         Stop afte
d530: 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72  r hitting an err
d540: 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46  or.  Default OFF
d550: 5c 6e 22 0a 20 20 22 2e 64 61 74 61 62 61 73 65  \n".  ".database
d560: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69  s             Li
d570: 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c  st names and fil
d580: 65 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64  es of attached d
d590: 61 74 61 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e  atabases\n".  ".
d5a0: 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e  dump ?TABLE? ...
d5b0: 20 20 20 20 20 20 44 75 6d 70 20 74 68 65 20 64        Dump the d
d5c0: 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51  atabase in an SQ
d5d0: 4c 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22  L text format\n"
d5e0: 0a 20 20 22 2e 65 63 68 6f 20 4f 4e 7c 4f 46 46  .  ".echo ON|OFF
d5f0: 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20             Turn 
d600: 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20  command echo on 
d610: 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 78  or off\n".  ".ex
d620: 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
d630: 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72      Exit this pr
d640: 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78 70  ogram\n".  ".exp
d650: 6c 61 69 6e 20 4f 4e 7c 4f 46 46 20 20 20 20 20  lain ON|OFF     
d660: 20 20 20 54 75 72 6e 20 6f 75 74 70 75 74 20 6d     Turn output m
d670: 6f 64 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ode suitable for
d680: 20 45 58 50 4c 41 49 4e 20 6f 6e 20 6f 72 20 6f   EXPLAIN on or o
d690: 66 66 2e 5c 6e 22 0a 23 69 66 20 21 64 65 66 69  ff.\n".#if !defi
d6a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d6b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
d6c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d6d0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
d6e0: 20 20 22 2e 67 65 6e 66 6b 65 79 20 3f 4f 50 54    ".genfkey ?OPT
d6f0: 49 4f 4e 53 3f 20 20 20 20 20 4f 70 74 69 6f 6e  IONS?     Option
d700: 73 20 61 72 65 3a 5c 6e 22 0a 20 20 22 20 20 20  s are:\n".  "   
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 2d 2d 6e 6f 2d 64 72 6f 70 3a        --no-drop:
d730: 20 44 6f 20 6e 6f 74 20 64 72 6f 70 20 6f 6c 64   Do not drop old
d740: 20 66 6b 65 79 20 74 72 69 67 67 65 72 73 2e 5c   fkey triggers.\
d750: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
d770: 2d 69 67 6e 6f 72 65 2d 65 72 72 6f 72 73 3a 20  -ignore-errors: 
d780: 49 67 6e 6f 72 65 20 74 61 62 6c 65 73 20 77 69  Ignore tables wi
d790: 74 68 20 66 6b 65 79 20 65 72 72 6f 72 73 5c 6e  th fkey errors\n
d7a0: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
d7c0: 65 78 65 63 3a 20 45 78 65 63 75 74 65 20 67 65  exec: Execute ge
d7d0: 6e 65 72 61 74 65 64 20 53 51 4c 20 69 6d 6d 65  nerated SQL imme
d7e0: 64 69 61 74 65 6c 79 5c 6e 22 0a 20 20 22 20 20  diately\n".  "  
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 20 53 65 65 20 66 69 6c 65 20 74 6f       See file to
d810: 6f 6c 2f 67 65 6e 66 6b 65 79 2e 52 45 41 44 4d  ol/genfkey.READM
d820: 45 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  E in the source 
d830: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
d850: 73 74 72 69 62 75 74 69 6f 6e 20 66 6f 72 20 66  stribution for f
d860: 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
d870: 6f 6e 2e 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  on.\n".#endif.  
d880: 22 2e 68 65 61 64 65 72 28 73 29 20 4f 4e 7c 4f  ".header(s) ON|O
d890: 46 46 20 20 20 20 20 20 54 75 72 6e 20 64 69 73  FF      Turn dis
d8a0: 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20  play of headers 
d8b0: 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
d8c0: 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20  .help           
d8d0: 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 69 73         Show this
d8e0: 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e   message\n".  ".
d8f0: 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
d900: 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74  E     Import dat
d910: 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f  a from FILE into
d920: 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 2e 69 6e   TABLE\n".  ".in
d930: 64 69 63 65 73 20 54 41 42 4c 45 20 20 20 20 20  dices TABLE     
d940: 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f      Show names o
d950: 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  f all indices on
d960: 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66 64 65 66   TABLE\n".#ifdef
d970: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
d980: 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61  OTRACE.  ".iotra
d990: 63 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ce FILE         
d9a0: 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61 67   Enable I/O diag
d9b0: 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67 20 74  nostic logging t
d9c0: 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e 64 69 66  o FILE\n".#endif
d9d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d9e0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
d9f0: 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c  ION.  ".load FIL
da00: 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f  E ?ENTRY?     Lo
da10: 61 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20  ad an extension 
da20: 6c 69 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69  library\n".#endi
da30: 66 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20  f.  ".mode MODE 
da40: 3f 54 41 42 4c 45 3f 20 20 20 20 20 53 65 74 20  ?TABLE?     Set 
da50: 6f 75 74 70 75 74 20 6d 6f 64 65 20 77 68 65 72  output mode wher
da60: 65 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66  e MODE is one of
da70: 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  :\n".  "        
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d   csv      Comma-
daa0: 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
dab0: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c  column   Left-al
dae0: 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20  igned columns.  
daf0: 28 53 65 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a  (See .width)\n".
db00: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
db10: 20 20 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c              html
db20: 20 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65       HTML <table
db30: 3e 20 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20  > code\n".  "   
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 69 6e 73 65 72 74 20 20 20 53        insert   S
db60: 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d  QL insert statem
db70: 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e  ents for TABLE\n
db80: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
dba0: 6e 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65  ne     One value
dbb0: 20 70 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22   per line\n".  "
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 20 20 20 20 20 6c 69 73 74 20 20 20           list   
dbe0: 20 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74    Values delimit
dbf0: 65 64 20 62 79 20 2e 73 65 70 61 72 61 74 6f 72  ed by .separator
dc00: 20 73 74 72 69 6e 67 5c 6e 22 0a 20 20 22 20 20   string\n".  "  
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 74 61 62 73 20 20 20 20 20         tabs     
dc30: 54 61 62 2d 73 65 70 61 72 61 74 65 64 20 76 61  Tab-separated va
dc40: 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20  lues\n".  "     
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c      tcl      TCL
dc70: 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e   list elements\n
dc80: 22 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20  ".  ".nullvalue 
dc90: 53 54 52 49 4e 47 20 20 20 20 20 20 50 72 69 6e  STRING      Prin
dca0: 74 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63  t STRING in plac
dcb0: 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e of NULL values
dcc0: 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 46  \n".  ".output F
dcd0: 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 53 65  ILENAME       Se
dce0: 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c  nd output to FIL
dcf0: 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 6f 75 74  ENAME\n".  ".out
dd00: 70 75 74 20 73 74 64 6f 75 74 20 20 20 20 20 20  put stdout      
dd10: 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
dd20: 6f 20 74 68 65 20 73 63 72 65 65 6e 5c 6e 22 0a  o the screen\n".
dd30: 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20    ".prompt MAIN 
dd40: 43 4f 4e 54 49 4e 55 45 20 20 52 65 70 6c 61 63  CONTINUE  Replac
dd50: 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 70  e the standard p
dd60: 72 6f 6d 70 74 73 5c 6e 22 0a 20 20 22 2e 71 75  rompts\n".  ".qu
dd70: 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
dd80: 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72      Exit this pr
dd90: 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 72 65 61  ogram\n".  ".rea
dda0: 64 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20  d FILENAME      
ddb0: 20 20 20 45 78 65 63 75 74 65 20 53 51 4c 20 69     Execute SQL i
ddc0: 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20  n FILENAME\n".  
ddd0: 22 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46  ".restore ?DB? F
dde0: 49 4c 45 20 20 20 20 20 52 65 73 74 6f 72 65 20  ILE     Restore 
ddf0: 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28 64  content of DB (d
de00: 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29  efault \"main\")
de10: 20 66 72 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20 20   from FILE\n".  
de20: 22 2e 73 63 68 65 6d 61 20 3f 54 41 42 4c 45 3f  ".schema ?TABLE?
de30: 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65          Show the
de40: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
de50: 74 73 5c 6e 22 0a 20 20 22 2e 73 65 70 61 72 61  ts\n".  ".separa
de60: 74 6f 72 20 53 54 52 49 4e 47 20 20 20 20 20 20  tor STRING      
de70: 43 68 61 6e 67 65 20 73 65 70 61 72 61 74 6f 72  Change separator
de80: 20 75 73 65 64 20 62 79 20 6f 75 74 70 75 74 20   used by output 
de90: 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70 6f 72 74  mode and .import
dea0: 5c 6e 22 0a 20 20 22 2e 73 68 6f 77 20 20 20 20  \n".  ".show    
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
dec0: 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ow the current v
ded0: 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75  alues for variou
dee0: 73 20 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20  s settings\n".  
def0: 22 2e 74 61 62 6c 65 73 20 3f 50 41 54 54 45 52  ".tables ?PATTER
df00: 4e 3f 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d  N?      List nam
df10: 65 73 20 6f 66 20 74 61 62 6c 65 73 20 6d 61 74  es of tables mat
df20: 63 68 69 6e 67 20 61 20 4c 49 4b 45 20 70 61 74  ching a LIKE pat
df30: 74 65 72 6e 5c 6e 22 0a 20 20 22 2e 74 69 6d 65  tern\n".  ".time
df40: 6f 75 74 20 4d 53 20 20 20 20 20 20 20 20 20 20  out MS          
df50: 20 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f    Try opening lo
df60: 63 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20  cked tables for 
df70: 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c  MS milliseconds\
df80: 6e 22 0a 23 69 66 20 48 41 53 5f 54 49 4d 45 52  n".#if HAS_TIMER
df90: 0a 20 20 22 2e 74 69 6d 65 72 20 4f 4e 7c 4f 46  .  ".timer ON|OF
dfa0: 46 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  F          Turn 
dfb0: 74 68 65 20 43 50 55 20 74 69 6d 65 72 20 6d 65  the CPU timer me
dfc0: 61 73 75 72 65 6d 65 6e 74 20 6f 6e 20 6f 72 20  asurement on or 
dfd0: 6f 66 66 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  off\n".#endif.  
dfe0: 22 2e 77 69 64 74 68 20 4e 55 4d 20 4e 55 4d 20  ".width NUM NUM 
dff0: 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f 6c 75  ...     Set colu
e000: 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22  mn widths for \"
e010: 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22  column\" mode\n"
e020: 0a 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .;../* Forward r
e030: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
e040: 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69  ic int process_i
e050: 6e 70 75 74 28 73 74 72 75 63 74 20 63 61 6c 6c  nput(struct call
e060: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46 49  back_data *p, FI
e070: 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20  LE *in);../*.** 
e080: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
e090: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
e0a0: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
e0b0: 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
e0c0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
e0d0: 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
e0e0: 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
e0f0: 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
e100: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e110: 6f 70 65 6e 5f 64 62 28 73 74 72 75 63 74 20 63  open_db(struct c
e120: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29  allback_data *p)
e130: 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  {.  if( p->db==0
e140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
e150: 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  open(p->zDbFilen
e160: 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ame, &p->db);.  
e170: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
e180: 20 20 69 66 28 20 64 62 20 26 26 20 73 71 6c 69    if( db && sqli
e190: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3d  te3_errcode(db)=
e1a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e1b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
e1c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
e1d0: 22 73 68 65 6c 6c 73 74 61 74 69 63 22 2c 20 30  "shellstatic", 0
e1e0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
e1f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 68 65 6c  ,.          shel
e200: 6c 73 74 61 74 69 63 46 75 6e 63 2c 20 30 2c 20  lstaticFunc, 0, 
e210: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
e220: 28 20 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54  ( db==0 || SQLIT
e230: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
e240: 72 63 6f 64 65 28 64 62 29 20 29 7b 0a 20 20 20  rcode(db) ){.   
e250: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
e260: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 6f 70 65  r,"Unable to ope
e270: 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c  n database \"%s\
e280: 22 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  ": %s\n", .     
e290: 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
e2a0: 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ame, sqlite3_err
e2b0: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
e2c0: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23  exit(1);.    }.#
e2d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e2e0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
e2f0: 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e  N.    sqlite3_en
e300: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
e310: 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23  ion(p->db, 1);.#
e320: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
e330: 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65  ** Do C-language
e340: 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e 67   style dequoting
e350: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 74 20 20 20  ..**.**    \t   
e360: 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e   -> tab.**    \n
e370: 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a      -> newline.*
e380: 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e 20 63 61  *    \r    -> ca
e390: 72 72 69 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a  rriage return.**
e3a0: 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63      \NNN  -> asc
e3b0: 69 69 20 63 68 61 72 61 63 74 65 72 20 4e 4e 4e  ii character NNN
e3c0: 20 69 6e 20 6f 63 74 61 6c 0a 2a 2a 20 20 20 20   in octal.**    
e3d0: 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61  \\    -> backsla
e3e0: 73 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  sh.*/.static voi
e3f0: 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  d resolve_backsl
e400: 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a  ashes(char *z){.
e410: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
e420: 61 72 20 63 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  ar c;.  for(i=j=
e430: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
e440: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
e450: 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
e460: 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d        c = z[++i]
e470: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
e480: 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  n' ){.        c 
e490: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65  = '\n';.      }e
e4a0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27 20 29  lse if( c=='t' )
e4b0: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
e4c0: 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t';.      }else 
e4d0: 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20  if( c=='r' ){.  
e4e0: 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a        c = '\r';.
e4f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e500: 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27  c>='0' && c<='7'
e510: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d   ){.        c -=
e520: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66   '0';.        if
e530: 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
e540: 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
e550: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
e560: 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c           c = (c<
e570: 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27  <3) + z[i] - '0'
e580: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e590: 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a  z[i+1]>='0' && z
e5a0: 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20  [i+1]<='7' ){.  
e5b0: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
e5c0: 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28             c = (
e5d0: 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
e5e0: 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0';.          }.
e5f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e600: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
e610: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
e620: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
e630: 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73  nterpret zArg as
e640: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
e650: 2e 20 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  .  Return either
e660: 20 30 20 6f 72 20 31 2e 0a 2a 2f 0a 73 74 61 74   0 or 1..*/.stat
e670: 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61  ic int booleanVa
e680: 6c 75 65 28 63 68 61 72 20 2a 7a 41 72 67 29 7b  lue(char *zArg){
e690: 0a 20 20 69 6e 74 20 76 61 6c 20 3d 20 61 74 6f  .  int val = ato
e6a0: 69 28 7a 41 72 67 29 3b 0a 20 20 69 6e 74 20 6a  i(zArg);.  int j
e6b0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 41 72  ;.  for(j=0; zAr
e6c0: 67 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  g[j]; j++){.    
e6d0: 7a 41 72 67 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zArg[j] = (char)
e6e0: 74 6f 6c 6f 77 65 72 28 7a 41 72 67 5b 6a 5d 29  tolower(zArg[j])
e6f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63  ;.  }.  if( strc
e700: 6d 70 28 7a 41 72 67 2c 22 6f 6e 22 29 3d 3d 30  mp(zArg,"on")==0
e710: 20 29 7b 0a 20 20 20 20 76 61 6c 20 3d 20 31 3b   ){.    val = 1;
e720: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
e730: 63 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d  cmp(zArg,"yes")=
e740: 3d 30 20 29 7b 0a 20 20 20 20 76 61 6c 20 3d 20  =0 ){.    val = 
e750: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
e760: 76 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  val;.}../*.** If
e770: 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62   an input line b
e780: 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74  egins with "." t
e790: 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  hen invoke this 
e7a0: 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72  routine to.** pr
e7b0: 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e  ocess that line.
e7c0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
e7d0: 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65  on error, 2 to e
e7e0: 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72  xit, and 0 other
e7f0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
e800: 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  int do_meta_comm
e810: 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  and(char *zLine,
e820: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
e830: 5f 64 61 74 61 20 2a 70 29 7b 0a 20 20 69 6e 74  _data *p){.  int
e840: 20 69 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41   i = 1;.  int nA
e850: 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c  rg = 0;.  int n,
e860: 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   c;.  int rc = 0
e870: 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b  ;.  char *azArg[
e880: 35 30 5d 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65  50];..  /* Parse
e890: 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20   the input line 
e8a0: 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a  into tokens..  *
e8b0: 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65  /.  while( zLine
e8c0: 5b 69 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61  [i] && nArg<Arra
e8d0: 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a  ySize(azArg) ){.
e8e0: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
e8f0: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
e900: 72 29 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69  r)zLine[i]) ){ i
e910: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c  ++; }.    if( zL
e920: 69 6e 65 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61  ine[i]==0 ) brea
e930: 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  k;.    if( zLine
e940: 5b 69 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69  [i]=='\'' || zLi
e950: 6e 65 5b 69 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  ne[i]=='"' ){.  
e960: 20 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20      int delim = 
e970: 7a 4c 69 6e 65 5b 69 2b 2b 5d 3b 0a 20 20 20 20  zLine[i++];.    
e980: 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20    azArg[nArg++] 
e990: 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20  = &zLine[i];.   
e9a0: 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
e9b0: 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d  i] && zLine[i]!=
e9c0: 64 65 6c 69 6d 20 29 7b 20 69 2b 2b 3b 20 7d 0a  delim ){ i++; }.
e9d0: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
e9e0: 69 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20  i]==delim ){.   
e9f0: 20 20 20 20 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20       zLine[i++] 
ea00: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
ea10: 20 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22     if( delim=='"
ea20: 27 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  ' ) resolve_back
ea30: 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41  slashes(azArg[nA
ea40: 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg-1]);.    }els
ea50: 65 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  e{.      azArg[n
ea60: 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
ea70: 69 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  i];.      while(
ea80: 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 21 69 73   zLine[i] && !is
ea90: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
eaa0: 63 68 61 72 29 7a 4c 69 6e 65 5b 69 5d 29 20 29  char)zLine[i]) )
eab0: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69  { i++; }.      i
eac0: 66 28 20 7a 4c 69 6e 65 5b 69 5d 20 29 20 7a 4c  f( zLine[i] ) zL
ead0: 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20  ine[i++] = 0;.  
eae0: 20 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b      resolve_back
eaf0: 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41  slashes(azArg[nA
eb00: 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg-1]);.    }.  
eb10: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
eb20: 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a  the input line..
eb30: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d    */.  if( nArg=
eb40: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
eb50: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    n = strlen30(a
eb60: 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20  zArg[0]);.  c = 
eb70: 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 69  azArg[0][0];.  i
eb80: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
eb90: 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
eba0: 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c  rg[0], "backup",
ebb0: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31   n)==0 && nArg>1
ebc0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
ebd0: 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20  ar *zDestFile;. 
ebe0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ebf0: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
ec00: 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
ec10: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
ec20: 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  kup;.    int rc;
ec30: 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
ec40: 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 46   ){.      zDestF
ec50: 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
ec60: 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d 61 69        zDb = "mai
ec70: 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n";.    }else{. 
ec80: 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
ec90: 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20   azArg[2];.     
eca0: 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b   zDb = azArg[1];
ecb0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ecc0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65  sqlite3_open(zDe
ecd0: 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29 3b  stFile, &pDest);
ece0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ecf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ed00: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
ed10: 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
ed20: 70 65 6e 20 25 73 5c 6e 22 2c 20 7a 44 65 73 74  pen %s\n", zDest
ed30: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  File);.      sql
ed40: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
ed50: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ed60: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  1;.    }.    ope
ed70: 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 70 42 61  n_db(p);.    pBa
ed80: 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
ed90: 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74  ackup_init(pDest
eda0: 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c  , "main", p->db,
edb0: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
edc0: 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
edd0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
ede0: 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
edf0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
ee00: 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20  (pDest));.      
ee10: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
ee20: 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
ee30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
ee40: 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71  while(  (rc = sq
ee50: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
ee60: 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
ee70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20  =SQLITE_OK ){}. 
ee80: 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
ee90: 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
eea0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
eeb0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
eec0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
eed0: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
eee0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
eef0: 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
ef00: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
ef10: 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
ef20: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
ef30: 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65  ose(pDest);.  }e
ef40: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
ef50: 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
ef60: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
ef70: 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 26 26 20  bail", n)==0 && 
ef80: 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 62 61  nArg>1 ){.    ba
ef90: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f  il_on_error = bo
efa0: 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
efb0: 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  [1]);.  }else.. 
efc0: 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
efd0: 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
efe0: 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73  Arg[0], "databas
eff0: 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
f000: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
f010: 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20  k_data data;.   
f020: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
f030: 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
f040: 70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  p);.    memcpy(&
f050: 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
f060: 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
f070: 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b  .showHeader = 1;
f080: 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d  .    data.mode =
f090: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   MODE_Column;.  
f0a0: 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68 5b    data.colWidth[
f0b0: 30 5d 20 3d 20 33 3b 0a 20 20 20 20 64 61 74 61  0] = 3;.    data
f0c0: 2e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20 31  .colWidth[1] = 1
f0d0: 35 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c 57  5;.    data.colW
f0e0: 69 64 74 68 5b 32 5d 20 3d 20 35 38 3b 0a 20 20  idth[2] = 58;.  
f0f0: 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a    data.cnt = 0;.
f100: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
f110: 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
f120: 64 61 74 61 62 61 73 65 5f 6c 69 73 74 3b 20 22  database_list; "
f130: 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  , callback, &dat
f140: 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
f150: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
f160: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
f170: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
f180: 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
f190: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
f1a0: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
f1b0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
f1c0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63   c=='d' && strnc
f1d0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75  mp(azArg[0], "du
f1e0: 6d 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  mp", n)==0 ){.  
f1f0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
f200: 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
f210: 28 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  (p);.    fprintf
f220: 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20  (p->out, "BEGIN 
f230: 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29  TRANSACTION;\n")
f240: 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c  ;.    p->writabl
f250: 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  eSchema = 0;.   
f260: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
f270: 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69  >db, "PRAGMA wri
f280: 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22  table_schema=ON"
f290: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
f2a0: 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
f2b0: 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
f2c0: 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 0a 20  dump_query(p, . 
f2d0: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
f2e0: 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
f2f0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
f300: 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
f310: 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20  RE sql NOT NULL 
f320: 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65  AND type=='table
f330: 27 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  '", 0.      );. 
f340: 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64       run_table_d
f350: 75 6d 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74  ump_query(p->out
f360: 2c 20 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  , p->db,.       
f370: 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
f380: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
f390: 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
f3a0: 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e   sql NOT NULL AN
f3b0: 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
f3c0: 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
f3d0: 65 77 27 29 22 0a 20 20 20 20 20 20 29 3b 0a 20  ew')".      );. 
f3e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f3f0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
f400: 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
f410: 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 68 65  +){.        zShe
f420: 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67  llStatic = azArg
f430: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 72 75 6e  [i];.        run
f440: 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
f450: 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 20 20  ry(p,.          
f460: 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
f470: 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
f480: 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
f490: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62         "WHERE tb
f4a0: 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c  l_name LIKE shel
f4b0: 6c 73 74 61 74 69 63 28 29 20 41 4e 44 20 74 79  lstatic() AND ty
f4c0: 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20 20  pe=='table'".   
f4d0: 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71         "  AND sq
f4e0: 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 30 29 3b  l NOT NULL", 0);
f4f0: 0a 20 20 20 20 20 20 20 20 72 75 6e 5f 74 61 62  .        run_tab
f500: 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2d  le_dump_query(p-
f510: 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 0a 20 20 20  >out, p->db,.   
f520: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
f530: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
f540: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
f550: 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
f560: 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20   NULL".         
f570: 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20   "  AND type IN 
f580: 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65  ('index','trigge
f590: 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20  r','view')".    
f5a0: 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c        "  AND tbl
f5b0: 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c  _name LIKE shell
f5c0: 73 74 61 74 69 63 28 29 22 0a 20 20 20 20 20 20  static()".      
f5d0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 68    );.        zSh
f5e0: 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20  ellStatic = 0;. 
f5f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f600: 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65   if( p->writable
f610: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
f620: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
f630: 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
f640: 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29  _schema=OFF;\n")
f650: 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61  ;.      p->writa
f660: 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  bleSchema = 0;. 
f670: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f680: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
f690: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
f6a0: 68 65 6d 61 3d 4f 46 46 22 2c 20 30 2c 20 30 2c  hema=OFF", 0, 0,
f6b0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72   0);.    if( zEr
f6c0: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70  rMsg ){.      fp
f6d0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
f6e0: 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
f6f0: 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
f700: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
f710: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
f720: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
f730: 75 74 2c 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29  ut, "COMMIT;\n")
f740: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
f750: 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
f760: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
f770: 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30  ], "echo", n)==0
f780: 20 26 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20   && nArg>1 ){.  
f790: 20 20 70 2d 3e 65 63 68 6f 4f 6e 20 3d 20 62 6f    p->echoOn = bo
f7a0: 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
f7b0: 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  [1]);.  }else.. 
f7c0: 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
f7d0: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
f7e0: 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29   "exit", n)==0 )
f7f0: 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20  {.    rc = 2;.  
f800: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
f810: 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
f820: 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69  zArg[0], "explai
f830: 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n", n)==0 ){.   
f840: 20 69 6e 74 20 76 61 6c 20 3d 20 6e 41 72 67 3e   int val = nArg>
f850: 3d 32 20 3f 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  =2 ? booleanValu
f860: 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 31 3b  e(azArg[1]) : 1;
f870: 0a 20 20 20 20 69 66 28 76 61 6c 20 3d 3d 20 31  .    if(val == 1
f880: 29 20 7b 0a 20 20 20 20 20 20 69 66 28 21 70 2d  ) {.      if(!p-
f890: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c  >explainPrev.val
f8a0: 69 64 29 20 7b 0a 20 20 20 20 20 20 20 20 70 2d  id) {.        p-
f8b0: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c  >explainPrev.val
f8c0: 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
f8d0: 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 6d  p->explainPrev.m
f8e0: 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
f8f0: 20 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69         p->explai
f900: 6e 50 72 65 76 2e 73 68 6f 77 48 65 61 64 65 72  nPrev.showHeader
f910: 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
f920: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
f930: 28 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e  (p->explainPrev.
f940: 63 6f 6c 57 69 64 74 68 2c 70 2d 3e 63 6f 6c 57  colWidth,p->colW
f950: 69 64 74 68 2c 73 69 7a 65 6f 66 28 70 2d 3e 63  idth,sizeof(p->c
f960: 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20 20 20  olWidth));.     
f970: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 63   }.      /* We c
f980: 6f 75 6c 64 20 70 75 74 20 74 68 69 73 20 63 6f  ould put this co
f990: 64 65 20 75 6e 64 65 72 20 74 68 65 20 21 70 2d  de under the !p-
f9a0: 3e 65 78 70 6c 61 69 6e 56 61 6c 69 64 0a 20 20  >explainValid.  
f9b0: 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e      ** condition
f9c0: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
f9d0: 20 6e 6f 74 20 65 78 65 63 75 74 65 20 69 66 20   not execute if 
f9e0: 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
f9f0: 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 61  n.      ** expla
fa00: 69 6e 20 6d 6f 64 65 2e 20 48 6f 77 65 76 65 72  in mode. However
fa10: 2c 20 61 6c 77 61 79 73 20 65 78 65 63 75 74 69  , always executi
fa20: 6e 67 20 69 74 20 61 6c 6c 6f 77 73 20 75 73 20  ng it allows us 
fa30: 61 6e 20 65 61 73 79 0a 20 20 20 20 20 20 2a 2a  an easy.      **
fa40: 20 77 61 73 20 74 6f 20 72 65 73 65 74 20 74 6f   was to reset to
fa50: 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 69 6e   explain mode in
fa60: 20 63 61 73 65 20 74 68 65 20 75 73 65 72 20 70   case the user p
fa70: 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20  reviously.      
fa80: 2a 2a 20 64 69 64 20 61 6e 20 2e 65 78 70 6c 61  ** did an .expla
fa90: 69 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  in followed by a
faa0: 20 2e 77 69 64 74 68 2c 20 2e 6d 6f 64 65 20 6f   .width, .mode o
fab0: 72 20 2e 68 65 61 64 65 72 0a 20 20 20 20 20 20  r .header.      
fac0: 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20  ** command..    
fad0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6d 6f    */.      p->mo
fae0: 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
faf0: 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77  n;.      p->show
fb00: 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Header = 1;.    
fb10: 20 20 6d 65 6d 73 65 74 28 70 2d 3e 63 6f 6c 57    memset(p->colW
fb20: 69 64 74 68 2c 30 2c 41 72 72 61 79 53 69 7a 65  idth,0,ArraySize
fb30: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a  (p->colWidth));.
fb40: 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74        p->colWidt
fb50: 68 5b 30 5d 20 3d 20 34 3b 20 20 20 20 20 20 20  h[0] = 4;       
fb60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
fb70: 64 72 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63  dr */.      p->c
fb80: 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20 31 33 3b  olWidth[1] = 13;
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fba0: 20 2f 2a 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* opcode */.  
fbb0: 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
fbc0: 32 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20 20  2] = 4;         
fbd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
fbe0: 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69  /.      p->colWi
fbf0: 64 74 68 5b 33 5d 20 3d 20 34 3b 20 20 20 20 20  dth[3] = 4;     
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc10: 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63  P2 */.      p->c
fc20: 6f 6c 57 69 64 74 68 5b 34 5d 20 3d 20 34 3b 20  olWidth[4] = 4; 
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20   /* P3 */.      
fc50: 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 35 5d 20 3d  p->colWidth[5] =
fc60: 20 31 33 3b 20 20 20 20 20 20 20 20 20 20 20 20   13;            
fc70: 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20       /* P4 */.  
fc80: 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
fc90: 36 5d 20 3d 20 32 3b 20 20 20 20 20 20 20 20 20  6] = 2;         
fca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 2a           /* P5 *
fcb0: 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69  /.      p->colWi
fcc0: 64 74 68 5b 37 5d 20 3d 20 31 33 3b 20 20 20 20  dth[7] = 13;    
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fce0: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
fcf0: 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e 65 78 70  }else if (p->exp
fd00: 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 29 20  lainPrev.valid) 
fd10: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61  {.      p->expla
fd20: 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3d 20 30  inPrev.valid = 0
fd30: 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  ;.      p->mode 
fd40: 3d 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76  = p->explainPrev
fd50: 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e  .mode;.      p->
fd60: 73 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e  showHeader = p->
fd70: 65 78 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77  explainPrev.show
fd80: 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 6d 65  Header;.      me
fd90: 6d 63 70 79 28 70 2d 3e 63 6f 6c 57 69 64 74 68  mcpy(p->colWidth
fda0: 2c 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e  ,p->explainPrev.
fdb0: 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66 28  colWidth,sizeof(
fdc0: 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20  p->colWidth));. 
fdd0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
fde0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
fdf0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
fe00: 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  BLE) && !defined
fe10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
fe20: 51 55 45 52 59 29 0a 20 20 69 66 28 20 63 3d 3d  QUERY).  if( c==
fe30: 27 67 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'g' && strncmp(a
fe40: 7a 41 72 67 5b 30 5d 2c 20 22 67 65 6e 66 6b 65  zArg[0], "genfke
fe50: 79 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  y", n)==0 ){.   
fe60: 20 47 65 6e 66 6b 65 79 43 6d 64 20 63 6d 64 3b   GenfkeyCmd cmd;
fe70: 0a 20 20 20 20 69 66 28 20 30 3d 3d 67 65 6e 66  .    if( 0==genf
fe80: 6b 65 79 50 61 72 73 65 41 72 67 73 28 26 63 6d  keyParseArgs(&cm
fe90: 64 2c 20 26 61 7a 41 72 67 5b 31 5d 2c 20 6e 41  d, &azArg[1], nA
fea0: 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 63  rg-1) ){.      c
feb0: 6d 64 2e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  md.db = p->db;. 
fec0: 20 20 20 20 20 63 6d 64 2e 70 43 62 20 3d 20 70       cmd.pCb = p
fed0: 3b 0a 20 20 20 20 20 20 67 65 6e 66 6b 65 79 5f  ;.      genfkey_
fee0: 63 72 65 61 74 65 5f 74 72 69 67 67 65 72 73 28  create_triggers(
fef0: 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 28  p->db, "main", (
ff00: 76 6f 69 64 20 2a 29 26 63 6d 64 2c 20 67 65 6e  void *)&cmd, gen
ff10: 66 6b 65 79 43 6d 64 43 62 29 3b 0a 20 20 20 20  fkeyCmdCb);.    
ff20: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
ff30: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
ff40: 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  & (strncmp(azArg
ff50: 5b 30 5d 2c 20 22 68 65 61 64 65 72 22 2c 20 6e  [0], "header", n
ff60: 29 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  )==0 ||.        
ff70: 20 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70           strncmp
ff80: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64  (azArg[0], "head
ff90: 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 26 26 20  ers", n)==0 )&& 
ffa0: 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 70 2d  nArg>1 ){.    p-
ffb0: 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f  >showHeader = bo
ffc0: 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
ffd0: 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  [1]);.  }else.. 
ffe0: 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73   if( c=='h' && s
fff0: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
10000 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29   "help", n)==0 )
10010 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
10020 64 65 72 72 2c 22 25 73 22 2c 7a 48 65 6c 70 29  derr,"%s",zHelp)
10030 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
10040 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
10050 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d  mp(azArg[0], "im
10060 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20  port", n)==0 && 
10070 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 63  nArg>=3 ){.    c
10080 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20 61 7a  har *zTable = az
10090 41 72 67 5b 32 5d 3b 20 20 20 20 2f 2a 20 49 6e  Arg[2];    /* In
100a0 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
100b0 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  his table */.   
100c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61   char *zFile = a
100d0 7a 41 72 67 5b 31 5d 3b 20 20 20 20 20 2f 2a 20  zArg[1];     /* 
100e0 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68  The file from wh
100f0 69 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64  ich to extract d
10100 61 74 61 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ata */.    sqlit
10110 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
10120 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74         /* A stat
10130 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
10140 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10150 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
10160 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69  lt code */.    i
10170 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
10180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10190 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
101a0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
101b0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
101e0 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72  es in an SQL str
101f0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
10200 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
10210 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
10220 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69  ounters */.    i
10230 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20  nt nSep;        
10240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10250 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
10260 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 5d 20   p->separator[] 
10270 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
10280 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10290 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61     /* An SQL sta
102a0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68  tement */.    ch
102b0 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20  ar *zLine;      
102c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
102d0 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e  ingle line of in
102e0 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  put from the fil
102f0 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a  e */.    char **
10300 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  azCol;          
10310 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20       /* zLine[] 
10320 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63  broken up into c
10330 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68  olumns */.    ch
10340 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20  ar *zCommit;    
10350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
10360 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67   to commit chang
10370 65 73 20 2a 2f 20 20 20 0a 20 20 20 20 46 49 4c  es */   .    FIL
10380 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
10390 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
103a0 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
103b0 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30    int lineno = 0
103c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
103d0 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   Line number of 
103e0 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 0a 20  input file */.. 
103f0 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
10400 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
10410 33 30 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  30(p->separator)
10420 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
10430 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
10440 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 6e 2d  tf(stderr, "non-
10450 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72  null separator r
10460 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f  equired for impo
10470 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
10480 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
10490 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
104a0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
104b0 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
104c0 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
104d0 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
104e0 20 30 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   0;.    nByte = 
104f0 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
10500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10510 5f 70 72 65 70 61 72 65 28 70 2d 3e 64 62 2c 20  _prepare(p->db, 
10520 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
10530 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
10540 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
10550 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10560 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
10570 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
10580 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
10590 62 29 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  b));.      nCol 
105a0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
105b0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
105c0 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
105d0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
105e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
105f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
10600 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
10610 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( nCol==0 ) ret
10620 75 72 6e 20 30 3b 0a 20 20 20 20 7a 53 71 6c 20  urn 0;.    zSql 
10630 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
10640 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 20 + nCol*2 );
10650 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
10660 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
10670 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
10680 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c  f(nByte+20, zSql
10690 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27  , "INSERT INTO '
106a0 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a  %q' VALUES(?", z
106b0 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
106c0 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
106d0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
106e0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
106f0 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
10700 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
10710 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
10720 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
10730 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
10740 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
10750 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d  lite3_prepare(p-
10760 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
10770 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
10780 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
10790 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66  f( rc ){.      f
107a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
107b0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
107c0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
107d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
107e0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
107f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
10800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
10810 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72   fopen(zFile, "r
10820 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  b");.    if( in=
10830 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
10840 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e  ntf(stderr, "can
10850 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25  not open file: %
10860 73 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  s\n", zFile);.  
10870 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
10880 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
10890 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
108a0 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d   }.    azCol = m
108b0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a  alloc( sizeof(az
108c0 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29  Col[0])*(nCol+1)
108d0 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   );.    if( azCo
108e0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 63  l==0 ){.      fc
108f0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
10900 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
10910 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
10920 28 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c  (p->db, "BEGIN",
10930 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a   0, 0, 0);.    z
10940 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54  Commit = "COMMIT
10950 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  ";.    while( (z
10960 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74  Line = local_get
10970 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20  line(0, in))!=0 
10980 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
10990 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20  ;.      i = 0;. 
109a0 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
109b0 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20       azCol[0] = 
109c0 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72  zLine;.      for
109d0 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a  (i=0, z=zLine; *
109e0 7a 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26  z && *z!='\n' &&
109f0 20 2a 7a 21 3d 27 5c 72 27 3b 20 7a 2b 2b 29 7b   *z!='\r'; z++){
10a00 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
10a10 3d 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30 5d  =p->separator[0]
10a20 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 70   && strncmp(z, p
10a30 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 6e 53 65  ->separator, nSe
10a40 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
10a50 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
10a60 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
10a70 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
10a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
10a90 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
10aa0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
10ab0 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
10ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10ad0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10ae0 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  *z = 0;.      if
10af0 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20  ( i+1!=nCol ){. 
10b00 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
10b10 74 64 65 72 72 2c 22 25 73 20 6c 69 6e 65 20 25  tderr,"%s line %
10b20 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
10b30 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62  olumns of data b
10b40 75 74 20 66 6f 75 6e 64 20 25 64 5c 6e 22 2c 0a  ut found %d\n",.
10b50 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
10b60 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
10b70 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  i+1);.        zC
10b80 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
10b90 4b 22 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  K";.        free
10ba0 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
10bb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10bc0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
10bd0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
10be0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
10bf0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b  d_text(pStmt, i+
10c00 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c  1, azCol[i], -1,
10c10 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
10c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10c30 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
10c40 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
10c50 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
10c60 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  mt);.      free(
10c70 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  zLine);.      if
10c80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10c90 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
10ca0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
10cb0 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
10cc0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
10cd0 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
10ce0 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
10cf0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
10d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10d10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
10d20 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63  e(azCol);.    fc
10d30 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71  lose(in);.    sq
10d40 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10d50 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
10d60 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
10d70 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29  Commit, 0, 0, 0)
10d80 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
10d90 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
10da0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e  mp(azArg[0], "in
10db0 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26  dices", n)==0 &&
10dc0 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 73   nArg>1 ){.    s
10dd0 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
10de0 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ata data;.    ch
10df0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
10e00 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b  .    open_db(p);
10e10 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
10e20 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
10e30 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
10e40 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
10e50 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f    data.mode = MO
10e60 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7a 53 68  DE_List;.    zSh
10e70 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72  ellStatic = azAr
10e80 67 5b 31 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  g[1];.    sqlite
10e90 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20  3_exec(p->db,.  
10ea0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
10eb0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
10ec0 74 65 72 20 22 0a 20 20 20 20 20 20 22 57 48 45  ter ".      "WHE
10ed0 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
10ee0 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  AND tbl_name LIK
10ef0 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20  E shellstatic() 
10f00 22 0a 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41  ".      "UNION A
10f10 4c 4c 20 22 0a 20 20 20 20 20 20 22 53 45 4c 45  LL ".      "SELE
10f20 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
10f30 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
10f40 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74  ".      "WHERE t
10f50 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20  ype='index' AND 
10f60 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68  tbl_name LIKE sh
10f70 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a 20 20  ellstatic() ".  
10f80 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 31 22      "ORDER BY 1"
10f90 2c 0a 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b  ,.      callback
10fa0 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
10fb0 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 53 68  g.    );.    zSh
10fc0 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20  ellStatic = 0;. 
10fd0 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
10fe0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
10ff0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
11000 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
11010 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11020 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
11030 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 64   }.  }else..#ifd
11040 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11050 5f 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63  _IOTRACE.  if( c
11060 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
11070 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72  (azArg[0], "iotr
11080 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ace", n)==0 ){. 
11090 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28     extern void (
110a0 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29  *sqlite3IoTrace)
110b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e  (const char*, ..
110c0 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72  .);.    if( iotr
110d0 61 63 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d  ace && iotrace!=
110e0 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28  stdout ) fclose(
110f0 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f  iotrace);.    io
11100 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69  trace = 0;.    i
11110 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
11120 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
11130 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
11140 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
11150 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b  g[1], "-")==0 ){
11160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f  .      sqlite3Io
11170 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50  Trace = iotraceP
11180 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74  rintf;.      iot
11190 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20  race = stdout;. 
111a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
111b0 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28  iotrace = fopen(
111c0 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a  azArg[1], "w");.
111d0 20 20 20 20 20 20 69 66 28 20 69 6f 74 72 61 63        if( iotrac
111e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
111f0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
11200 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25  "cannot open \"%
11210 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
11220 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11230 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20  e3IoTrace = 0;. 
11240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11250 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
11260 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e  ce = iotracePrin
11270 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tf;.      }.    
11280 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
11290 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
112a0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
112b0 53 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c  SION.  if( c=='l
112c0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
112d0 72 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e  rg[0], "load", n
112e0 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d 32 20  )==0 && nArg>=2 
112f0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
11300 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63  r *zFile, *zProc
11310 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
11320 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Msg = 0;.    int
11330 20 72 63 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d   rc;.    zFile =
11340 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a   azArg[1];.    z
11350 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f  Proc = nArg>=3 ?
11360 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20   azArg[2] : 0;. 
11370 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
11380 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11390 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
113a0 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  ->db, zFile, zPr
113b0 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  oc, &zErrMsg);. 
113c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
113d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70  E_OK ){.      fp
113e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
113f0 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
11400 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11410 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
11420 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
11430 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
11440 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26  .  if( c=='m' &&
11450 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
11460 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30  ], "mode", n)==0
11470 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20   && nArg>=2 ){. 
11480 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c     int n2 = strl
11490 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  en30(azArg[1]);.
114a0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
114b0 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 22 2c  azArg[1],"line",
114c0 6e 32 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c  n2)==0.        |
114d0 7c 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d  |.        strncm
114e0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65  p(azArg[1],"line
114f0 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  s",n2)==0 ){.   
11500 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
11510 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 7d 65 6c 73  E_Line;.    }els
11520 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a  e if( strncmp(az
11530 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 22 2c  Arg[1],"column",
11540 6e 32 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  n2)==0.         
11550 20 20 20 20 20 7c 7c 0a 20 20 20 20 20 20 20 20       ||.        
11560 20 20 20 20 20 20 73 74 72 6e 63 6d 70 28 61 7a        strncmp(az
11570 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22  Arg[1],"columns"
11580 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
11590 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
115a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73  Column;.    }els
115b0 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a  e if( strncmp(az
115c0 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32  Arg[1],"list",n2
115d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
115e0 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  >mode = MODE_Lis
115f0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
11600 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
11610 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20  ],"html",n2)==0 
11620 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
11630 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
11640 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
11650 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63  cmp(azArg[1],"tc
11660 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  l",n2)==0 ){.   
11670 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
11680 45 5f 54 63 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  E_Tcl;.    }else
11690 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
116a0 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d  rg[1],"csv",n2)=
116b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
116c0 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a  ode = MODE_Csv;.
116d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
116e0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
116f0 3e 73 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  >separator), p->
11700 73 65 70 61 72 61 74 6f 72 2c 20 22 2c 22 29 3b  separator, ",");
11710 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
11720 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
11730 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  "tabs",n2)==0 ){
11740 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
11750 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
11760 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11770 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70  tf(sizeof(p->sep
11780 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70 61  arator), p->sepa
11790 72 61 74 6f 72 2c 20 22 5c 74 22 29 3b 0a 20 20  rator, "\t");.  
117a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
117b0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e  cmp(azArg[1],"in
117c0 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  sert",n2)==0 ){.
117d0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
117e0 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20  MODE_Insert;.   
117f0 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29     if( nArg>=3 )
11800 7b 0a 20 20 20 20 20 20 20 20 73 65 74 5f 74 61  {.        set_ta
11810 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 61 7a 41 72  ble_name(p, azAr
11820 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g[2]);.      }el
11830 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 5f  se{.        set_
11840 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 22 74  table_name(p, "t
11850 61 62 6c 65 22 29 3b 0a 20 20 20 20 20 20 7d 0a  able");.      }.
11860 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20      }else {.    
11870 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
11880 2c 22 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62 65  ,"mode should be
11890 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
118a0 20 20 20 20 22 63 6f 6c 75 6d 6e 20 63 73 76 20      "column csv 
118b0 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65  html insert line
118c0 20 6c 69 73 74 20 74 61 62 73 20 74 63 6c 5c 6e   list tabs tcl\n
118d0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
118e0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27 20  e..  if( c=='n' 
118f0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
11900 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22  [0], "nullvalue"
11910 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
11920 3d 32 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74  =2 ) {.    sqlit
11930 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
11940 6f 66 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29  of(p->nullvalue)
11950 2c 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 0a  , p->nullvalue,.
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e       "%.*s", (in
11980 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e  t)ArraySize(p->n
11990 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 20 61 7a 41  ullvalue)-1, azA
119a0 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a  rg[1]);.  }else.
119b0 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26  .  if( c=='o' &&
119c0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
119d0 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d  ], "output", n)=
119e0 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b  =0 && nArg==2 ){
119f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 21  .    if( p->out!
11a00 3d 73 74 64 6f 75 74 20 29 7b 0a 20 20 20 20 20  =stdout ){.     
11a10 20 66 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b   fclose(p->out);
11a20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
11a30 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
11a40 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20  stdout")==0 ){. 
11a50 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
11a60 64 6f 75 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  dout;.      sqli
11a70 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
11a80 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c  eof(p->outfile),
11a90 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 73 74   p->outfile, "st
11aa0 64 6f 75 74 22 29 3b 0a 20 20 20 20 7d 65 6c 73  dout");.    }els
11ab0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  e{.      p->out 
11ac0 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d  = fopen(azArg[1]
11ad0 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69  , "wb");.      i
11ae0 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
11af0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
11b00 73 74 64 65 72 72 2c 22 63 61 6e 27 74 20 77 72  stderr,"can't wr
11b10 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
11b20 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
11b30 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
11b40 64 6f 75 74 3b 0a 20 20 20 20 20 20 7d 20 65 6c  dout;.      } el
11b50 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 73 71  se {.         sq
11b60 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
11b70 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
11b80 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
11b90 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  %s", azArg[1]);.
11ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11bb0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
11bc0 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'p' && strncmp(a
11bd0 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74  zArg[0], "prompt
11be0 22 2c 20 6e 29 3d 3d 30 20 26 26 20 28 6e 41 72  ", n)==0 && (nAr
11bf0 67 3d 3d 32 20 7c 7c 20 6e 41 72 67 3d 3d 33 29  g==2 || nArg==3)
11c00 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20  ){.    if( nArg 
11c10 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74  >= 2) {.      st
11c20 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74  rncpy(mainPrompt
11c30 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41  ,azArg[1],(int)A
11c40 72 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f  rraySize(mainPro
11c50 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
11c60 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33     if( nArg >= 3
11c70 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
11c80 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  y(continuePrompt
11c90 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41  ,azArg[2],(int)A
11ca0 72 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75  rraySize(continu
11cb0 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20  ePrompt)-1);.   
11cc0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
11cd0 28 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e  ( c=='q' && strn
11ce0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71  cmp(azArg[0], "q
11cf0 75 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  uit", n)==0 ){. 
11d00 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c     rc = 2;.  }el
11d10 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27  se..  if( c=='r'
11d20 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
11d30 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72  cmp(azArg[0], "r
11d40 65 61 64 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  ead", n)==0 && n
11d50 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 46 49  Arg==2 ){.    FI
11d60 4c 45 20 2a 61 6c 74 20 3d 20 66 6f 70 65 6e 28  LE *alt = fopen(
11d70 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b  azArg[1], "rb");
11d80 0a 20 20 20 20 69 66 28 20 61 6c 74 3d 3d 30 20  .    if( alt==0 
11d90 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
11da0 28 73 74 64 65 72 72 2c 22 63 61 6e 27 74 20 6f  (stderr,"can't o
11db0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
11dc0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
11dd0 6c 73 65 7b 0a 20 20 20 20 20 20 70 72 6f 63 65  lse{.      proce
11de0 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74 29  ss_input(p, alt)
11df0 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 61  ;.      fclose(a
11e00 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  lt);.    }.  }el
11e10 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27  se..  if( c=='r'
11e20 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
11e30 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72  cmp(azArg[0], "r
11e40 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 26  estore", n)==0 &
11e50 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20  & nArg>1 ){.    
11e60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
11e70 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  File;.    const 
11e80 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73  char *zDb;.    s
11e90 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20  qlite3 *pSrc;.  
11ea0 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
11eb0 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
11ec0 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  nt rc;.    int n
11ed0 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
11ee0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
11ef0 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
11f00 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
11f10 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a    zDb = "main";.
11f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11f30 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72   zSrcFile = azAr
11f40 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20  g[2];.      zDb 
11f50 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
11f60 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
11f70 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65  e3_open(zSrcFile
11f80 2c 20 26 70 53 72 63 29 3b 0a 20 20 20 20 69 66  , &pSrc);.    if
11f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11fa0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
11fb0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
11fc0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 25 73 5c   cannot open %s\
11fd0 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20  n", zSrcFile);. 
11fe0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
11ff0 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
12000 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
12010 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
12020 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
12030 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
12040 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53  t(p->db, zDb, pS
12050 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20  rc, "main");.   
12060 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
12070 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
12080 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
12090 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
120a0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
120b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
120c0 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20  ose(pSrc);.     
120d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
120e0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
120f0 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
12100 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
12110 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  0))==SQLITE_OK. 
12120 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d           || rc==
12130 53 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a  SQLITE_BUSY  ){.
12140 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
12150 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
12160 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75       if( nTimeou
12170 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b  t++ >= 3 ) break
12180 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12190 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20  3_sleep(100);.  
121a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
121b0 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66  sqlite3_backup_f
121c0 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a  inish(pBackup);.
121d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
121e0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
121f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12200 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
12210 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
12220 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43  | rc==SQLITE_LOC
12230 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 66 70 72  KED ){.      fpr
12240 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 6f  intf(stderr, "so
12250 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73  urce database is
12260 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 7d   busy\n");.    }
12270 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
12280 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
12290 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
122a0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
122b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
122c0 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
122d0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
122e0 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
122f0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63  mp(azArg[0], "sc
12300 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  hema", n)==0 ){.
12310 20 20 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62      struct callb
12320 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20  ack_data data;. 
12330 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
12340 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
12350 62 28 70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  b(p);.    memcpy
12360 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
12370 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
12380 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
12390 30 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  0;.    data.mode
123a0 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20   = MODE_Semi;.  
123b0 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a    if( nArg>1 ){.
123c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
123d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72     for(i=0; azAr
123e0 67 5b 31 5d 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a  g[1][i]; i++) az
123f0 41 72 67 5b 31 5d 5b 69 5d 20 3d 20 28 63 68 61  Arg[1][i] = (cha
12400 72 29 74 6f 6c 6f 77 65 72 28 61 7a 41 72 67 5b  r)tolower(azArg[
12410 31 5d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  1][i]);.      if
12420 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
12430 5d 2c 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ],"sqlite_master
12440 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12450 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b   char *new_argv[
12460 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d  2], *new_colv[2]
12470 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
12480 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54 45 20  gv[0] = "CREATE 
12490 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73  TABLE sqlite_mas
124a0 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20 20 20  ter (\n".       
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
124c0 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a    type text,\n".
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124e0 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65        "  name te
124f0 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
12510 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e  tbl_name text,\n
12520 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
12530 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70          "  rootp
12540 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a  age integer,\n".
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 20 20 20 20 20 22 20 20 73 71 6c 20 74 65 78        "  sql tex
12570 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  t\n".           
12580 20 20 20 20 20 20 20 20 20 20 20 22 29 22 3b 0a             ")";.
12590 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
125a0 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
125b0 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22   new_colv[0] = "
125c0 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65  sql";.        ne
125d0 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_colv[1] = 0;. 
125e0 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28         callback(
125f0 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72  &data, 1, new_ar
12600 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20  gv, new_colv);. 
12610 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
12620 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
12630 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
12640 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
12650 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67     char *new_arg
12660 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b  v[2], *new_colv[
12670 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  2];.        new_
12680 61 72 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54  argv[0] = "CREAT
12690 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73 71 6c  E TEMP TABLE sql
126a0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
126b0 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  (\n".           
126c0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79             "  ty
126d0 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  pe text,\n".    
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c    "  name text,\
12700 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
12710 20 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f           "  tbl_
12720 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20      "  rootpage 
12750 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20  integer,\n".    
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22    "  sql text\n"
12780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12790 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20         ")";.    
127a0 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20      new_argv[1] 
127b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  = 0;.        new
127c0 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22  _colv[0] = "sql"
127d0 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f  ;.        new_co
127e0 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  lv[1] = 0;.     
127f0 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74     callback(&dat
12800 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20  a, 1, new_argv, 
12810 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20  new_colv);.     
12820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12830 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61  zShellStatic = a
12840 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 20  zArg[1];.       
12850 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
12860 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22  >db,.          "
12870 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
12880 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 28  ".          "  (
12890 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20  SELECT sql sql, 
128a0 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e  type type, tbl_n
128b0 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61  ame tbl_name, na
128c0 6d 65 20 6e 61 6d 65 22 0a 20 20 20 20 20 20 20  me name".       
128d0 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73 71     "     FROM sq
128e0 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f  lite_master UNIO
128f0 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 20 20  N ALL".         
12900 20 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c   "   SELECT sql,
12910 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c   type, tbl_name,
12920 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
12930 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22  e_temp_master) "
12940 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52  .          "WHER
12950 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  E tbl_name LIKE 
12960 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 41 4e  shellstatic() AN
12970 44 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41  D type!='meta' A
12980 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 22  ND sql NOTNULL "
12990 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
129a0 52 20 42 59 20 73 75 62 73 74 72 28 74 79 70 65  R BY substr(type
129b0 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20 20  ,2,1), name",.  
129c0 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
129d0 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
129e0 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65  g);.        zShe
129f0 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20  llStatic = 0;.  
12a00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
12a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
12a20 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
12a30 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
12a40 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20 20 20  FROM ".         
12a50 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73  "  (SELECT sql s
12a60 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74  ql, type type, t
12a70 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65  bl_name tbl_name
12a80 2c 20 6e 61 6d 65 20 6e 61 6d 65 22 0a 20 20 20  , name name".   
12a90 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d        "     FROM
12aa0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55   sqlite_master U
12ab0 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20  NION ALL".      
12ac0 20 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71     "   SELECT sq
12ad0 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  l, type, tbl_nam
12ae0 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  e, name FROM sql
12af0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29  ite_temp_master)
12b00 20 22 0a 20 20 20 20 20 20 20 20 20 22 57 48 45   ".         "WHE
12b10 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20  RE type!='meta' 
12b20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20  AND sql NOTNULL 
12b30 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
12b40 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20  E 'sqlite_%'".  
12b50 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
12b60 20 73 75 62 73 74 72 28 74 79 70 65 2c 32 2c 31   substr(type,2,1
12b70 29 2c 20 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  ), name",.      
12b80 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
12b90 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20  ta, &zErrMsg.   
12ba0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
12bb0 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
12bc0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
12bd0 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
12be0 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
12bf0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12c00 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrMsg);.    }.
12c10 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
12c20 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
12c30 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61  (azArg[0], "sepa
12c40 72 61 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 26 26  rator", n)==0 &&
12c50 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
12c60 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
12c70 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72  (sizeof(p->separ
12c80 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70 61 72 61  ator), p->separa
12c90 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
12ca0 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22            "%.*s"
12cb0 2c 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  , (int)sizeof(p-
12cc0 3e 73 65 70 61 72 61 74 6f 72 29 2d 31 2c 20 61  >separator)-1, a
12cd0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73  zArg[1]);.  }els
12ce0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
12cf0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
12d00 5b 30 5d 2c 20 22 73 68 6f 77 22 2c 20 6e 29 3d  [0], "show", n)=
12d10 3d 30 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  =0){.    int i;.
12d20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
12d30 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
12d40 2c 22 65 63 68 6f 22 2c 20 70 2d 3e 65 63 68 6f  ,"echo", p->echo
12d50 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66  On ? "on" : "off
12d60 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
12d70 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25  p->out,"%9.9s: %
12d80 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e 22 2c 20  s\n","explain", 
12d90 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 76  p->explainPrev.v
12da0 61 6c 69 64 20 3f 20 22 6f 6e 22 20 3a 22 6f 66  alid ? "on" :"of
12db0 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  f");.    fprintf
12dc0 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20  (p->out,"%9.9s: 
12dd0 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73 22 2c  %s\n","headers",
12de0 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3f   p->showHeader ?
12df0 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a   "on" : "off");.
12e00 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
12e10 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
12e20 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 44 65 73  ,"mode", modeDes
12e30 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20  cr[p->mode]);.  
12e40 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
12e50 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22 6e 75 6c  ,"%9.9s: ", "nul
12e60 6c 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 20  lvalue");.      
12e70 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
12e80 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 75 6c 6c 76  p->out, p->nullv
12e90 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 66 70 72  alue);.      fpr
12ea0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
12eb0 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
12ec0 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25  p->out,"%9.9s: %
12ed0 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c 0a 20  s\n","output",. 
12ee0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
12ef0 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c 65 29 20  n30(p->outfile) 
12f00 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20 3a 20 22  ? p->outfile : "
12f10 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 66 70  stdout");.    fp
12f20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
12f30 2e 39 73 3a 20 22 2c 20 22 73 65 70 61 72 61 74  .9s: ", "separat
12f40 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70  or");.      outp
12f50 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
12f60 75 74 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  ut, p->separator
12f70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
12f80 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
12f90 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
12fa0 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c 22 77 69  ut,"%9.9s: ","wi
12fb0 64 74 68 22 29 3b 0a 20 20 20 20 66 6f 72 20 28  dth");.    for (
12fc0 69 3d 30 3b 69 3c 28 69 6e 74 29 41 72 72 61 79  i=0;i<(int)Array
12fd0 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68  Size(p->colWidth
12fe0 29 20 26 26 20 70 2d 3e 63 6f 6c 57 69 64 74 68  ) && p->colWidth
12ff0 5b 69 5d 20 21 3d 20 30 3b 69 2b 2b 29 20 7b 0a  [i] != 0;i++) {.
13000 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
13010 3e 6f 75 74 2c 22 25 64 20 22 2c 70 2d 3e 63 6f  >out,"%d ",p->co
13020 6c 57 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20  lWidth[i]);.    
13030 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  }.    fprintf(p-
13040 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 65  >out,"\n");.  }e
13050 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74  lse..  if( c=='t
13060 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e  ' && n>1 && strn
13070 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74  cmp(azArg[0], "t
13080 61 62 6c 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  ables", n)==0 ){
13090 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 52 65  .    char **azRe
130a0 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52  sult;.    int nR
130b0 6f 77 2c 20 72 63 3b 0a 20 20 20 20 63 68 61 72  ow, rc;.    char
130c0 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 6f   *zErrMsg;.    o
130d0 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 69  pen_db(p);.    i
130e0 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  f( nArg==1 ){.  
130f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13100 5f 67 65 74 5f 74 61 62 6c 65 28 70 2d 3e 64 62  _get_table(p->db
13110 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
13120 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
13130 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
13140 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65 20      "WHERE type 
13150 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65  IN ('table','vie
13160 77 27 29 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  w') AND name NOT
13170 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
13180 22 0a 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e  ".        "UNION
13190 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22   ALL ".        "
131a0 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
131b0 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
131c0 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
131d0 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
131e0 61 62 6c 65 27 2c 27 76 69 65 77 27 29 20 22 0a  able','view') ".
131f0 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
13200 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20 26 61  Y 1",.        &a
13210 7a 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20  zResult, &nRow, 
13220 30 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20  0, &zErrMsg.    
13230 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
13240 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
13250 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  ic = azArg[1];. 
13260 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13270 33 5f 67 65 74 5f 74 61 62 6c 65 28 70 2d 3e 64  3_get_table(p->d
13280 62 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  b,.        "SELE
13290 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
132a0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
132b0 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
132c0 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69   IN ('table','vi
132d0 65 77 27 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49  ew') AND name LI
132e0 4b 45 20 27 25 27 7c 7c 73 68 65 6c 6c 73 74 61  KE '%'||shellsta
132f0 74 69 63 28 29 7c 7c 27 25 27 20 22 0a 20 20 20  tic()||'%' ".   
13300 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20       "UNION ALL 
13310 22 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ".        "SELEC
13320 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
13330 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22  te_temp_master "
13340 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
13350 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27  type IN ('table'
13360 2c 27 76 69 65 77 27 29 20 41 4e 44 20 6e 61 6d  ,'view') AND nam
13370 65 20 4c 49 4b 45 20 27 25 27 7c 7c 73 68 65 6c  e LIKE '%'||shel
13380 6c 73 74 61 74 69 63 28 29 7c 7c 27 25 27 20 22  lstatic()||'%' "
13390 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20  .        "ORDER 
133a0 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20 26  BY 1",.        &
133b0 61 7a 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c  azResult, &nRow,
133c0 20 30 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20   0, &zErrMsg.   
133d0 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 53 68 65     );.      zShe
133e0 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20  llStatic = 0;.  
133f0 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72    }.    if( zErr
13400 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72  Msg ){.      fpr
13410 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
13420 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
13430 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
13440 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
13450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13460 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13470 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20  .      int len, 
13480 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  maxlen = 0;.    
13490 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
134a0 20 20 69 6e 74 20 6e 50 72 69 6e 74 43 6f 6c 2c    int nPrintCol,
134b0 20 6e 50 72 69 6e 74 52 6f 77 3b 0a 20 20 20 20   nPrintRow;.    
134c0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 52    for(i=1; i<=nR
134d0 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; i++){.      
134e0 20 20 69 66 28 20 61 7a 52 65 73 75 6c 74 5b 69    if( azResult[i
134f0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
13500 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73  .        len = s
13510 74 72 6c 65 6e 33 30 28 61 7a 52 65 73 75 6c 74  trlen30(azResult
13520 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [i]);.        if
13530 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d  ( len>maxlen ) m
13540 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  axlen = len;.   
13550 20 20 20 7d 0a 20 20 20 20 20 20 6e 50 72 69 6e     }.      nPrin
13560 74 43 6f 6c 20 3d 20 38 30 2f 28 6d 61 78 6c 65  tCol = 80/(maxle
13570 6e 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n+2);.      if( 
13580 6e 50 72 69 6e 74 43 6f 6c 3c 31 20 29 20 6e 50  nPrintCol<1 ) nP
13590 72 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20 20 20  rintCol = 1;.   
135a0 20 20 20 6e 50 72 69 6e 74 52 6f 77 20 3d 20 28     nPrintRow = (
135b0 6e 52 6f 77 20 2b 20 6e 50 72 69 6e 74 43 6f 6c  nRow + nPrintCol
135c0 20 2d 20 31 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b   - 1)/nPrintCol;
135d0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
135e0 69 3c 6e 50 72 69 6e 74 52 6f 77 3b 20 69 2b 2b  i<nPrintRow; i++
135f0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
13600 3d 69 2b 31 3b 20 6a 3c 3d 6e 52 6f 77 3b 20 6a  =i+1; j<=nRow; j
13610 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a 20 20  +=nPrintRow){.  
13620 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
13630 70 20 3d 20 6a 3c 3d 6e 50 72 69 6e 74 52 6f 77  p = j<=nPrintRow
13640 20 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a 20 20   ? "" : "  ";.  
13650 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
13660 25 73 25 2d 2a 73 22 2c 20 7a 53 70 2c 20 6d 61  %s%-*s", zSp, ma
13670 78 6c 65 6e 2c 20 61 7a 52 65 73 75 6c 74 5b 6a  xlen, azResult[j
13680 5d 20 3f 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20  ] ? azResult[j] 
13690 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  : "");.        }
136a0 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
136b0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
136c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
136d0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
136e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74    sqlite3_free_t
136f0 61 62 6c 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a  able(azResult);.
13700 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
13710 3d 3d 27 74 27 20 26 26 20 6e 3e 34 20 26 26 20  =='t' && n>4 && 
13720 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
13730 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 6e 29 3d  , "timeout", n)=
13740 3d 30 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b  =0 && nArg>=2 ){
13750 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b  .    open_db(p);
13760 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
13770 79 5f 74 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c  y_timeout(p->db,
13780 20 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 29   atoi(azArg[1]))
13790 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 0a 23 69 66  ;.  }else.  .#if
137a0 20 48 41 53 5f 54 49 4d 45 52 20 20 0a 20 20 69   HAS_TIMER  .  i
137b0 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 3d  f( c=='t' && n>=
137c0 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  5 && strncmp(azA
137d0 72 67 5b 30 5d 2c 20 22 74 69 6d 65 72 22 2c 20  rg[0], "timer", 
137e0 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20  n)==0 && nArg>1 
137f0 29 7b 0a 20 20 20 20 65 6e 61 62 6c 65 54 69 6d  ){.    enableTim
13800 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  er = booleanValu
13810 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
13820 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
13830 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72  f( c=='w' && str
13840 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
13850 77 69 64 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b  width", n)==0 ){
13860 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
13870 61 73 73 65 72 74 28 20 6e 41 72 67 3c 3d 41 72  assert( nArg<=Ar
13880 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29  raySize(azArg) )
13890 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
138a0 3c 6e 41 72 67 20 26 26 20 6a 3c 41 72 72 61 79  <nArg && j<Array
138b0 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68  Size(p->colWidth
138c0 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  ); j++){.      p
138d0 2d 3e 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20  ->colWidth[j-1] 
138e0 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b 6a 5d 29  = atoi(azArg[j])
138f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
13900 0a 0a 20 20 7b 0a 20 20 20 20 66 70 72 69 6e 74  ..  {.    fprint
13910 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f  f(stderr, "unkno
13920 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 69 6e  wn command or in
13930 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 3a  valid arguments:
13940 20 22 0a 20 20 20 20 20 20 22 20 5c 22 25 73 5c   ".      " \"%s\
13950 22 2e 20 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70  ". Enter \".help
13960 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20  \" for help\n", 
13970 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 7d 0a 0a  azArg[0]);.  }..
13980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13990 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
139a0 45 20 69 66 20 61 20 73 65 6d 69 63 6f 6c 6f 6e  E if a semicolon
139b0 20 6f 63 63 75 72 73 20 61 6e 79 77 68 65 72 65   occurs anywhere
139c0 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 4e 20   in the first N 
139d0 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 6f 66  characters.** of
139e0 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 0a 2a 2f 0a   string z[]..*/.
139f0 73 74 61 74 69 63 20 69 6e 74 20 5f 63 6f 6e 74  static int _cont
13a00 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63  ains_semicolon(c
13a10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
13a20 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t N){.  int i;. 
13a30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
13a40 2b 2b 29 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  ++){  if( z[i]==
13a50 27 3b 27 20 29 20 72 65 74 75 72 6e 20 31 3b 20  ';' ) return 1; 
13a60 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
13a70 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
13a80 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e  ee if a line con
13a90 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
13aa0 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f  f whitespace..*/
13ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c  .static int _all
13ac0 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73  _whitespace(cons
13ad0 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f  t char *z){.  fo
13ae0 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  r(; *z; z++){.  
13af0 20 20 69 66 28 20 69 73 73 70 61 63 65 28 2a 28    if( isspace(*(
13b00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
13b10 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
13b20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26 26    if( *z=='/' &&
13b30 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20   z[1]=='*' ){.  
13b40 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20      z += 2;.    
13b50 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 28    while( *z && (
13b60 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d 21  *z!='*' || z[1]!
13b70 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  ='/') ){ z++; }.
13b80 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30 20        if( *z==0 
13b90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
13ba0 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e    z++;.      con
13bb0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
13bc0 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26 20   if( *z=='-' && 
13bd0 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  z[1]=='-' ){.   
13be0 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20     z += 2;.     
13bf0 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a   while( *z && *z
13c00 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20 7d  !='\n' ){ z++; }
13c10 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30  .      if( *z==0
13c20 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
13c30 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
13c40 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
13c50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
13c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13c70 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 69 6e   TRUE if the lin
13c80 65 20 74 79 70 65 64 20 69 6e 20 69 73 20 61 6e  e typed in is an
13c90 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65 72   SQL command ter
13ca0 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a 2a  minator other.**
13cb0 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f 6c   than a semi-col
13cc0 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65 72  on.  The SQL Ser
13cd0 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20 63  ver style "go" c
13ce0 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72 73  ommand is unders
13cf0 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74 68  tood.** as is th
13d00 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a 2f  e Oracle "/"..*/
13d10 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 69 73 5f  .static int _is_
13d20 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74  command_terminat
13d30 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  or(const char *z
13d40 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  Line){.  while( 
13d50 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67 6e  isspace(*(unsign
13d60 65 64 20 63 68 61 72 2a 29 7a 4c 69 6e 65 29 20  ed char*)zLine) 
13d70 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b 0a 20  ){ zLine++; };. 
13d80 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27   if( zLine[0]=='
13d90 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65  /' && _all_white
13da0 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31 5d 29  space(&zLine[1])
13db0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
13dc0 3b 20 20 2f 2a 20 4f 72 61 63 6c 65 20 2a 2f 0a  ;  /* Oracle */.
13dd0 20 20 7d 0a 20 20 69 66 28 20 74 6f 6c 6f 77 65    }.  if( tolowe
13de0 72 28 7a 4c 69 6e 65 5b 30 5d 29 3d 3d 27 67 27  r(zLine[0])=='g'
13df0 20 26 26 20 74 6f 6c 6f 77 65 72 28 7a 4c 69 6e   && tolower(zLin
13e00 65 5b 31 5d 29 3d 3d 27 6f 27 0a 20 20 20 20 20  e[1])=='o'.     
13e10 20 20 20 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74      && _all_whit
13e20 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 32 5d  espace(&zLine[2]
13e30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13e40 31 3b 20 20 2f 2a 20 53 51 4c 20 53 65 72 76 65  1;  /* SQL Serve
13e50 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  r */.  }.  retur
13e60 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
13e70 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 53 71  turn true if zSq
13e80 6c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  l is a complete 
13e90 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
13ea0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
13eb0 69 74 0a 2a 2a 20 65 6e 64 73 20 69 6e 20 74 68  it.** ends in th
13ec0 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 73 74  e middle of a st
13ed0 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 6f 72 20  ring literal or 
13ee0 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 2e  C-style comment.
13ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f  .*/.static int _
13f00 69 73 5f 63 6f 6d 70 6c 65 74 65 28 63 68 61 72  is_complete(char
13f10 20 2a 7a 53 71 6c 2c 20 69 6e 74 20 6e 53 71 6c   *zSql, int nSql
13f20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
13f30 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
13f40 75 72 6e 20 31 3b 0a 20 20 7a 53 71 6c 5b 6e 53  urn 1;.  zSql[nS
13f50 71 6c 5d 20 3d 20 27 3b 27 3b 0a 20 20 7a 53 71  ql] = ';';.  zSq
13f60 6c 5b 6e 53 71 6c 2b 31 5d 20 3d 20 30 3b 0a 20  l[nSql+1] = 0;. 
13f70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   rc = sqlite3_co
13f80 6d 70 6c 65 74 65 28 7a 53 71 6c 29 3b 0a 20 20  mplete(zSql);.  
13f90 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 30 3b 0a  zSql[nSql] = 0;.
13fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13fb0 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74  /*.** Read input
13fc0 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70 72   from *in and pr
13fd0 6f 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a 69  ocess it.  If *i
13fe0 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74 0a  n==0 then input.
13ff0 2a 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69 76  ** is interactiv
14000 65 20 2d 20 74 68 65 20 75 73 65 72 20 69 73 20  e - the user is 
14010 74 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20 4f  typing it it.  O
14020 74 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74 0a  therwise, input.
14030 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f  ** is coming fro
14040 6d 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76 69  m a file or devi
14050 63 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69 73  ce.  A prompt is
14060 20 69 73 73 75 65 64 20 61 6e 64 20 68 69 73 74   issued and hist
14070 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64 20  ory.** is saved 
14080 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69 73  only if input is
14090 20 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20 41   interactive.  A
140a0 6e 20 69 6e 74 65 72 72 75 70 74 20 73 69 67 6e  n interrupt sign
140b0 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73 65  al will.** cause
140c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
140d0 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c   exit immediatel
140e0 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74 20  y, unless input 
140f0 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  is interactive..
14100 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
14110 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
14120 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
14130 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73   process_input(s
14140 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
14150 61 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e  ata *p, FILE *in
14160 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
14170 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
14180 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53  ql = 0;.  int nS
14190 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53  ql = 0;.  int nS
141a0 71 6c 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 63  qlPrior = 0;.  c
141b0 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
141c0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65 72  int rc;.  int er
141d0 72 43 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rCnt = 0;.  int 
141e0 6c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 69 6e  lineno = 0;.  in
141f0 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b  t startline = 0;
14200 0a 0a 20 20 77 68 69 6c 65 28 20 65 72 72 43 6e  ..  while( errCn
14210 74 3d 3d 30 20 7c 7c 20 21 62 61 69 6c 5f 6f 6e  t==0 || !bail_on
14220 5f 65 72 72 6f 72 20 7c 7c 20 28 69 6e 3d 3d 30  _error || (in==0
14230 20 26 26 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74   && stdin_is_int
14240 65 72 61 63 74 69 76 65 29 20 29 7b 0a 20 20 20  eractive) ){.   
14250 20 66 66 6c 75 73 68 28 70 2d 3e 6f 75 74 29 3b   fflush(p->out);
14260 0a 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29  .    free(zLine)
14270 3b 0a 20 20 20 20 7a 4c 69 6e 65 20 3d 20 6f 6e  ;.    zLine = on
14280 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 7a 53 71  e_input_line(zSq
14290 6c 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20  l, in);.    if( 
142a0 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zLine==0 ){.    
142b0 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 57 65 20    break;  /* We 
142c0 68 61 76 65 20 72 65 61 63 68 65 64 20 45 4f 46  have reached EOF
142d0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
142e0 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  ( seenInterrupt 
142f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 21  ){.      if( in!
14300 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
14310 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
14320 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  = 0;.    }.    l
14330 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
14340 20 70 2d 3e 65 63 68 6f 4f 6e 20 29 20 70 72 69   p->echoOn ) pri
14350 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 4c 69 6e  ntf("%s\n", zLin
14360 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 53 71  e);.    if( (zSq
14370 6c 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 30 5d 3d  l==0 || zSql[0]=
14380 3d 30 29 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74  =0) && _all_whit
14390 65 73 70 61 63 65 28 7a 4c 69 6e 65 29 20 29 20  espace(zLine) ) 
143a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
143b0 28 20 7a 4c 69 6e 65 20 26 26 20 7a 4c 69 6e 65  ( zLine && zLine
143c0 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 6e 53 71 6c  [0]=='.' && nSql
143d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
143e0 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e  = do_meta_comman
143f0 64 28 7a 4c 69 6e 65 2c 20 70 29 3b 0a 20 20 20  d(zLine, p);.   
14400 20 20 20 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a     if( rc==2 ){.
14410 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14420 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
14430 63 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  c ){.        err
14440 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Cnt++;.      }. 
14450 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
14460 20 20 20 7d 0a 20 20 20 20 69 66 28 20 5f 69 73     }.    if( _is
14470 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61  _command_termina
14480 74 6f 72 28 7a 4c 69 6e 65 29 20 26 26 20 5f 69  tor(zLine) && _i
14490 73 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 2c  s_complete(zSql,
144a0 20 6e 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20   nSql) ){.      
144b0 6d 65 6d 63 70 79 28 7a 4c 69 6e 65 2c 22 3b 22  memcpy(zLine,";"
144c0 2c 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ,2);.    }.    n
144d0 53 71 6c 50 72 69 6f 72 20 3d 20 6e 53 71 6c 3b  SqlPrior = nSql;
144e0 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
144f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
14500 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
14510 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 69 73 73 70  zLine[i] && issp
14520 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ace((unsigned ch
14530 61 72 29 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b  ar)zLine[i]); i+
14540 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 7a  +){}.      if( z
14550 4c 69 6e 65 5b 69 5d 21 3d 30 20 29 7b 0a 20 20  Line[i]!=0 ){.  
14560 20 20 20 20 20 20 6e 53 71 6c 20 3d 20 73 74 72        nSql = str
14570 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20  len30(zLine);.  
14580 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c        zSql = mal
14590 6c 6f 63 28 20 6e 53 71 6c 2b 33 20 29 3b 0a 20  loc( nSql+3 );. 
145a0 20 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 3d         if( zSql=
145b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
145c0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
145d0 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
145e0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78  ");.          ex
145f0 69 74 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  it(1);.        }
14600 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14610 7a 53 71 6c 2c 20 7a 4c 69 6e 65 2c 20 6e 53 71  zSql, zLine, nSq
14620 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 74  l+1);.        st
14630 61 72 74 6c 69 6e 65 20 3d 20 6c 69 6e 65 6e 6f  artline = lineno
14640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14650 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  lse{.      int l
14660 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c  en = strlen30(zL
14670 69 6e 65 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  ine);.      zSql
14680 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 53 71 6c   = realloc( zSql
14690 2c 20 6e 53 71 6c 20 2b 20 6c 65 6e 20 2b 20 34  , nSql + len + 4
146a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53   );.      if( zS
146b0 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ql==0 ){.       
146c0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
146d0 22 25 73 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  "%s: out of memo
146e0 72 79 21 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a  ry!\n", Argv0);.
146f0 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
14700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
14710 53 71 6c 5b 6e 53 71 6c 2b 2b 5d 20 3d 20 27 5c  Sql[nSql++] = '\
14720 6e 27 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  n';.      memcpy
14730 28 26 7a 53 71 6c 5b 6e 53 71 6c 5d 2c 20 7a 4c  (&zSql[nSql], zL
14740 69 6e 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ine, len+1);.   
14750 20 20 20 6e 53 71 6c 20 2b 3d 20 6c 65 6e 3b 0a     nSql += len;.
14760 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53      }.    if( zS
14770 71 6c 20 26 26 20 5f 63 6f 6e 74 61 69 6e 73 5f  ql && _contains_
14780 73 65 6d 69 63 6f 6c 6f 6e 28 26 7a 53 71 6c 5b  semicolon(&zSql[
14790 6e 53 71 6c 50 72 69 6f 72 5d 2c 20 6e 53 71 6c  nSqlPrior], nSql
147a0 2d 6e 53 71 6c 50 72 69 6f 72 29 0a 20 20 20 20  -nSqlPrior).    
147b0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
147c0 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
147d0 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 70  zSql) ){.      p
147e0 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->cnt = 0;.     
147f0 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20   open_db(p);.   
14800 20 20 20 42 45 47 49 4e 5f 54 49 4d 45 52 3b 0a     BEGIN_TIMER;.
14810 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14820 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
14830 53 71 6c 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 70  Sql, callback, p
14840 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
14850 20 20 20 45 4e 44 5f 54 49 4d 45 52 3b 0a 20 20     END_TIMER;.  
14860 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45      if( rc || zE
14870 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
14880 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b 31 30   char zPrefix[10
14890 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
148a0 69 6e 21 3d 30 20 7c 7c 20 21 73 74 64 69 6e 5f  in!=0 || !stdin_
148b0 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29  is_interactive )
148c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
148d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
148e0 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50  eof(zPrefix), zP
148f0 72 65 66 69 78 2c 20 0a 20 20 20 20 20 20 20 20  refix, .        
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 22 53 51 4c 20 65 72 72 6f 72 20 6e 65     "SQL error ne
14920 61 72 20 6c 69 6e 65 20 25 64 3a 22 2c 20 73 74  ar line %d:", st
14930 61 72 74 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20  artline);.      
14940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14950 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
14960 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66  ntf(sizeof(zPref
14970 69 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 53  ix), zPrefix, "S
14980 51 4c 20 65 72 72 6f 72 3a 22 29 3b 0a 20 20 20  QL error:");.   
14990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
149a0 66 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b  f( zErrMsg!=0 ){
149b0 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
149c0 66 28 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72  f("%s %s\n", zPr
149d0 65 66 69 78 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  efix, zErrMsg);.
149e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
149f0 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
14a00 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 4d  .          zErrM
14a10 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
14a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14a30 20 70 72 69 6e 74 66 28 22 25 73 20 25 73 5c 6e   printf("%s %s\n
14a40 22 2c 20 7a 50 72 65 66 69 78 2c 20 73 71 6c 69  ", zPrefix, sqli
14a50 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
14a60 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
14a70 20 20 20 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a        errCnt++;.
14a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72        }.      fr
14a90 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ee(zSql);.      
14aa0 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  zSql = 0;.      
14ab0 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nSql = 0;.    }.
14ac0 20 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 20 29    }.  if( zSql )
14ad0 7b 0a 20 20 20 20 69 66 28 20 21 5f 61 6c 6c 5f  {.    if( !_all_
14ae0 77 68 69 74 65 73 70 61 63 65 28 7a 53 71 6c 29  whitespace(zSql)
14af0 20 29 20 66 70 72 69 6e 74 66 28 73 74 64 65 72   ) fprintf(stder
14b00 72 2c 20 22 49 6e 63 6f 6d 70 6c 65 74 65 20 53  r, "Incomplete S
14b10 51 4c 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 29  QL: %s\n", zSql)
14b20 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29  ;.    free(zSql)
14b30 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 4c 69  ;.  }.  free(zLi
14b40 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 72  ne);.  return er
14b50 72 43 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rCnt;.}../*.** R
14b60 65 74 75 72 6e 20 61 20 70 61 74 68 6e 61 6d 65  eturn a pathname
14b70 20 77 68 69 63 68 20 69 73 20 74 68 65 20 75 73   which is the us
14b80 65 72 27 73 20 68 6f 6d 65 20 64 69 72 65 63 74  er's home direct
14b90 6f 72 79 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74  ory.  A.** 0 ret
14ba0 75 72 6e 20 69 6e 64 69 63 61 74 65 73 20 61 6e  urn indicates an
14bb0 20 65 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b   error of some k
14bc0 69 6e 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ind.  Space to h
14bd0 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  old the.** resul
14be0 74 69 6e 67 20 73 74 72 69 6e 67 20 69 73 20 6f  ting string is o
14bf0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
14c00 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
14c10 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
14c20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 65 20  should free the 
14c30 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
14c40 63 20 63 68 61 72 20 2a 66 69 6e 64 5f 68 6f 6d  c char *find_hom
14c50 65 5f 64 69 72 28 76 6f 69 64 29 7b 0a 20 20 63  e_dir(void){.  c
14c60 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20  har *home_dir = 
14c70 4e 55 4c 4c 3b 0a 0a 23 69 66 20 21 64 65 66 69  NULL;..#if !defi
14c80 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
14c90 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26  defined(WIN32) &
14ca0 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32  & !defined(__OS2
14cb0 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
14cc0 5f 57 49 4e 33 32 5f 57 43 45 29 20 26 26 20 21  _WIN32_WCE) && !
14cd0 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
14ce0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52   && !defined(_WR
14cf0 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 73 74 72 75  S_KERNEL).  stru
14d00 63 74 20 70 61 73 73 77 64 20 2a 70 77 65 6e 74  ct passwd *pwent
14d10 3b 0a 20 20 75 69 64 5f 74 20 75 69 64 20 3d 20  ;.  uid_t uid = 
14d20 67 65 74 75 69 64 28 29 3b 0a 20 20 69 66 28 20  getuid();.  if( 
14d30 28 70 77 65 6e 74 3d 67 65 74 70 77 75 69 64 28  (pwent=getpwuid(
14d40 75 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  uid)) != NULL) {
14d50 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20  .    home_dir = 
14d60 70 77 65 6e 74 2d 3e 70 77 5f 64 69 72 3b 0a 20  pwent->pw_dir;. 
14d70 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64   }.#endif..#if d
14d80 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
14d90 45 29 0a 20 20 2f 2a 20 57 69 6e 64 6f 77 73 20  E).  /* Windows 
14da0 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69  CE (arm-wince-mi
14db0 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65  ngw32ce-gcc) doe
14dc0 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 67 65  s not provide ge
14dd0 74 65 6e 76 28 29 0a 20 20 20 2a 2f 0a 20 20 68  tenv().   */.  h
14de0 6f 6d 65 5f 64 69 72 20 3d 20 73 74 72 64 75 70  ome_dir = strdup
14df0 28 22 2f 22 29 3b 0a 23 65 6c 73 65 0a 0a 23 69  ("/");.#else..#i
14e00 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
14e10 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
14e20 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  32) || defined(_
14e30 5f 4f 53 32 5f 5f 29 0a 20 20 69 66 20 28 21 68  _OS2__).  if (!h
14e40 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68  ome_dir) {.    h
14e50 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76  ome_dir = getenv
14e60 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b  ("USERPROFILE");
14e70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
14e80 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a  f (!home_dir) {.
14e90 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67      home_dir = g
14ea0 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20  etenv("HOME");. 
14eb0 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
14ec0 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
14ed0 65 64 28 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  ed(WIN32) || def
14ee0 69 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a 20 20  ined(__OS2__).  
14ef0 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b  if (!home_dir) {
14f00 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 72 69 76  .    char *zDriv
14f10 65 2c 20 2a 7a 50 61 74 68 3b 0a 20 20 20 20 69  e, *zPath;.    i
14f20 6e 74 20 6e 3b 0a 20 20 20 20 7a 44 72 69 76 65  nt n;.    zDrive
14f30 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 44   = getenv("HOMED
14f40 52 49 56 45 22 29 3b 0a 20 20 20 20 7a 50 61 74  RIVE");.    zPat
14f50 68 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45  h = getenv("HOME
14f60 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20  PATH");.    if( 
14f70 7a 44 72 69 76 65 20 26 26 20 7a 50 61 74 68 20  zDrive && zPath 
14f80 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72  ){.      n = str
14f90 6c 65 6e 33 30 28 7a 44 72 69 76 65 29 20 2b 20  len30(zDrive) + 
14fa0 73 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20  strlen30(zPath) 
14fb0 2b 20 31 3b 0a 20 20 20 20 20 20 68 6f 6d 65 5f  + 1;.      home_
14fc0 64 69 72 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20  dir = malloc( n 
14fd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 6d  );.      if( hom
14fe0 65 5f 64 69 72 3d 3d 30 20 29 20 72 65 74 75 72  e_dir==0 ) retur
14ff0 6e 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n 0;.      sqlit
15000 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 68  e3_snprintf(n, h
15010 6f 6d 65 5f 64 69 72 2c 20 22 25 73 25 73 22 2c  ome_dir, "%s%s",
15020 20 7a 44 72 69 76 65 2c 20 7a 50 61 74 68 29 3b   zDrive, zPath);
15030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 6f  .      return ho
15040 6d 65 5f 64 69 72 3b 0a 20 20 20 20 7d 0a 20 20  me_dir;.    }.  
15050 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 22 63 3a    home_dir = "c:
15060 5c 5c 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  \\";.  }.#endif.
15070 0a 23 65 6e 64 69 66 20 2f 2a 20 21 5f 57 49 4e  .#endif /* !_WIN
15080 33 32 5f 57 43 45 20 2a 2f 0a 0a 20 20 69 66 28  32_WCE */..  if(
15090 20 68 6f 6d 65 5f 64 69 72 20 29 7b 0a 20 20 20   home_dir ){.   
150a0 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
150b0 30 28 68 6f 6d 65 5f 64 69 72 29 20 2b 20 31 3b  0(home_dir) + 1;
150c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 6d  .    char *z = m
150d0 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20  alloc( n );.    
150e0 69 66 28 20 7a 20 29 20 6d 65 6d 63 70 79 28 7a  if( z ) memcpy(z
150f0 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 6e 29 3b 0a  , home_dir, n);.
15100 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 7a      home_dir = z
15110 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
15120 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a 2f 2a 0a  home_dir;.}../*.
15130 2a 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72  ** Read input fr
15140 6f 6d 20 74 68 65 20 66 69 6c 65 20 67 69 76 65  om the file give
15150 6e 20 62 79 20 73 71 6c 69 74 65 72 63 5f 6f 76  n by sqliterc_ov
15160 65 72 72 69 64 65 2e 20 20 4f 72 20 69 66 20 74  erride.  Or if t
15170 68 61 74 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  hat.** parameter
15180 20 69 73 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 69   is NULL, take i
15190 6e 70 75 74 20 66 72 6f 6d 20 7e 2f 2e 73 71 6c  nput from ~/.sql
151a0 69 74 65 72 63 0a 2a 2f 0a 73 74 61 74 69 63 20  iterc.*/.static 
151b0 76 6f 69 64 20 70 72 6f 63 65 73 73 5f 73 71 6c  void process_sql
151c0 69 74 65 72 63 28 0a 20 20 73 74 72 75 63 74 20  iterc(.  struct 
151d0 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70  callback_data *p
151e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66  ,        /* Conf
151f0 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61 20 2a  iguration data *
15200 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15210 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64  sqliterc_overrid
15220 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  e   /* Name of c
15230 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e 55 4c 4c  onfig file. NULL
15240 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
15250 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 68 6f  */.){.  char *ho
15260 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 20  me_dir = NULL;. 
15270 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
15280 69 74 65 72 63 20 3d 20 73 71 6c 69 74 65 72 63  iterc = sqliterc
15290 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20 63 68 61  _override;.  cha
152a0 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 46  r *zBuf = 0;.  F
152b0 49 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a  ILE *in = NULL;.
152c0 20 20 69 6e 74 20 6e 42 75 66 3b 0a 0a 20 20 69    int nBuf;..  i
152d0 66 20 28 73 71 6c 69 74 65 72 63 20 3d 3d 20 4e  f (sqliterc == N
152e0 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f  ULL) {.    home_
152f0 64 69 72 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f  dir = find_home_
15300 64 69 72 28 29 3b 0a 20 20 20 20 69 66 28 20 68  dir();.    if( h
15310 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 7b 0a 23 69  ome_dir==0 ){.#i
15320 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50  f !defined(__RTP
15330 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
15340 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 20  _WRS_KERNEL).   
15350 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
15360 72 2c 22 25 73 3a 20 63 61 6e 6e 6f 74 20 6c 6f  r,"%s: cannot lo
15370 63 61 74 65 20 79 6f 75 72 20 68 6f 6d 65 20 64  cate your home d
15380 69 72 65 63 74 6f 72 79 21 5c 6e 22 2c 20 41 72  irectory!\n", Ar
15390 67 76 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  gv0);.#endif.   
153a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
153b0 0a 20 20 20 20 6e 42 75 66 20 3d 20 73 74 72 6c  .    nBuf = strl
153c0 65 6e 33 30 28 68 6f 6d 65 5f 64 69 72 29 20 2b  en30(home_dir) +
153d0 20 31 36 3b 0a 20 20 20 20 7a 42 75 66 20 3d 20   16;.    zBuf = 
153e0 6d 61 6c 6c 6f 63 28 20 6e 42 75 66 20 29 3b 0a  malloc( nBuf );.
153f0 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20      if( zBuf==0 
15400 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
15410 28 73 74 64 65 72 72 2c 22 25 73 3a 20 6f 75 74  (stderr,"%s: out
15420 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 2c 20   of memory!\n", 
15430 41 72 67 76 30 29 3b 0a 20 20 20 20 20 20 65 78  Argv0);.      ex
15440 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
15450 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
15460 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 22 25 73  f(nBuf, zBuf,"%s
15470 2f 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65  /.sqliterc",home
15480 5f 64 69 72 29 3b 0a 20 20 20 20 66 72 65 65 28  _dir);.    free(
15490 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20 73  home_dir);.    s
154a0 71 6c 69 74 65 72 63 20 3d 20 28 63 6f 6e 73 74  qliterc = (const
154b0 20 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20 7d   char*)zBuf;.  }
154c0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71  .  in = fopen(sq
154d0 6c 69 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20  literc,"rb");.  
154e0 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66  if( in ){.    if
154f0 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72  ( stdin_is_inter
15500 61 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  active ){.      
15510 70 72 69 6e 74 66 28 22 2d 2d 20 4c 6f 61 64 69  printf("-- Loadi
15520 6e 67 20 72 65 73 6f 75 72 63 65 73 20 66 72 6f  ng resources fro
15530 6d 20 25 73 5c 6e 22 2c 73 71 6c 69 74 65 72 63  m %s\n",sqliterc
15540 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 6f  );.    }.    pro
15550 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 69 6e 29  cess_input(p,in)
15560 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
15570 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 42 75  ;.  }.  free(zBu
15580 66 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  f);.  return;.}.
15590 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 61 76 61 69  ./*.** Show avai
155a0 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  lable command li
155b0 6e 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74  ne options.*/.st
155c0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
155d0 7a 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20 0a 20 20  zOptions[] = .  
155e0 22 20 20 20 2d 69 6e 69 74 20 66 69 6c 65 6e 61  "   -init filena
155f0 6d 65 20 20 20 20 20 20 20 72 65 61 64 2f 70 72  me       read/pr
15600 6f 63 65 73 73 20 6e 61 6d 65 64 20 66 69 6c 65  ocess named file
15610 5c 6e 22 0a 20 20 22 20 20 20 2d 65 63 68 6f 20  \n".  "   -echo 
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15630 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65  rint commands be
15640 66 6f 72 65 20 65 78 65 63 75 74 69 6f 6e 5c 6e  fore execution\n
15650 22 0a 20 20 22 20 20 20 2d 5b 6e 6f 5d 68 65 61  ".  "   -[no]hea
15660 64 65 72 20 20 20 20 20 20 20 20 20 20 74 75 72  der          tur
15670 6e 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20  n headers on or 
15680 6f 66 66 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61  off\n".  "   -ba
15690 69 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  il              
156a0 20 20 73 74 6f 70 20 61 66 74 65 72 20 68 69 74    stop after hit
156b0 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22  ting an error\n"
156c0 0a 20 20 22 20 20 20 2d 69 6e 74 65 72 61 63 74  .  "   -interact
156d0 69 76 65 20 20 20 20 20 20 20 20 20 66 6f 72 63  ive         forc
156e0 65 20 69 6e 74 65 72 61 63 74 69 76 65 20 49 2f  e interactive I/
156f0 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 74 63  O\n".  "   -batc
15700 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
15710 66 6f 72 63 65 20 62 61 74 63 68 20 49 2f 4f 5c  force batch I/O\
15720 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e  n".  "   -column
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
15740 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
15750 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22   'column'\n".  "
15760 20 20 20 2d 63 73 76 20 20 20 20 20 20 20 20 20     -csv         
15770 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70          set outp
15780 75 74 20 6d 6f 64 65 20 74 6f 20 27 63 73 76 27  ut mode to 'csv'
15790 5c 6e 22 0a 20 20 22 20 20 20 2d 68 74 6d 6c 20  \n".  "   -html 
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
157b0 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74  et output mode t
157c0 6f 20 48 54 4d 4c 5c 6e 22 0a 20 20 22 20 20 20  o HTML\n".  "   
157d0 2d 6c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  -line           
157e0 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20       set output 
157f0 6d 6f 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c 6e  mode to 'line'\n
15800 22 0a 20 20 22 20 20 20 2d 6c 69 73 74 20 20 20  ".  "   -list   
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
15820 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
15830 27 6c 69 73 74 27 5c 6e 22 0a 20 20 22 20 20 20  'list'\n".  "   
15840 2d 73 65 70 61 72 61 74 6f 72 20 27 78 27 20 20  -separator 'x'  
15850 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20       set output 
15860 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72 20  field separator 
15870 28 7c 29 5c 6e 22 0a 20 20 22 20 20 20 2d 6e 75  (|)\n".  "   -nu
15880 6c 6c 76 61 6c 75 65 20 27 74 65 78 74 27 20 20  llvalue 'text'  
15890 20 20 73 65 74 20 74 65 78 74 20 73 74 72 69 6e    set text strin
158a0 67 20 66 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65  g for NULL value
158b0 73 5c 6e 22 0a 20 20 22 20 20 20 2d 76 65 72 73  s\n".  "   -vers
158c0 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
158d0 73 68 6f 77 20 53 51 4c 69 74 65 20 76 65 72 73  show SQLite vers
158e0 69 6f 6e 5c 6e 22 0a 3b 0a 73 74 61 74 69 63 20  ion\n".;.static 
158f0 76 6f 69 64 20 75 73 61 67 65 28 69 6e 74 20 73  void usage(int s
15900 68 6f 77 44 65 74 61 69 6c 29 7b 0a 20 20 66 70  howDetail){.  fp
15910 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
15920 20 20 20 20 22 55 73 61 67 65 3a 20 25 73 20 5b      "Usage: %s [
15930 4f 50 54 49 4f 4e 53 5d 20 46 49 4c 45 4e 41 4d  OPTIONS] FILENAM
15940 45 20 5b 53 51 4c 5d 5c 6e 22 20 20 0a 20 20 20  E [SQL]\n"  .   
15950 20 20 20 22 46 49 4c 45 4e 41 4d 45 20 69 73 20     "FILENAME is 
15960 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 53  the name of an S
15970 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
15980 41 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  A new database i
15990 73 20 63 72 65 61 74 65 64 5c 6e 22 0a 20 20 20  s created\n".   
159a0 20 20 20 22 69 66 20 74 68 65 20 66 69 6c 65 20     "if the file 
159b0 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 69 6f 75  does not previou
159c0 73 6c 79 20 65 78 69 73 74 2e 5c 6e 22 2c 20 41  sly exist.\n", A
159d0 72 67 76 30 29 3b 0a 20 20 69 66 28 20 73 68 6f  rgv0);.  if( sho
159e0 77 44 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 66  wDetail ){.    f
159f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
15a00 4f 50 54 49 4f 4e 53 20 69 6e 63 6c 75 64 65 3a  OPTIONS include:
15a10 5c 6e 25 73 22 2c 20 7a 4f 70 74 69 6f 6e 73 29  \n%s", zOptions)
15a20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
15a30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
15a40 55 73 65 20 74 68 65 20 2d 68 65 6c 70 20 6f 70  Use the -help op
15a50 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
15a60 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c  nal information\
15a70 6e 22 29 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28  n");.  }.  exit(
15a80 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  1);.}../*.** Ini
15a90 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74  tialize the stat
15aa0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
15ab0 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20   data.*/.static 
15ac0 76 6f 69 64 20 6d 61 69 6e 5f 69 6e 69 74 28 73  void main_init(s
15ad0 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64  truct callback_d
15ae0 61 74 61 20 2a 64 61 74 61 29 20 7b 0a 20 20 6d  ata *data) {.  m
15af0 65 6d 73 65 74 28 64 61 74 61 2c 20 30 2c 20 73  emset(data, 0, s
15b00 69 7a 65 6f 66 28 2a 64 61 74 61 29 29 3b 0a 20  izeof(*data));. 
15b10 20 64 61 74 61 2d 3e 6d 6f 64 65 20 3d 20 4d 4f   data->mode = MO
15b20 44 45 5f 4c 69 73 74 3b 0a 20 20 6d 65 6d 63 70  DE_List;.  memcp
15b30 79 28 64 61 74 61 2d 3e 73 65 70 61 72 61 74 6f  y(data->separato
15b40 72 2c 22 7c 22 2c 20 32 29 3b 0a 20 20 64 61 74  r,"|", 2);.  dat
15b50 61 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  a->showHeader = 
15b60 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  0;.  sqlite3_snp
15b70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 6d 61 69  rintf(sizeof(mai
15b80 6e 50 72 6f 6d 70 74 29 2c 20 6d 61 69 6e 50 72  nPrompt), mainPr
15b90 6f 6d 70 74 2c 22 73 71 6c 69 74 65 3e 20 22 29  ompt,"sqlite> ")
15ba0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
15bb0 69 6e 74 66 28 73 69 7a 65 6f 66 28 63 6f 6e 74  intf(sizeof(cont
15bc0 69 6e 75 65 50 72 6f 6d 70 74 29 2c 20 63 6f 6e  inuePrompt), con
15bd0 74 69 6e 75 65 50 72 6f 6d 70 74 2c 22 20 20 20  tinuePrompt,"   
15be0 2e 2e 2e 3e 20 22 29 3b 0a 7d 0a 0a 69 6e 74 20  ...> ");.}..int 
15bf0 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
15c00 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  har **argv){.  c
15c10 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
15c20 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62  ;.  struct callb
15c30 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20  ack_data data;. 
15c40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
15c50 69 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 68  itFile = 0;.  ch
15c60 61 72 20 2a 7a 46 69 72 73 74 43 6d 64 20 3d 20  ar *zFirstCmd = 
15c70 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
15c80 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 41 72 67  t rc = 0;..  Arg
15c90 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
15ca0 6d 61 69 6e 5f 69 6e 69 74 28 26 64 61 74 61 29  main_init(&data)
15cb0 3b 0a 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  ;.  stdin_is_int
15cc0 65 72 61 63 74 69 76 65 20 3d 20 69 73 61 74 74  eractive = isatt
15cd0 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  y(0);..  /* Make
15ce0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
15cf0 76 61 6c 69 64 20 73 69 67 6e 61 6c 20 68 61 6e  valid signal han
15d00 64 6c 65 72 20 65 61 72 6c 79 2c 20 62 65 66 6f  dler early, befo
15d10 72 65 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  re anything.  **
15d20 20 65 6c 73 65 20 69 73 20 64 6f 6e 65 2e 0a 20   else is done.. 
15d30 20 2a 2f 0a 23 69 66 64 65 66 20 53 49 47 49 4e   */.#ifdef SIGIN
15d40 54 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 49 4e  T.  signal(SIGIN
15d50 54 2c 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e  T, interrupt_han
15d60 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  dler);.#endif.. 
15d70 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 69 74 69 61   /* Do an initia
15d80 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74  l pass through t
15d90 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  he command-line 
15da0 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 6f 63 61  argument to loca
15db0 74 65 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65  te.  ** the name
15dc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15dd0 20 66 69 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20   file, the name 
15de0 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
15df0 61 74 69 6f 6e 20 66 69 6c 65 2c 0a 20 20 2a 2a  ation file,.  **
15e00 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 63   and the first c
15e10 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 75 74  ommand to execut
15e20 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
15e30 31 3b 20 69 3c 61 72 67 63 2d 31 3b 20 69 2b 2b  1; i<argc-1; i++
15e40 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  ){.    char *z;.
15e50 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b      if( argv[i][
15e60 30 5d 21 3d 27 2d 27 20 29 20 62 72 65 61 6b 3b  0]!='-' ) break;
15e70 0a 20 20 20 20 7a 20 3d 20 61 72 67 76 5b 69 5d  .    z = argv[i]
15e80 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
15e90 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27  '-' && z[1]=='-'
15ea0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
15eb0 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
15ec0 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30 20  -separator")==0 
15ed0 7c 7c 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  || strcmp(argv[i
15ee0 5d 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d  ],"-nullvalue")=
15ef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  =0 ){.      i++;
15f00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
15f10 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
15f20 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  init")==0 ){.   
15f30 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 49     i++;.      zI
15f40 6e 69 74 46 69 6c 65 20 3d 20 61 72 67 76 5b 69  nitFile = argv[i
15f50 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  ];.    }.  }.  i
15f60 66 28 20 69 3c 61 72 67 63 20 29 7b 0a 23 69 66  f( i<argc ){.#if
15f70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15f80 4f 53 5f 4f 53 32 29 20 26 26 20 53 51 4c 49 54  OS_OS2) && SQLIT
15f90 45 5f 4f 53 5f 4f 53 32 0a 20 20 20 20 64 61 74  E_OS_OS2.    dat
15fa0 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  a.zDbFilename = 
15fb0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 63 6f  (const char *)co
15fc0 6e 76 65 72 74 43 70 50 61 74 68 54 6f 55 74 66  nvertCpPathToUtf
15fd0 38 28 20 61 72 67 76 5b 69 2b 2b 5d 20 29 3b 0a  8( argv[i++] );.
15fe0 23 65 6c 73 65 0a 20 20 20 20 64 61 74 61 2e 7a  #else.    data.z
15ff0 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 61 72 67  DbFilename = arg
16000 76 5b 69 2b 2b 5d 3b 0a 23 65 6e 64 69 66 0a 20  v[i++];.#endif. 
16010 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
16020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
16030 52 59 44 42 0a 20 20 20 20 64 61 74 61 2e 7a 44  RYDB.    data.zD
16040 62 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65  bFilename = ":me
16050 6d 6f 72 79 3a 22 3b 0a 23 65 6c 73 65 0a 20 20  mory:";.#else.  
16060 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61    data.zDbFilena
16070 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  me = 0;.#endif. 
16080 20 7d 0a 20 20 69 66 28 20 69 3c 61 72 67 63 20   }.  if( i<argc 
16090 29 7b 0a 20 20 20 20 7a 46 69 72 73 74 43 6d 64  ){.    zFirstCmd
160a0 20 3d 20 61 72 67 76 5b 69 2b 2b 5d 3b 0a 20 20   = argv[i++];.  
160b0 7d 0a 20 20 64 61 74 61 2e 6f 75 74 20 3d 20 73  }.  data.out = s
160c0 74 64 6f 75 74 3b 0a 0a 23 69 66 64 65 66 20 53  tdout;..#ifdef S
160d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
160e0 59 44 42 0a 20 20 69 66 28 20 64 61 74 61 2e 7a  YDB.  if( data.z
160f0 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  DbFilename==0 ){
16100 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
16110 65 72 72 2c 22 25 73 3a 20 6e 6f 20 64 61 74 61  err,"%s: no data
16120 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 73 70  base filename sp
16130 65 63 69 66 69 65 64 5c 6e 22 2c 20 61 72 67 76  ecified\n", argv
16140 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31  [0]);.    exit(1
16150 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
16160 20 2f 2a 20 47 6f 20 61 68 65 61 64 20 61 6e 64   /* Go ahead and
16170 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
16180 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 61 6c  se file if it al
16190 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 49  ready exists.  I
161a0 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  f the.  ** file 
161b0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
161c0 64 65 6c 61 79 20 6f 70 65 6e 69 6e 67 20 69 74  delay opening it
161d0 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  .  This prevents
161e0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 0a   empty database.
161f0 20 20 2a 2a 20 66 69 6c 65 73 20 66 72 6f 6d 20    ** files from 
16200 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 69 66  being created if
16210 20 61 20 75 73 65 72 20 6d 69 73 74 79 70 65 73   a user mistypes
16220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
16230 6d 65 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a  me argument.  **
16240 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 20 63   to the sqlite c
16250 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 74 6f 6f 6c  ommand-line tool
16260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 63 63  ..  */.  if( acc
16270 65 73 73 28 64 61 74 61 2e 7a 44 62 46 69 6c 65  ess(data.zDbFile
16280 6e 61 6d 65 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  name, 0)==0 ){. 
16290 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61     open_db(&data
162a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f  );.  }..  /* Pro
162b0 63 65 73 73 20 74 68 65 20 69 6e 69 74 69 61 6c  cess the initial
162c0 69 7a 61 74 69 6f 6e 20 66 69 6c 65 20 69 66 20  ization file if 
162d0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
162e0 66 20 6e 6f 20 2d 69 6e 69 74 20 6f 70 74 69 6f  f no -init optio
162f0 6e 0a 20 20 2a 2a 20 69 73 20 67 69 76 65 6e 20  n.  ** is given 
16300 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
16310 69 6e 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61 20  ine, look for a 
16320 66 69 6c 65 20 6e 61 6d 65 64 20 7e 2f 2e 73 71  file named ~/.sq
16330 6c 69 74 65 72 63 20 61 6e 64 0a 20 20 2a 2a 20  literc and.  ** 
16340 74 72 79 20 74 6f 20 70 72 6f 63 65 73 73 20 69  try to process i
16350 74 2e 0a 20 20 2a 2f 0a 20 20 70 72 6f 63 65 73  t..  */.  proces
16360 73 5f 73 71 6c 69 74 65 72 63 28 26 64 61 74 61  s_sqliterc(&data
16370 2c 7a 49 6e 69 74 46 69 6c 65 29 3b 0a 0a 20 20  ,zInitFile);..  
16380 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64  /* Make a second
16390 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68   pass through th
163a0 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61  e command-line a
163b0 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 65 74 0a  rgument and set.
163c0 20 20 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20 20 54    ** options.  T
163d0 68 69 73 20 73 65 63 6f 6e 64 20 70 61 73 73 20  his second pass 
163e0 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
163f0 20 61 66 74 65 72 20 74 68 65 20 69 6e 69 74 69   after the initi
16400 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 66  alization.  ** f
16410 69 6c 65 20 69 73 20 70 72 6f 63 65 73 73 65 64  ile is processed
16420 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6d   so that the com
16430 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65  mand-line argume
16440 6e 74 73 20 77 69 6c 6c 20 6f 76 65 72 72 69 64  nts will overrid
16450 65 0a 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20  e.  ** settings 
16460 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
16470 61 74 69 6f 6e 20 66 69 6c 65 2e 0a 20 20 2a 2f  ation file..  */
16480 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
16490 67 63 20 26 26 20 61 72 67 76 5b 69 5d 5b 30 5d  gc && argv[i][0]
164a0 3d 3d 27 2d 27 3b 20 69 2b 2b 29 7b 0a 20 20 20  =='-'; i++){.   
164b0 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b   char *z = argv[
164c0 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d  i];.    if( z[1]
164d0 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  =='-' ){ z++; }.
164e0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
164f0 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a  ,"-init")==0 ){.
16500 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
16510 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
16520 7a 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29 7b  z,"-html")==0 ){
16530 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
16540 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
16550 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
16560 6d 70 28 7a 2c 22 2d 6c 69 73 74 22 29 3d 3d 30  mp(z,"-list")==0
16570 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d   ){.      data.m
16580 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
16590 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
165a0 74 72 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22 29  trcmp(z,"-line")
165b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
165c0 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  a.mode = MODE_Li
165d0 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ne;.    }else if
165e0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f 6c  ( strcmp(z,"-col
165f0 75 6d 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  umn")==0 ){.    
16600 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f    data.mode = MO
16610 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  DE_Column;.    }
16620 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
16630 7a 2c 22 2d 63 73 76 22 29 3d 3d 30 20 29 7b 0a  z,"-csv")==0 ){.
16640 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
16650 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20  = MODE_Csv;.    
16660 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2e 73 65    memcpy(data.se
16670 70 61 72 61 74 6f 72 2c 22 2c 22 2c 32 29 3b 0a  parator,",",2);.
16680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
16690 72 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61 74  rcmp(z,"-separat
166a0 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
166b0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69   i++;.      sqli
166c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
166d0 65 6f 66 28 64 61 74 61 2e 73 65 70 61 72 61 74  eof(data.separat
166e0 6f 72 29 2c 20 64 61 74 61 2e 73 65 70 61 72 61  or), data.separa
166f0 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
16700 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a              "%.*
16710 73 22 2c 28 69 6e 74 29 73 69 7a 65 6f 66 28 64  s",(int)sizeof(d
16720 61 74 61 2e 73 65 70 61 72 61 74 6f 72 29 2d 31  ata.separator)-1
16730 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  ,argv[i]);.    }
16740 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
16750 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d  z,"-nullvalue")=
16760 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  =0 ){.      i++;
16770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
16780 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64  nprintf(sizeof(d
16790 61 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 29 2c 20  ata.nullvalue), 
167a0 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 2c 0a  data.nullvalue,.
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 28 69         "%.*s",(i
167d0 6e 74 29 73 69 7a 65 6f 66 28 64 61 74 61 2e 6e  nt)sizeof(data.n
167e0 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 61 72 67 76  ullvalue)-1,argv
167f0 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
16800 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
16810 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  eader")==0 ){.  
16820 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
16830 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  der = 1;.    }el
16840 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
16850 22 2d 6e 6f 68 65 61 64 65 72 22 29 3d 3d 30 20  "-noheader")==0 
16860 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73 68  ){.      data.sh
16870 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
16880 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
16890 6d 70 28 7a 2c 22 2d 65 63 68 6f 22 29 3d 3d 30  mp(z,"-echo")==0
168a0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 65   ){.      data.e
168b0 63 68 6f 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  choOn = 1;.    }
168c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
168d0 7a 2c 22 2d 62 61 69 6c 22 29 3d 3d 30 20 29 7b  z,"-bail")==0 ){
168e0 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65  .      bail_on_e
168f0 72 72 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65  rror = 1;.    }e
16900 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16910 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20  ,"-version")==0 
16920 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
16930 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
16940 6c 69 62 76 65 72 73 69 6f 6e 28 29 29 3b 0a 20  libversion());. 
16950 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
16960 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
16970 63 6d 70 28 7a 2c 22 2d 69 6e 74 65 72 61 63 74  cmp(z,"-interact
16980 69 76 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ive")==0 ){.    
16990 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72    stdin_is_inter
169a0 61 63 74 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  active = 1;.    
169b0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
169c0 28 7a 2c 22 2d 62 61 74 63 68 22 29 3d 3d 30 20  (z,"-batch")==0 
169d0 29 7b 0a 20 20 20 20 20 20 73 74 64 69 6e 5f 69  ){.      stdin_i
169e0 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
169f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
16a00 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 6c 70   strcmp(z,"-help
16a10 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  ")==0 || strcmp(
16a20 7a 2c 20 22 2d 2d 68 65 6c 70 22 29 3d 3d 30 20  z, "--help")==0 
16a30 29 7b 0a 20 20 20 20 20 20 75 73 61 67 65 28 31  ){.      usage(1
16a40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16a50 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
16a60 72 72 2c 22 25 73 3a 20 75 6e 6b 6e 6f 77 6e 20  rr,"%s: unknown 
16a70 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 41  option: %s\n", A
16a80 72 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20 20 20  rgv0, z);.      
16a90 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
16aa0 55 73 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20  Use -help for a 
16ab0 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e  list of options.
16ac0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
16ad0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
16ae0 0a 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64  .  if( zFirstCmd
16af0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20 6a   ){.    /* Run j
16b00 75 73 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  ust the command 
16b10 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65  that follows the
16b20 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 20   database name. 
16b30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 46     */.    if( zF
16b40 69 72 73 74 43 6d 64 5b 30 5d 3d 3d 27 2e 27 20  irstCmd[0]=='.' 
16b50 29 7b 0a 20 20 20 20 20 20 64 6f 5f 6d 65 74 61  ){.      do_meta
16b60 5f 63 6f 6d 6d 61 6e 64 28 7a 46 69 72 73 74 43  _command(zFirstC
16b70 6d 64 2c 20 26 64 61 74 61 29 3b 0a 20 20 20 20  md, &data);.    
16b80 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d    exit(0);.    }
16b90 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
16ba0 72 63 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64  rc;.      open_d
16bb0 62 28 26 64 61 74 61 29 3b 0a 20 20 20 20 20 20  b(&data);.      
16bc0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
16bd0 63 28 64 61 74 61 2e 64 62 2c 20 7a 46 69 72 73  c(data.db, zFirs
16be0 74 43 6d 64 2c 20 63 61 6c 6c 62 61 63 6b 2c 20  tCmd, callback, 
16bf0 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
16c00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16c10 30 20 26 26 20 7a 45 72 72 4d 73 67 21 3d 30 20  0 && zErrMsg!=0 
16c20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
16c30 74 66 28 73 74 64 65 72 72 2c 22 53 51 4c 20 65  tf(stderr,"SQL e
16c40 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
16c50 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 65  rMsg);.        e
16c60 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
16c70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
16c80 20 20 20 2f 2a 20 52 75 6e 20 63 6f 6d 6d 61 6e     /* Run comman
16c90 64 73 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d  ds received from
16ca0 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 0a   standard input.
16cb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
16cc0 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
16cd0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ive ){.      cha
16ce0 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20 20 20 20  r *zHome;.      
16cf0 63 68 61 72 20 2a 7a 48 69 73 74 6f 72 79 20 3d  char *zHistory =
16d00 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48   0;.      int nH
16d10 69 73 74 6f 72 79 3b 0a 20 20 20 20 20 20 70 72  istory;.      pr
16d20 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53  intf(.        "S
16d30 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 25 73  QLite version %s
16d40 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 45 6e 74  \n".        "Ent
16d50 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72  er \".help\" for
16d60 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 5c 6e 22   instructions\n"
16d70 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65 72 20  .        "Enter 
16d80 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74  SQL statements t
16d90 65 72 6d 69 6e 61 74 65 64 20 77 69 74 68 20 61  erminated with a
16da0 20 5c 22 3b 5c 22 5c 6e 22 2c 0a 20 20 20 20 20   \";\"\n",.     
16db0 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65     sqlite3_libve
16dc0 72 73 69 6f 6e 28 29 0a 20 20 20 20 20 20 29 3b  rsion().      );
16dd0 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66  .      zHome = f
16de0 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a  ind_home_dir();.
16df0 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 20        if( zHome 
16e00 29 7b 0a 20 20 20 20 20 20 20 20 6e 48 69 73 74  ){.        nHist
16e10 6f 72 79 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ory = strlen30(z
16e20 48 6f 6d 65 29 20 2b 20 32 30 3b 0a 20 20 20 20  Home) + 20;.    
16e30 20 20 20 20 69 66 28 20 28 7a 48 69 73 74 6f 72      if( (zHistor
16e40 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69 73 74  y = malloc(nHist
16e50 6f 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ory))!=0 ){.    
16e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
16e70 70 72 69 6e 74 66 28 6e 48 69 73 74 6f 72 79 2c  printf(nHistory,
16e80 20 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f 2e 73   zHistory,"%s/.s
16e90 71 6c 69 74 65 5f 68 69 73 74 6f 72 79 22 2c 20  qlite_history", 
16ea0 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zHome);.        
16eb0 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 64 65  }.      }.#if de
16ec0 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c  fined(HAVE_READL
16ed0 49 4e 45 29 20 26 26 20 48 41 56 45 5f 52 45 41  INE) && HAVE_REA
16ee0 44 4c 49 4e 45 3d 3d 31 0a 20 20 20 20 20 20 69  DLINE==1.      i
16ef0 66 28 20 7a 48 69 73 74 6f 72 79 20 29 20 72 65  f( zHistory ) re
16f00 61 64 5f 68 69 73 74 6f 72 79 28 7a 48 69 73 74  ad_history(zHist
16f10 6f 72 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ory);.#endif.   
16f20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f     rc = process_
16f30 69 6e 70 75 74 28 26 64 61 74 61 2c 20 30 29 3b  input(&data, 0);
16f40 0a 20 20 20 20 20 20 69 66 28 20 7a 48 69 73 74  .      if( zHist
16f50 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ory ){.        s
16f60 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 31 30  tifle_history(10
16f70 30 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  0);.        writ
16f80 65 5f 68 69 73 74 6f 72 79 28 7a 48 69 73 74 6f  e_history(zHisto
16f90 72 79 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ry);.        fre
16fa0 65 28 7a 48 69 73 74 6f 72 79 29 3b 0a 20 20 20  e(zHistory);.   
16fb0 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28     }.      free(
16fc0 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zHome);.    }els
16fd0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  e{.      rc = pr
16fe0 6f 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74  ocess_input(&dat
16ff0 61 2c 20 73 74 64 69 6e 29 3b 0a 20 20 20 20 7d  a, stdin);.    }
17000 0a 20 20 7d 0a 20 20 73 65 74 5f 74 61 62 6c 65  .  }.  set_table
17010 5f 6e 61 6d 65 28 26 64 61 74 61 2c 20 30 29 3b  _name(&data, 0);
17020 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
17030 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6c 6f   if( sqlite3_clo
17040 73 65 28 64 62 29 21 3d 53 51 4c 49 54 45 5f 4f  se(db)!=SQLITE_O
17050 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  K ){.      fprin
17060 74 66 28 73 74 64 65 72 72 2c 22 65 72 72 6f 72  tf(stderr,"error
17070 20 63 6c 6f 73 69 6e 67 20 64 61 74 61 62 61 73   closing databas
17080 65 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  e: %s\n", sqlite
17090 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
170a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
170b0 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.