/ Hex Artifact Content
Login

Artifact f66531a57fff927f95c98d99c28237d88e400c86:


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 31 30 20 32  hell.c,v 1.210 2
0200: 30 30 39 2f 30 35 2f 33 31 20 31 37 3a 31 36 3a  009/05/31 17:16:
0210: 31 30 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  10 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 0a 23 64 65 66 69 6e 65 20 42    }.}..#define B
0ad0: 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e  EGIN_TIMER begin
0ae0: 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20  Timer().#define 
0af0: 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d  END_TIMER endTim
0b00: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53  er().#define HAS
0b10: 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20  _TIMER 1..#elif 
0b20: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
0b30: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
0b40: 32 29 29 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 77  2))..#include <w
0b50: 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a 20 53 61  indows.h>../* Sa
0b60: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
0b70: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
0b80: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
0b90: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
0ba0: 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72 6f  atic HANDLE hPro
0bb0: 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49 4c  cess;.static FIL
0bc0: 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42 65  ETIME ftKernelBe
0bd0: 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  gin;.static FILE
0be0: 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69 6e  TIME ftUserBegin
0bf0: 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c 20 28  ;.typedef BOOL (
0c00: 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f 43 54  WINAPI *GETPROCT
0c10: 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20 4c 50  IMES)(HANDLE, LP
0c20: 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45  FILETIME, LPFILE
0c30: 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45  TIME, LPFILETIME
0c40: 2c 20 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73  , LPFILETIME);.s
0c50: 74 61 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d  tatic GETPROCTIM
0c60: 45 53 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d  ES getProcessTim
0c70: 65 73 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a  esAddr = NULL;..
0c80: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
0c90: 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65 64 20  imer is enabled 
0ca0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e  */.static int en
0cb0: 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a 0a  ableTimer = 0;..
0cc0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
0cd0: 65 65 20 69 66 20 77 65 20 68 61 76 65 20 74 69  ee if we have ti
0ce0: 6d 65 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65  mer support.  Re
0cf0: 74 75 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73  turn 1 if necess
0d00: 61 72 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66  ary.** support f
0d10: 6f 75 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70  ound (or found p
0d20: 72 65 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73  reviously)..*/.s
0d30: 74 61 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d  tatic int hasTim
0d40: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
0d50: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
0d60: 64 64 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ddr ){.    retur
0d70: 6e 20 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n 1;.  } else {.
0d80: 20 20 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73      /* GetProces
0d90: 73 54 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73  sTimes() isn't s
0da0: 75 70 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39  upported in WIN9
0db0: 35 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72  5 and some other
0dc0: 20 57 69 6e 64 6f 77 73 20 76 65 72 73 69 6f 6e   Windows version
0dd0: 73 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 69 66  s..    ** See if
0de0: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20   the version we 
0df0: 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68  are running on h
0e00: 61 73 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74  as it, and if it
0e10: 20 64 6f 65 73 2c 20 73 61 76 65 20 6f 66 66 0a   does, save off.
0e20: 20 20 20 20 2a 2a 20 61 20 70 6f 69 6e 74 65 72      ** a pointer
0e30: 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63   to it and the c
0e40: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68  urrent process h
0e50: 61 6e 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  andle..    */.  
0e60: 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74    hProcess = Get
0e70: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29  CurrentProcess()
0e80: 3b 0a 20 20 20 20 69 66 28 20 68 50 72 6f 63 65  ;.    if( hProce
0e90: 73 73 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53  ss ){.      HINS
0ea0: 54 41 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d  TANCE hinstLib =
0eb0: 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58   LoadLibrary(TEX
0ec0: 54 28 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22  T("Kernel32.dll"
0ed0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55  ));.      if( NU
0ee0: 4c 4c 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29  LL != hinstLib )
0ef0: 7b 0a 20 20 20 20 20 20 20 20 67 65 74 50 72 6f  {.        getPro
0f00: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20  cessTimesAddr = 
0f10: 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29 20 47  (GETPROCTIMES) G
0f20: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 68 69  etProcAddress(hi
0f30: 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72 6f 63  nstLib, "GetProc
0f40: 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20 20 20  essTimes");.    
0f50: 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20      if( NULL != 
0f60: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
0f70: 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ddr ){.         
0f80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
0f90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46 72 65     }.        Fre
0fa0: 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74 4c 69  eLibrary(hinstLi
0fb0: 62 29 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  b); .      }.   
0fc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
0fd0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  0;.}../*.** Begi
0fe0: 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72  n timing an oper
0ff0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
1000: 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72 28  void beginTimer(
1010: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
1020: 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74 50  bleTimer && getP
1030: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20  rocessTimesAddr 
1040: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
1050: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
1060: 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63 65  it;.    getProce
1070: 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72 6f  ssTimesAddr(hPro
1080: 63 65 73 73 2c 20 26 66 74 43 72 65 61 74 69 6f  cess, &ftCreatio
1090: 6e 2c 20 26 66 74 45 78 69 74 2c 20 26 66 74 4b  n, &ftExit, &ftK
10a0: 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 55  ernelBegin, &ftU
10b0: 73 65 72 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 7d  serBegin);.  }.}
10c0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
10d0: 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74 77  difference of tw
10e0: 6f 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  o FILETIME struc
10f0: 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f  ts in seconds */
1100: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74  .static double t
1110: 69 6d 65 44 69 66 66 28 46 49 4c 45 54 49 4d 45  imeDiff(FILETIME
1120: 20 2a 70 53 74 61 72 74 2c 20 46 49 4c 45 54 49   *pStart, FILETI
1130: 4d 45 20 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c  ME *pEnd){.  sql
1140: 69 74 65 5f 69 6e 74 36 34 20 69 36 34 53 74 61  ite_int64 i64Sta
1150: 72 74 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69  rt = *((sqlite_i
1160: 6e 74 36 34 20 2a 29 20 70 53 74 61 72 74 29 3b  nt64 *) pStart);
1170: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
1180: 69 36 34 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69  i64End = *((sqli
1190: 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 45 6e 64  te_int64 *) pEnd
11a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 6f 75  );.  return (dou
11b0: 62 6c 65 29 20 28 28 69 36 34 45 6e 64 20 2d 20  ble) ((i64End - 
11c0: 69 36 34 53 74 61 72 74 29 20 2f 20 31 30 30 30  i64Start) / 1000
11d0: 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  0000.0);.}../*.*
11e0: 2a 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69  * Print the timi
11f0: 6e 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73  ng results..*/.s
1200: 74 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69  tatic void endTi
1210: 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  mer(void){.  if(
1220: 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20   enableTimer && 
1230: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
1240: 64 64 72 29 7b 0a 20 20 20 20 46 49 4c 45 54 49  ddr){.    FILETI
1250: 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66  ME ftCreation, f
1260: 74 45 78 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45  tExit, ftKernelE
1270: 6e 64 2c 20 66 74 55 73 65 72 45 6e 64 3b 0a 20  nd, ftUserEnd;. 
1280: 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d     getProcessTim
1290: 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c  esAddr(hProcess,
12a0: 20 26 66 74 43 72 65 61 74 69 6f 6e 2c 20 26 66   &ftCreation, &f
12b0: 74 45 78 69 74 2c 20 26 66 74 4b 65 72 6e 65 6c  tExit, &ftKernel
12c0: 45 6e 64 2c 20 26 66 74 55 73 65 72 45 6e 64 29  End, &ftUserEnd)
12d0: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 50  ;.    printf("CP
12e0: 55 20 54 69 6d 65 3a 20 75 73 65 72 20 25 66 20  U Time: user %f 
12f0: 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20  sys %f\n",.     
1300: 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 55 73    timeDiff(&ftUs
1310: 65 72 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72  erBegin, &ftUser
1320: 45 6e 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d  End),.       tim
1330: 65 44 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42  eDiff(&ftKernelB
1340: 65 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45  egin, &ftKernelE
1350: 6e 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65  nd));.  }.}..#de
1360: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
1370: 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64   beginTimer().#d
1380: 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20  efine END_TIMER 
1390: 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69  endTimer().#defi
13a0: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73  ne HAS_TIMER has
13b0: 54 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23  Timer()..#else.#
13c0: 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d  define BEGIN_TIM
13d0: 45 52 20 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f  ER .#define END_
13e0: 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20 48 41  TIMER.#define HA
13f0: 53 5f 54 49 4d 45 52 20 30 0a 23 65 6e 64 69 66  S_TIMER 0.#endif
1400: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20  ../*.** Used to 
1410: 70 72 65 76 65 6e 74 20 77 61 72 6e 69 6e 67 73  prevent warnings
1420: 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61   about unused pa
1430: 72 61 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66  rameters.*/.#def
1440: 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ine UNUSED_PARAM
1450: 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28 78  ETER(x) (void)(x
1460: 29 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ).../***********
1470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
1500: 65 67 69 6e 20 67 65 6e 66 6b 65 79 20 6c 6f 67  egin genfkey log
1510: 69 63 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ic..*/.#if !defi
1520: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1530: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
1540: 20 21 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45   !defined SQLITE
1550: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a  _OMIT_SUBQUERY..
1560: 23 64 65 66 69 6e 65 20 47 45 4e 46 4b 45 59 5f  #define GENFKEY_
1570: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 31 0a  ERROR         1.
1580: 23 64 65 66 69 6e 65 20 47 45 4e 46 4b 45 59 5f  #define GENFKEY_
1590: 44 52 4f 50 54 52 49 47 47 45 52 20 20 20 32 0a  DROPTRIGGER   2.
15a0: 23 64 65 66 69 6e 65 20 47 45 4e 46 4b 45 59 5f  #define GENFKEY_
15b0: 43 52 45 41 54 45 54 52 49 47 47 45 52 20 33 0a  CREATETRIGGER 3.
15c0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 66 6b  static int genfk
15d0: 65 79 5f 63 72 65 61 74 65 5f 74 72 69 67 67 65  ey_create_trigge
15e0: 72 73 28 73 71 6c 69 74 65 33 20 2a 2c 20 63 6f  rs(sqlite3 *, co
15f0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 76 6f 69 64  nst char *, void
1600: 20 2a 2c 0a 20 20 69 6e 74 20 28 2a 29 28 76 6f   *,.  int (*)(vo
1610: 69 64 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74  id *, int, const
1620: 20 63 68 61 72 20 2a 29 0a 29 3b 0a 0a 73 74 72   char *).);..str
1630: 75 63 74 20 47 65 6e 66 6b 65 79 43 62 20 7b 0a  uct GenfkeyCb {.
1640: 20 20 76 6f 69 64 20 2a 70 43 74 78 3b 0a 20 20    void *pCtx;.  
1650: 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 69 6e 74  int eType;.  int
1660: 20 28 2a 78 44 61 74 61 29 28 76 6f 69 64 20 2a   (*xData)(void *
1670: 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61  , int, const cha
1680: 72 20 2a 29 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  r *);.};.typedef
1690: 20 73 74 72 75 63 74 20 47 65 6e 66 6b 65 79 43   struct GenfkeyC
16a0: 62 20 47 65 6e 66 6b 65 79 43 62 3b 0a 0a 2f 2a  b GenfkeyCb;../*
16b0: 20 54 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69   The code in thi
16c0: 73 20 66 69 6c 65 20 64 65 66 69 6e 65 73 20 61  s file defines a
16d0: 20 73 71 6c 69 74 65 33 20 76 69 72 74 75 61 6c   sqlite3 virtual
16e0: 2d 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68  -table module th
16f0: 61 74 0a 2a 2a 20 70 72 6f 76 69 64 65 73 20 61  at.** provides a
1700: 20 72 65 61 64 2d 6f 6e 6c 79 20 76 69 65 77 20   read-only view 
1710: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  of the current d
1720: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
1730: 54 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2a 20  There is one.** 
1740: 72 6f 77 20 69 6e 20 74 68 65 20 73 63 68 65 6d  row in the schem
1750: 61 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68  a table for each
1760: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 64   column in the d
1770: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
1780: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 43 48 45 4d  */.#define SCHEM
1790: 41 20 5c 0a 22 43 52 45 41 54 45 20 54 41 42 4c  A \."CREATE TABL
17a0: 45 20 78 28 22 20 20 20 20 20 20 20 20 20 20 20  E x("           
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 5c 0a 20 20 22 64 61 74 61 62 61 73 65 2c 22   \.  "database,"
17f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1800: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69  e of database (i
1810: 2e 65 2e 20 6d 61 69 6e 2c 20 74 65 6d 70 20 65  .e. main, temp e
1820: 74 63 2e 29 20 2a 2f 20 20 20 20 20 20 20 20 20  tc.) */         
1830: 5c 0a 20 20 22 74 61 62 6c 65 6e 61 6d 65 2c 22  \.  "tablename,"
1840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1850: 20 6f 66 20 74 61 62 6c 65 20 2a 2f 20 20 20 20   of table */    
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 20 20 20 20 20 20 20 5c                 \
1880: 0a 20 20 22 63 69 64 2c 22 20 20 20 20 20 20 20  .  "cid,"       
1890: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
18a0: 6e 20 6e 75 6d 62 65 72 20 28 66 72 6f 6d 20 6c  n number (from l
18b0: 65 66 74 2d 74 6f 2d 72 69 67 68 74 2c 20 30 20  eft-to-right, 0 
18c0: 75 70 77 61 72 64 29 20 2a 2f 20 20 20 20 5c 0a  upward) */    \.
18d0: 20 20 22 6e 61 6d 65 2c 22 20 20 20 20 20 20 20    "name,"       
18e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
18f0: 20 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20   name */        
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1920: 20 22 74 79 70 65 2c 22 20 20 20 20 20 20 20 20   "type,"        
1930: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 69        /* Specifi
1940: 65 64 20 74 79 70 65 20 28 69 2e 65 2e 20 56 41  ed type (i.e. VA
1950: 52 43 48 41 52 28 33 32 29 29 20 2a 2f 20 20 20  RCHAR(32)) */   
1960: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1970: 22 6e 6f 74 5f 6e 75 6c 6c 2c 22 20 20 20 20 20  "not_null,"     
1980: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
1990: 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c   True if NOT NUL
19a0: 4c 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20  L was specified 
19b0: 2a 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22  */         \.  "
19c0: 64 66 6c 74 5f 76 61 6c 75 65 2c 22 20 20 20 20  dflt_value,"    
19d0: 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76      /* Default v
19e0: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 63 6f  alue for this co
19f0: 6c 75 6d 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  lumn */         
1a00: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 70            \.  "p
1a10: 6b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k"              
1a20: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1a30: 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20 70 61 72  is column is par
1a40: 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79  t of the primary
1a50: 20 6b 65 79 20 2a 2f 20 20 5c 0a 22 29 22 0a 0a   key */  \.")"..
1a60: 23 64 65 66 69 6e 65 20 53 43 48 45 4d 41 32 20  #define SCHEMA2 
1a70: 5c 0a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  \."CREATE TABLE 
1a80: 78 28 22 20 20 20 20 20 20 20 20 20 20 20 20 20  x("             
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ac0: 0a 20 20 22 64 61 74 61 62 61 73 65 2c 22 20 20  .  "database,"  
1ad0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1ae0: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 2e 65  of database (i.e
1af0: 2e 20 6d 61 69 6e 2c 20 74 65 6d 70 20 65 74 63  . main, temp etc
1b00: 2e 29 20 2a 2f 20 20 20 20 20 20 20 20 20 5c 0a  .) */         \.
1b10: 20 20 22 66 72 6f 6d 5f 74 62 6c 2c 22 20 20 20    "from_tbl,"   
1b20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1b30: 66 20 74 61 62 6c 65 20 2a 2f 20 20 20 20 20 20  f table */      
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1b60: 20 22 66 6b 69 64 2c 22 20 20 20 20 20 20 20 20   "fkid,"        
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1bb0: 22 73 65 71 2c 22 20 20 20 20 20 20 20 20 20 20  "seq,"          
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22             \.  "
1c00: 74 6f 5f 74 62 6c 2c 22 20 20 20 20 20 20 20 20  to_tbl,"        
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 66            \.  "f
1c50: 72 6f 6d 5f 63 6f 6c 2c 22 20 20 20 20 20 20 20  rom_col,"       
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74 6f           \.  "to
1ca0: 5f 63 6f 6c 2c 22 20 20 20 20 20 20 20 20 20 20  _col,"          
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 6f 6e 5f          \.  "on_
1cf0: 75 70 64 61 74 65 2c 22 20 20 20 20 20 20 20 20  update,"        
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 5c 0a 20 20 22 6f 6e 5f 64         \.  "on_d
1d40: 65 6c 65 74 65 2c 22 20 20 20 20 20 20 20 20 20  elete,"         
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 20 20 20 5c 0a 20 20 22 6d 61 74 63 68        \.  "match
1d90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 20 20 5c 0a 22 29 22 0a 0a 23 64 65 66       \.")"..#def
1de0: 69 6e 65 20 53 43 48 45 4d 41 33 20 5c 0a 22 43  ine SCHEMA3 \."C
1df0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 22 20  REATE TABLE x(" 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22             \.  "
1e40: 64 61 74 61 62 61 73 65 2c 22 20 20 20 20 20 20  database,"      
1e50: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
1e60: 61 74 61 62 61 73 65 20 28 69 2e 65 2e 20 6d 61  atabase (i.e. ma
1e70: 69 6e 2c 20 74 65 6d 70 20 65 74 63 2e 29 20 2a  in, temp etc.) *
1e80: 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74  /         \.  "t
1e90: 61 62 6c 65 6e 61 6d 65 2c 22 20 20 20 20 20 20  ablename,"      
1ea0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
1eb0: 62 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ble */          
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 73 65           \.  "se
1ee0: 71 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  q,"             
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 6e 61 6d          \.  "nam
1f30: 65 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  e,"             
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 20 20 20 20 5c 0a 20 20 22 69 73 75 6e         \.  "isun
1f80: 69 71 75 65 22 20 20 20 20 20 20 20 20 20 20 20  ique"           
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 20 20 20 20 20 20 5c 0a 22 29 22 0a 0a 23 64 65        \.")"..#de
1fd0: 66 69 6e 65 20 53 43 48 45 4d 41 34 20 5c 0a 22  fine SCHEMA4 \."
1fe0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 22  CREATE TABLE x("
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2030: 22 64 61 74 61 62 61 73 65 2c 22 20 20 20 20 20  "database,"     
2040: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2050: 64 61 74 61 62 61 73 65 20 28 69 2e 65 2e 20 6d  database (i.e. m
2060: 61 69 6e 2c 20 74 65 6d 70 20 65 74 63 2e 29 20  ain, temp etc.) 
2070: 2a 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22  */         \.  "
2080: 69 6e 64 65 78 6e 61 6d 65 2c 22 20 20 20 20 20  indexname,"     
2090: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
20a0: 61 62 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20  able */         
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 73            \.  "s
20d0: 65 71 6e 6f 2c 22 20 20 20 20 20 20 20 20 20 20  eqno,"          
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 63 69           \.  "ci
2120: 64 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  d,"             
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 6e 61 6d          \.  "nam
2170: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e"              
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 5c 0a 22 29 22 0a 0a 23 64         \.")"..#d
21c0: 65 66 69 6e 65 20 53 43 48 45 4d 41 35 20 5c 0a  efine SCHEMA5 \.
21d0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28  "CREATE TABLE x(
21e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2220: 20 22 64 61 74 61 62 61 73 65 2c 22 20 20 20 20   "database,"    
2230: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2240: 20 64 61 74 61 62 61 73 65 20 28 69 2e 65 2e 20   database (i.e. 
2250: 6d 61 69 6e 2c 20 74 65 6d 70 20 65 74 63 2e 29  main, temp etc.)
2260: 20 2a 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20   */         \.  
2270: 22 74 72 69 67 67 65 72 6e 61 6d 65 2c 22 20 20  "triggername,"  
2280: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2290: 74 72 69 67 67 65 72 20 2a 2f 20 20 20 20 20 20  trigger */      
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22             \.  "
22c0: 64 75 6d 6d 79 22 20 20 20 20 20 20 20 20 20 20  dummy"          
22d0: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f      /* Unused */
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 20 20 20 20 20 5c 0a 22 29 22 0a            \.")".
2310: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2320: 53 63 68 65 6d 61 54 61 62 6c 65 20 53 63 68 65  SchemaTable Sche
2330: 6d 61 54 61 62 6c 65 3b 0a 73 74 61 74 69 63 20  maTable;.static 
2340: 73 74 72 75 63 74 20 53 63 68 65 6d 61 54 61 62  struct SchemaTab
2350: 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  le {.  const cha
2360: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  r *zName;.  cons
2370: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 3b  t char *zObject;
2380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2390: 50 72 61 67 6d 61 3b 0a 20 20 63 6f 6e 73 74 20  Pragma;.  const 
23a0: 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 3b 0a 7d  char *zSchema;.}
23b0: 20 61 53 63 68 65 6d 61 54 61 62 6c 65 5b 5d 20   aSchemaTable[] 
23c0: 3d 20 7b 0a 20 20 7b 20 22 74 61 62 6c 65 5f 69  = {.  { "table_i
23d0: 6e 66 6f 22 2c 20 20 20 20 20 20 20 22 74 61 62  nfo",       "tab
23e0: 6c 65 22 2c 20 22 50 52 41 47 4d 41 20 25 51 2e  le", "PRAGMA %Q.
23f0: 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c  table_info(%Q)",
2400: 20 20 20 20 20 20 20 53 43 48 45 4d 41 20 7d 2c         SCHEMA },
2410: 0a 20 20 7b 20 22 66 6f 72 65 69 67 6e 5f 6b 65  .  { "foreign_ke
2420: 79 5f 6c 69 73 74 22 2c 20 22 74 61 62 6c 65 22  y_list", "table"
2430: 2c 20 22 50 52 41 47 4d 41 20 25 51 2e 66 6f 72  , "PRAGMA %Q.for
2440: 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 25 51  eign_key_list(%Q
2450: 29 22 2c 20 53 43 48 45 4d 41 32 20 7d 2c 0a 20  )", SCHEMA2 },. 
2460: 20 7b 20 22 69 6e 64 65 78 5f 6c 69 73 74 22 2c   { "index_list",
2470: 20 20 20 20 20 20 20 22 74 61 62 6c 65 22 2c 20         "table", 
2480: 22 50 52 41 47 4d 41 20 25 51 2e 69 6e 64 65 78  "PRAGMA %Q.index
2490: 5f 6c 69 73 74 28 25 51 29 22 2c 20 20 20 20 20  _list(%Q)",     
24a0: 20 20 53 43 48 45 4d 41 33 20 7d 2c 0a 20 20 7b    SCHEMA3 },.  {
24b0: 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 2c 20 20   "index_info",  
24c0: 20 20 20 20 20 22 69 6e 64 65 78 22 2c 20 22 50       "index", "P
24d0: 52 41 47 4d 41 20 25 51 2e 69 6e 64 65 78 5f 69  RAGMA %Q.index_i
24e0: 6e 66 6f 28 25 51 29 22 2c 20 20 20 20 20 20 20  nfo(%Q)",       
24f0: 53 43 48 45 4d 41 34 20 7d 2c 0a 20 20 7b 20 22  SCHEMA4 },.  { "
2500: 74 72 69 67 67 65 72 5f 6c 69 73 74 22 2c 20 20  trigger_list",  
2510: 20 20 20 22 74 72 69 67 67 65 72 22 2c 20 22 53     "trigger", "S
2520: 45 4c 45 43 54 20 31 22 2c 20 20 20 20 20 20 20  ELECT 1",       
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 43                SC
2540: 48 45 4d 41 35 20 7d 2c 0a 20 20 7b 20 30 2c 20  HEMA5 },.  { 0, 
2550: 30 2c 20 30 2c 20 30 20 7d 0a 7d 3b 0a 0a 74 79  0, 0, 0 }.};..ty
2560: 70 65 64 65 66 20 73 74 72 75 63 74 20 73 63 68  pedef struct sch
2570: 65 6d 61 5f 76 74 61 62 20 73 63 68 65 6d 61 5f  ema_vtab schema_
2580: 76 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74  vtab;.typedef st
2590: 72 75 63 74 20 73 63 68 65 6d 61 5f 63 75 72 73  ruct schema_curs
25a0: 6f 72 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  or schema_cursor
25b0: 3b 0a 0a 2f 2a 20 41 20 73 63 68 65 6d 61 20 74  ;../* A schema t
25c0: 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 73  able object */.s
25d0: 74 72 75 63 74 20 73 63 68 65 6d 61 5f 76 74 61  truct schema_vta
25e0: 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  b {.  sqlite3_vt
25f0: 61 62 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74  ab base;.  sqlit
2600: 65 33 20 2a 64 62 3b 0a 20 20 53 63 68 65 6d 61  e3 *db;.  Schema
2610: 54 61 62 6c 65 20 2a 70 54 79 70 65 3b 0a 7d 3b  Table *pType;.};
2620: 0a 0a 2f 2a 20 41 20 73 63 68 65 6d 61 20 74 61  ../* A schema ta
2630: 62 6c 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63  ble cursor objec
2640: 74 20 2a 2f 0a 73 74 72 75 63 74 20 73 63 68 65  t */.struct sche
2650: 6d 61 5f 63 75 72 73 6f 72 20 7b 0a 20 20 73 71  ma_cursor {.  sq
2660: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
2670: 72 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  r base;.  sqlite
2680: 33 5f 73 74 6d 74 20 2a 70 44 62 4c 69 73 74 3b  3_stmt *pDbList;
2690: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
26a0: 2a 70 54 61 62 6c 65 4c 69 73 74 3b 0a 20 20 73  *pTableList;.  s
26b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f  qlite3_stmt *pCo
26c0: 6c 75 6d 6e 4c 69 73 74 3b 0a 20 20 69 6e 74 20  lumnList;.  int 
26d0: 72 6f 77 69 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  rowid;.};../*.**
26e0: 20 54 61 62 6c 65 20 64 65 73 74 72 75 63 74 6f   Table destructo
26f0: 72 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  r for the schema
2700: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
2710: 69 63 20 69 6e 74 20 73 63 68 65 6d 61 44 65 73  ic int schemaDes
2720: 74 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61  troy(sqlite3_vta
2730: 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c  b *pVtab){.  sql
2740: 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 29  ite3_free(pVtab)
2750: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
2760: 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 63 6f 6e  ./*.** Table con
2770: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
2780: 20 73 63 68 65 6d 61 20 6d 6f 64 75 6c 65 2e 0a   schema module..
2790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63  */.static int sc
27a0: 68 65 6d 61 43 72 65 61 74 65 28 0a 20 20 73 71  hemaCreate(.  sq
27b0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
27c0: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
27d0: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
27e0: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
27f0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
2800: 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
2810: 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
2820: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2830: 0a 20 20 73 63 68 65 6d 61 5f 76 74 61 62 20 2a  .  schema_vtab *
2840: 70 56 74 61 62 3b 0a 20 20 53 63 68 65 6d 61 54  pVtab;.  SchemaT
2850: 61 62 6c 65 20 2a 70 54 79 70 65 20 3d 20 26 61  able *pType = &a
2860: 53 63 68 65 6d 61 54 61 62 6c 65 5b 30 5d 3b 0a  SchemaTable[0];.
2870: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2880: 54 45 52 28 70 7a 45 72 72 29 3b 0a 20 20 69 66  TER(pzErr);.  if
2890: 28 20 61 72 67 63 3e 33 20 29 7b 0a 20 20 20 20  ( argc>3 ){.    
28a0: 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 79 70 65  int i;.    pType
28b0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
28c0: 30 3b 20 61 53 63 68 65 6d 61 54 61 62 6c 65 5b  0; aSchemaTable[
28d0: 69 5d 2e 7a 4e 61 6d 65 3b 20 69 2b 2b 29 7b 20  i].zName; i++){ 
28e0: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74  .      if( 0==st
28f0: 72 63 6d 70 28 61 72 67 76 5b 33 5d 2c 20 61 53  rcmp(argv[3], aS
2900: 63 68 65 6d 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e  chemaTable[i].zN
2910: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
2920: 70 54 79 70 65 20 3d 20 26 61 53 63 68 65 6d 61  pType = &aSchema
2930: 54 61 62 6c 65 5b 69 5d 3b 0a 20 20 20 20 20 20  Table[i];.      
2940: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2950: 21 70 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  !pType ){.      
2960: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2970: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
2980: 20 20 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65    pVtab = sqlite
2990: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
29a0: 73 63 68 65 6d 61 5f 76 74 61 62 29 29 3b 0a 20  schema_vtab));. 
29b0: 20 69 66 28 20 70 56 74 61 62 20 29 7b 0a 20 20   if( pVtab ){.  
29c0: 20 20 6d 65 6d 73 65 74 28 70 56 74 61 62 2c 20    memset(pVtab, 
29d0: 30 2c 20 73 69 7a 65 6f 66 28 73 63 68 65 6d 61  0, sizeof(schema
29e0: 5f 76 74 61 62 29 29 3b 0a 20 20 20 20 70 56 74  _vtab));.    pVt
29f0: 61 62 2d 3e 64 62 20 3d 20 28 73 71 6c 69 74 65  ab->db = (sqlite
2a00: 33 20 2a 29 70 41 75 78 3b 0a 20 20 20 20 70 56  3 *)pAux;.    pV
2a10: 74 61 62 2d 3e 70 54 79 70 65 20 3d 20 70 54 79  tab->pType = pTy
2a20: 70 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  pe;.    rc = sql
2a30: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
2a40: 62 28 64 62 2c 20 70 54 79 70 65 2d 3e 7a 53 63  b(db, pType->zSc
2a50: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  hema);.  }.  *pp
2a60: 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f  Vtab = (sqlite3_
2a70: 76 74 61 62 20 2a 29 70 56 74 61 62 3b 0a 20 20  vtab *)pVtab;.  
2a80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a90: 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63  .** Open a new c
2aa0: 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 73 63 68  ursor on the sch
2ab0: 65 6d 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ema table..*/.st
2ac0: 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 4f  atic int schemaO
2ad0: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
2ae0: 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33   *pVTab, sqlite3
2af0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
2b00: 70 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  pCursor){.  int 
2b10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2b20: 4d 3b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73  M;.  schema_curs
2b30: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 55 4e 55 53  or *pCur;.  UNUS
2b40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 54  ED_PARAMETER(pVT
2b50: 61 62 29 3b 0a 20 20 70 43 75 72 20 3d 20 73 71  ab);.  pCur = sq
2b60: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2b70: 65 6f 66 28 73 63 68 65 6d 61 5f 63 75 72 73 6f  eof(schema_curso
2b80: 72 29 29 3b 0a 20 20 69 66 28 20 70 43 75 72 20  r));.  if( pCur 
2b90: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43  ){.    memset(pC
2ba0: 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 63  ur, 0, sizeof(sc
2bb0: 68 65 6d 61 5f 63 75 72 73 6f 72 29 29 3b 0a 20  hema_cursor));. 
2bc0: 20 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 28     *ppCursor = (
2bd0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
2be0: 73 6f 72 20 2a 29 70 43 75 72 3b 0a 20 20 20 20  sor *)pCur;.    
2bf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
2c20: 61 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 63  a schema table c
2c30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
2c40: 20 69 6e 74 20 73 63 68 65 6d 61 43 6c 6f 73 65   int schemaClose
2c50: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
2c60: 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 63  rsor *cur){.  sc
2c70: 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75  hema_cursor *pCu
2c80: 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73  r = (schema_curs
2c90: 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 71 6c 69  or *)cur;.  sqli
2ca0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75  te3_finalize(pCu
2cb0: 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 73  r->pDbList);.  s
2cc0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2cd0: 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74  pCur->pTableList
2ce0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
2cf0: 61 6c 69 7a 65 28 70 43 75 72 2d 3e 70 43 6f 6c  alize(pCur->pCol
2d00: 75 6d 6e 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  umnList);.  sqli
2d10: 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a  te3_free(pCur);.
2d20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d30: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  OK;.}..static vo
2d40: 69 64 20 63 6f 6c 75 6d 6e 54 6f 52 65 73 75 6c  id columnToResul
2d50: 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  t(sqlite3_contex
2d60: 74 20 2a 63 74 78 2c 20 73 71 6c 69 74 65 33 5f  t *ctx, sqlite3_
2d70: 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74  stmt *pStmt, int
2d80: 20 69 43 6f 6c 29 7b 0a 20 20 73 77 69 74 63 68   iCol){.  switch
2d90: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
2da0: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43 6f  _type(pStmt, iCo
2db0: 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  l) ){.    case S
2dc0: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20  QLITE_NULL:.    
2dd0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2de0: 5f 6e 75 6c 6c 28 63 74 78 29 3b 0a 20 20 20 20  _null(ctx);.    
2df0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2e00: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
2e10: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
2e20: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
2e30: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
2e40: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 43  _int64(pStmt, iC
2e50: 6f 6c 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ol));.      brea
2e60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2e70: 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20  TE_FLOAT:.      
2e80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
2e90: 6f 75 62 6c 65 28 63 74 78 2c 20 73 71 6c 69 74  ouble(ctx, sqlit
2ea0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
2eb0: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a  (pStmt, iCol));.
2ec0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ed0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
2ee0: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
2ef0: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
2f00: 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
2f10: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
2f20: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
2f30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f40: 74 65 78 74 28 63 74 78 2c 20 7a 2c 20 2d 31 2c  text(ctx, z, -1,
2f50: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
2f60: 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  T);.      break;
2f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2f80: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 63  .** Retrieve a c
2f90: 6f 6c 75 6d 6e 20 6f 66 20 64 61 74 61 2e 0a 2a  olumn of data..*
2fa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
2fb0: 65 6d 61 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  emaColumn(sqlite
2fc0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
2fd0: 75 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ur, sqlite3_cont
2fe0: 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69 29  ext *ctx, int i)
2ff0: 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f  {.  schema_curso
3000: 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d  r *pCur = (schem
3010: 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  a_cursor *)cur;.
3020: 20 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20    switch( i ){. 
3030: 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20     case 0:.     
3040: 20 63 6f 6c 75 6d 6e 54 6f 52 65 73 75 6c 74 28   columnToResult(
3050: 63 74 78 2c 20 70 43 75 72 2d 3e 70 44 62 4c 69  ctx, pCur->pDbLi
3060: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  st, 1);.      br
3070: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 3a  eak;.    case 1:
3080: 0a 20 20 20 20 20 20 63 6f 6c 75 6d 6e 54 6f 52  .      columnToR
3090: 65 73 75 6c 74 28 63 74 78 2c 20 70 43 75 72 2d  esult(ctx, pCur-
30a0: 3e 70 54 61 62 6c 65 4c 69 73 74 2c 20 30 29 3b  >pTableList, 0);
30b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
30c0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
30d0: 20 63 6f 6c 75 6d 6e 54 6f 52 65 73 75 6c 74 28   columnToResult(
30e0: 63 74 78 2c 20 70 43 75 72 2d 3e 70 43 6f 6c 75  ctx, pCur->pColu
30f0: 6d 6e 4c 69 73 74 2c 20 69 2d 32 29 3b 0a 20 20  mnList, i-2);.  
3100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
3110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3120: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
3130: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
3140: 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   rowid..*/.stati
3150: 63 20 69 6e 74 20 73 63 68 65 6d 61 52 6f 77 69  c int schemaRowi
3160: 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  d(sqlite3_vtab_c
3170: 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69  ursor *cur, sqli
3180: 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64  te_int64 *pRowid
3190: 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73  ){.  schema_curs
31a0: 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65  or *pCur = (sche
31b0: 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b  ma_cursor *)cur;
31c0: 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75  .  *pRowid = pCu
31d0: 72 2d 3e 72 6f 77 69 64 3b 0a 20 20 72 65 74 75  r->rowid;.  retu
31e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
31f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 61  .static int fina
3200: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 73 74 6d  lize(sqlite3_stm
3210: 74 20 2a 2a 70 70 53 74 6d 74 29 7b 0a 20 20 69  t **ppStmt){.  i
3220: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
3230: 66 69 6e 61 6c 69 7a 65 28 2a 70 70 53 74 6d 74  finalize(*ppStmt
3240: 29 3b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  );.  *ppStmt = 0
3250: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
3260: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  ..static int sch
3270: 65 6d 61 45 6f 66 28 73 71 6c 69 74 65 33 5f 76  emaEof(sqlite3_v
3280: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
3290: 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f  {.  schema_curso
32a0: 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d  r *pCur = (schem
32b0: 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  a_cursor *)cur;.
32c0: 20 20 72 65 74 75 72 6e 20 28 70 43 75 72 2d 3e    return (pCur->
32d0: 70 44 62 4c 69 73 74 20 3f 20 30 20 3a 20 31 29  pDbList ? 0 : 1)
32e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
32f0: 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
3300: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a   the next row..*
3310: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
3320: 65 6d 61 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  emaNext(sqlite3_
3330: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
3340: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
3350: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 63 68 65 6d  LITE_OK;.  schem
3360: 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  a_cursor *pCur =
3370: 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20   (schema_cursor 
3380: 2a 29 63 75 72 3b 0a 20 20 73 63 68 65 6d 61 5f  *)cur;.  schema_
3390: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 73  vtab *pVtab = (s
33a0: 63 68 65 6d 61 5f 76 74 61 62 20 2a 29 28 63 75  chema_vtab *)(cu
33b0: 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 63 68 61  r->pVtab);.  cha
33c0: 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 0a 20 20  r *zSql = 0;..  
33d0: 77 68 69 6c 65 28 20 21 70 43 75 72 2d 3e 70 43  while( !pCur->pC
33e0: 6f 6c 75 6d 6e 4c 69 73 74 20 7c 7c 20 53 51 4c  olumnList || SQL
33f0: 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33  ITE_ROW!=sqlite3
3400: 5f 73 74 65 70 28 70 43 75 72 2d 3e 70 43 6f 6c  _step(pCur->pCol
3410: 75 6d 6e 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  umnList) ){.    
3420: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
3430: 72 63 20 3d 20 66 69 6e 61 6c 69 7a 65 28 26 70  rc = finalize(&p
3440: 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74  Cur->pColumnList
3450: 29 29 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 65  )) ) goto next_e
3460: 78 69 74 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  xit;..    while(
3470: 20 21 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69   !pCur->pTableLi
3480: 73 74 20 7c 7c 20 53 51 4c 49 54 45 5f 52 4f 57  st || SQLITE_ROW
3490: 21 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  !=sqlite3_step(p
34a0: 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 29  Cur->pTableList)
34b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
34c0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66  LITE_OK!=(rc = f
34d0: 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70  inalize(&pCur->p
34e0: 54 61 62 6c 65 4c 69 73 74 29 29 20 29 20 67 6f  TableList)) ) go
34f0: 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a 0a 20  to next_exit;.. 
3500: 20 20 20 20 20 61 73 73 65 72 74 28 70 43 75 72       assert(pCur
3510: 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 20 20  ->pDbList);.    
3520: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
3530: 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW!=sqlite3_ste
3540: 70 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 29  p(pCur->pDbList)
3550: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
3560: 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d   finalize(&pCur-
3570: 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 20 20 20  >pDbList);.     
3580: 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69     goto next_exi
3590: 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
35a0: 20 20 2f 2a 20 53 65 74 20 7a 53 71 6c 20 74 6f    /* Set zSql to
35b0: 20 74 68 65 20 53 51 4c 20 74 6f 20 70 75 6c 6c   the SQL to pull
35c0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 61 62   the list of tab
35d0: 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  les from the .  
35e0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61      ** sqlite_ma
35f0: 73 74 65 72 20 28 6f 72 20 73 71 6c 69 74 65 5f  ster (or sqlite_
3600: 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 74 61 62  temp_master) tab
3610: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
3620: 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 64 65 6e  se.      ** iden
3630: 74 66 69 65 64 20 62 79 20 74 68 65 20 72 6f 77  tfied by the row
3640: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
3650: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
3660: 20 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 0a 20   pCur->pDbList. 
3670: 20 20 20 20 20 2a 2a 20 28 69 74 65 72 61 74 69       ** (iterati
3680: 6e 67 20 74 68 72 6f 75 67 68 20 61 20 22 50 52  ng through a "PR
3690: 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c 69  AGMA database_li
36a0: 73 74 3b 22 20 73 74 61 74 65 6d 65 6e 74 29 2e  st;" statement).
36b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36c0: 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
36d0: 6d 6e 5f 69 6e 74 28 70 43 75 72 2d 3e 70 44 62  mn_int(pCur->pDb
36e0: 4c 69 73 74 2c 20 30 29 3d 3d 31 20 29 7b 0a 20  List, 0)==1 ){. 
36f0: 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
3700: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
3710: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
3720: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
3730: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
3740: 57 48 45 52 45 20 74 79 70 65 3d 25 51 22 2c 0a  WHERE type=%Q",.
3750: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
3760: 62 2d 3e 70 54 79 70 65 2d 3e 7a 4f 62 6a 65 63  b->pType->zObjec
3770: 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  t.        );.   
3780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3790: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
37a0: 70 44 62 4c 69 73 74 20 3d 20 70 43 75 72 2d 3e  pDbList = pCur->
37b0: 70 44 62 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  pDbList;.       
37c0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
37d0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
37e0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
37f0: 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  e FROM %Q.sqlite
3800: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79  _master WHERE ty
3810: 70 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  pe=%Q",.        
3820: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
3830: 75 6d 6e 5f 74 65 78 74 28 70 44 62 4c 69 73 74  umn_text(pDbList
3840: 2c 20 31 29 2c 20 70 56 74 61 62 2d 3e 70 54 79  , 1), pVtab->pTy
3850: 70 65 2d 3e 7a 4f 62 6a 65 63 74 0a 20 20 20 20  pe->zObject.    
3860: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
3870: 20 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29       if( !zSql )
3880: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
3890: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
38a0: 20 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 65       goto next_e
38b0: 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  xit;.      }..  
38c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38d0: 5f 70 72 65 70 61 72 65 28 70 56 74 61 62 2d 3e  _prepare(pVtab->
38e0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
38f0: 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2c  Cur->pTableList,
3900: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
3910: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
3920: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
3930: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 6e 65  ITE_OK ) goto ne
3940: 78 74 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  xt_exit;.    }..
3950: 20 20 20 20 2f 2a 20 53 65 74 20 7a 53 71 6c 20      /* Set zSql 
3960: 74 6f 20 74 68 65 20 53 51 4c 20 74 6f 20 74 68  to the SQL to th
3970: 65 20 74 61 62 6c 65 5f 69 6e 66 6f 20 70 72 61  e table_info pra
3980: 67 6d 61 20 66 6f 72 20 74 68 65 20 74 61 62 6c  gma for the tabl
3990: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
39a0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
39b0: 20 74 68 65 20 72 6f 77 73 20 70 6f 69 6e 74 65   the rows pointe
39c0: 64 20 74 6f 20 62 79 20 73 74 61 74 65 6d 65 6e  d to by statemen
39d0: 74 73 20 70 43 75 72 2d 3e 70 44 62 4c 69 73 74  ts pCur->pDbList
39e0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 43 75 72   and.    ** pCur
39f0: 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2e 0a 20 20  ->pTableList..  
3a00: 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20    */.    zSql = 
3a10: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3a20: 70 56 74 61 62 2d 3e 70 54 79 70 65 2d 3e 7a 50  pVtab->pType->zP
3a30: 72 61 67 6d 61 2c 0a 20 20 20 20 20 20 20 20 73  ragma,.        s
3a40: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
3a50: 78 74 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74  xt(pCur->pDbList
3a60: 2c 20 31 29 2c 0a 20 20 20 20 20 20 20 20 73 71  , 1),.        sq
3a70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
3a80: 74 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69  t(pCur->pTableLi
3a90: 73 74 2c 20 30 29 0a 20 20 20 20 29 3b 0a 0a 20  st, 0).    );.. 
3aa0: 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a     if( !zSql ){.
3ab0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3ac0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
3ad0: 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a 20  oto next_exit;. 
3ae0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
3af0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 56  lite3_prepare(pV
3b00: 74 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  tab->db, zSql, -
3b10: 31 2c 20 26 70 43 75 72 2d 3e 70 43 6f 6c 75 6d  1, &pCur->pColum
3b20: 6e 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 73  nList, 0);.    s
3b30: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
3b40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
3b50: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
3b60: 6e 65 78 74 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  next_exit;.  }. 
3b70: 20 70 43 75 72 2d 3e 72 6f 77 69 64 2b 2b 3b 0a   pCur->rowid++;.
3b80: 0a 6e 65 78 74 5f 65 78 69 74 3a 0a 20 20 2f 2a  .next_exit:.  /*
3b90: 20 54 4f 44 4f 3a 20 48 61 6e 64 6c 65 20 72 63   TODO: Handle rc
3ba0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
3bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
3bc0: 61 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 63  a schema table c
3bd0: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
3be0: 20 69 6e 74 20 73 63 68 65 6d 61 46 69 6c 74 65   int schemaFilte
3bf0: 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  r(.  sqlite3_vta
3c00: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
3c10: 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64  ursor, .  int id
3c20: 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  xNum, const char
3c30: 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20   *idxStr,.  int 
3c40: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
3c50: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
3c60: 69 6e 74 20 72 63 3b 0a 20 20 73 63 68 65 6d 61  int rc;.  schema
3c70: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28  _vtab *pVtab = (
3c80: 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 29 28 70  schema_vtab *)(p
3c90: 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
3ca0: 62 29 3b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72  b);.  schema_cur
3cb0: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68  sor *pCur = (sch
3cc0: 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 70 56 74  ema_cursor *)pVt
3cd0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 55 4e 55 53  abCursor;.  UNUS
3ce0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78  ED_PARAMETER(idx
3cf0: 4e 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Num);.  UNUSED_P
3d00: 41 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29  ARAMETER(idxStr)
3d10: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
3d20: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e  ETER(argc);.  UN
3d30: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
3d40: 72 67 76 29 3b 0a 20 20 70 43 75 72 2d 3e 72 6f  rgv);.  pCur->ro
3d50: 77 69 64 20 3d 20 30 3b 0a 20 20 66 69 6e 61 6c  wid = 0;.  final
3d60: 69 7a 65 28 26 70 43 75 72 2d 3e 70 54 61 62 6c  ize(&pCur->pTabl
3d70: 65 4c 69 73 74 29 3b 0a 20 20 66 69 6e 61 6c 69  eList);.  finali
3d80: 7a 65 28 26 70 43 75 72 2d 3e 70 43 6f 6c 75 6d  ze(&pCur->pColum
3d90: 6e 4c 69 73 74 29 3b 0a 20 20 66 69 6e 61 6c 69  nList);.  finali
3da0: 7a 65 28 26 70 43 75 72 2d 3e 70 44 62 4c 69 73  ze(&pCur->pDbLis
3db0: 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  t);.  rc = sqlit
3dc0: 65 33 5f 70 72 65 70 61 72 65 28 70 56 74 61 62  e3_prepare(pVtab
3dd0: 2d 3e 64 62 2c 22 53 45 4c 45 43 54 20 30 2c 20  ->db,"SELECT 0, 
3de0: 27 6d 61 69 6e 27 22 2c 20 2d 31 2c 20 26 70 43  'main'", -1, &pC
3df0: 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20 30 29 3b  ur->pDbList, 0);
3e00: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
3e10: 51 4c 49 54 45 5f 4f 4b 20 3f 20 73 63 68 65 6d  QLITE_OK ? schem
3e20: 61 4e 65 78 74 28 70 56 74 61 62 43 75 72 73 6f  aNext(pVtabCurso
3e30: 72 29 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  r) : rc);.}../*.
3e40: 2a 2a 20 41 6e 61 6c 79 73 65 20 74 68 65 20 57  ** Analyse the W
3e50: 48 45 52 45 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a  HERE condition..
3e60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63  */.static int sc
3e70: 68 65 6d 61 42 65 73 74 49 6e 64 65 78 28 73 71  hemaBestIndex(sq
3e80: 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c  lite3_vtab *tab,
3e90: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
3ea0: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a  nfo *pIdxInfo){.
3eb0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3ec0: 45 52 28 74 61 62 29 3b 0a 20 20 55 4e 55 53 45  ER(tab);.  UNUSE
3ed0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 49 64 78  D_PARAMETER(pIdx
3ee0: 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
3ef0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
3f00: 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61  .** A virtual ta
3f10: 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68 61 74 20  ble module that 
3f20: 6d 65 72 65 6c 79 20 65 63 68 6f 73 20 6d 65 74  merely echos met
3f30: 68 6f 64 20 63 61 6c 6c 73 20 69 6e 74 6f 20 54  hod calls into T
3f40: 43 4c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e  CL.** variables.
3f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
3f60: 65 33 5f 6d 6f 64 75 6c 65 20 73 63 68 65 6d 61  e3_module schema
3f70: 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20  Module = {.  0, 
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
3fa0: 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 63 68 65 6d  rsion */.  schem
3fb0: 61 43 72 65 61 74 65 2c 0a 20 20 73 63 68 65 6d  aCreate,.  schem
3fc0: 61 43 72 65 61 74 65 2c 0a 20 20 73 63 68 65 6d  aCreate,.  schem
3fd0: 61 42 65 73 74 49 6e 64 65 78 2c 0a 20 20 73 63  aBestIndex,.  sc
3fe0: 68 65 6d 61 44 65 73 74 72 6f 79 2c 0a 20 20 73  hemaDestroy,.  s
3ff0: 63 68 65 6d 61 44 65 73 74 72 6f 79 2c 0a 20 20  chemaDestroy,.  
4000: 73 63 68 65 6d 61 4f 70 65 6e 2c 20 20 20 20 20  schemaOpen,     
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4020: 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
4030: 75 72 73 6f 72 20 2a 2f 0a 20 20 73 63 68 65 6d  ursor */.  schem
4040: 61 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  aClose,         
4050: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
4060: 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
4070: 6f 72 20 2a 2f 0a 20 20 73 63 68 65 6d 61 46 69  or */.  schemaFi
4080: 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  lter,           
4090: 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20       /* xFilter 
40a0: 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e  - configure scan
40b0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
40c0: 20 20 73 63 68 65 6d 61 4e 65 78 74 2c 20 20 20    schemaNext,   
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40e0: 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63  * xNext - advanc
40f0: 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
4100: 73 63 68 65 6d 61 45 6f 66 2c 20 20 20 20 20 20  schemaEof,      
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4120: 78 45 6f 66 20 2a 2f 0a 20 20 73 63 68 65 6d 61  xEof */.  schema
4130: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
4140: 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
4150: 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
4160: 0a 20 20 73 63 68 65 6d 61 52 6f 77 69 64 2c 20  .  schemaRowid, 
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
4190: 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
41c0: 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  te */.  0,      
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41e0: 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a       /* xBegin *
41f0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30   /* xSync */.  0
4220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
4240: 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20  Commit */.  0,  
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
4270: 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20  lback */.  0,   
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
42a0: 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20  Method */.  0,  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e           /* xRen
42d0: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ame */.};../*.**
42e0: 20 45 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20   Extension load 
42f0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
4300: 74 69 63 20 69 6e 74 20 69 6e 73 74 61 6c 6c 53  tic int installS
4310: 63 68 65 6d 61 4d 6f 64 75 6c 65 28 73 71 6c 69  chemaModule(sqli
4320: 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33  te3 *db, sqlite3
4330: 20 2a 73 64 62 29 7b 0a 20 20 73 71 6c 69 74 65   *sdb){.  sqlite
4340: 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28  3_create_module(
4350: 64 62 2c 20 22 73 63 68 65 6d 61 22 2c 20 26 73  db, "schema", &s
4360: 63 68 65 6d 61 4d 6f 64 75 6c 65 2c 20 28 76 6f  chemaModule, (vo
4370: 69 64 20 2a 29 73 64 62 29 3b 0a 20 20 72 65 74  id *)sdb);.  ret
4380: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4390: 20 20 73 6a 28 7a 56 61 6c 75 65 2c 20 7a 4a 6f    sj(zValue, zJo
43a0: 69 6e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  in).**.** The fo
43b0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
43c0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
43d0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20  mentation of an 
43e0: 61 67 67 72 65 67 61 74 65 20 0a 2a 2a 20 66 75  aggregate .** fu
43f0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75  nction that retu
4400: 72 6e 73 20 61 20 73 74 72 69 6e 67 2e 20 45 61  rns a string. Ea
4410: 63 68 20 74 69 6d 65 20 74 68 65 20 66 75 6e 63  ch time the func
4420: 74 69 6f 6e 20 69 73 20 73 74 65 70 70 65 64 2c  tion is stepped,
4430: 20 0a 2a 2a 20 69 74 20 61 70 70 65 6e 64 73 20   .** it appends 
4440: 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 74 65 72  data to an inter
4450: 6e 61 6c 20 62 75 66 66 65 72 2e 20 57 68 65 6e  nal buffer. When
4460: 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69   the aggregate i
4470: 73 20 66 69 6e 61 6c 69 7a 65 64 2c 0a 2a 2a 20  s finalized,.** 
4480: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4490: 74 68 65 20 62 75 66 66 65 72 20 61 72 65 20 72  the buffer are r
44a0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
44b0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
44c0: 65 20 61 67 67 72 65 67 61 74 65 20 69 73 20 73  e aggregate is s
44d0: 74 65 70 70 65 64 20 74 68 65 20 62 75 66 66 65  tepped the buffe
44e0: 72 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  r is set to a co
44f0: 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  py.** of the fir
4500: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
4510: 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 61 6e 64   second time and
4520: 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
4530: 73 20 69 74 20 69 73 0a 2a 2a 20 73 74 65 70 70  s it is.** stepp
4540: 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ed a copy of the
4550: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
4560: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
4570: 74 68 65 20 62 75 66 66 65 72 2c 20 74 68 65 6e  the buffer, then
4580: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
4590: 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 45  e first..**.** E
45a0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
45b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
45c0: 29 20 56 41 4c 55 45 53 28 27 31 27 29 3b 0a 2a  ) VALUES('1');.*
45d0: 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  *   INSERT INTO 
45e0: 74 31 28 61 29 20 56 41 4c 55 45 53 28 27 32 27  t1(a) VALUES('2'
45f0: 29 3b 0a 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  );.**   INSERT I
4600: 4e 54 4f 20 74 31 28 61 29 20 56 41 4c 55 45 53  NTO t1(a) VALUES
4610: 28 27 33 27 29 3b 0a 2a 2a 20 20 20 53 45 4c 45  ('3');.**   SELE
4620: 43 54 20 73 6a 28 61 2c 20 27 2c 20 27 29 20 46  CT sj(a, ', ') F
4630: 52 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20  ROM t1;.**.**   
4640: 20 20 3d 3e 20 20 22 31 2c 20 32 2c 20 33 22 0a    =>  "1, 2, 3".
4650: 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 53 74 72  **.*/.struct Str
4660: 42 75 66 66 65 72 20 7b 0a 20 20 63 68 61 72 20  Buffer {.  char 
4670: 2a 7a 42 75 66 3b 0a 7d 3b 0a 74 79 70 65 64 65  *zBuf;.};.typede
4680: 66 20 73 74 72 75 63 74 20 53 74 72 42 75 66 66  f struct StrBuff
4690: 65 72 20 53 74 72 42 75 66 66 65 72 3b 0a 73 74  er StrBuffer;.st
46a0: 61 74 69 63 20 76 6f 69 64 20 6a 6f 69 6e 46 69  atic void joinFi
46b0: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
46c0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
46d0: 7b 0a 20 20 53 74 72 42 75 66 66 65 72 20 2a 70  {.  StrBuffer *p
46e0: 3b 0a 20 20 70 20 3d 20 28 53 74 72 42 75 66 66  ;.  p = (StrBuff
46f0: 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  er *)sqlite3_agg
4700: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
4710: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 53  ontext, sizeof(S
4720: 74 72 42 75 66 66 65 72 29 29 3b 0a 20 20 73 71  trBuffer));.  sq
4730: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4740: 74 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 7a 42  t(context, p->zB
4750: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
4760: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
4770: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 42 75  ite3_free(p->zBu
4780: 66 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  f);.}.static voi
4790: 64 20 6a 6f 69 6e 53 74 65 70 28 0a 20 20 73 71  d joinStep(.  sq
47a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
47b0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
47c0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
47d0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
47e0: 53 74 72 42 75 66 66 65 72 20 2a 70 3b 0a 20 20  StrBuffer *p;.  
47f0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4800: 28 61 72 67 63 29 3b 0a 20 20 70 20 3d 20 28 53  (argc);.  p = (S
4810: 74 72 42 75 66 66 65 72 20 2a 29 73 71 6c 69 74  trBuffer *)sqlit
4820: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
4830: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
4840: 7a 65 6f 66 28 53 74 72 42 75 66 66 65 72 29 29  zeof(StrBuffer))
4850: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 42 75 66 3d  ;.  if( p->zBuf=
4860: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 42 75  =0 ){.    p->zBu
4870: 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  f = sqlite3_mpri
4880: 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
4890: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
48a0: 76 5b 30 5d 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  v[0]));.  }else{
48b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 20  .    char *zTmp 
48c0: 3d 20 70 2d 3e 7a 42 75 66 3b 0a 20 20 20 20 70  = p->zBuf;.    p
48d0: 2d 3e 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33  ->zBuf = sqlite3
48e0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 25 73 25 73  _mprintf("%s%s%s
48f0: 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 54 6d 70  ", .        zTmp
4900: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
4910: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 73  text(argv[1]), s
4920: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4930: 74 28 61 72 67 76 5b 30 5d 29 0a 20 20 20 20 29  t(argv[0]).    )
4940: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4950: 65 65 28 7a 54 6d 70 29 3b 0a 20 20 7d 0a 7d 0a  ee(zTmp);.  }.}.
4960: 0a 2f 2a 0a 2a 2a 20 20 20 64 71 28 7a 53 74 72  ./*.**   dq(zStr
4970: 69 6e 67 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing).**.** This 
4980: 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
4990: 61 63 63 65 70 74 73 20 61 20 73 69 6e 67 6c 65  accepts a single
49a0: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 69 6e   argument and in
49b0: 74 65 72 70 72 65 74 73 20 69 74 20 61 73 0a 2a  terprets it as.*
49c0: 2a 20 61 20 74 65 78 74 20 76 61 6c 75 65 2e 20  * a text value. 
49d0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
49e0: 20 69 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   is the argument
49f0: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75   enclosed in dou
4a00: 62 6c 65 0a 2a 2a 20 71 75 6f 74 65 73 2e 20 49  ble.** quotes. I
4a10: 66 20 61 6e 79 20 64 6f 75 62 6c 65 20 71 75 6f  f any double quo
4a20: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61 72  te characters ar
4a30: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
4a40: 20 61 72 67 75 6d 65 6e 74 2c 20 0a 2a 2a 20 74   argument, .** t
4a50: 68 65 73 65 20 61 72 65 20 65 73 63 61 70 65 64  hese are escaped
4a60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 64 71 28 27 74 68  ..**.**   dq('th
4a70: 65 20 72 61 76 65 6e 20 22 4e 65 76 65 72 6d 6f  e raven "Nevermo
4a80: 72 65 2e 22 27 29 20 3d 3d 20 27 22 74 68 65 20  re."') == '"the 
4a90: 72 61 76 65 6e 20 22 22 4e 65 76 65 72 6d 6f 72  raven ""Nevermor
4aa0: 65 2e 22 22 22 27 0a 2a 2f 0a 73 74 61 74 69 63  e."""'.*/.static
4ab0: 20 76 6f 69 64 20 64 6f 75 62 6c 65 71 75 6f 74   void doublequot
4ac0: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
4ad0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
4ae0: 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73    int argc, .  s
4af0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4b00: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 69 3b  rgv.){.  int ii;
4b10: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20  .  char *zOut;. 
4b20: 20 63 68 61 72 20 2a 7a 43 73 72 3b 0a 20 20 63   char *zCsr;.  c
4b30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d  onst char *zIn =
4b40: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
4b50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4b60: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  t(argv[0]);.  in
4b70: 74 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f  t nIn = sqlite3_
4b80: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
4b90: 5b 30 5d 29 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  [0]);..  UNUSED_
4ba0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
4bb0: 0a 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  .  zOut = sqlite
4bc0: 33 5f 6d 61 6c 6c 6f 63 28 6e 49 6e 2a 32 2b 33  3_malloc(nIn*2+3
4bd0: 29 3b 0a 20 20 7a 43 73 72 20 3d 20 7a 4f 75 74  );.  zCsr = zOut
4be0: 3b 0a 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 22  ;.  *zCsr++ = '"
4bf0: 27 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  ';.  for(ii=0; i
4c00: 69 3c 6e 49 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20  i<nIn; ii++){.  
4c10: 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 49 6e 5b    *zCsr++ = zIn[
4c20: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e  ii];.    if( zIn
4c30: 5b 69 69 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  [ii]=='"' ){.   
4c40: 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 22 27     *zCsr++ = '"'
4c50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 7a  ;.    }.  }.  *z
4c60: 43 73 72 2b 2b 20 3d 20 27 22 27 3b 0a 20 20 2a  Csr++ = '"';.  *
4c70: 7a 43 73 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 0a  zCsr++ = '\0';..
4c80: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4c90: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
4ca0: 4f 75 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Out, -1, SQLITE_
4cb0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
4cc0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
4cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 6d 75 6c  ;.}../*.**   mul
4ce0: 74 69 72 65 70 6c 61 63 65 28 7a 53 74 72 69 6e  tireplace(zStrin
4cf0: 67 2c 20 7a 53 65 61 72 63 68 31 2c 20 7a 52 65  g, zSearch1, zRe
4d00: 70 6c 61 63 65 31 2c 20 2e 2e 2e 29 0a 2a 2f 0a  place1, ...).*/.
4d10: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74  static void mult
4d20: 69 72 65 70 6c 61 63 65 28 0a 20 20 73 71 6c 69  ireplace(.  sqli
4d30: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
4d40: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67  text, .  int arg
4d50: 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  c, .  sqlite3_va
4d60: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
4d70: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 68 61  int i = 0;.  cha
4d80: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 20 20 69  r *zOut = 0;.  i
4d90: 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 69  nt nOut = 0;.  i
4da0: 6e 74 20 6e 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  nt nMalloc = 0;.
4db0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
4dc0: 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  n = (const char 
4dd0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
4de0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
4df0: 20 69 6e 74 20 6e 49 6e 20 3d 20 73 71 6c 69 74   int nIn = sqlit
4e00: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
4e10: 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 77 68 69 6c  rgv[0]);..  whil
4e20: 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20  e( i<nIn ){.    
4e30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 70  const char *zCop
4e40: 79 20 3d 20 26 7a 49 6e 5b 69 5d 3b 0a 20 20 20  y = &zIn[i];.   
4e50: 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 31 3b 0a   int nCopy = 1;.
4e60: 20 20 20 20 69 6e 74 20 6e 52 65 70 6c 61 63 65      int nReplace
4e70: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 6a 3b   = 1;.    int j;
4e80: 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c  .    for(j=1; j<
4e90: 28 61 72 67 63 2d 31 29 3b 20 6a 2b 3d 32 29 7b  (argc-1); j+=2){
4ea0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
4eb0: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
4ec0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
4ed0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 6a 5d 29  ue_text(argv[j])
4ee0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
4ef0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
4f00: 74 65 73 28 61 72 67 76 5b 6a 5d 29 3b 0a 20 20  tes(argv[j]);.  
4f10: 20 20 20 20 69 66 28 20 6e 3c 3d 28 6e 49 6e 2d      if( n<=(nIn-
4f20: 69 29 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  i) && 0==strncmp
4f30: 28 7a 2c 20 7a 43 6f 70 79 2c 20 6e 29 20 29 7b  (z, zCopy, n) ){
4f40: 0a 20 20 20 20 20 20 20 20 7a 43 6f 70 79 20 3d  .        zCopy =
4f50: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
4f60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4f70: 74 28 61 72 67 76 5b 6a 2b 31 5d 29 3b 0a 20 20  t(argv[j+1]);.  
4f80: 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 73 71        nCopy = sq
4f90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
4fa0: 73 28 61 72 67 76 5b 6a 2b 31 5d 29 3b 0a 20 20  s(argv[j+1]);.  
4fb0: 20 20 20 20 20 20 6e 52 65 70 6c 61 63 65 20 3d        nReplace =
4fc0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   n;.        brea
4fd0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4fe0: 0a 20 20 20 20 69 66 28 20 28 6e 4f 75 74 2b 6e  .    if( (nOut+n
4ff0: 43 6f 70 79 29 3e 6e 4d 61 6c 6c 6f 63 20 29 7b  Copy)>nMalloc ){
5000: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  .      char *zNe
5010: 77 3b 0a 20 20 20 20 20 20 6e 4d 61 6c 6c 6f 63  w;.      nMalloc
5020: 20 3d 20 31 36 20 2b 20 28 6e 4f 75 74 2b 6e 43   = 16 + (nOut+nC
5030: 6f 70 79 29 2a 32 3b 0a 20 20 20 20 20 20 7a 4e  opy)*2;.      zN
5040: 65 77 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ew = (char*)sqli
5050: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 7a 4f 75 74  te3_realloc(zOut
5060: 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  , nMalloc);.    
5070: 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b    if( zNew==0 ){
5080: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5090: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
50a0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
50b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
50c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
50d0: 20 20 20 7a 4f 75 74 20 3d 20 7a 4e 65 77 3b 0a     zOut = zNew;.
50e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
50f0: 20 20 61 73 73 65 72 74 28 20 6e 4d 61 6c 6c 6f    assert( nMallo
5100: 63 3e 3d 28 6e 4f 75 74 2b 6e 43 6f 70 79 29 20  c>=(nOut+nCopy) 
5110: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
5120: 4f 75 74 5b 6e 4f 75 74 5d 2c 20 7a 43 6f 70 79  Out[nOut], zCopy
5130: 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 69 20  , nCopy);.    i 
5140: 2b 3d 20 6e 52 65 70 6c 61 63 65 3b 0a 20 20 20  += nReplace;.   
5150: 20 6e 4f 75 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a   nOut += nCopy;.
5160: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72    }..  sqlite3_r
5170: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
5180: 78 74 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 2c 20  xt, zOut, nOut, 
5190: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
51a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
51b0: 65 28 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(zOut);.}../*.*
51c0: 2a 20 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  * A callback for
51d0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
51e0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
51f0: 62 61 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  back specified b
5200: 79 20 74 68 65 0a 2a 2a 20 47 65 6e 66 6b 65 79  y the.** Genfkey
5210: 43 62 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  Cb structure poi
5220: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 76  nted to by the v
5230: 6f 69 64 2a 20 70 61 73 73 65 64 20 61 73 20 74  oid* passed as t
5240: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5250: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5260: 20 69 6e 76 6f 6b 65 43 61 6c 6c 62 61 63 6b 28   invokeCallback(
5270: 76 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 41 72  void *p, int nAr
5280: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  g, char **azArg,
5290: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a   char **azCol){.
52a0: 20 20 47 65 6e 66 6b 65 79 43 62 20 2a 70 43 62    GenfkeyCb *pCb
52b0: 20 3d 20 28 47 65 6e 66 6b 65 79 43 62 20 2a 29   = (GenfkeyCb *)
52c0: 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  p;.  UNUSED_PARA
52d0: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
52e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
52f0: 61 7a 43 6f 6c 29 3b 0a 20 20 72 65 74 75 72 6e  azCol);.  return
5300: 20 70 43 62 2d 3e 78 44 61 74 61 28 70 43 62 2d   pCb->xData(pCb-
5310: 3e 70 43 74 78 2c 20 70 43 62 2d 3e 65 54 79 70  >pCtx, pCb->eTyp
5320: 65 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 7d 0a  e, azArg[0]);.}.
5330: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 74 65  .static int dete
5340: 63 74 53 63 68 65 6d 61 50 72 6f 62 6c 65 6d 28  ctSchemaProblem(
5350: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
5380: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
5390: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 65 73 73 61  nst char *zMessa
53a0: 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
53b0: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
53c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   error message *
53d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
53e0: 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20  zSql,           
53f0: 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
5400: 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20  ent to run */.  
5410: 47 65 6e 66 6b 65 79 43 62 20 2a 70 43 62 0a 29  GenfkeyCb *pCb.)
5420: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
5430: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
5440: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
5450: 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
5460: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
5470: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
5480: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
5490: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
54a0: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
54b0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
54c0: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 68  pStmt) ){.    ch
54d0: 61 72 20 2a 7a 44 65 6c 3b 0a 20 20 20 20 69 6e  ar *zDel;.    in
54e0: 74 20 69 46 6b 20 3d 20 73 71 6c 69 74 65 33 5f  t iFk = sqlite3_
54f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
5500: 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 0);.    const 
5510: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 28 63 6f  char *zTab = (co
5520: 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
5530: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
5540: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 7a 44  Stmt, 1);.    zD
5550: 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  el = sqlite3_mpr
5560: 69 6e 74 66 28 22 45 72 72 6f 72 20 69 6e 20 74  intf("Error in t
5570: 61 62 6c 65 20 25 73 3a 20 25 73 22 2c 20 7a 54  able %s: %s", zT
5580: 61 62 2c 20 7a 4d 65 73 73 61 67 65 29 3b 0a 20  ab, zMessage);. 
5590: 20 20 20 72 63 20 3d 20 70 43 62 2d 3e 78 44 61     rc = pCb->xDa
55a0: 74 61 28 70 43 62 2d 3e 70 43 74 78 2c 20 70 43  ta(pCb->pCtx, pC
55b0: 62 2d 3e 65 54 79 70 65 2c 20 7a 44 65 6c 29 3b  b->eType, zDel);
55c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
55d0: 65 28 7a 44 65 6c 29 3b 0a 20 20 20 20 69 66 28  e(zDel);.    if(
55e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
55f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
5600: 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDel = sqlite3_m
5610: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
5620: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 6d  "DELETE FROM tem
5630: 70 2e 66 6b 65 79 20 57 48 45 52 45 20 66 72 6f  p.fkey WHERE fro
5640: 6d 5f 74 62 6c 20 3d 20 25 51 20 41 4e 44 20 66  m_tbl = %Q AND f
5650: 6b 69 64 20 3d 20 25 64 22 0a 20 20 20 20 20 20  kid = %d".      
5660: 20 20 2c 20 7a 54 61 62 2c 20 69 46 6b 0a 20 20    , zTab, iFk.  
5670: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
5680: 5f 65 78 65 63 28 64 62 2c 20 7a 44 65 6c 2c 20  _exec(db, zDel, 
5690: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
56a0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 65 6c 29  lite3_free(zDel)
56b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
56c0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
56d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
56e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
56f0: 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  eate and populat
5700: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
5710: 65 20 22 66 6b 65 79 22 2e 0a 2a 2f 0a 73 74 61  e "fkey"..*/.sta
5720: 74 69 63 20 69 6e 74 20 70 6f 70 75 6c 61 74 65  tic int populate
5730: 54 65 6d 70 54 61 62 6c 65 28 73 71 6c 69 74 65  TempTable(sqlite
5740: 33 20 2a 64 62 2c 20 47 65 6e 66 6b 65 79 43 62  3 *db, GenfkeyCb
5750: 20 2a 70 43 61 6c 6c 62 61 63 6b 29 7b 0a 20 20   *pCallback){.  
5760: 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 72 63 20  int rc;.  .  rc 
5770: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
5780: 62 2c 20 0a 20 20 20 20 20 20 22 43 52 45 41 54  b, .      "CREAT
5790: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
57a0: 74 65 6d 70 2e 76 5f 66 6b 65 79 20 55 53 49 4e  temp.v_fkey USIN
57b0: 47 20 73 63 68 65 6d 61 28 66 6f 72 65 69 67 6e  G schema(foreign
57c0: 5f 6b 65 79 5f 6c 69 73 74 29 3b 22 0a 20 20 20  _key_list);".   
57d0: 20 20 20 22 43 52 45 41 54 45 20 56 49 52 54 55     "CREATE VIRTU
57e0: 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e 76 5f  AL TABLE temp.v_
57f0: 63 6f 6c 20 55 53 49 4e 47 20 73 63 68 65 6d 61  col USING schema
5800: 28 74 61 62 6c 65 5f 69 6e 66 6f 29 3b 22 0a 20  (table_info);". 
5810: 20 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52       "CREATE VIR
5820: 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e  TUAL TABLE temp.
5830: 76 5f 69 64 78 6c 69 73 74 20 55 53 49 4e 47 20  v_idxlist USING 
5840: 73 63 68 65 6d 61 28 69 6e 64 65 78 5f 6c 69 73  schema(index_lis
5850: 74 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41  t);".      "CREA
5860: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
5870: 20 74 65 6d 70 2e 76 5f 69 64 78 69 6e 66 6f 20   temp.v_idxinfo 
5880: 55 53 49 4e 47 20 73 63 68 65 6d 61 28 69 6e 64  USING schema(ind
5890: 65 78 5f 69 6e 66 6f 29 3b 22 0a 20 20 20 20 20  ex_info);".     
58a0: 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
58b0: 20 54 41 42 4c 45 20 74 65 6d 70 2e 76 5f 74 72   TABLE temp.v_tr
58c0: 69 67 67 65 72 73 20 55 53 49 4e 47 20 73 63 68  iggers USING sch
58d0: 65 6d 61 28 74 72 69 67 67 65 72 5f 6c 69 73 74  ema(trigger_list
58e0: 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41 54  );".      "CREAT
58f0: 45 20 54 41 42 4c 45 20 74 65 6d 70 2e 66 6b 65  E TABLE temp.fke
5900: 79 20 41 53 20 22 0a 20 20 20 20 20 20 20 20 22  y AS ".        "
5910: 53 45 4c 45 43 54 20 66 72 6f 6d 5f 74 62 6c 2c  SELECT from_tbl,
5920: 20 74 6f 5f 74 62 6c 2c 20 66 6b 69 64 2c 20 66   to_tbl, fkid, f
5930: 72 6f 6d 5f 63 6f 6c 2c 20 74 6f 5f 63 6f 6c 2c  rom_col, to_col,
5940: 20 6f 6e 5f 75 70 64 61 74 65 2c 20 6f 6e 5f 64   on_update, on_d
5950: 65 6c 65 74 65 20 22 0a 20 20 20 20 20 20 20 20  elete ".        
5960: 22 46 52 4f 4d 20 74 65 6d 70 2e 76 5f 66 6b 65  "FROM temp.v_fke
5970: 79 20 57 48 45 52 45 20 64 61 74 61 62 61 73 65  y WHERE database
5980: 20 3d 20 27 6d 61 69 6e 27 3b 22 0a 20 20 20 20   = 'main';".    
5990: 20 20 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b    , 0, 0, 0.  );
59a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
59b0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
59c0: 3b 0a 0a 20 20 72 63 20 3d 20 64 65 74 65 63 74  ;..  rc = detect
59d0: 53 63 68 65 6d 61 50 72 6f 62 6c 65 6d 28 64 62  SchemaProblem(db
59e0: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  , "foreign key c
59f0: 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65 78  olumns do not ex
5a00: 69 73 74 22 2c 0a 20 20 20 20 22 53 45 4c 45 43  ist",.    "SELEC
5a10: 54 20 66 6b 69 64 2c 20 66 72 6f 6d 5f 74 62 6c  T fkid, from_tbl
5a20: 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 74 65 6d   ".    "FROM tem
5a30: 70 2e 66 6b 65 79 20 22 0a 20 20 20 20 22 57 48  p.fkey ".    "WH
5a40: 45 52 45 20 74 6f 5f 63 6f 6c 20 49 53 20 4e 4f  ERE to_col IS NO
5a50: 54 20 4e 55 4c 4c 20 41 4e 44 20 4e 4f 54 20 45  T NULL AND NOT E
5a60: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 31 20  XISTS (SELECT 1 
5a70: 22 0a 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20  ".        "FROM 
5a80: 74 65 6d 70 2e 76 5f 63 6f 6c 20 57 48 45 52 45  temp.v_col WHERE
5a90: 20 74 61 62 6c 65 6e 61 6d 65 3d 74 6f 5f 74 62   tablename=to_tb
5aa0: 6c 20 41 4e 44 20 6e 61 6d 65 3d 3d 74 6f 5f 63  l AND name==to_c
5ab0: 6f 6c 22 0a 20 20 20 20 22 29 22 2c 20 70 43 61  ol".    ")", pCa
5ac0: 6c 6c 62 61 63 6b 0a 20 20 29 3b 0a 20 20 69 66  llback.  );.  if
5ad0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5ae0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5af0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
5b00: 20 74 68 65 20 74 65 6d 70 2e 66 6b 65 79 20 74   the temp.fkey t
5b10: 61 62 6c 65 20 69 73 20 6d 6f 73 74 6c 79 20 70  able is mostly p
5b20: 6f 70 75 6c 61 74 65 64 2e 20 49 66 20 61 6e 79  opulated. If any
5b30: 20 66 6f 72 65 69 67 6e 0a 20 20 2a 2a 20 6b 65   foreign.  ** ke
5b40: 79 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ys were specifie
5b50: 64 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 69  d so that they i
5b60: 6d 70 6c 69 63 69 74 6c 79 20 72 65 66 65 72 20  mplicitly refer 
5b70: 74 6f 20 74 68 65 79 20 70 72 69 6d 61 72 79 0a  to they primary.
5b80: 20 20 2a 2a 20 6b 65 79 20 6f 66 20 74 68 65 20    ** key of the 
5b90: 70 61 72 65 6e 74 20 74 61 62 6c 65 2c 20 74 68  parent table, th
5ba0: 65 20 22 74 6f 5f 63 6f 6c 22 20 76 61 6c 75 65  e "to_col" value
5bb0: 73 20 6f 66 20 74 68 65 20 74 65 6d 70 2e 66 6b  s of the temp.fk
5bc0: 65 79 20 72 6f 77 73 0a 20 20 2a 2a 20 61 72 65  ey rows.  ** are
5bd0: 20 73 74 69 6c 6c 20 73 65 74 20 74 6f 20 4e 55   still set to NU
5be0: 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
5bf0: 69 73 20 69 73 20 65 61 73 69 6c 79 20 66 69 78  is is easily fix
5c00: 65 64 20 66 6f 72 20 73 69 6e 67 6c 65 20 63 6f  ed for single co
5c10: 6c 75 6d 6e 20 70 72 69 6d 61 72 79 20 6b 65 79  lumn primary key
5c20: 73 2c 20 62 75 74 20 6e 6f 74 20 66 6f 72 0a 20  s, but not for. 
5c30: 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 73 2e 20   ** composites. 
5c40: 57 69 74 68 20 61 20 63 6f 6d 70 6f 73 69 74 65  With a composite
5c50: 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68   primary key, th
5c60: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
5c70: 20 72 65 6c 69 61 62 6c 79 0a 20 20 2a 2a 20 71   reliably.  ** q
5c80: 75 65 72 79 20 73 71 6c 69 74 65 20 66 6f 72 20  uery sqlite for 
5c90: 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
5ca0: 63 68 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 74  ch the columns t
5cb0: 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 0a  hat make up the.
5cc0: 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 6b    ** composite k
5cd0: 65 79 20 77 65 72 65 20 64 65 63 6c 61 72 65 64  ey were declared
5ce0: 20 69 2e 65 2e 20 74 68 65 72 65 20 69 73 20 6e   i.e. there is n
5cf0: 6f 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66  o way to tell if
5d00: 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61   the.  ** schema
5d10: 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 74 61 69   actually contai
5d20: 6e 73 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28  ns "PRIMARY KEY(
5d30: 61 2c 20 62 29 22 20 6f 72 20 22 50 52 49 4d 41  a, b)" or "PRIMA
5d40: 52 59 20 4b 45 59 28 62 2c 20 61 29 22 2e 0a 20  RY KEY(b, a)".. 
5d50: 20 2a 2a 20 54 68 65 72 65 66 6f 72 65 2c 20 74   ** Therefore, t
5d60: 68 69 73 20 63 61 73 65 20 69 73 20 6e 6f 74 20  his case is not 
5d70: 68 61 6e 64 6c 65 64 2e 20 54 68 65 20 66 6f 6c  handled. The fol
5d80: 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
5d90: 63 61 6c 6c 0a 20 20 2a 2a 20 64 65 74 65 63 74  call.  ** detect
5da0: 73 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  s instances of t
5db0: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  his case..  */. 
5dc0: 20 72 63 20 3d 20 64 65 74 65 63 74 53 63 68 65   rc = detectSche
5dd0: 6d 61 50 72 6f 62 6c 65 6d 28 64 62 2c 20 22 69  maProblem(db, "i
5de0: 6d 70 6c 69 63 69 74 20 6d 61 70 70 69 6e 67 20  mplicit mapping 
5df0: 74 6f 20 63 6f 6d 70 6f 73 69 74 65 20 70 72 69  to composite pri
5e00: 6d 61 72 79 20 6b 65 79 22 2c 0a 20 20 20 20 22  mary key",.    "
5e10: 53 45 4c 45 43 54 20 66 6b 69 64 2c 20 66 72 6f  SELECT fkid, fro
5e20: 6d 5f 74 62 6c 20 22 0a 20 20 20 20 22 46 52 4f  m_tbl ".    "FRO
5e30: 4d 20 74 65 6d 70 2e 66 6b 65 79 20 22 0a 20 20  M temp.fkey ".  
5e40: 20 20 22 57 48 45 52 45 20 74 6f 5f 63 6f 6c 20    "WHERE to_col 
5e50: 49 53 20 4e 55 4c 4c 20 22 0a 20 20 20 20 22 47  IS NULL ".    "G
5e60: 52 4f 55 50 20 42 59 20 66 6b 69 64 2c 20 66 72  ROUP BY fkid, fr
5e70: 6f 6d 5f 74 62 6c 20 48 41 56 49 4e 47 20 63 6f  om_tbl HAVING co
5e80: 75 6e 74 28 2a 29 20 3e 20 31 22 2c 20 70 43 61  unt(*) > 1", pCa
5e90: 6c 6c 62 61 63 6b 0a 20 20 29 3b 0a 20 20 69 66  llback.  );.  if
5ea0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5eb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5ec0: 2f 2a 20 44 65 74 65 63 74 20 61 74 74 65 6d 70  /* Detect attemp
5ed0: 74 73 20 74 6f 20 69 6d 70 6c 69 63 69 74 6c 79  ts to implicitly
5ee0: 20 6d 61 70 20 74 6f 20 74 68 65 20 70 72 69 6d   map to the prim
5ef0: 61 72 79 20 6b 65 79 20 6f 66 20 61 20 74 61 62  ary key of a tab
5f00: 6c 65 20 0a 20 20 2a 2a 20 74 68 61 74 20 68 61  le .  ** that ha
5f10: 73 20 6e 6f 20 70 72 69 6d 61 72 79 20 6b 65 79  s no primary key
5f20: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2f 0a 20 20   column..  */.  
5f30: 72 63 20 3d 20 64 65 74 65 63 74 53 63 68 65 6d  rc = detectSchem
5f40: 61 50 72 6f 62 6c 65 6d 28 64 62 2c 20 22 69 6d  aProblem(db, "im
5f50: 70 6c 69 63 69 74 20 6d 61 70 70 69 6e 67 20 74  plicit mapping t
5f60: 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70  o non-existant p
5f70: 72 69 6d 61 72 79 20 6b 65 79 22 2c 0a 20 20 20  rimary key",.   
5f80: 20 22 53 45 4c 45 43 54 20 66 6b 69 64 2c 20 66   "SELECT fkid, f
5f90: 72 6f 6d 5f 74 62 6c 20 22 0a 20 20 20 20 22 46  rom_tbl ".    "F
5fa0: 52 4f 4d 20 74 65 6d 70 2e 66 6b 65 79 20 22 0a  ROM temp.fkey ".
5fb0: 20 20 20 20 22 57 48 45 52 45 20 74 6f 5f 63 6f      "WHERE to_co
5fc0: 6c 20 49 53 20 4e 55 4c 4c 20 41 4e 44 20 4e 4f  l IS NULL AND NO
5fd0: 54 20 45 58 49 53 54 53 20 22 0a 20 20 20 20 20  T EXISTS ".     
5fe0: 20 22 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d   "(SELECT 1 FROM
5ff0: 20 74 65 6d 70 2e 76 5f 63 6f 6c 20 57 48 45 52   temp.v_col WHER
6000: 45 20 70 6b 20 41 4e 44 20 74 61 62 6c 65 6e 61  E pk AND tablena
6010: 6d 65 20 3d 20 74 65 6d 70 2e 66 6b 65 79 2e 74  me = temp.fkey.t
6020: 6f 5f 74 62 6c 29 22 0a 20 20 20 20 2c 20 70 43  o_tbl)".    , pC
6030: 61 6c 6c 62 61 63 6b 0a 20 20 29 3b 0a 20 20 69  allback.  );.  i
6040: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6050: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6060: 20 2f 2a 20 46 69 78 20 61 6c 6c 20 74 68 65 20   /* Fix all the 
6070: 69 6d 70 6c 69 63 69 74 20 70 72 69 6d 61 72 79  implicit primary
6080: 20 6b 65 79 20 6d 61 70 70 69 6e 67 73 20 69 6e   key mappings in
6090: 20 74 68 65 20 74 65 6d 70 2e 66 6b 65 79 20 74   the temp.fkey t
60a0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  able. */.  rc = 
60b0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
60c0: 20 0a 20 20 20 20 22 55 50 44 41 54 45 20 74 65   .    "UPDATE te
60d0: 6d 70 2e 66 6b 65 79 20 53 45 54 20 74 6f 5f 63  mp.fkey SET to_c
60e0: 6f 6c 20 3d 20 22 0a 20 20 20 20 20 20 22 28 53  ol = ".      "(S
60f0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
6100: 74 65 6d 70 2e 76 5f 63 6f 6c 20 57 48 45 52 45  temp.v_col WHERE
6110: 20 70 6b 20 41 4e 44 20 74 61 62 6c 65 6e 61 6d   pk AND tablenam
6120: 65 3d 74 65 6d 70 2e 66 6b 65 79 2e 74 6f 5f 74  e=temp.fkey.to_t
6130: 62 6c 29 22 0a 20 20 20 20 22 20 57 48 45 52 45  bl)".    " WHERE
6140: 20 74 6f 5f 63 6f 6c 20 49 53 20 4e 55 4c 4c 3b   to_col IS NULL;
6150: 22 0a 20 20 20 20 2c 20 30 2c 20 30 2c 20 30 0a  ".    , 0, 0, 0.
6160: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
6170: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6180: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  n rc;..  /* Now 
6190: 63 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 61  check that all a
61a0: 6c 6c 20 70 61 72 65 6e 74 20 6b 65 79 73 20 61  ll parent keys a
61b0: 72 65 20 65 69 74 68 65 72 20 70 72 69 6d 61 72  re either primar
61c0: 79 20 6b 65 79 73 20 6f 72 20 0a 20 20 2a 2a 20  y keys or .  ** 
61d0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 75 6e 69  subject to a uni
61e0: 71 75 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  que constraint..
61f0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
6200: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 0a 20 20  te3_exec(db, .  
6210: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
6220: 74 65 6d 70 2e 69 64 78 32 20 41 53 20 53 45 4c  temp.idx2 AS SEL
6230: 45 43 54 20 22 0a 20 20 20 20 20 20 22 69 6c 2e  ECT ".      "il.
6240: 74 61 62 6c 65 6e 61 6d 65 20 41 53 20 74 61 62  tablename AS tab
6250: 6c 65 6e 61 6d 65 2c 22 0a 20 20 20 20 20 20 22  lename,".      "
6260: 69 69 2e 69 6e 64 65 78 6e 61 6d 65 20 41 53 20  ii.indexname AS 
6270: 69 6e 64 65 78 6e 61 6d 65 2c 22 0a 20 20 20 20  indexname,".    
6280: 20 20 22 69 69 2e 6e 61 6d 65 20 41 53 20 63 6f    "ii.name AS co
6290: 6c 20 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20  l ".      "FROM 
62a0: 74 65 6d 70 2e 76 5f 69 64 78 6c 69 73 74 20 41  temp.v_idxlist A
62b0: 53 20 69 6c 2c 20 74 65 6d 70 2e 76 5f 69 64 78  S il, temp.v_idx
62c0: 69 6e 66 6f 20 41 53 20 69 69 20 22 0a 20 20 20  info AS ii ".   
62d0: 20 20 20 22 57 48 45 52 45 20 69 6c 2e 69 73 75     "WHERE il.isu
62e0: 6e 69 71 75 65 20 41 4e 44 20 69 6c 2e 64 61 74  nique AND il.dat
62f0: 61 62 61 73 65 3d 27 6d 61 69 6e 27 20 41 4e 44  abase='main' AND
6300: 20 69 69 2e 69 6e 64 65 78 6e 61 6d 65 20 3d 20   ii.indexname = 
6310: 69 6c 2e 6e 61 6d 65 3b 22 0a 20 20 20 20 22 49  il.name;".    "I
6320: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e  NSERT INTO temp.
6330: 69 64 78 32 20 22 0a 20 20 20 20 20 20 22 53 45  idx2 ".      "SE
6340: 4c 45 43 54 20 74 61 62 6c 65 6e 61 6d 65 2c 20  LECT tablename, 
6350: 27 70 6b 27 2c 20 6e 61 6d 65 20 46 52 4f 4d 20  'pk', name FROM 
6360: 74 65 6d 70 2e 76 5f 63 6f 6c 20 57 48 45 52 45  temp.v_col WHERE
6370: 20 70 6b 3b 22 0a 0a 20 20 20 20 22 43 52 45 41   pk;"..    "CREA
6380: 54 45 20 54 41 42 4c 45 20 74 65 6d 70 2e 69 64  TE TABLE temp.id
6390: 78 20 41 53 20 53 45 4c 45 43 54 20 22 0a 20 20  x AS SELECT ".  
63a0: 20 20 20 20 22 74 61 62 6c 65 6e 61 6d 65 2c 20      "tablename, 
63b0: 69 6e 64 65 78 6e 61 6d 65 2c 20 73 6a 28 64 71  indexname, sj(dq
63c0: 28 63 6f 6c 29 2c 27 2c 27 29 20 41 53 20 63 6f  (col),',') AS co
63d0: 6c 73 20 22 0a 20 20 20 20 20 20 22 46 52 4f 4d  ls ".      "FROM
63e0: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
63f0: 74 65 6d 70 2e 69 64 78 32 20 4f 52 44 45 52 20  temp.idx2 ORDER 
6400: 42 59 20 63 6f 6c 29 20 22 20 0a 20 20 20 20 20  BY col) " .     
6410: 20 22 47 52 4f 55 50 20 42 59 20 74 61 62 6c 65   "GROUP BY table
6420: 6e 61 6d 65 2c 20 69 6e 64 65 78 6e 61 6d 65 3b  name, indexname;
6430: 22 0a 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  "..    "CREATE T
6440: 41 42 4c 45 20 74 65 6d 70 2e 66 6b 65 79 32 20  ABLE temp.fkey2 
6450: 41 53 20 53 45 4c 45 43 54 20 22 0a 20 20 20 20  AS SELECT ".    
6460: 20 20 20 20 22 66 6b 69 64 2c 20 66 72 6f 6d 5f      "fkid, from_
6470: 74 62 6c 2c 20 74 6f 5f 74 62 6c 2c 20 73 6a 28  tbl, to_tbl, sj(
6480: 64 71 28 74 6f 5f 63 6f 6c 29 2c 27 2c 27 29 20  dq(to_col),',') 
6490: 41 53 20 63 6f 6c 73 20 22 0a 20 20 20 20 20 20  AS cols ".      
64a0: 20 20 22 46 52 4f 4d 20 28 53 45 4c 45 43 54 20    "FROM (SELECT 
64b0: 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 66 6b 65 79  * FROM temp.fkey
64c0: 20 4f 52 44 45 52 20 42 59 20 74 6f 5f 63 6f 6c   ORDER BY to_col
64d0: 29 20 22 20 0a 20 20 20 20 20 20 20 20 22 47 52  ) " .        "GR
64e0: 4f 55 50 20 42 59 20 66 6b 69 64 2c 20 66 72 6f  OUP BY fkid, fro
64f0: 6d 5f 74 62 6c 3b 22 0a 0a 20 20 20 20 22 43 52  m_tbl;"..    "CR
6500: 45 41 54 45 20 54 41 42 4c 45 20 74 65 6d 70 2e  EATE TABLE temp.
6510: 74 72 69 67 67 65 72 73 20 41 53 20 53 45 4c 45  triggers AS SELE
6520: 43 54 20 22 0a 20 20 20 20 20 20 20 20 22 74 72  CT ".        "tr
6530: 69 67 67 65 72 6e 61 6d 65 20 46 52 4f 4d 20 74  iggername FROM t
6540: 65 6d 70 2e 76 5f 74 72 69 67 67 65 72 73 20 57  emp.v_triggers W
6550: 48 45 52 45 20 64 61 74 61 62 61 73 65 3d 27 6d  HERE database='m
6560: 61 69 6e 27 20 41 4e 44 20 22 0a 20 20 20 20 20  ain' AND ".     
6570: 20 20 20 22 74 72 69 67 67 65 72 6e 61 6d 65 20     "triggername 
6580: 4c 49 4b 45 20 27 67 65 6e 66 6b 65 79 25 27 3b  LIKE 'genfkey%';
6590: 22 0a 20 20 20 20 2c 20 30 2c 20 30 2c 20 30 0a  ".    , 0, 0, 0.
65a0: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
65b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
65c0: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 64 65 74  n rc;.  rc = det
65d0: 65 63 74 53 63 68 65 6d 61 50 72 6f 62 6c 65 6d  ectSchemaProblem
65e0: 28 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  (db, "foreign ke
65f0: 79 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 22  y is not unique"
6600: 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 66 6b  ,.    "SELECT fk
6610: 69 64 2c 20 66 72 6f 6d 5f 74 62 6c 20 22 0a 20  id, from_tbl ". 
6620: 20 20 20 22 46 52 4f 4d 20 74 65 6d 70 2e 66 6b     "FROM temp.fk
6630: 65 79 32 20 22 0a 20 20 20 20 22 57 48 45 52 45  ey2 ".    "WHERE
6640: 20 4e 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c   NOT EXISTS (SEL
6650: 45 43 54 20 31 20 22 0a 20 20 20 20 20 20 20 20  ECT 1 ".        
6660: 22 46 52 4f 4d 20 74 65 6d 70 2e 69 64 78 20 57  "FROM temp.idx W
6670: 48 45 52 45 20 74 61 62 6c 65 6e 61 6d 65 3d 74  HERE tablename=t
6680: 6f 5f 74 62 6c 20 41 4e 44 20 66 6b 65 79 32 2e  o_tbl AND fkey2.
6690: 63 6f 6c 73 3d 3d 69 64 78 2e 63 6f 6c 73 22 0a  cols==idx.cols".
66a0: 20 20 20 20 22 29 22 2c 20 70 43 61 6c 6c 62 61      ")", pCallba
66b0: 63 6b 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  ck.  );.  if( rc
66c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
66d0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 65 74 75  turn rc;..  retu
66e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
66f0: 65 20 47 45 4e 46 4b 45 59 5f 45 52 52 4f 52 20  e GENFKEY_ERROR 
6700: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
6710: 65 20 47 45 4e 46 4b 45 59 5f 44 52 4f 50 54 52  e GENFKEY_DROPTR
6720: 49 47 47 45 52 20 20 20 32 0a 23 64 65 66 69 6e  IGGER   2.#defin
6730: 65 20 47 45 4e 46 4b 45 59 5f 43 52 45 41 54 45  e GENFKEY_CREATE
6740: 54 52 49 47 47 45 52 20 33 0a 73 74 61 74 69 63  TRIGGER 3.static
6750: 20 69 6e 74 20 67 65 6e 66 6b 65 79 5f 63 72 65   int genfkey_cre
6760: 61 74 65 5f 74 72 69 67 67 65 72 73 28 0a 20 20  ate_triggers(.  
6770: 73 71 6c 69 74 65 33 20 2a 73 64 62 2c 20 20 20  sqlite3 *sdb,   
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6790: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
67a0: 6f 6e 20 74 6f 20 72 65 61 64 20 73 63 68 65 6d  on to read schem
67b0: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 63 6f 6e 73  a from */.  cons
67c0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 62 20 74   /* Name of db t
67f0: 6f 20 72 65 61 64 20 28 22 6d 61 69 6e 22 2c 20  o read ("main", 
6800: 22 74 65 6d 70 22 29 20 2a 2f 0a 20 20 76 6f 69  "temp") */.  voi
6810: 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  d *pCtx,        
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69    /* Context poi
6840: 6e 74 65 72 20 74 6f 20 70 61 73 73 20 74 6f 20  nter to pass to 
6850: 78 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 28  xData */.  int (
6860: 2a 78 44 61 74 61 29 28 76 6f 69 64 20 2a 2c 20  *xData)(void *, 
6870: 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  int, const char 
6880: 2a 29 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *).){.  const ch
6890: 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 20 20 22  ar *zSql =.    "
68a0: 53 45 4c 45 43 54 20 6d 75 6c 74 69 72 65 70 6c  SELECT multirepl
68b0: 61 63 65 28 27 22 0a 0a 20 20 20 20 20 20 22 2d  ace('"..      "-
68c0: 2d 20 54 72 69 67 67 65 72 73 20 66 6f 72 20 66  - Triggers for f
68d0: 6f 72 65 69 67 6e 20 6b 65 79 20 6d 61 70 70 69  oreign key mappi
68e0: 6e 67 3a 5c 6e 22 0a 20 20 20 20 20 20 22 2d 2d  ng:\n".      "--
68f0: 5c 6e 22 0a 20 20 20 20 20 20 22 2d 2d 20 20 20  \n".      "--   
6900: 20 20 2f 66 72 6f 6d 5f 72 65 61 64 61 62 6c 65    /from_readable
6910: 2f 20 52 45 46 45 52 45 4e 43 45 53 20 2f 74 6f  / REFERENCES /to
6920: 5f 72 65 61 64 61 62 6c 65 2f 5c 6e 22 0a 20 20  _readable/\n".  
6930: 20 20 20 20 22 2d 2d 20 20 20 20 20 6f 6e 20 64      "--     on d
6940: 65 6c 65 74 65 20 2f 6f 6e 5f 64 65 6c 65 74 65  elete /on_delete
6950: 2f 5c 6e 22 0a 20 20 20 20 20 20 22 2d 2d 20 20  /\n".      "--  
6960: 20 20 20 6f 6e 20 75 70 64 61 74 65 20 2f 6f 6e     on update /on
6970: 5f 75 70 64 61 74 65 2f 5c 6e 22 0a 20 20 20 20  _update/\n".    
6980: 20 20 22 2d 2d 5c 6e 22 0a 0a 20 20 20 20 20 20    "--\n"..      
6990: 2f 2a 20 54 68 65 20 22 42 45 46 4f 52 45 20 49  /* The "BEFORE I
69a0: 4e 53 45 52 54 20 4f 4e 20 3c 72 65 66 65 72 65  NSERT ON <refere
69b0: 6e 63 69 6e 67 3e 22 20 74 72 69 67 67 65 72 2e  ncing>" trigger.
69c0: 20 54 68 69 73 20 74 72 69 67 67 65 72 27 73 20   This trigger's 
69d0: 6a 6f 62 20 69 73 20 74 6f 0a 20 20 20 20 20 20  job is to.      
69e0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65  ** throw an exce
69f0: 70 74 69 6f 6e 20 69 66 20 74 68 65 20 75 73 65  ption if the use
6a00: 72 20 74 72 69 65 73 20 74 6f 20 69 6e 73 65 72  r tries to inser
6a10: 74 20 61 20 72 6f 77 20 69 6e 74 6f 20 74 68 65  t a row into the
6a20: 0a 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65  .      ** refere
6a30: 6e 63 69 6e 67 20 74 61 62 6c 65 20 66 6f 72 20  ncing table for 
6a40: 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20 6e  which there is n
6a50: 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  o corresponding 
6a60: 72 6f 77 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  row in.      ** 
6a70: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
6a80: 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  able..      */. 
6a90: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 52 49       "CREATE TRI
6aa0: 47 47 45 52 20 2f 6e 61 6d 65 2f 5f 69 6e 73 65  GGER /name/_inse
6ab0: 72 74 5f 72 65 66 65 72 65 6e 63 69 6e 67 20 42  rt_referencing B
6ac0: 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20  EFORE INSERT ON 
6ad0: 2f 74 62 6c 2f 20 57 48 45 4e 20 5c 6e 22 0a 20  /tbl/ WHEN \n". 
6ae0: 20 20 20 20 20 22 20 20 20 20 2f 6b 65 79 5f 6e       "    /key_n
6af0: 6f 74 6e 75 6c 6c 2f 20 41 4e 44 20 4e 4f 54 20  otnull/ AND NOT 
6b00: 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 31  EXISTS (SELECT 1
6b10: 20 46 52 4f 4d 20 2f 72 65 66 2f 20 57 48 45 52   FROM /ref/ WHER
6b20: 45 20 2f 63 6f 6e 64 31 2f 29 5c 6e 22 20 0a 20  E /cond1/)\n" . 
6b30: 20 20 20 20 20 22 42 45 47 49 4e 5c 6e 22 0a 20       "BEGIN\n". 
6b40: 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
6b50: 20 52 41 49 53 45 28 41 42 4f 52 54 2c 20 27 27   RAISE(ABORT, ''
6b60: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
6b70: 64 27 27 29 3b 5c 6e 22 0a 20 20 20 20 20 20 22  d'');\n".      "
6b80: 45 4e 44 3b 5c 6e 22 0a 0a 20 20 20 20 20 20 2f  END;\n"..      /
6b90: 2a 20 54 68 65 20 22 42 45 46 4f 52 45 20 55 50  * The "BEFORE UP
6ba0: 44 41 54 45 20 4f 4e 20 3c 72 65 66 65 72 65 6e  DATE ON <referen
6bb0: 63 69 6e 67 3e 22 20 74 72 69 67 67 65 72 2e 20  cing>" trigger. 
6bc0: 54 68 69 73 20 74 72 69 67 67 65 72 27 73 20 6a  This trigger's j
6bd0: 6f 62 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ob .      ** is 
6be0: 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65  to throw an exce
6bf0: 70 74 69 6f 6e 20 69 66 20 74 68 65 20 75 73 65  ption if the use
6c00: 72 20 74 72 69 65 73 20 74 6f 20 75 70 64 61 74  r tries to updat
6c10: 65 20 61 20 72 6f 77 20 69 6e 20 74 68 65 0a 20  e a row in the. 
6c20: 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63       ** referenc
6c30: 69 6e 67 20 74 61 62 6c 65 20 63 61 75 73 69 6e  ing table causin
6c40: 67 20 69 74 20 74 6f 20 63 6f 72 72 65 73 70 6f  g it to correspo
6c50: 6e 64 20 74 6f 20 6e 6f 20 72 6f 77 20 69 6e 20  nd to no row in 
6c60: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 66  the.      ** ref
6c70: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 0a 20  erenced table.. 
6c80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 22 43       */.      "C
6c90: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 2f 6e  REATE TRIGGER /n
6ca0: 61 6d 65 2f 5f 75 70 64 61 74 65 5f 72 65 66 65  ame/_update_refe
6cb0: 72 65 6e 63 69 6e 67 20 42 45 46 4f 52 45 5c 6e  rencing BEFORE\n
6cc0: 22 0a 20 20 20 20 20 20 22 20 20 20 20 55 50 44  ".      "    UPD
6cd0: 41 54 45 20 4f 46 20 2f 72 6b 65 79 5f 6c 69 73  ATE OF /rkey_lis
6ce0: 74 2f 20 4f 4e 20 2f 74 62 6c 2f 20 57 48 45 4e  t/ ON /tbl/ WHEN
6cf0: 20 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20   \n".      "    
6d00: 2f 6b 65 79 5f 6e 6f 74 6e 75 6c 6c 2f 20 41 4e  /key_notnull/ AN
6d10: 44 20 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20  D \n".      "   
6d20: 20 4e 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c   NOT EXISTS (SEL
6d30: 45 43 54 20 31 20 46 52 4f 4d 20 2f 72 65 66 2f  ECT 1 FROM /ref/
6d40: 20 57 48 45 52 45 20 2f 63 6f 6e 64 31 2f 29 5c   WHERE /cond1/)\
6d50: 6e 22 20 0a 20 20 20 20 20 20 22 42 45 47 49 4e  n" .      "BEGIN
6d60: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 20 20 53  \n".        "  S
6d70: 45 4c 45 43 54 20 52 41 49 53 45 28 41 42 4f 52  ELECT RAISE(ABOR
6d80: 54 2c 20 27 27 63 6f 6e 73 74 72 61 69 6e 74 20  T, ''constraint 
6d90: 66 61 69 6c 65 64 27 27 29 3b 5c 6e 22 0a 20 20  failed'');\n".  
6da0: 20 20 20 20 22 45 4e 44 3b 5c 6e 22 0a 0a 0a 20      "END;\n"... 
6db0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 42 45 46       /* The "BEF
6dc0: 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 3c 72  ORE DELETE ON <r
6dd0: 65 66 65 72 65 6e 63 65 64 3e 22 20 74 72 69 67  eferenced>" trig
6de0: 67 65 72 2e 20 54 68 69 73 20 74 72 69 67 67 65  ger. This trigge
6df0: 72 27 73 20 6a 6f 62 20 0a 20 20 20 20 20 20 2a  r's job .      *
6e00: 2a 20 69 73 20 74 6f 20 64 65 74 65 63 74 20 77  * is to detect w
6e10: 68 65 6e 20 61 20 72 6f 77 20 69 73 20 64 65 6c  hen a row is del
6e20: 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65  eted from the re
6e30: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 74  ferenced table t
6e40: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63  o .      ** whic
6e50: 68 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65  h rows in the re
6e60: 66 65 72 65 6e 63 69 6e 67 20 74 61 62 6c 65 20  ferencing table 
6e70: 63 6f 72 72 65 73 70 6f 6e 64 2e 20 54 68 65 20  correspond. The 
6e80: 61 63 74 69 6f 6e 20 74 61 6b 65 6e 0a 20 20 20  action taken.   
6e90: 20 20 20 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e     ** depends on
6ea0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
6eb0: 65 20 27 4f 4e 20 44 45 4c 45 54 45 27 20 63 6c  e 'ON DELETE' cl
6ec0: 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ause..      */. 
6ed0: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 52 49       "CREATE TRI
6ee0: 47 47 45 52 20 2f 6e 61 6d 65 2f 5f 64 65 6c 65  GGER /name/_dele
6ef0: 74 65 5f 72 65 66 65 72 65 6e 63 65 64 20 42 45  te_referenced BE
6f00: 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 2f  FORE DELETE ON /
6f10: 72 65 66 2f 20 57 48 45 4e 5c 6e 22 0a 20 20 20  ref/ WHEN\n".   
6f20: 20 20 20 22 20 20 20 20 45 58 49 53 54 53 20 28     "    EXISTS (
6f30: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 2f 74  SELECT 1 FROM /t
6f40: 62 6c 2f 20 57 48 45 52 45 20 2f 63 6f 6e 64 32  bl/ WHERE /cond2
6f50: 2f 29 5c 6e 22 0a 20 20 20 20 20 20 22 42 45 47  /)\n".      "BEG
6f60: 49 4e 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 2f  IN\n".      "  /
6f70: 64 65 6c 65 74 65 5f 61 63 74 69 6f 6e 2f 5c 6e  delete_action/\n
6f80: 22 0a 20 20 20 20 20 20 22 45 4e 44 3b 5c 6e 22  ".      "END;\n"
6f90: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  ..      /* The "
6fa0: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
6fb0: 3c 72 65 66 65 72 65 6e 63 65 64 3e 22 20 74 72  <referenced>" tr
6fc0: 69 67 67 65 72 2e 20 54 68 69 73 20 74 72 69 67  igger. This trig
6fd0: 67 65 72 27 73 20 6a 6f 62 20 0a 20 20 20 20 20  ger's job .     
6fe0: 20 2a 2a 20 69 73 20 74 6f 20 64 65 74 65 63 74   ** is to detect
6ff0: 20 77 68 65 6e 20 74 68 65 20 6b 65 79 20 63 6f   when the key co
7000: 6c 75 6d 6e 73 20 6f 66 20 61 20 72 6f 77 20 69  lumns of a row i
7010: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
7020: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
7030: 20 74 6f 20 77 68 69 63 68 20 6f 6e 65 20 6f 72   to which one or
7040: 20 6d 6f 72 65 20 72 6f 77 73 20 69 6e 20 74 68   more rows in th
7050: 65 20 72 65 66 65 72 65 6e 63 69 6e 67 20 74 61  e referencing ta
7060: 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 20 61  ble correspond a
7070: 72 65 0a 20 20 20 20 20 20 2a 2a 20 75 70 64 61  re.      ** upda
7080: 74 65 64 2e 20 54 68 65 20 61 63 74 69 6f 6e 20  ted. The action 
7090: 74 61 6b 65 6e 20 64 65 70 65 6e 64 73 20 6f 6e  taken depends on
70a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
70b0: 65 20 27 4f 4e 20 55 50 44 41 54 45 27 20 0a 20  e 'ON UPDATE' . 
70c0: 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a       ** clause..
70d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 22        */.      "
70e0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 2f  CREATE TRIGGER /
70f0: 6e 61 6d 65 2f 5f 75 70 64 61 74 65 5f 72 65 66  name/_update_ref
7100: 65 72 65 6e 63 65 64 20 41 46 54 45 52 5c 6e 22  erenced AFTER\n"
7110: 0a 20 20 20 20 20 20 22 20 20 20 20 55 50 44 41  .      "    UPDA
7120: 54 45 20 4f 46 20 2f 66 6b 65 79 5f 6c 69 73 74  TE OF /fkey_list
7130: 2f 20 4f 4e 20 2f 72 65 66 2f 20 57 48 45 4e 20  / ON /ref/ WHEN 
7140: 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20 45  \n".      "    E
7150: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 31 20  XISTS (SELECT 1 
7160: 46 52 4f 4d 20 2f 74 62 6c 2f 20 57 48 45 52 45  FROM /tbl/ WHERE
7170: 20 2f 63 6f 6e 64 32 2f 29 5c 6e 22 0a 20 20 20   /cond2/)\n".   
7180: 20 20 20 22 42 45 47 49 4e 5c 6e 22 0a 20 20 20     "BEGIN\n".   
7190: 20 20 20 22 20 20 2f 75 70 64 61 74 65 5f 61 63     "  /update_ac
71a0: 74 69 6f 6e 2f 5c 6e 22 0a 20 20 20 20 20 20 22  tion/\n".      "
71b0: 45 4e 44 3b 5c 6e 22 0a 20 20 20 20 22 27 22 0a  END;\n".    "'".
71c0: 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 61 72  .    /* These ar
71d0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 53 51  e used in the SQ
71e0: 4c 20 63 6f 6d 6d 65 6e 74 20 77 72 69 74 74 65  L comment writte
71f0: 6e 20 61 62 6f 76 65 20 65 61 63 68 20 73 65 74  n above each set
7200: 20 6f 66 20 74 72 69 67 67 65 72 73 20 2a 2f 0a   of triggers */.
7210: 20 20 20 20 22 2c 20 27 2f 66 72 6f 6d 5f 72 65      ", '/from_re
7220: 61 64 61 62 6c 65 2f 27 2c 20 20 66 72 6f 6d 5f  adable/',  from_
7230: 74 62 6c 20 7c 7c 20 27 28 27 20 7c 7c 20 73 6a  tbl || '(' || sj
7240: 28 66 72 6f 6d 5f 63 6f 6c 2c 20 27 2c 20 27 29  (from_col, ', ')
7250: 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20   || ')'".    ", 
7260: 27 2f 74 6f 5f 72 65 61 64 61 62 6c 65 2f 27 2c  '/to_readable/',
7270: 20 20 20 20 74 6f 5f 74 62 6c 20 7c 7c 20 27 28      to_tbl || '(
7280: 27 20 7c 7c 20 73 6a 28 74 6f 5f 63 6f 6c 2c 20  ' || sj(to_col, 
7290: 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20  ', ') || ')'".  
72a0: 20 20 22 2c 20 27 2f 6f 6e 5f 64 65 6c 65 74 65    ", '/on_delete
72b0: 2f 27 2c 20 6f 6e 5f 64 65 6c 65 74 65 22 0a 20  /', on_delete". 
72c0: 20 20 20 22 2c 20 27 2f 6f 6e 5f 75 70 64 61 74     ", '/on_updat
72d0: 65 2f 27 2c 20 6f 6e 5f 75 70 64 61 74 65 22 0a  e/', on_update".
72e0: 0a 20 20 20 20 22 2c 20 27 2f 6e 61 6d 65 2f 27  .    ", '/name/'
72f0: 2c 20 20 20 27 67 65 6e 66 6b 65 79 27 20 7c 7c  ,   'genfkey' ||
7300: 20 6d 69 6e 28 72 6f 77 69 64 29 22 0a 20 20 20   min(rowid)".   
7310: 20 22 2c 20 27 2f 74 62 6c 2f 27 2c 20 20 20 20   ", '/tbl/',    
7320: 64 71 28 66 72 6f 6d 5f 74 62 6c 29 22 0a 20 20  dq(from_tbl)".  
7330: 20 20 22 2c 20 27 2f 72 65 66 2f 27 2c 20 20 20    ", '/ref/',   
7340: 20 64 71 28 74 6f 5f 74 62 6c 29 22 0a 20 20 20   dq(to_tbl)".   
7350: 20 22 2c 20 27 2f 6b 65 79 5f 6e 6f 74 6e 75 6c   ", '/key_notnul
7360: 6c 2f 27 2c 20 73 6a 28 27 6e 65 77 2e 27 20 7c  l/', sj('new.' |
7370: 7c 20 64 71 28 66 72 6f 6d 5f 63 6f 6c 29 20 7c  | dq(from_col) |
7380: 7c 20 27 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 27  | ' IS NOT NULL'
7390: 2c 20 27 20 41 4e 44 20 27 29 22 0a 0a 20 20 20  , ' AND ')"..   
73a0: 20 22 2c 20 27 2f 66 6b 65 79 5f 6c 69 73 74 2f   ", '/fkey_list/
73b0: 27 2c 20 73 6a 28 64 71 28 74 6f 5f 63 6f 6c 29  ', sj(dq(to_col)
73c0: 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 2c 20  , ', ')".    ", 
73d0: 27 2f 72 6b 65 79 5f 6c 69 73 74 2f 27 2c 20 73  '/rkey_list/', s
73e0: 6a 28 64 71 28 66 72 6f 6d 5f 63 6f 6c 29 2c 20  j(dq(from_col), 
73f0: 27 2c 20 27 29 22 0a 0a 20 20 20 20 22 2c 20 27  ', ')"..    ", '
7400: 2f 63 6f 6e 64 31 2f 27 2c 20 20 73 6a 28 6d 75  /cond1/',  sj(mu
7410: 6c 74 69 72 65 70 6c 61 63 65 28 27 6e 65 77 2e  ltireplace('new.
7420: 2f 66 72 6f 6d 2f 20 3d 3d 20 2f 74 6f 2f 27 22  /from/ == /to/'"
7430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7440: 20 20 20 20 22 2c 20 27 2f 66 72 6f 6d 2f 27 2c      ", '/from/',
7450: 20 64 71 28 66 72 6f 6d 5f 63 6f 6c 29 22 0a 20   dq(from_col)". 
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 20 20 22 2c 20 27 2f 74 6f 2f 27 2c 20 20 20 64    ", '/to/',   d
7480: 71 28 74 6f 5f 63 6f 6c 29 22 0a 20 20 20 20 20  q(to_col)".     
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
74a0: 2c 20 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20  , ' AND ')".    
74b0: 22 2c 20 27 2f 63 6f 6e 64 32 2f 27 2c 20 20 73  ", '/cond2/',  s
74c0: 6a 28 6d 75 6c 74 69 72 65 70 6c 61 63 65 28 27  j(multireplace('
74d0: 6f 6c 64 2e 2f 74 6f 2f 20 3d 3d 20 2f 66 72 6f  old./to/ == /fro
74e0: 6d 2f 27 22 0a 20 20 20 20 20 20 20 20 20 20 20  m/'".           
74f0: 20 20 20 20 20 20 20 20 22 2c 20 27 2f 66 72 6f          ", '/fro
7500: 6d 2f 27 2c 20 64 71 28 66 72 6f 6d 5f 63 6f 6c  m/', dq(from_col
7510: 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
7520: 20 20 20 20 20 20 22 2c 20 27 2f 74 6f 2f 27 2c        ", '/to/',
7530: 20 20 20 64 71 28 74 6f 5f 63 6f 6c 29 22 0a 20     dq(to_col)". 
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 20 20 22 29 2c 20 27 20 41 4e 44 20 27 29 22 0a    "), ' AND ')".
7560: 0a 20 20 20 20 22 2c 20 27 2f 75 70 64 61 74 65  .    ", '/update
7570: 5f 61 63 74 69 6f 6e 2f 27 2c 20 43 41 53 45 20  _action/', CASE 
7580: 6f 6e 5f 75 70 64 61 74 65 20 22 0a 20 20 20 20  on_update ".    
7590: 20 20 22 57 48 45 4e 20 27 53 45 54 20 4e 55 4c    "WHEN 'SET NUL
75a0: 4c 27 20 54 48 45 4e 20 22 0a 20 20 20 20 20 20  L' THEN ".      
75b0: 20 20 22 6d 75 6c 74 69 72 65 70 6c 61 63 65 28    "multireplace(
75c0: 27 55 50 44 41 54 45 20 2f 74 62 6c 2f 20 53 45  'UPDATE /tbl/ SE
75d0: 54 20 2f 73 65 74 6c 69 73 74 2f 20 57 48 45 52  T /setlist/ WHER
75e0: 45 20 2f 77 68 65 72 65 2f 3b 27 20 22 0a 20 20  E /where/;' ".  
75f0: 20 20 20 20 20 20 22 2c 20 27 2f 73 65 74 6c 69        ", '/setli
7600: 73 74 2f 27 2c 20 73 6a 28 64 71 28 66 72 6f 6d  st/', sj(dq(from
7610: 5f 63 6f 6c 29 7c 7c 27 20 3d 20 4e 55 4c 4c 27  _col)||' = NULL'
7620: 2c 27 2c 20 27 29 22 0a 20 20 20 20 20 20 20 20  ,', ')".        
7630: 22 2c 20 27 2f 74 62 6c 2f 27 2c 20 20 20 20 20  ", '/tbl/',     
7640: 64 71 28 66 72 6f 6d 5f 74 62 6c 29 22 0a 20 20  dq(from_tbl)".  
7650: 20 20 20 20 20 20 22 2c 20 27 2f 77 68 65 72 65        ", '/where
7660: 2f 27 2c 20 20 20 73 6a 28 64 71 28 66 72 6f 6d  /',   sj(dq(from
7670: 5f 63 6f 6c 29 7c 7c 27 20 3d 20 6f 6c 64 2e 27  _col)||' = old.'
7680: 7c 7c 64 71 28 74 6f 5f 63 6f 6c 29 2c 27 20 41  ||dq(to_col),' A
7690: 4e 44 20 27 29 22 0a 20 20 20 20 20 20 20 20 22  ND ')".        "
76a0: 29 22 0a 20 20 20 20 20 20 22 57 48 45 4e 20 27  )".      "WHEN '
76b0: 43 41 53 43 41 44 45 27 20 54 48 45 4e 20 22 0a  CASCADE' THEN ".
76c0: 20 20 20 20 20 20 20 20 22 6d 75 6c 74 69 72 65          "multire
76d0: 70 6c 61 63 65 28 27 55 50 44 41 54 45 20 2f 74  place('UPDATE /t
76e0: 62 6c 2f 20 53 45 54 20 2f 73 65 74 6c 69 73 74  bl/ SET /setlist
76f0: 2f 20 57 48 45 52 45 20 2f 77 68 65 72 65 2f 3b  / WHERE /where/;
7700: 27 20 22 0a 20 20 20 20 20 20 20 20 22 2c 20 27  ' ".        ", '
7710: 2f 73 65 74 6c 69 73 74 2f 27 2c 20 73 6a 28 64  /setlist/', sj(d
7720: 71 28 66 72 6f 6d 5f 63 6f 6c 29 7c 7c 27 20 3d  q(from_col)||' =
7730: 20 6e 65 77 2e 27 7c 7c 64 71 28 74 6f 5f 63 6f   new.'||dq(to_co
7740: 6c 29 2c 27 2c 20 27 29 22 0a 20 20 20 20 20 20  l),', ')".      
7750: 20 20 22 2c 20 27 2f 74 62 6c 2f 27 2c 20 20 20    ", '/tbl/',   
7760: 20 20 64 71 28 66 72 6f 6d 5f 74 62 6c 29 22 0a    dq(from_tbl)".
7770: 20 20 20 20 20 20 20 20 22 2c 20 27 2f 77 68 65          ", '/whe
7780: 72 65 2f 27 2c 20 20 20 73 6a 28 64 71 28 66 72  re/',   sj(dq(fr
7790: 6f 6d 5f 63 6f 6c 29 7c 7c 27 20 3d 20 6f 6c 64  om_col)||' = old
77a0: 2e 27 7c 7c 64 71 28 74 6f 5f 63 6f 6c 29 2c 27  .'||dq(to_col),'
77b0: 20 41 4e 44 20 27 29 22 0a 20 20 20 20 20 20 20   AND ')".       
77c0: 20 22 29 22 0a 20 20 20 20 20 20 22 45 4c 53 45   ")".      "ELSE
77d0: 20 22 0a 20 20 20 20 20 20 22 20 20 27 53 45 4c   ".      "  'SEL
77e0: 45 43 54 20 52 41 49 53 45 28 41 42 4f 52 54 2c  ECT RAISE(ABORT,
77f0: 20 27 27 63 6f 6e 73 74 72 61 69 6e 74 20 66 61   ''constraint fa
7800: 69 6c 65 64 27 27 29 3b 27 22 0a 20 20 20 20 20  iled'');'".     
7810: 20 22 45 4e 44 20 22 0a 0a 20 20 20 20 22 2c 20   "END "..    ", 
7820: 27 2f 64 65 6c 65 74 65 5f 61 63 74 69 6f 6e 2f  '/delete_action/
7830: 27 2c 20 43 41 53 45 20 6f 6e 5f 64 65 6c 65 74  ', CASE on_delet
7840: 65 20 22 0a 20 20 20 20 20 20 22 57 48 45 4e 20  e ".      "WHEN 
7850: 27 53 45 54 20 4e 55 4c 4c 27 20 54 48 45 4e 20  'SET NULL' THEN 
7860: 22 0a 20 20 20 20 20 20 20 20 22 6d 75 6c 74 69  ".        "multi
7870: 72 65 70 6c 61 63 65 28 27 55 50 44 41 54 45 20  replace('UPDATE 
7880: 2f 74 62 6c 2f 20 53 45 54 20 2f 73 65 74 6c 69  /tbl/ SET /setli
7890: 73 74 2f 20 57 48 45 52 45 20 2f 77 68 65 72 65  st/ WHERE /where
78a0: 2f 3b 27 20 22 0a 20 20 20 20 20 20 20 20 22 2c  /;' ".        ",
78b0: 20 27 2f 73 65 74 6c 69 73 74 2f 27 2c 20 73 6a   '/setlist/', sj
78c0: 28 64 71 28 66 72 6f 6d 5f 63 6f 6c 29 7c 7c 27  (dq(from_col)||'
78d0: 20 3d 20 4e 55 4c 4c 27 2c 27 2c 20 27 29 22 0a   = NULL',', ')".
78e0: 20 20 20 20 20 20 20 20 22 2c 20 27 2f 74 62 6c          ", '/tbl
78f0: 2f 27 2c 20 20 20 20 20 64 71 28 66 72 6f 6d 5f  /',     dq(from_
7900: 74 62 6c 29 22 0a 20 20 20 20 20 20 20 20 22 2c  tbl)".        ",
7910: 20 27 2f 77 68 65 72 65 2f 27 2c 20 20 20 73 6a   '/where/',   sj
7920: 28 64 71 28 66 72 6f 6d 5f 63 6f 6c 29 7c 7c 27  (dq(from_col)||'
7930: 20 3d 20 6f 6c 64 2e 27 7c 7c 64 71 28 74 6f 5f   = old.'||dq(to_
7940: 63 6f 6c 29 2c 27 20 41 4e 44 20 27 29 22 0a 20  col),' AND ')". 
7950: 20 20 20 20 20 20 20 22 29 22 0a 20 20 20 20 20         ")".     
7960: 20 22 57 48 45 4e 20 27 43 41 53 43 41 44 45 27   "WHEN 'CASCADE'
7970: 20 54 48 45 4e 20 22 0a 20 20 20 20 20 20 20 20   THEN ".        
7980: 22 6d 75 6c 74 69 72 65 70 6c 61 63 65 28 27 44  "multireplace('D
7990: 45 4c 45 54 45 20 46 52 4f 4d 20 2f 74 62 6c 2f  ELETE FROM /tbl/
79a0: 20 57 48 45 52 45 20 2f 77 68 65 72 65 2f 3b 27   WHERE /where/;'
79b0: 20 22 0a 20 20 20 20 20 20 20 20 22 2c 20 27 2f   ".        ", '/
79c0: 74 62 6c 2f 27 2c 20 20 20 20 20 64 71 28 66 72  tbl/',     dq(fr
79d0: 6f 6d 5f 74 62 6c 29 22 0a 20 20 20 20 20 20 20  om_tbl)".       
79e0: 20 22 2c 20 27 2f 77 68 65 72 65 2f 27 2c 20 20   ", '/where/',  
79f0: 20 73 6a 28 64 71 28 66 72 6f 6d 5f 63 6f 6c 29   sj(dq(from_col)
7a00: 7c 7c 27 20 3d 20 6f 6c 64 2e 27 7c 7c 64 71 28  ||' = old.'||dq(
7a10: 74 6f 5f 63 6f 6c 29 2c 27 20 41 4e 44 20 27 29  to_col),' AND ')
7a20: 22 0a 20 20 20 20 20 20 20 20 22 29 22 0a 20 20  ".        ")".  
7a30: 20 20 20 20 22 45 4c 53 45 20 22 0a 20 20 20 20      "ELSE ".    
7a40: 20 20 22 20 20 27 53 45 4c 45 43 54 20 52 41 49    "  'SELECT RAI
7a50: 53 45 28 41 42 4f 52 54 2c 20 27 27 63 6f 6e 73  SE(ABORT, ''cons
7a60: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 27 27 29  traint failed'')
7a70: 3b 27 22 0a 20 20 20 20 20 20 22 45 4e 44 20 22  ;'".      "END "
7a80: 0a 0a 20 20 20 20 22 29 20 46 52 4f 4d 20 74 65  ..    ") FROM te
7a90: 6d 70 2e 66 6b 65 79 20 22 0a 20 20 20 20 22 47  mp.fkey ".    "G
7aa0: 52 4f 55 50 20 42 59 20 66 72 6f 6d 5f 74 62 6c  ROUP BY from_tbl
7ab0: 2c 20 66 6b 69 64 22 0a 20 20 3b 0a 0a 20 20 69  , fkid".  ;..  i
7ac0: 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 69  nt rc;.  const i
7ad0: 6e 74 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  nt enc = SQLITE_
7ae0: 55 54 46 38 3b 0a 20 20 73 71 6c 69 74 65 33 20  UTF8;.  sqlite3 
7af0: 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 47 65 6e 66  *db = 0;..  Genf
7b00: 6b 65 79 43 62 20 63 62 3b 0a 20 20 63 62 2e 78  keyCb cb;.  cb.x
7b10: 44 61 74 61 20 3d 20 78 44 61 74 61 3b 0a 20 20  Data = xData;.  
7b20: 63 62 2e 70 43 74 78 20 3d 20 70 43 74 78 3b 0a  cb.pCtx = pCtx;.
7b30: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7b40: 54 45 52 28 7a 44 62 29 3b 0a 0a 20 20 2f 2a 20  TER(zDb);..  /* 
7b50: 4f 70 65 6e 20 74 68 65 20 77 6f 72 6b 69 6e 67  Open the working
7b60: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7b70: 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
7b80: 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72  te3_open(":memor
7b90: 79 3a 22 2c 20 26 64 62 29 3b 0a 20 20 69 66 28  y:", &db);.  if(
7ba0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7bb0: 20 67 6f 74 6f 20 67 65 6e 66 6b 65 79 5f 65 78   goto genfkey_ex
7bc0: 69 74 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  it;..  /* Create
7bd0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 73 63 61   the special sca
7be0: 6c 61 72 20 61 6e 64 20 61 67 67 72 65 67 61 74  lar and aggregat
7bf0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  e functions used
7c00: 20 62 79 20 74 68 69 73 20 70 72 6f 67 72 61 6d   by this program
7c10: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  . */.  sqlite3_c
7c20: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
7c30: 62 2c 20 22 64 71 22 2c 20 31 2c 20 65 6e 63 2c  b, "dq", 1, enc,
7c40: 20 30 2c 20 64 6f 75 62 6c 65 71 75 6f 74 65 2c   0, doublequote,
7c50: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
7c60: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7c70: 6e 28 64 62 2c 20 22 6d 75 6c 74 69 72 65 70 6c  n(db, "multirepl
7c80: 61 63 65 22 2c 20 2d 31 2c 20 65 6e 63 2c 20 64  ace", -1, enc, d
7c90: 62 2c 20 6d 75 6c 74 69 72 65 70 6c 61 63 65 2c  b, multireplace,
7ca0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
7cb0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7cc0: 6e 28 64 62 2c 20 22 73 6a 22 2c 20 32 2c 20 65  n(db, "sj", 2, e
7cd0: 6e 63 2c 20 30 2c 20 30 2c 20 6a 6f 69 6e 53 74  nc, 0, 0, joinSt
7ce0: 65 70 2c 20 6a 6f 69 6e 46 69 6e 61 6c 69 7a 65  ep, joinFinalize
7cf0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c  );..  /* Install
7d00: 20 74 68 65 20 22 73 63 68 65 6d 61 22 20 76 69   the "schema" vi
7d10: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
7d20: 6c 65 20 2a 2f 0a 20 20 69 6e 73 74 61 6c 6c 53  le */.  installS
7d30: 63 68 65 6d 61 4d 6f 64 75 6c 65 28 64 62 2c 20  chemaModule(db, 
7d40: 73 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  sdb);..  /* Crea
7d50: 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
7d60: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 69 74  a temp table wit
7d70: 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
7d80: 6e 20 72 65 71 75 69 72 65 64 20 74 6f 0a 20 20  n required to.  
7d90: 2a 2a 20 62 75 69 6c 64 20 74 68 65 20 66 6f 72  ** build the for
7da0: 65 69 67 6e 20 6b 65 79 20 74 72 69 67 67 65 72  eign key trigger
7db0: 73 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 20  s. See function 
7dc0: 70 6f 70 75 6c 61 74 65 54 65 6d 70 54 61 62 6c  populateTempTabl
7dd0: 65 28 29 0a 20 20 2a 2a 20 66 6f 72 20 64 65 74  e().  ** for det
7de0: 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 63 62 2e  ails..  */.  cb.
7df0: 65 54 79 70 65 20 3d 20 47 45 4e 46 4b 45 59 5f  eType = GENFKEY_
7e00: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 6f  ERROR;.  rc = po
7e10: 70 75 6c 61 74 65 54 65 6d 70 54 61 62 6c 65 28  pulateTempTable(
7e20: 64 62 2c 20 26 63 62 29 3b 0a 20 20 69 66 28 20  db, &cb);.  if( 
7e30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7e40: 67 6f 74 6f 20 67 65 6e 66 6b 65 79 5f 65 78 69  goto genfkey_exi
7e50: 74 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20  t;..  /* Unless 
7e60: 74 68 65 20 2d 2d 6e 6f 2d 64 72 6f 70 20 6f 70  the --no-drop op
7e70: 74 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66 69  tion was specifi
7e80: 65 64 2c 20 67 65 6e 65 72 61 74 65 20 44 52 4f  ed, generate DRO
7e90: 50 20 54 52 49 47 47 45 52 0a 20 20 2a 2a 20 73  P TRIGGER.  ** s
7ea0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 64 72 6f  tatements to dro
7eb0: 70 20 61 6e 79 20 74 72 69 67 67 65 72 73 20 69  p any triggers i
7ec0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 67  n the database g
7ed0: 65 6e 65 72 61 74 65 64 20 62 79 20 61 0a 20 20  enerated by a.  
7ee0: 2a 2a 20 70 72 65 76 69 6f 75 73 20 72 75 6e 20  ** previous run 
7ef0: 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 2e  of this program.
7f00: 0a 20 20 2a 2f 0a 20 20 63 62 2e 65 54 79 70 65  .  */.  cb.eType
7f10: 20 3d 20 47 45 4e 46 4b 45 59 5f 44 52 4f 50 54   = GENFKEY_DROPT
7f20: 52 49 47 47 45 52 3b 0a 20 20 72 63 20 3d 20 73  RIGGER;.  rc = s
7f30: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
7f40: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 27 44 52  .    "SELECT 'DR
7f50: 4f 50 20 54 52 49 47 47 45 52 20 6d 61 69 6e 2e  OP TRIGGER main.
7f60: 27 20 7c 7c 20 64 71 28 74 72 69 67 67 65 72 6e  ' || dq(triggern
7f70: 61 6d 65 29 20 7c 7c 20 27 3b 27 20 46 52 4f 4d  ame) || ';' FROM
7f80: 20 74 72 69 67 67 65 72 73 22 0a 20 20 20 20 2c   triggers".    ,
7f90: 69 6e 76 6f 6b 65 43 61 6c 6c 62 61 63 6b 2c 20  invokeCallback, 
7fa0: 28 76 6f 69 64 20 2a 29 26 63 62 2c 20 30 0a 20  (void *)&cb, 0. 
7fb0: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
7fc0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 67  LITE_OK ) goto g
7fd0: 65 6e 66 6b 65 79 5f 65 78 69 74 3b 0a 0a 20 20  enfkey_exit;..  
7fe0: 2f 2a 20 52 75 6e 20 74 68 65 20 6d 61 69 6e 20  /* Run the main 
7ff0: 71 75 65 72 79 20 74 6f 20 63 72 65 61 74 65 20  query to create 
8000: 74 68 65 20 74 72 69 67 67 65 72 20 64 65 66 69  the trigger defi
8010: 6e 69 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 63 62  nitions. */.  cb
8020: 2e 65 54 79 70 65 20 3d 20 47 45 4e 46 4b 45 59  .eType = GENFKEY
8030: 5f 43 52 45 41 54 45 54 52 49 47 47 45 52 3b 0a  _CREATETRIGGER;.
8040: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
8050: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 69 6e  xec(db, zSql, in
8060: 76 6f 6b 65 43 61 6c 6c 62 61 63 6b 2c 20 28 76  vokeCallback, (v
8070: 6f 69 64 20 2a 29 26 63 62 2c 20 30 29 3b 0a 20  oid *)&cb, 0);. 
8080: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8090: 4f 4b 20 29 20 67 6f 74 6f 20 67 65 6e 66 6b 65  OK ) goto genfke
80a0: 79 5f 65 78 69 74 3b 0a 0a 67 65 6e 66 6b 65 79  y_exit;..genfkey
80b0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
80c0: 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 72 65  _close(db);.  re
80d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 65 6e  turn rc;.}...#en
80e0: 64 69 66 0a 2f 2a 20 45 6e 64 20 67 65 6e 66 6b  dif./* End genfk
80f0: 65 79 20 6c 6f 67 69 63 2e 20 2a 2f 0a 2f 2a 2a  ey logic. */./**
8100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8140: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  *******/./******
8150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8190: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ***/../*.** If t
81a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61  he following fla
81b0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63  g is set, then c
81c0: 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e  ommand execution
81d0: 20 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20   stops.** at an 
81e0: 65 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20  error if we are 
81f0: 6e 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e  not interactive.
8200: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
8210: 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30  ail_on_error = 0
8220: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20  ;../*.** Threat 
8230: 73 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65  stdin as an inte
8240: 72 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66  ractive input if
8250: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
8260: 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72  ariable.** is tr
8270: 75 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  ue.  Otherwise, 
8280: 61 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20  assume stdin is 
8290: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66  connected to a f
82a0: 69 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a  ile or pipe..*/.
82b0: 73 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e  static int stdin
82c0: 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20  _is_interactive 
82d0: 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  = 1;../*.** The 
82e0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65  following is the
82f0: 20 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74   open SQLite dat
8300: 61 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20  abase.  We make 
8310: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8320: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20  this database a 
8330: 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20  static variable 
8340: 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  so that it can b
8350: 65 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79  e accessed.** by
8360: 20 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64   the SIGINT hand
8370: 6c 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74  ler to interrupt
8380: 20 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73   database proces
8390: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
83a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
83b0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20  ../*.** True if 
83c0: 61 6e 20 69 6e 74 65 72 72 75 70 74 20 28 43 6f  an interrupt (Co
83d0: 6e 74 72 6f 6c 2d 43 29 20 68 61 73 20 62 65 65  ntrol-C) has bee
83e0: 6e 20 72 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73  n received..*/.s
83f0: 74 61 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 69  tatic volatile i
8400: 6e 74 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  nt seenInterrupt
8410: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   = 0;../*.** Thi
8420: 73 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  s is the name of
8430: 20 6f 75 72 20 70 72 6f 67 72 61 6d 2e 20 49 74   our program. It
8440: 20 69 73 20 73 65 74 20 69 6e 20 6d 61 69 6e 28   is set in main(
8450: 29 2c 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20  ), used.** in a 
8460: 6e 75 6d 62 65 72 20 6f 66 20 6f 74 68 65 72 20  number of other 
8470: 70 6c 61 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66  places, mostly f
8480: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
8490: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  s..*/.static cha
84a0: 72 20 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a  r *Argv0;../*.**
84b0: 20 50 72 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e   Prompt strings.
84c0: 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20   Initialized in 
84d0: 6d 61 69 6e 2e 20 53 65 74 74 61 62 6c 65 20 77  main. Settable w
84e0: 69 74 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74  ith.**   .prompt
84f0: 20 6d 61 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a   main continue.*
8500: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 6d 61  /.static char ma
8510: 69 6e 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20  inPrompt[20];   
8520: 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 6e 65 20    /* First line 
8530: 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a  prompt. default:
8540: 20 22 73 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74   "sqlite> "*/.st
8550: 61 74 69 63 20 63 68 61 72 20 63 6f 6e 74 69 6e  atic char contin
8560: 75 65 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a  uePrompt[20]; /*
8570: 20 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72   Continuation pr
8580: 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22  ompt. default: "
8590: 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a     ...> " */../*
85a0: 0a 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72  .** Write I/O tr
85b0: 61 63 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c  aces to the foll
85c0: 6f 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f  owing stream..*/
85d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
85e0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74  NABLE_IOTRACE.st
85f0: 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61  atic FILE *iotra
8600: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
8610: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8620: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72  ne works like pr
8630: 69 6e 74 66 20 69 6e 20 74 68 61 74 20 69 74 73  intf in that its
8640: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
8650: 69 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73  is a.** format s
8660: 74 72 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71  tring and subseq
8670: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61  uent arguments a
8680: 72 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  re values to be 
8690: 73 75 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69  substituted.** i
86a0: 6e 20 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65  n place of % fie
86b0: 6c 64 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  lds.  The result
86c0: 20 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74   of formatting t
86d0: 68 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  his string.** is
86e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72   written to iotr
86f0: 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ace..*/.#ifdef S
8700: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
8710: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
8720: 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63   iotracePrintf(c
8730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
8740: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
8750: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
8760: 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65  z;.  if( iotrace
8770: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8780: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
8790: 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  rmat);.  z = sql
87a0: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
87b0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
87c0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69  _end(ap);.  fpri
87d0: 6e 74 66 28 69 6f 74 72 61 63 65 2c 20 22 25 73  ntf(iotrace, "%s
87e0: 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", z);.  sqlite3
87f0: 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64  _free(z);.}.#end
8800: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  if.../*.** Deter
8810: 6d 69 6e 65 73 20 69 66 20 61 20 73 74 72 69 6e  mines if a strin
8820: 67 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66  g is a number of
8830: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
8840: 69 6e 74 20 69 73 4e 75 6d 62 65 72 28 63 6f 6e  int isNumber(con
8850: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
8860: 2a 72 65 61 6c 6e 75 6d 29 7b 0a 20 20 69 66 28  *realnum){.  if(
8870: 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d   *z=='-' || *z==
8880: 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28  '+' ) z++;.  if(
8890: 20 21 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b   !isdigit(*z) ){
88a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
88b0: 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20 69 66 28 20   }.  z++;.  if( 
88c0: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
88d0: 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  um = 0;.  while(
88e0: 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20   isdigit(*z) ){ 
88f0: 7a 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d  z++; }.  if( *z=
8900: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b  ='.' ){.    z++;
8910: 0a 20 20 20 20 69 66 28 20 21 69 73 64 69 67 69  .    if( !isdigi
8920: 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30  t(*z) ) return 0
8930: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 64  ;.    while( isd
8940: 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  igit(*z) ){ z++;
8950: 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e   }.    if( realn
8960: 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20  um ) *realnum = 
8970: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d  1;.  }.  if( *z=
8980: 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20  ='e' || *z=='E' 
8990: 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  ){.    z++;.    
89a0: 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a  if( *z=='+' || *
89b0: 7a 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  z=='-' ) z++;.  
89c0: 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a    if( !isdigit(*
89d0: 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
89e0: 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69     while( isdigi
89f0: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
8a00: 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20      if( realnum 
8a10: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a  ) *realnum = 1;.
8a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d    }.  return *z=
8a30: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 67  =0;.}../*.** A g
8a40: 6c 6f 62 61 6c 20 63 68 61 72 2a 20 61 6e 64 20  lobal char* and 
8a50: 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  an SQL function 
8a60: 74 6f 20 61 63 63 65 73 73 20 69 74 73 20 63 75  to access its cu
8a70: 72 72 65 6e 74 20 76 61 6c 75 65 20 0a 2a 2a 20  rrent value .** 
8a80: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 53  from within an S
8a90: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  QL statement. Th
8aa0: 69 73 20 70 72 6f 67 72 61 6d 20 75 73 65 64 20  is program used 
8ab0: 74 6f 20 75 73 65 20 74 68 65 20 0a 2a 2a 20 73  to use the .** s
8ac0: 71 6c 69 74 65 5f 65 78 65 63 5f 70 72 69 6e 74  qlite_exec_print
8ad0: 66 28 29 20 41 50 49 20 74 6f 20 73 75 62 73 74  f() API to subst
8ae0: 69 74 75 65 20 61 20 73 74 72 69 6e 67 20 69 6e  itue a string in
8af0: 74 6f 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  to an SQL statem
8b00: 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 63 6f 72 72  ent..** The corr
8b10: 65 63 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68  ect way to do th
8b20: 69 73 20 77 69 74 68 20 73 71 6c 69 74 65 33 20  is with sqlite3 
8b30: 69 73 20 74 6f 20 75 73 65 20 74 68 65 20 62 69  is to use the bi
8b40: 6e 64 20 41 50 49 2c 20 62 75 74 0a 2a 2a 20 73  nd API, but.** s
8b50: 69 6e 63 65 20 74 68 65 20 73 68 65 6c 6c 20 69  ince the shell i
8b60: 73 20 62 75 69 6c 74 20 61 72 6f 75 6e 64 20 74  s built around t
8b70: 68 65 20 63 61 6c 6c 62 61 63 6b 20 70 61 72 61  he callback para
8b80: 64 69 67 6d 20 69 74 20 77 6f 75 6c 64 20 62 65  digm it would be
8b90: 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 77 6f 72   a lot.** of wor
8ba0: 6b 2e 20 49 6e 73 74 65 61 64 20 6a 75 73 74 20  k. Instead just 
8bb0: 75 73 65 20 74 68 69 73 20 68 61 63 6b 2c 20 77  use this hack, w
8bc0: 68 69 63 68 20 69 73 20 71 75 69 74 65 20 68 61  hich is quite ha
8bd0: 72 6d 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  rmless..*/.stati
8be0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  c const char *zS
8bf0: 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a  hellStatic = 0;.
8c00: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
8c10: 6c 73 74 61 74 69 63 46 75 6e 63 28 0a 20 20 73  lstaticFunc(.  s
8c20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8c30: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
8c40: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
8c50: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
8c60: 20 61 73 73 65 72 74 28 20 30 3d 3d 61 72 67 63   assert( 0==argc
8c70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53   );.  assert( zS
8c80: 68 65 6c 6c 53 74 61 74 69 63 20 29 3b 0a 20 20  hellStatic );.  
8c90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8ca0: 28 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44  (argc);.  UNUSED
8cb0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29  _PARAMETER(argv)
8cc0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
8cd0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
8ce0: 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 2c 20 2d   zShellStatic, -
8cf0: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
8d00: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
8d10: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
8d20: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
8d30: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
8d40: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
8d50: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
8d60: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
8d70: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
8d80: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
8d90: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
8da0: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
8db0: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
8dc0: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
8dd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
8de0: 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72  rface is like "r
8df0: 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20  eadline" but no 
8e00: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69  command-line edi
8e10: 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e  ting.** is done.
8e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
8e30: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
8e40: 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49  har *zPrompt, FI
8e50: 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  LE *in){.  char 
8e60: 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c  *zLine;.  int nL
8e70: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ine;.  int n;.  
8e80: 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20 69 66 28 20  int eol;..  if( 
8e90: 7a 50 72 6f 6d 70 74 20 26 26 20 2a 7a 50 72 6f  zPrompt && *zPro
8ea0: 6d 70 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  mpt ){.    print
8eb0: 66 28 22 25 73 22 2c 7a 50 72 6f 6d 70 74 29 3b  f("%s",zPrompt);
8ec0: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
8ed0: 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 4c 69 6e 65  ut);.  }.  nLine
8ee0: 20 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20   = 100;.  zLine 
8ef0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20  = malloc( nLine 
8f00: 29 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d  );.  if( zLine==
8f10: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8f20: 6e 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30  n = 0;.  eol = 0
8f30: 3b 0a 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20  ;.  while( !eol 
8f40: 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30  ){.    if( n+100
8f50: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
8f60: 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20  nLine = nLine*2 
8f70: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69  + 100;.      zLi
8f80: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
8f90: 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
8fa0: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
8fb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
8fc0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
8fd0: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
8fe0: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
8ff0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
9000: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
9010: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
9020: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
9030: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
9040: 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20   0;.      eol = 
9050: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
9060: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
9070: 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b   zLine[n] ){ n++
9080: 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20  ; }.    if( n>0 
9090: 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27  && zLine[n-1]=='
90a0: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d  \n' ){.      n--
90b0: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  ;.      zLine[n]
90c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20   = 0;.      eol 
90d0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
90e0: 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63   zLine = realloc
90f0: 28 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a  ( zLine, n+1 );.
9100: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
9110: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
9120: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
9130: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
9140: 2a 0a 2a 2a 20 7a 50 72 69 6f 72 20 69 73 20 61  *.** zPrior is a
9150: 20 73 74 72 69 6e 67 20 6f 66 20 70 72 69 6f 72   string of prior
9160: 20 74 65 78 74 20 72 65 74 72 69 65 76 65 64 2e   text retrieved.
9170: 20 20 49 66 20 6e 6f 74 20 74 68 65 20 65 6d 70    If not the emp
9180: 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 74 68  ty.** string, th
9190: 65 6e 20 69 73 73 75 65 20 61 20 63 6f 6e 74 69  en issue a conti
91a0: 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 0a  nuation prompt..
91b0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
91c0: 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 63  one_input_line(c
91d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 69 6f  onst char *zPrio
91e0: 72 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  r, FILE *in){.  
91f0: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20  char *zPrompt;. 
9200: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a   char *zResult;.
9210: 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20    if( in!=0 ){. 
9220: 20 20 20 72 65 74 75 72 6e 20 6c 6f 63 61 6c 5f     return local_
9230: 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 3b 0a  getline(0, in);.
9240: 20 20 7d 0a 20 20 69 66 28 20 7a 50 72 69 6f 72    }.  if( zPrior
9250: 20 26 26 20 7a 50 72 69 6f 72 5b 30 5d 20 29 7b   && zPrior[0] ){
9260: 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20 63  .    zPrompt = c
9270: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 3b 0a 20  ontinuePrompt;. 
9280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f   }else{.    zPro
9290: 6d 70 74 20 3d 20 6d 61 69 6e 50 72 6f 6d 70 74  mpt = mainPrompt
92a0: 3b 0a 20 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20  ;.  }.  zResult 
92b0: 3d 20 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d  = readline(zProm
92c0: 70 74 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  pt);.#if defined
92d0: 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 20  (HAVE_READLINE) 
92e0: 26 26 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  && HAVE_READLINE
92f0: 3d 3d 31 0a 20 20 69 66 28 20 7a 52 65 73 75 6c  ==1.  if( zResul
9300: 74 20 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20  t && *zResult ) 
9310: 61 64 64 5f 68 69 73 74 6f 72 79 28 7a 52 65 73  add_history(zRes
9320: 75 6c 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ult);.#endif.  r
9330: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d  eturn zResult;.}
9340: 0a 0a 73 74 72 75 63 74 20 70 72 65 76 69 6f 75  ..struct previou
9350: 73 5f 6d 6f 64 65 5f 64 61 74 61 20 7b 0a 20 20  s_mode_data {.  
9360: 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20 20  int valid;      
9370: 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65    /* Is there le
9380: 67 69 74 20 64 61 74 61 20 69 6e 20 68 65 72 65  git data in here
9390: 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b  ? */.  int mode;
93a0: 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65  .  int showHeade
93b0: 72 3b 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74  r;.  int colWidt
93c0: 68 5b 31 30 30 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  h[100];.};../*.*
93d0: 2a 20 41 6e 20 70 6f 69 6e 74 65 72 20 74 6f 20  * An pointer to 
93e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
93f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
9400: 20 70 61 73 73 65 64 20 66 72 6f 6d 0a 2a 2a 20   passed from.** 
9410: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
9420: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
9430: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
9440: 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 0a 2a  to communicate.*
9450: 2a 20 73 74 61 74 65 20 61 6e 64 20 6d 6f 64 65  * state and mode
9460: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
9470: 0a 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  .struct callback
9480: 5f 64 61 74 61 20 7b 0a 20 20 73 71 6c 69 74 65  _data {.  sqlite
9490: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
94a0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
94b0: 20 2a 2f 0a 20 20 69 6e 74 20 65 63 68 6f 4f 6e   */.  int echoOn
94c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
94d0: 54 72 75 65 20 74 6f 20 65 63 68 6f 20 69 6e 70  True to echo inp
94e0: 75 74 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 20  ut commands */. 
94f0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
9500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9510: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73  r of records dis
9520: 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f  played so far */
9530: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20  .  FILE *out;   
9540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
9550: 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  te results here 
9560: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20  */.  int mode;  
9570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9580: 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65  n output mode se
9590: 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 77  tting */.  int w
95a0: 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20  ritableSchema;  
95b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41    /* True if PRA
95c0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
95d0: 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20  ema=ON */.  int 
95e0: 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20  showHeader;     
95f0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68     /* True to sh
9600: 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ow column names 
9610: 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d  in List or Colum
9620: 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  n mode */.  char
9630: 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20   *zDestTable;   
9640: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65     /* Name of de
9650: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
9660: 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74  when MODE_Insert
9670: 20 2a 2f 0a 20 20 63 68 61 72 20 73 65 70 61 72   */.  char separ
9680: 61 74 6f 72 5b 32 30 5d 3b 20 20 20 20 2f 2a 20  ator[20];    /* 
9690: 53 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  Separator charac
96a0: 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f 4c 69 73  ter for MODE_Lis
96b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69  t */.  int colWi
96c0: 64 74 68 5b 31 30 30 5d 3b 20 20 20 20 20 2f 2a  dth[100];     /*
96d0: 20 52 65 71 75 65 73 74 65 64 20 77 69 64 74 68   Requested width
96e0: 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
96f0: 77 68 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d  when in column m
9700: 6f 64 65 2a 2f 0a 20 20 69 6e 74 20 61 63 74 75  ode*/.  int actu
9710: 61 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  alWidth[100];  /
9720: 2a 20 41 63 74 75 61 6c 20 77 69 64 74 68 20 6f  * Actual width o
9730: 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f  f each column */
9740: 0a 20 20 63 68 61 72 20 6e 75 6c 6c 76 61 6c 75  .  char nullvalu
9750: 65 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 54 68 65  e[20];    /* The
9760: 20 74 65 78 74 20 74 6f 20 70 72 69 6e 74 20 77   text to print w
9770: 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73  hen a NULL comes
9780: 20 62 61 63 6b 20 66 72 6f 6d 0a 20 20 20 20 20   back from.     
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97a0: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
97b0: 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ase */.  struct 
97c0: 70 72 65 76 69 6f 75 73 5f 6d 6f 64 65 5f 64 61  previous_mode_da
97d0: 74 61 20 65 78 70 6c 61 69 6e 50 72 65 76 3b 0a  ta explainPrev;.
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 6c 64           /* Hold
9800: 73 20 74 68 65 20 6d 6f 64 65 20 69 6e 66 6f 72  s the mode infor
9810: 6d 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f  mation just befo
9820: 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  re.             
9830: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2e              ** .
9840: 65 78 70 6c 61 69 6e 20 4f 4e 20 2a 2f 0a 20 20  explain ON */.  
9850: 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c  char outfile[FIL
9860: 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46  ENAME_MAX]; /* F
9870: 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74  ilename for *out
9880: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9890: 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20   *zDbFilename;  
98a0: 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
98b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
98c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
98d0: 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75   *pStmt;   /* Cu
98e0: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
98f0: 69 66 20 61 6e 79 2e 20 2a 2f 0a 7d 3b 0a 0a 2f  if any. */.};../
9900: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
9910: 68 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73  he allowed modes
9920: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  ..*/.#define MOD
9930: 45 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a  E_Line     0  /*
9940: 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20   One column per 
9950: 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e  line.  Blank lin
9960: 65 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64  e between record
9970: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  s */.#define MOD
9980: 45 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a  E_Column   1  /*
9990: 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20   One record per 
99a0: 6c 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c  line in neat col
99b0: 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  umns */.#define 
99c0: 4d 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20  MODE_List     2 
99d0: 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70   /* One record p
99e0: 65 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73  er line with a s
99f0: 65 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66  eparator */.#def
9a00: 69 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20  ine MODE_Semi   
9a10: 20 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20    3  /* Same as 
9a20: 4d 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70  MODE_List but ap
9a30: 70 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68  pend ";" to each
9a40: 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65   line */.#define
9a50: 20 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34   MODE_Html     4
9a60: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e    /* Generate an
9a70: 20 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a   XHTML table */.
9a80: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73  #define MODE_Ins
9a90: 65 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65  ert   5  /* Gene
9aa0: 72 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74  rate SQL "insert
9ab0: 22 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  " statements */.
9ac0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c  #define MODE_Tcl
9ad0: 20 20 20 20 20 20 36 20 20 2f 2a 20 47 65 6e 65        6  /* Gene
9ae0: 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54  rate ANSI-C or T
9af0: 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e  CL quoted elemen
9b00: 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ts */.#define MO
9b10: 44 45 5f 43 73 76 20 20 20 20 20 20 37 20 20 2f  DE_Csv      7  /
9b20: 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c  * Quote strings,
9b30: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61   numbers are pla
9b40: 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  in */.#define MO
9b50: 44 45 5f 45 78 70 6c 61 69 6e 20 20 38 20 20 2f  DE_Explain  8  /
9b60: 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75  * Like MODE_Colu
9b70: 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 74  mn, but do not t
9b80: 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f 0a  runcate data */.
9b90: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
9ba0: 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d 20  ar *modeDescr[] 
9bb0: 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20 20  = {.  "line",.  
9bc0: 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69 73  "column",.  "lis
9bd0: 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20 20  t",.  "semi",.  
9be0: 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65 72  "html",.  "inser
9bf0: 74 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  t",.  "tcl",.  "
9c00: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
9c10: 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d  ",.};../*.** Num
9c20: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
9c30: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a 23  in an array.*/.#
9c40: 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a 65  define ArraySize
9c50: 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65 6f  (X)  (int)(sizeo
9c60: 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d  f(X)/sizeof(X[0]
9c70: 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  ))../*.** Comput
9c80: 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74  e a string lengt
9c90: 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65  h that is limite
9ca0: 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65  d to what can be
9cb0: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f   stored in.** lo
9cc0: 77 65 72 20 33 30 20 62 69 74 73 20 6f 66 20 61  wer 30 bits of a
9cd0: 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69   32-bit signed i
9ce0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
9cf0: 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63  c int strlen30(c
9d00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
9d10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20   const char *z2 
9d20: 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = z;.  while( *z
9d30: 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72  2 ){ z2++; }.  r
9d40: 65 74 75 72 6e 20 30 78 33 66 66 66 66 66 66 66  eturn 0x3fffffff
9d50: 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29   & (int)(z2 - z)
9d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
9d70: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
9d80: 6e 67 20 61 73 20 61 20 68 65 78 2d 65 6e 63 6f  ng as a hex-enco
9d90: 64 65 64 20 62 6c 6f 62 20 28 65 67 2e 20 58 27  ded blob (eg. X'
9da0: 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69  1234' ).*/.stati
9db0: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 65  c void output_he
9dc0: 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74  x_blob(FILE *out
9dd0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
9de0: 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b  lob, int nBlob){
9df0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
9e00: 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72 20   *zBlob = (char 
9e10: 2a 29 70 42 6c 6f 62 3b 0a 20 20 66 70 72 69 6e  *)pBlob;.  fprin
9e20: 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20  tf(out,"X'");.  
9e30: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62  for(i=0; i<nBlob
9e40: 3b 20 69 2b 2b 29 7b 20 66 70 72 69 6e 74 66 28  ; i++){ fprintf(
9e50: 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62  out,"%02x",zBlob
9e60: 5b 69 5d 29 3b 20 7d 0a 20 20 66 70 72 69 6e 74  [i]); }.  fprint
9e70: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f  f(out,"'");.}../
9e80: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
9e90: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
9ea0: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
9eb0: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
9ec0: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
9ed0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
9ee0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
9ef0: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
9f00: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9f10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53 69  int i;.  int nSi
9f20: 6e 67 6c 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ngle = 0;.  for(
9f30: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
9f40: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
9f50: 5c 27 27 20 29 20 6e 53 69 6e 67 6c 65 2b 2b 3b  \'' ) nSingle++;
9f60: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 53 69 6e 67  .  }.  if( nSing
9f70: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  le==0 ){.    fpr
9f80: 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c  intf(out,"'%s'",
9f90: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
9fa0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22   fprintf(out,"'"
9fb0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
9fc0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
9fd0: 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21  0; z[i] && z[i]!
9fe0: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
9ff0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
a000: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
a010: 6f 75 74 2c 22 27 27 22 29 3b 0a 20 20 20 20 20  out,"''");.     
a020: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 65     z++;.      }e
a030: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c  lse if( z[i]=='\
a040: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  '' ){.        fp
a050: 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 27  rintf(out,"%.*s'
a060: 27 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 20 20 20  '",i,z);.       
a070: 20 7a 20 2b 3d 20 69 2b 31 3b 0a 20 20 20 20 20   z += i+1;.     
a080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a090: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22  fprintf(out,"%s"
a0a0: 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ,z);.        bre
a0b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a0c0: 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
a0d0: 74 2c 22 27 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t,"'");.  }.}../
a0e0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
a0f0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
a100: 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69  a quoted accordi
a110: 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71  ng to C or TCL q
a120: 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f  uoting rules..*/
a130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
a140: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c  put_c_string(FIL
a150: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
a160: 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e  ar *z){.  unsign
a170: 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74  ed int c;.  fput
a180: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77  c('"', out);.  w
a190: 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b  hile( (c = *(z++
a1a0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
a1b0: 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
a1c0: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
a1d0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20  .      fputc(c, 
a1e0: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
a1f0: 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20  if( c=='\t' ){. 
a200: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
a210: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
a220: 74 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('t', out);.  
a230: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
a240: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \n' ){.      fpu
a250: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
a260: 20 20 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20       fputc('n', 
a270: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
a280: 69 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20  if( c=='\r' ){. 
a290: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
a2a0: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
a2b0: 74 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('r', out);.  
a2c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70    }else if( !isp
a2d0: 72 69 6e 74 28 63 29 20 29 7b 0a 20 20 20 20 20  rint(c) ){.     
a2e0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
a2f0: 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b  \%03o", c&0xff);
a300: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a310: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
a320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75  .    }.  }.  fpu
a330: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a  tc('"', out);.}.
a340: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
a350: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77  e given string w
a360: 69 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74  ith characters t
a370: 68 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20  hat are special 
a380: 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70  to.** HTML escap
a390: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
a3a0: 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73  id output_html_s
a3b0: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
a3c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
a3d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 77 68 69 6c  .  int i;.  whil
a3e0: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72  e( *z ){.    for
a3f0: 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 20 0a 20 20  (i=0;   z[i] .  
a400: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
a410: 5d 21 3d 27 3c 27 20 0a 20 20 20 20 20 20 20 20  ]!='<' .        
a420: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27      && z[i]!='&'
a430: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
a440: 20 7a 5b 69 5d 21 3d 27 3e 27 20 0a 20 20 20 20   z[i]!='>' .    
a450: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
a460: 3d 27 5c 22 27 20 0a 20 20 20 20 20 20 20 20 20  ='\"' .         
a470: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27     && z[i]!='\''
a480: 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d  ;.        i++){}
a490: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a  .    if( i>0 ){.
a4a0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
a4b0: 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20  t,"%.*s",i,z);. 
a4c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69     }.    if( z[i
a4d0: 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20  ]=='<' ){.      
a4e0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74  fprintf(out,"&lt
a4f0: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
a500: 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a  f( z[i]=='&' ){.
a510: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
a520: 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20  t,"&amp;");.    
a530: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
a540: 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72  '>' ){.      fpr
a550: 69 6e 74 66 28 6f 75 74 2c 22 26 67 74 3b 22 29  intf(out,"&gt;")
a560: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a570: 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20 20  z[i]=='\"' ){.  
a580: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
a590: 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d  "&quot;");.    }
a5a0: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
a5b0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72  \'' ){.      fpr
a5c0: 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22  intf(out,"&#39;"
a5d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a5e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a5f0: 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b  .    z += i + 1;
a600: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
a610: 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e   a field contain
a620: 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20  s any character 
a630: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20  identified by a 
a640: 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  1 in the followi
a650: 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65  ng.** array, the
a660: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73  n the string mus
a670: 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20  t be quoted for 
a680: 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  CSV..*/.static c
a690: 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73  onst char needCs
a6a0: 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31  vQuote[] = {.  1
a6b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a6c0: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
a6d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a6e0: 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31     .  1, 1, 1, 1
a6f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
a700: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a710: 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20  , 1, 1,   .  1, 
a720: 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 1, 0, 0, 0, 0
a730: 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 1,   0, 0, 0, 
a740: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  0, 0, 0, 0, 0, .
a750: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a760: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
a770: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a780: 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20   0, .  0, 0, 0, 
a790: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
a7a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a7b0: 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30  0, 0, 0, .  0, 0
a7c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a7d0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
a7e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20  , 0, 0, 0, 0, . 
a7f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a800: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
a810: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a820: 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30  0, .  0, 0, 0, 0
a830: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
a840: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a850: 2c 20 30 2c 20 31 2c 20 0a 20 20 31 2c 20 31 2c  , 0, 1, .  1, 1,
a860: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a870: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
a880: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
a890: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a8a0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
a8b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a8c0: 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31   1,   .  1, 1, 1
a8d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a8e0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
a8f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20  , 1, 1, 1,   .  
a900: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a910: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a920: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a930: 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20  ,   .  1, 1, 1, 
a940: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
a950: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a960: 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c  1, 1, 1,   .  1,
a970: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a980: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
a990: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a9a0: 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c    .  1, 1, 1, 1,
a9b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
a9c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a9d0: 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31   1, 1,   .  1, 1
a9e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a9f0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
aa00: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
aa10: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  .};../*.** Outpu
aa20: 74 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  t a single term 
aa30: 6f 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c  of CSV.  Actuall
aa40: 79 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 20  y, p->separator 
aa50: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
aa60: 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68  he separator, wh
aa70: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
aa80: 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20  ot be a comma.  
aa90: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 20 69 73 0a  p->nullvalue is.
aaa0: 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75  ** the null valu
aab0: 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20  e.  Strings are 
aac0: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 41 4e 53  quoted using ANS
aad0: 49 2d 43 20 72 75 6c 65 73 2e 20 20 4e 75 6d 62  I-C rules.  Numb
aae0: 65 72 73 0a 2a 2a 20 61 70 70 65 61 72 20 6f 75  ers.** appear ou
aaf0: 74 73 69 64 65 20 6f 66 20 71 75 6f 74 65 73 2e  tside of quotes.
ab00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ab10: 6f 75 74 70 75 74 5f 63 73 76 28 73 74 72 75 63  output_csv(struc
ab20: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
ab30: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
ab40: 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20  z, int bSep){.  
ab50: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f  FILE *out = p->o
ab60: 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  ut;.  if( z==0 )
ab70: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
ab80: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 76 61  t,"%s",p->nullva
ab90: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
aba0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
abb0: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
abc0: 30 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  0(p->separator);
abd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
abe0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
abf0: 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65  if( needCsvQuote
ac00: 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [((unsigned char
ac10: 2a 29 7a 29 5b 69 5d 5d 20 0a 20 20 20 20 20 20  *)z)[i]] .      
ac20: 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e     || (z[i]==p->
ac30: 73 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26 20  separator[0] && 
ac40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e  .             (n
ac50: 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70  Sep==1 || memcmp
ac60: 28 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  (z, p->separator
ac70: 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a  , nSep)==0)) ){.
ac80: 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20          i = 0;. 
ac90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aca0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
acb0: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
acc0: 20 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29    putc('"', out)
acd0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ace0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
acf0: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
ad00: 22 27 20 29 20 70 75 74 63 28 27 22 27 2c 20 6f  "' ) putc('"', o
ad10: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ut);.        put
ad20: 63 28 7a 5b 69 5d 2c 20 6f 75 74 29 3b 0a 20 20  c(z[i], out);.  
ad30: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 63      }.      putc
ad40: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
ad50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
ad60: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
ad70: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
ad80: 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20  if( bSep ){.    
ad90: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
ada0: 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61 74  "%s", p->separat
adb0: 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64  or);.  }.}..#ifd
adc0: 65 66 20 53 49 47 49 4e 54 0a 2f 2a 0a 2a 2a 20  ef SIGINT./*.** 
add0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
ade0: 73 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  s when the user 
adf0: 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a  presses Ctrl-C.*
ae00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
ae10: 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28  terrupt_handler(
ae20: 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20  int NotUsed){.  
ae30: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ae40: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65  (NotUsed);.  see
ae50: 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 31 3b 0a  nInterrupt = 1;.
ae60: 20 20 69 66 28 20 64 62 20 29 20 73 71 6c 69 74    if( db ) sqlit
ae70: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
ae80: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
ae90: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
aea0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
aeb0: 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a  hat the shell.**
aec0: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
aed0: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
aee0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
aef0: 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c  ic int shell_cal
af00: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
af10: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
af20: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
af30: 2a 61 7a 43 6f 6c 2c 20 69 6e 74 20 2a 61 69 54  *azCol, int *aiT
af40: 79 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ype){.  int i;. 
af50: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
af60: 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72 75  _data *p = (stru
af70: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
af80: 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28 20 70  *)pArg;..  if( p
af90: 2d 3e 65 63 68 6f 4f 6e 20 26 26 20 70 2d 3e 63  ->echoOn && p->c
afa0: 6e 74 3d 3d 30 20 20 26 26 20 70 2d 3e 70 53 74  nt==0  && p->pSt
afb0: 6d 74 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  mt){.    printf(
afc0: 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
afd0: 73 71 6c 28 70 2d 3e 70 53 74 6d 74 29 29 3b 0a  sql(p->pStmt));.
afe0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
aff0: 2d 3e 6d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  ->mode ){.    ca
b000: 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a  se MODE_Line: {.
b010: 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b        int w = 5;
b020: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
b030: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b040: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
b050: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
b060: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
b070: 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  en30(azCol[i] ? 
b080: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
b090: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
b0a0: 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20  w ) w = len;.   
b0b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
b0c0: 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 66 70 72 69  ->cnt++>0 ) fpri
b0d0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
b0e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
b0f0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
b100: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
b110: 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 5c  ->out,"%*s = %s\
b120: 6e 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  n", w, azCol[i],
b130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b140: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
b150: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61  g[i] : p->nullva
b160: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
b170: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b180: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45  .    case MODE_E
b190: 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73 65  xplain:.    case
b1a0: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a   MODE_Column: {.
b1b0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
b1c0: 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ++==0 ){.       
b1d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
b1e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b1f0: 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20 20    int w, n;.    
b200: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
b210: 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74  ySize(p->colWidt
b220: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
b230: 20 20 77 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74    w = p->colWidt
b240: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  h[i];.          
b250: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b260: 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20     w = 0;.      
b270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b280: 69 66 28 20 77 3c 3d 30 20 29 7b 0a 20 20 20 20  if( w<=0 ){.    
b290: 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c          w = strl
b2a0: 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  en30(azCol[i] ? 
b2b0: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b2d0: 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20  w<10 ) w = 10;. 
b2e0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73             n = s
b2f0: 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 20 26 26  trlen30(azArg &&
b300: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
b310: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61  g[i] : p->nullva
b320: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lue);.          
b330: 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d 20    if( w<n ) w = 
b340: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
b350: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
b360: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75  rraySize(p->actu
b370: 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  alWidth) ){.    
b380: 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75 61          p->actua
b390: 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20  lWidth[i] = w;. 
b3a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b3b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77       if( p->show
b3c0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
b3d0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
b3e0: 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c  >out,"%-*.*s%s",
b3f0: 77 2c 77 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d  w,w,azCol[i], i=
b400: 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20  =nArg-1 ? "\n": 
b410: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  "  ");.         
b420: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
b430: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77       if( p->show
b440: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
b450: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b460: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
b470: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
b480: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
b490: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
b4a0: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
b4c0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
b4d0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ];.            }
b4e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b4f0: 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20       w = 10;.   
b500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b510: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
b520: 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22  ->out,"%-*.*s%s"
b530: 2c 77 2c 77 2c 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ,w,w,"----------
b540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20  ---------".     
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
b570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20  ---------",.    
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22  i==nArg-1 ? "\n"
b5d0: 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20  : "  ");.       
b5e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
b5f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b600: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
b610: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
b620: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
b630: 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20          int w;. 
b640: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
b650: 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c  aySize(p->actual
b660: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
b670: 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75       w = p->actu
b680: 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  alWidth[i];.    
b690: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b6a0: 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20        w = 10;.  
b6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b6c0: 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
b6d0: 45 5f 45 78 70 6c 61 69 6e 20 26 26 20 61 7a 41  E_Explain && azA
b6e0: 72 67 5b 69 5d 20 26 26 20 0a 20 20 20 20 20 20  rg[i] && .      
b6f0: 20 20 20 20 20 73 74 72 6c 65 6e 33 30 28 61 7a       strlen30(az
b700: 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20  Arg[i])>w ){.   
b710: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
b720: 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n30(azArg[i]);. 
b730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b740: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
b750: 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a  "%-*.*s%s",w,w,.
b760: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
b770: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
b780: 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 20  : p->nullvalue, 
b790: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22  i==nArg-1 ? "\n"
b7a0: 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d  : "  ");.      }
b7b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b7c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
b7d0: 45 5f 53 65 6d 69 3a 0a 20 20 20 20 63 61 73 65  E_Semi:.    case
b7e0: 20 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20   MODE_List: {.  
b7f0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
b800: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
b810: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
b820: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
b830: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
b840: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
b850: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
b860: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e   i==nArg-1 ? "\n
b870: 22 20 3a 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  " : p->separator
b880: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b890: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
b8a0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
b8b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b8c0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b8d0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
b8e0: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
b8f0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
b900: 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 3b 0a 20   p->nullvalue;. 
b910: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
b920: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
b930: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
b940: 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Arg-1 ){.       
b950: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
b960: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61  t, "%s", p->sepa
b970: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
b980: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 6f 64  }else if( p->mod
b990: 65 3d 3d 4d 4f 44 45 5f 53 65 6d 69 20 29 7b 0a  e==MODE_Semi ){.
b9a0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
b9b0: 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29  f(p->out, ";\n")
b9c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b9d0: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
b9e0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
b9f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ba00: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ba10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ba20: 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20  MODE_Html: {.   
ba30: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
ba40: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
ba50: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
ba60: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
ba70: 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 66  TR>");.        f
ba80: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
ba90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
baa0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
bab0: 3c 54 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  <TH>");.        
bac0: 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74    output_html_st
bad0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43  ring(p->out, azC
bae0: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
baf0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
bb00: 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TH>\n");.   
bb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
bb20: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
bb30: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
bb40: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
bb50: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
bb60: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
bb70: 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20  ut,"<TR>");.    
bb80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
bb90: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
bba0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
bbb0: 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20  "<TD>");.       
bbc0: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
bbd0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
bbe0: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
bbf0: 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b  : p->nullvalue);
bc00: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
bc10: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e  (p->out,"</TD>\n
bc20: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
bc30: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
bc40: 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TR>\n");.   
bc50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bc60: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63      case MODE_Tc
bc70: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
bc80: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
bc90: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
bca0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
bcb0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
bcc0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63          output_c
bcd0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61  _string(p->out,a
bce0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
bcf0: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
bd00: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
bd10: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65 70  ut, "%s", p->sep
bd20: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
bd30: 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   }.        fprin
bd40: 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b  tf(p->out,"\n");
bd50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
bd60: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
bd70: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
bd80: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
bd90: 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  {.        output
bda0: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
bdb0: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
bdc0: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76  rg[i] : p->nullv
bdd0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 66  alue);.        f
bde0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
bdf0: 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f  %s", p->separato
be00: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
be10: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
be20: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ,"\n");.      br
be30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
be40: 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a  ase MODE_Csv: {.
be50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
be60: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
be70: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
be80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
be90: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
bea0: 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c     output_csv(p,
beb0: 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f   azCol[i] ? azCo
bec0: 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72  l[i] : "", i<nAr
bed0: 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g-1);.        }.
bee0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
bef0: 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  p->out,"\n");.  
bf00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
bf10: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
bf20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
bf30: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
bf40: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
bf50: 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69  v(p, azArg[i], i
bf60: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
bf70: 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
bf80: 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  p->out,"\n");.  
bf90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bfa0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49  .    case MODE_I
bfb0: 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 70  nsert: {.      p
bfc0: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69  ->cnt++;.      i
bfd0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
bfe0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  eak;.      fprin
bff0: 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52  tf(p->out,"INSER
c000: 54 20 49 4e 54 4f 20 25 73 20 56 41 4c 55 45 53  T INTO %s VALUES
c010: 28 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  (",p->zDestTable
c020: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
c030: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c040: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
c050: 65 70 20 3d 20 69 3e 30 20 3f 20 22 2c 22 3a 20  ep = i>0 ? ",": 
c060: 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  "";.        if( 
c070: 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c  (azArg[i]==0) ||
c080: 20 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79   (aiType && aiTy
c090: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55  pe[i]==SQLITE_NU
c0a0: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LL) ){.         
c0b0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
c0c0: 22 25 73 4e 55 4c 4c 22 2c 7a 53 65 70 29 3b 0a  "%sNULL",zSep);.
c0d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c0e0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
c0f0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45  pe[i]==SQLITE_TE
c100: 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
c110: 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70  if( zSep[0] ) fp
c120: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
c130: 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20  ",zSep);.       
c140: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
c150: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
c160: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
c170: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
c180: 79 70 65 20 26 26 20 28 61 69 54 79 70 65 5b 69  ype && (aiType[i
c190: 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  ]==SQLITE_INTEGE
c1a0: 52 20 7c 7c 20 61 69 54 79 70 65 5b 69 5d 3d 3d  R || aiType[i]==
c1b0: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 20 29 7b  SQLITE_FLOAT) ){
c1c0: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
c1d0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22  tf(p->out,"%s%s"
c1e0: 2c 7a 53 65 70 2c 20 61 7a 41 72 67 5b 69 5d 29  ,zSep, azArg[i])
c1f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
c200: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
c210: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
c220: 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74  BLOB && p->pStmt
c230: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
c240: 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20  nst void *pBlob 
c250: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
c260: 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20  _blob(p->pStmt, 
c270: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  i);.          in
c280: 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65  t nBlob = sqlite
c290: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
c2a0: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
c2b0: 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 70 5b         if( zSep[
c2c0: 30 5d 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e  0] ) fprintf(p->
c2d0: 6f 75 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b 0a  out,"%s",zSep);.
c2e0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
c2f0: 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74  _hex_blob(p->out
c300: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
c310: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
c320: 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72  f( isNumber(azAr
c330: 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20  g[i], 0) ){.    
c340: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
c350: 3e 6f 75 74 2c 22 25 73 25 73 22 2c 7a 53 65 70  >out,"%s%s",zSep
c360: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
c370: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c380: 20 20 20 20 20 20 69 66 28 20 7a 53 65 70 5b 30        if( zSep[0
c390: 5d 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f  ] ) fprintf(p->o
c3a0: 75 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b 0a 20  ut,"%s",zSep);. 
c3b0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
c3c0: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
c3d0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
c3e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c3f0: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
c400: 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b  (p->out,");\n");
c410: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c420: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c430: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
c440: 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  s is the callbac
c450: 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74  k routine that t
c460: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
c470: 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72  y.** invokes for
c480: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71   each row of a q
c490: 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  uery result..*/.
c4a0: 73 74 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62  static int callb
c4b0: 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
c4c0: 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
c4d0: 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
c4e0: 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63  zCol){.  /* sinc
c4f0: 65 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  e we don't have 
c500: 74 79 70 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20  type info, call 
c510: 74 68 65 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  the shell_callba
c520: 63 6b 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  ck with a NULL v
c530: 61 6c 75 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e  alue */.  return
c540: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28   shell_callback(
c550: 70 41 72 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72  pArg, nArg, azAr
c560: 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b  g, azCol, NULL);
c570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c580: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
c590: 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ble field of the
c5a0: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 73   callback_data s
c5b0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74  tructure to.** t
c5c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
c5d0: 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63  able given.  Esc
c5e0: 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68  ape any quote ch
c5f0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a  aracters in the.
c600: 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a  ** table name..*
c610: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
c620: 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 73 74 72  t_table_name(str
c630: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
c640: 61 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  a *p, const char
c650: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
c660: 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64  i, n;.  int need
c670: 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Quote;.  char *z
c680: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73  ;..  if( p->zDes
c690: 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72  tTable ){.    fr
c6a0: 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  ee(p->zDestTable
c6b0: 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54  );.    p->zDestT
c6c0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  able = 0;.  }.  
c6d0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
c6e0: 65 74 75 72 6e 3b 0a 20 20 6e 65 65 64 51 75 6f  eturn;.  needQuo
c6f0: 74 65 20 3d 20 21 69 73 61 6c 70 68 61 28 28 75  te = !isalpha((u
c700: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 2a 7a 4e  nsigned char)*zN
c710: 61 6d 65 29 20 26 26 20 2a 7a 4e 61 6d 65 21 3d  ame) && *zName!=
c720: 27 5f 27 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30  '_';.  for(i=n=0
c730: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 2c  ; zName[i]; i++,
c740: 20 6e 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   n++){.    if( !
c750: 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65  isalnum((unsigne
c760: 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29  d char)zName[i])
c770: 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f   && zName[i]!='_
c780: 27 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 51  ' ){.      needQ
c790: 75 6f 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  uote = 1;.      
c7a0: 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c  if( zName[i]=='\
c7b0: 27 27 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  '' ) n++;.    }.
c7c0: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
c7d0: 6f 74 65 20 29 20 6e 20 2b 3d 20 32 3b 0a 20 20  ote ) n += 2;.  
c7e0: 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c  z = p->zDestTabl
c7f0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20  e = malloc( n+1 
c800: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  );.  if( z==0 ){
c810: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
c820: 65 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20  err,"Error: out 
c830: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
c840: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
c850: 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e    n = 0;.  if( n
c860: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b  eedQuote ) z[n++
c870: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28  ] = '\'';.  for(
c880: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
c890: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20  ++){.    z[n++] 
c8a0: 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20  = zName[i];.    
c8b0: 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c  if( zName[i]=='\
c8c0: 27 27 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c  '' ) z[n++] = '\
c8d0: 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  '';.  }.  if( ne
c8e0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d  edQuote ) z[n++]
c8f0: 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 6e 5d 20   = '\'';.  z[n] 
c900: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69  = 0;.}../* zIn i
c910: 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
c920: 65 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74 65 72  er to a NULL-ter
c930: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
c940: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
c950: 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  d.** from malloc
c960: 28 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f  (), or a NULL po
c970: 69 6e 74 65 72 2e 20 54 68 65 20 73 74 72 69 6e  inter. The strin
c980: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
c990: 7a 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20 61 64  zAppend is.** ad
c9a0: 64 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e 64 20  ded to zIn, and 
c9b0: 74 68 65 20 72 65 73 75 6c 74 20 72 65 74 75 72  the result retur
c9c0: 6e 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ned in memory ob
c9d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
c9e0: 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66  oc()..** zIn, if
c9f0: 20 69 74 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c   it was not NULL
ca00: 2c 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  , is freed..**.*
ca10: 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
ca20: 72 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65 2c 20  rgument, quote, 
ca30: 69 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74 68 65  is not '\0', the
ca40: 6e 20 69 74 20 69 73 20 75 73 65 64 20 61 73 20  n it is used as 
ca50: 61 20 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  a .** quote char
ca60: 61 63 74 65 72 20 66 6f 72 20 7a 41 70 70 65 6e  acter for zAppen
ca70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
ca80: 72 20 2a 61 70 70 65 6e 64 54 65 78 74 28 63 68  r *appendText(ch
ca90: 61 72 20 2a 7a 49 6e 2c 20 63 68 61 72 20 63 6f  ar *zIn, char co
caa0: 6e 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68  nst *zAppend, ch
cab0: 61 72 20 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74  ar quote){.  int
cac0: 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   len;.  int i;. 
cad0: 20 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d 20 73   int nAppend = s
cae0: 74 72 6c 65 6e 33 30 28 7a 41 70 70 65 6e 64 29  trlen30(zAppend)
caf0: 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 28 7a  ;.  int nIn = (z
cb00: 49 6e 3f 73 74 72 6c 65 6e 33 30 28 7a 49 6e 29  In?strlen30(zIn)
cb10: 3a 30 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41  :0);..  len = nA
cb20: 70 70 65 6e 64 2b 6e 49 6e 2b 31 3b 0a 20 20 69  ppend+nIn+1;.  i
cb30: 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20  f( quote ){.    
cb40: 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f  len += 2;.    fo
cb50: 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64  r(i=0; i<nAppend
cb60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
cb70: 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75  ( zAppend[i]==qu
cb80: 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20  ote ) len++;.   
cb90: 20 7d 0a 20 20 7d 0a 0a 20 20 7a 49 6e 20 3d 20   }.  }..  zIn = 
cba0: 28 63 68 61 72 20 2a 29 72 65 61 6c 6c 6f 63 28  (char *)realloc(
cbb0: 7a 49 6e 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  zIn, len);.  if(
cbc0: 20 21 7a 49 6e 20 29 7b 0a 20 20 20 20 72 65 74   !zIn ){.    ret
cbd0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
cbe0: 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63  ( quote ){.    c
cbf0: 68 61 72 20 2a 7a 43 73 72 20 3d 20 26 7a 49 6e  har *zCsr = &zIn
cc00: 5b 6e 49 6e 5d 3b 0a 20 20 20 20 2a 7a 43 73 72  [nIn];.    *zCsr
cc10: 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20  ++ = quote;.    
cc20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65  for(i=0; i<nAppe
cc30: 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; i++){.      
cc40: 2a 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e  *zCsr++ = zAppen
cc50: 64 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  d[i];.      if( 
cc60: 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74  zAppend[i]==quot
cc70: 65 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75  e ) *zCsr++ = qu
cc80: 6f 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  ote;.    }.    *
cc90: 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a  zCsr++ = quote;.
cca0: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 5c      *zCsr++ = '\
ccb0: 30 27 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0';.    assert( 
ccc0: 28 7a 43 73 72 2d 7a 49 6e 29 3d 3d 6c 65 6e 20  (zCsr-zIn)==len 
ccd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
cce0: 6d 65 6d 63 70 79 28 26 7a 49 6e 5b 6e 49 6e 5d  memcpy(&zIn[nIn]
ccf0: 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70 65  , zAppend, nAppe
cd00: 6e 64 29 3b 0a 20 20 20 20 7a 49 6e 5b 6c 65 6e  nd);.    zIn[len
cd10: 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  -1] = '\0';.  }.
cd20: 0a 20 20 72 65 74 75 72 6e 20 7a 49 6e 3b 0a 7d  .  return zIn;.}
cd30: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  .../*.** Execute
cd40: 20 61 20 71 75 65 72 79 20 73 74 61 74 65 6d 65   a query stateme
cd50: 6e 74 20 74 68 61 74 20 68 61 73 20 61 20 73 69  nt that has a si
cd60: 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
cd70: 6d 6e 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68  mn.  Print.** th
cd80: 61 74 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  at result column
cd90: 20 6f 6e 20 61 20 6c 69 6e 65 20 62 79 20 69 74   on a line by it
cda0: 73 65 6c 66 20 77 69 74 68 20 61 20 73 65 6d 69  self with a semi
cdb0: 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72  colon terminator
cdc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
cdd0: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
cde0: 65 2c 20 74 6f 20 73 68 6f 77 20 74 68 65 20 73  e, to show the s
cdf0: 63 68 65 6d 61 20 6f 66 20 74 68 65 20 64 61 74  chema of the dat
ce00: 61 62 61 73 65 20 62 79 0a 2a 2a 20 71 75 65 72  abase by.** quer
ce10: 79 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ying the SQLITE_
ce20: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 0a 2a 2f  MASTER table..*/
ce30: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f  .static int run_
ce40: 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
ce50: 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 20  (.  FILE *out,  
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ce70: 65 6e 64 20 6f 75 74 70 75 74 20 68 65 72 65 20  end output here 
ce80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
ce90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
cea0: 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72  Database to quer
ceb0: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
cec0: 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 2f  r *zSelect,    /
ced0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
cee0: 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f  nt to extract co
cef0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntent */.  const
cf00: 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77   char *zFirstRow
cf10: 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f     /* Print befo
cf20: 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66  re first row, if
cf30: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
cf40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
cf50: 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72  pSelect;.  int r
cf60: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
cf70: 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
cf80: 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c  elect, -1, &pSel
cf90: 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ect, 0);.  if( r
cfa0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
cfb0: 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  !pSelect ){.    
cfc0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
cfd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
cfe0: 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77  ep(pSelect);.  w
cff0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
d000: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20  _ROW ){.    if( 
d010: 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20  zFirstRow ){.   
d020: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
d030: 22 25 73 22 2c 20 7a 46 69 72 73 74 52 6f 77 29  "%s", zFirstRow)
d040: 3b 0a 20 20 20 20 20 20 7a 46 69 72 73 74 52 6f  ;.      zFirstRo
d050: 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  w = 0;.    }.   
d060: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
d070: 73 3b 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  s;\n", sqlite3_c
d080: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
d090: 63 74 2c 20 30 29 29 3b 0a 20 20 20 20 72 63 20  ct, 0));.    rc 
d0a0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
d0b0: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72  Select);.  }.  r
d0c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69  eturn sqlite3_fi
d0d0: 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74 29 3b  nalize(pSelect);
d0e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
d0f0: 74 65 20 73 70 61 63 65 20 61 6e 64 20 73 61 76  te space and sav
d100: 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20 65 72  e off current er
d110: 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ror string..*/.s
d120: 74 61 74 69 63 20 63 68 61 72 20 2a 73 61 76 65  tatic char *save
d130: 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69  _err_msg(.  sqli
d140: 74 65 33 20 2a 64 62 20 20 20 20 20 20 20 20 20  te3 *db         
d150: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
d160: 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  o query */.){.  
d170: 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b  int nErrMsg = 1+
d180: 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  strlen30(sqlite3
d190: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
d1a0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
d1b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
d1c0: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a  ErrMsg);.  if( z
d1d0: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 6d 65  ErrMsg ){.    me
d1e0: 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20 73 71  mcpy(zErrMsg, sq
d1f0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
d200: 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  , nErrMsg);.  }.
d210: 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d 73 67    return zErrMsg
d220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
d230: 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  te a statement o
d240: 72 20 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65  r set of stateme
d250: 6e 74 73 2e 20 20 50 72 69 6e 74 20 0a 2a 2a 20  nts.  Print .** 
d260: 61 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f  any result rows/
d270: 63 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e  columns dependin
d280: 67 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  g on the current
d290: 20 6d 6f 64 65 20 0a 2a 2a 20 73 65 74 20 76 69   mode .** set vi
d2a0: 61 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  a the supplied c
d2b0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  allback..**.** T
d2c0: 68 69 73 20 69 73 20 76 65 72 79 20 73 69 6d 69  his is very simi
d2d0: 6c 61 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20  lar to SQLite's 
d2e0: 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33  built-in sqlite3
d2f0: 5f 65 78 65 63 28 29 20 0a 2a 2a 20 66 75 6e 63  _exec() .** func
d300: 74 69 6f 6e 20 65 78 63 65 70 74 20 69 74 20 74  tion except it t
d310: 61 6b 65 73 20 61 20 73 6c 69 67 68 74 6c 79 20  akes a slightly 
d320: 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61  different callba
d330: 63 6b 20 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62  ck .** and callb
d340: 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d 65 6e  ack data argumen
d350: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
d360: 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20 73   shell_exec(.  s
d370: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
d3a0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a   open database *
d3b0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
d3c0: 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20  zSql,           
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 65 76 61  /* SQL to be eva
d3f0: 6c 75 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  luated */.  int 
d400: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
d410: 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68  d*,int,char**,ch
d420: 61 72 2a 2a 2c 69 6e 74 2a 29 2c 20 20 20 2f 2a  ar**,int*),   /*
d430: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
d440: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d470: 20 20 20 20 2f 2a 20 28 6e 6f 74 20 74 68 65 20      /* (not the 
d480: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
d490: 65 78 65 63 29 20 2a 2f 0a 20 20 73 74 72 75 63  exec) */.  struc
d4a0: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
d4b0: 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
d4c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
d4d0: 72 20 74 6f 20 73 74 72 75 63 74 20 63 61 6c 6c  r to struct call
d4e0: 62 61 63 6b 5f 64 61 74 61 20 2a 2f 0a 20 20 63  back_data */.  c
d4f0: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
d520: 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20  ror msg written 
d530: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
d540: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
d550: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72   = NULL;.  int r
d560: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d570: 20 69 6e 74 20 72 63 32 3b 0a 20 20 63 6f 6e 73   int rc2;.  cons
d580: 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65  t char *zLeftove
d590: 72 3b 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20  r;      /* Tail 
d5a0: 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53  of unprocessed S
d5b0: 51 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 70 7a 45  QL */..  if( pzE
d5c0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a  rrMsg ){.    *pz
d5d0: 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20  ErrMsg = NULL;. 
d5e0: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71   }..  while( zSq
d5f0: 6c 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f  l[0] && (SQLITE_
d600: 4f 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20  OK == rc) ){.   
d610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
d620: 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
d630: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
d640: 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20  zLeftover);.    
d650: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d  if( SQLITE_OK !=
d660: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
d670: 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
d680: 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
d690: 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
d6a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
d6c0: 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  !pStmt ){.      
d6d0: 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e    /* this happen
d6e0: 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20  s for a comment 
d6f0: 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a  or white-space *
d700: 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  /.        zSql =
d710: 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20   zLeftover;.    
d720: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
d730: 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53  ce(zSql[0]) ) zS
d740: 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  ql++;.        co
d750: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
d760: 0a 20 20 20 20 20 20 2f 2a 20 70 65 72 66 6f 72  .      /* perfor
d770: 6d 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  m the first step
d780: 2e 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c  .  this will tel
d790: 6c 20 75 73 20 69 66 20 77 65 0a 20 20 20 20 20  l us if we.     
d7a0: 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c   ** have a resul
d7b0: 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64  t set or not and
d7c0: 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e   how wide it is.
d7d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d7e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
d7f0: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
d800: 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20  /* if we have a 
d810: 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f  result set... */
d820: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
d830: 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20  E_ROW == rc ){. 
d840: 20 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20         /* if we 
d850: 68 61 76 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e  have a callback.
d860: 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  .. */.        if
d870: 28 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  ( xCallback ){. 
d880: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f           /* allo
d890: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 63  cate space for c
d8a0: 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c  ol name ptr, val
d8b0: 75 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65  ue ptr, and type
d8c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
d8d0: 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t nCol = sqlite3
d8e0: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
d8f0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
d900: 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71  void *pData = sq
d910: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 33 2a 6e  lite3_malloc(3*n
d920: 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74  Col*sizeof(const
d930: 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20   char*) + 1);.  
d940: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 44 61          if( !pDa
d950: 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
d960: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
d970: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
d980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d990: 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20    char **azCols 
d9a0: 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61  = (char **)pData
d9b0: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20  ;      /* Names 
d9c0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
d9d0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
d9e0: 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d   char **azVals =
d9f0: 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20   &azCols[nCol]; 
da00: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
da10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
da20: 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28  int *aiTypes = (
da30: 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43  int *)&azVals[nC
da40: 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74  ol]; /* Result t
da50: 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ypes */.        
da60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
da70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 73 69         assert(si
da80: 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a  zeof(int) <= siz
da90: 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 20 0a 20  eof(char *)); . 
daa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
dab0: 76 65 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63  ve off ptrs to c
dac0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
dad0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
dae0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
daf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
db00: 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azCols[i] = (cha
db10: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
db20: 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
db30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
db40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
db50: 73 61 76 65 20 6f 66 66 20 74 68 65 20 70 72 65  save off the pre
db60: 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68  pared statment h
db70: 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20  andle and reset 
db80: 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  row count */.   
db90: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72           if( pAr
dba0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
dbb0: 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
dbc0: 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
dbd0: 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20        pArg->cnt 
dbe0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
dbf0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   }.            d
dc00: 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o{.             
dc10: 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68 65 20   /* extract the 
dc20: 64 61 74 61 20 61 6e 64 20 64 61 74 61 20 74 79  data and data ty
dc30: 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pes */.         
dc40: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
dc50: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61              azVa
dc70: 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29  ls[i] = (char *)
dc80: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
dc90: 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ext(pStmt, i);. 
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
dcb0: 69 54 79 70 65 73 5b 69 5d 20 3d 20 73 71 6c 69  iTypes[i] = sqli
dcc0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
dcd0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
dce0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
dcf0: 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
dd00: 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
dd10: 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
dd30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20   break; /* from 
dd60: 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  for */.         
dd70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dd80: 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
dd90: 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  for */..        
dda0: 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61 74 61        /* if data
ddb0: 20 61 6e 64 20 74 79 70 65 73 20 65 78 74 72 61   and types extra
ddc0: 63 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  cted successfull
ddd0: 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  y... */.        
dde0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
ddf0: 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 20 0a 20  _ROW == rc ){ . 
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de10: 2a 20 63 61 6c 6c 20 74 68 65 20 73 75 70 70 6c  * call the suppl
de20: 69 65 64 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ied callback wit
de30: 68 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f 77  h the result row
de40: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20   data */.       
de50: 20 20 20 20 20 20 20 20 20 69 66 28 20 78 43 61           if( xCa
de60: 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f  llback(pArg, nCo
de70: 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c  l, azVals, azCol
de80: 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20  s, aiTypes) ){. 
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f   rc = SQLITE_ABO
deb0: 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RT;.            
dec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
dee0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
def0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
df00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
df10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
df20: 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51       } while( SQ
df30: 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
df40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
df50: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
df60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
df70: 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
df80: 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70           pArg->p
df90: 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Stmt = NULL;.   
dfa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dfb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
dfc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
dfd0: 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  do{.            
dfe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
dff0: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
e000: 20 20 20 20 7d 20 77 68 69 6c 65 28 20 72 63 20      } while( rc 
e010: 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b  == SQLITE_ROW );
e020: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e030: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   }..      /* if 
e040: 74 68 65 20 6c 61 73 74 20 73 71 6c 69 74 65 33  the last sqlite3
e050: 5f 73 74 65 70 28 29 20 64 69 64 6e 27 74 20 63  _step() didn't c
e060: 6f 6d 70 6c 65 74 65 20 73 75 63 63 65 73 73 66  omplete successf
e070: 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  ully... */.     
e080: 20 69 66 28 20 28 53 51 4c 49 54 45 5f 4f 4b 20   if( (SQLITE_OK 
e090: 21 3d 20 72 63 29 20 26 26 20 28 53 51 4c 49 54  != rc) && (SQLIT
e0a0: 45 5f 44 4f 4e 45 20 21 3d 20 72 63 29 20 29 7b  E_DONE != rc) ){
e0b0: 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 7a   .        if( pz
e0c0: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
e0d0: 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
e0e0: 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29  save_err_msg(db)
e0f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e110: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e120: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e130: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
e140: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
e150: 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 6c       /* if the l
e160: 61 73 74 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ast sqlite3_fina
e170: 6c 69 7a 65 28 29 20 64 69 64 6e 27 74 20 63 6f  lize() didn't co
e180: 6d 70 6c 65 74 65 20 73 75 63 63 65 73 73 66 75  mplete successfu
e190: 6c 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 41 4e  lly .      ** AN
e1a0: 44 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  D we don't have 
e1b0: 61 20 73 61 76 65 64 20 65 72 72 6f 72 20 66 72  a saved error fr
e1c0: 6f 6d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  om sqlite3_step 
e1d0: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ... */.      if(
e1e0: 20 28 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72   (SQLITE_OK != r
e1f0: 63 32 29 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  c2) && (SQLITE_O
e200: 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
e210: 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
e220: 20 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d        if( pzErrM
e230: 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sg ){.          
e240: 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65  *pzErrMsg = save
e250: 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20  _err_msg(db);.  
e260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e270: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
e280: 45 5f 4f 4b 20 3d 3d 20 72 63 20 29 7b 20 0a 20  E_OK == rc ){ . 
e290: 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
e2a0: 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20  eftover;.       
e2b0: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
e2c0: 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b  zSql[0]) ) zSql+
e2d0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
e2e0: 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c  .  } /* end whil
e2f0: 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72  e */..  return r
e300: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
e310: 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
e320: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
e330: 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
e340: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
e350: 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
e360: 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
e370: 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
e380: 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
e390: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
e3a0: 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
e3b0: 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
e3c0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
e3d0: 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
e3e0: 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
e3f0: 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
e400: 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
e410: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
e420: 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
e430: 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
e440: 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
e450: 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
e460: 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 72 63  azCol){.  int rc
e470: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
e480: 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20  zTable;.  const 
e490: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63  char *zType;.  c
e4a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
e4b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e4c0: 50 72 65 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  PrepStmt = 0;.  
e4d0: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
e4e0: 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72 75 63  data *p = (struc
e4f0: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
e500: 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45  *)pArg;..  UNUSE
e510: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 43 6f  D_PARAMETER(azCo
e520: 6c 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  l);.  if( nArg!=
e530: 33 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  3 ) return 1;.  
e540: 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30  zTable = azArg[0
e550: 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41  ];.  zType = azA
e560: 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20  rg[1];.  zSql = 
e570: 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 0a 20 20 69  azArg[2];.  .  i
e580: 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65  f( strcmp(zTable
e590: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
e5a0: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ce")==0 ){.    z
e5b0: 50 72 65 70 53 74 6d 74 20 3d 20 22 44 45 4c 45  PrepStmt = "DELE
e5c0: 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  TE FROM sqlite_s
e5d0: 65 71 75 65 6e 63 65 3b 5c 6e 22 3b 0a 20 20 7d  equence;\n";.  }
e5e0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e5f0: 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
e600: 73 74 61 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20  stat1")==0 ){.  
e610: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
e620: 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  , "ANALYZE sqlit
e630: 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20  e_master;\n");. 
e640: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
e650: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
e660: 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  te_", 7)==0 ){. 
e670: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
e680: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
e690: 28 7a 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56  (zSql, "CREATE V
e6a0: 49 52 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32  IRTUAL TABLE", 2
e6b0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  0)==0 ){.    cha
e6c0: 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28  r *zIns;.    if(
e6d0: 20 21 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68   !p->writableSch
e6e0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ema ){.      fpr
e6f0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
e700: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
e710: 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  hema=ON;\n");.  
e720: 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53      p->writableS
e730: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 7d  chema = 1;.    }
e740: 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c 69  .    zIns = sqli
e750: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
e760: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
e770: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28 74   sqlite_master(t
e780: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
e790: 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29 22  e,rootpage,sql)"
e7a0: 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28  .       "VALUES(
e7b0: 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25 71  'table','%q','%q
e7c0: 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20 20  ',0,'%q');",.   
e7d0: 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61 62      zTable, zTab
e7e0: 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 66  le, zSql);.    f
e7f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e800: 25 73 5c 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20  %s\n", zIns);.  
e810: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e820: 49 6e 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ins);.    return
e830: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
e840: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
e850: 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b   "%s;\n", zSql);
e860: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63  .  }..  if( strc
e870: 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65  mp(zType, "table
e880: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ")==0 ){.    sql
e890: 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 61 62 6c  ite3_stmt *pTabl
e8a0: 65 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 63  eInfo = 0;.    c
e8b0: 68 61 72 20 2a 7a 53 65 6c 65 63 74 20 3d 20 30  har *zSelect = 0
e8c0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  ;.    char *zTab
e8d0: 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  leInfo = 0;.    
e8e0: 63 68 61 72 20 2a 7a 54 6d 70 20 3d 20 30 3b 0a  char *zTmp = 0;.
e8f0: 20 20 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30      int nRow = 0
e900: 3b 0a 20 20 20 0a 20 20 20 20 7a 54 61 62 6c 65  ;.   .    zTable
e910: 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64 54 65 78  Info = appendTex
e920: 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 22 50  t(zTableInfo, "P
e930: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
e940: 28 22 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62  (", 0);.    zTab
e950: 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64 54  leInfo = appendT
e960: 65 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c 20  ext(zTableInfo, 
e970: 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a 20 20  zTable, '"');.  
e980: 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61    zTableInfo = a
e990: 70 70 65 6e 64 54 65 78 74 28 7a 54 61 62 6c 65  ppendText(zTable
e9a0: 49 6e 66 6f 2c 20 22 29 3b 22 2c 20 30 29 3b 0a  Info, ");", 0);.
e9b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e9c0: 33 5f 70 72 65 70 61 72 65 28 70 2d 3e 64 62 2c  3_prepare(p->db,
e9d0: 20 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 2d 31 2c   zTableInfo, -1,
e9e0: 20 26 70 54 61 62 6c 65 49 6e 66 6f 2c 20 30 29   &pTableInfo, 0)
e9f0: 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 61 62 6c  ;.    free(zTabl
ea00: 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  eInfo);.    if( 
ea10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
ea20: 20 21 70 54 61 62 6c 65 49 6e 66 6f 20 29 7b 0a   !pTableInfo ){.
ea30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
ea40: 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 65 6c 65      }..    zSele
ea50: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
ea60: 7a 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54  zSelect, "SELECT
ea70: 20 27 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 20   'INSERT INTO ' 
ea80: 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20 20 7a 54  || ", 0);.    zT
ea90: 6d 70 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  mp = appendText(
eaa0: 7a 54 6d 70 2c 20 7a 54 61 62 6c 65 2c 20 27 22  zTmp, zTable, '"
eab0: 27 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 6d 70  ');.    if( zTmp
eac0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63   ){.      zSelec
ead0: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
eae0: 53 65 6c 65 63 74 2c 20 7a 54 6d 70 2c 20 27 5c  Select, zTmp, '\
eaf0: 27 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '');.    }.    z
eb00: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
eb10: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 20 7c  ext(zSelect, " |
eb20: 7c 20 27 20 56 41 4c 55 45 53 28 27 20 7c 7c 20  | ' VALUES(' || 
eb30: 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  ", 0);.    rc = 
eb40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54 61  sqlite3_step(pTa
eb50: 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 77 68  bleInfo);.    wh
eb60: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
eb70: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ROW ){.      con
eb80: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d  st char *zText =
eb90: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
eba0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
ebb0: 78 74 28 70 54 61 62 6c 65 49 6e 66 6f 2c 20 31  xt(pTableInfo, 1
ebc0: 29 3b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63 74  );.      zSelect
ebd0: 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53   = appendText(zS
ebe0: 65 6c 65 63 74 2c 20 22 71 75 6f 74 65 28 22 2c  elect, "quote(",
ebf0: 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 65 6c 65   0);.      zSele
ec00: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
ec10: 7a 53 65 6c 65 63 74 2c 20 7a 54 65 78 74 2c 20  zSelect, zText, 
ec20: 27 22 27 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  '"');.      rc =
ec30: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54   sqlite3_step(pT
ec40: 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ableInfo);.     
ec50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ec60: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ROW ){.        z
ec70: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
ec80: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 29 20  ext(zSelect, ") 
ec90: 7c 7c 20 27 2c 27 20 7c 7c 20 22 2c 20 30 29 3b  || ',' || ", 0);
eca0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ecb0: 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20        zSelect = 
ecc0: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
ecd0: 63 74 2c 20 22 29 20 22 2c 20 30 29 3b 0a 20 20  ct, ") ", 0);.  
ece0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 6f 77      }.      nRow
ecf0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ++;.    }.    rc
ed00: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
ed10: 69 7a 65 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b  ize(pTableInfo);
ed20: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ed30: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 52 6f 77 3d 3d  ITE_OK || nRow==
ed40: 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
ed50: 7a 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  zSelect);.      
ed60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ed70: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
ed80: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
ed90: 2c 20 22 7c 7c 20 27 29 27 20 46 52 4f 4d 20 20  , "|| ')' FROM  
eda0: 22 2c 20 30 29 3b 0a 20 20 20 20 7a 53 65 6c 65  ", 0);.    zSele
edb0: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
edc0: 7a 53 65 6c 65 63 74 2c 20 7a 54 61 62 6c 65 2c  zSelect, zTable,
edd0: 20 27 22 27 29 3b 0a 0a 20 20 20 20 72 63 20 3d   '"');..    rc =
ede0: 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f   run_table_dump_
edf0: 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20 70 2d  query(p->out, p-
ee00: 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 7a 50  >db, zSelect, zP
ee10: 72 65 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  repStmt);.    if
ee20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
ee30: 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 7a 53  RUPT ){.      zS
ee40: 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65  elect = appendTe
ee50: 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 20 4f 52  xt(zSelect, " OR
ee60: 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
ee70: 43 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  C", 0);.      rc
ee80: 20 3d 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d   = run_table_dum
ee90: 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20  p_query(p->out, 
eea0: 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20  p->db, zSelect, 
eeb0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
eec0: 28 20 7a 53 65 6c 65 63 74 20 29 20 66 72 65 65  ( zSelect ) free
eed0: 28 7a 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20  (zSelect);.  }. 
eee0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
eef0: 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20  .** Run zQuery. 
ef00: 20 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61   Use dump_callba
ef10: 63 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c  ck() as the call
ef20: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20  back routine so 
ef30: 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  that.** the cont
ef40: 65 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72  ents of the quer
ef50: 79 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20  y are output as 
ef60: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
ef70: 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20  **.** If we get 
ef80: 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  a SQLITE_CORRUPT
ef90: 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68   error, rerun th
efa0: 65 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70  e query after ap
efb0: 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45  pending.** "ORDE
efc0: 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
efd0: 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a   to the end..*/.
efe0: 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73  static int run_s
eff0: 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
f000: 28 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62  (.  struct callb
f010: 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 0a 20 20  ack_data *p, .  
f020: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65  const char *zQue
f030: 72 79 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ry,.  char **pzE
f040: 72 72 4d 73 67 0a 29 7b 0a 20 20 69 6e 74 20 72  rrMsg.){.  int r
f050: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
f060: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51  3_exec(p->db, zQ
f070: 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62  uery, dump_callb
f080: 61 63 6b 2c 20 70 2c 20 70 7a 45 72 72 4d 73 67  ack, p, pzErrMsg
f090: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
f0a0: 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
f0b0: 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
f0c0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
f0d0: 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20  en30(zQuery);.  
f0e0: 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
f0f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
f100: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 51  zErrMsg);.    zQ
f110: 32 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b  2 = malloc( len+
f120: 31 30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  100 );.    if( z
f130: 51 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  Q2==0 ) return r
f140: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  c;.    sqlite3_s
f150: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
f160: 51 32 29 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52  Q2), zQ2, "%s OR
f170: 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
f180: 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20  C", zQuery);.   
f190: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
f1a0: 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64  ec(p->db, zQ2, d
f1b0: 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ump_callback, p,
f1c0: 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   pzErrMsg);.    
f1d0: 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20  free(zQ2);.  }. 
f1e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
f1f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f200: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
f210: 41 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65  ABLE) && !define
f220: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
f230: 42 51 55 45 52 59 29 0a 73 74 72 75 63 74 20 47  BQUERY).struct G
f240: 65 6e 66 6b 65 79 43 6d 64 20 7b 0a 20 20 73 71  enfkeyCmd {.  sq
f250: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f270: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
f280: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c  */.  struct call
f290: 62 61 63 6b 5f 64 61 74 61 20 2a 70 43 62 3b 20  back_data *pCb; 
f2a0: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
f2b0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 73  data */.  int is
f2c0: 49 67 6e 6f 72 65 45 72 72 6f 72 73 3b 20 20 20  IgnoreErrors;   
f2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
f2e0: 20 66 6f 72 20 2d 2d 69 67 6e 6f 72 65 2d 65 72   for --ignore-er
f2f0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
f300: 45 78 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  Exec;           
f310: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
f320: 20 66 6f 72 20 2d 2d 65 78 65 63 20 2a 2f 0a 20   for --exec */. 
f330: 20 69 6e 74 20 69 73 4e 6f 44 72 6f 70 3b 20 20   int isNoDrop;  
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 2f 2a 20 54 72 75 65 20 66 6f 72 20 2d 2d 6e 6f  /* True for --no
f360: 2d 64 72 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6e  -drop */.  int n
f370: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
f380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f390: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
f3a0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 7d 3b 0a  en so far */.};.
f3b0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 47  typedef struct G
f3c0: 65 6e 66 6b 65 79 43 6d 64 20 47 65 6e 66 6b 65  enfkeyCmd Genfke
f3d0: 79 43 6d 64 3b 0a 0a 73 74 61 74 69 63 20 69 6e  yCmd;..static in
f3e0: 74 20 67 65 6e 66 6b 65 79 50 61 72 73 65 41 72  t genfkeyParseAr
f3f0: 67 73 28 47 65 6e 66 6b 65 79 43 6d 64 20 2a 70  gs(GenfkeyCmd *p
f400: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
f410: 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74  int nArg){.  int
f420: 20 69 69 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c   ii;.  memset(p,
f430: 20 30 2c 20 73 69 7a 65 6f 66 28 47 65 6e 66 6b   0, sizeof(Genfk
f440: 65 79 43 6d 64 29 29 3b 0a 0a 20 20 66 6f 72 28  eyCmd));..  for(
f450: 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b 20 69  ii=0; ii<nArg; i
f460: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  i++){.    int n 
f470: 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  = strlen30(azArg
f480: 5b 69 69 5d 29 3b 0a 0a 20 20 20 20 69 66 28 20  [ii]);..    if( 
f490: 6e 3e 32 20 26 26 20 6e 3c 31 30 20 26 26 20 30  n>2 && n<10 && 0
f4a0: 3d 3d 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  ==strncmp(azArg[
f4b0: 69 69 5d 2c 20 22 2d 2d 6e 6f 2d 64 72 6f 70 22  ii], "--no-drop"
f4c0: 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 2d  , n) ){.      p-
f4d0: 3e 69 73 4e 6f 44 72 6f 70 20 3d 20 31 3b 0a 20  >isNoDrop = 1;. 
f4e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 32     }else if( n>2
f4f0: 20 26 26 20 6e 3c 31 36 20 26 26 20 30 3d 3d 73   && n<16 && 0==s
f500: 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 69 69 5d  trncmp(azArg[ii]
f510: 2c 20 22 2d 2d 69 67 6e 6f 72 65 2d 65 72 72 6f  , "--ignore-erro
f520: 72 73 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20  rs", n) ){.     
f530: 20 70 2d 3e 69 73 49 67 6e 6f 72 65 45 72 72 6f   p->isIgnoreErro
f540: 72 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rs = 1;.    }els
f550: 65 20 69 66 28 20 6e 3e 32 20 26 26 20 6e 3c 37  e if( n>2 && n<7
f560: 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 61   && 0==strncmp(a
f570: 7a 41 72 67 5b 69 69 5d 2c 20 22 2d 2d 65 78 65  zArg[ii], "--exe
f580: 63 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20  c", n) ){.      
f590: 70 2d 3e 69 73 45 78 65 63 20 3d 20 31 3b 0a 20  p->isExec = 1;. 
f5a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f5b0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
f5c0: 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
f5d0: 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 69   %s\n", azArg[ii
f5e0: 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ]);.      return
f5f0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   -1;.    }.  }..
f600: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f610: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
f620: 74 20 67 65 6e 66 6b 65 79 43 6d 64 43 62 28 76  t genfkeyCmdCb(v
f630: 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 65  oid *pCtx, int e
f640: 54 79 70 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Type, const char
f650: 20 2a 7a 29 7b 0a 20 20 47 65 6e 66 6b 65 79 43   *z){.  GenfkeyC
f660: 6d 64 20 2a 70 20 3d 20 28 47 65 6e 66 6b 65 79  md *p = (Genfkey
f670: 43 6d 64 20 2a 29 70 43 74 78 3b 0a 20 20 69 66  Cmd *)pCtx;.  if
f680: 28 20 65 54 79 70 65 3d 3d 47 45 4e 46 4b 45 59  ( eType==GENFKEY
f690: 5f 45 52 52 4f 52 20 26 26 20 21 70 2d 3e 69 73  _ERROR && !p->is
f6a0: 49 67 6e 6f 72 65 45 72 72 6f 72 73 20 29 7b 0a  IgnoreErrors ){.
f6b0: 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20      p->nErr++;. 
f6c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
f6d0: 72 2c 20 22 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  r, "%s\n", z);. 
f6e0: 20 7d 20 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 45   } ..  if( p->nE
f6f0: 72 72 3d 3d 30 20 26 26 20 28 0a 20 20 20 20 20  rr==0 && (.     
f700: 20 20 20 28 65 54 79 70 65 3d 3d 47 45 4e 46 4b     (eType==GENFK
f710: 45 59 5f 43 52 45 41 54 45 54 52 49 47 47 45 52  EY_CREATETRIGGER
f720: 29 0a 20 20 20 20 20 7c 7c 20 28 65 54 79 70 65  ).     || (eType
f730: 3d 3d 47 45 4e 46 4b 45 59 5f 44 52 4f 50 54 52  ==GENFKEY_DROPTR
f740: 49 47 47 45 52 20 26 26 20 21 70 2d 3e 69 73 4e  IGGER && !p->isN
f750: 6f 44 72 6f 70 29 0a 20 20 29 29 7b 0a 20 20 20  oDrop).  )){.   
f760: 20 69 66 28 20 70 2d 3e 69 73 45 78 65 63 20 29   if( p->isExec )
f770: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f780: 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 2c 20 30  exec(p->db, z, 0
f790: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
f7a0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
f7b0: 7a 43 6f 6c 20 3d 20 22 73 71 6c 22 3b 0a 20 20  zCol = "sql";.  
f7c0: 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 28 76 6f      callback((vo
f7d0: 69 64 20 2a 29 70 2d 3e 70 43 62 2c 20 31 2c 20  id *)p->pCb, 1, 
f7e0: 28 63 68 61 72 20 2a 2a 29 26 7a 2c 20 28 63 68  (char **)&z, (ch
f7f0: 61 72 20 2a 2a 29 26 7a 43 6f 6c 29 3b 0a 20 20  ar **)&zCol);.  
f800: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
f810: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
f820: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 78  endif../*.** Tex
f830: 74 20 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73  t of a help mess
f840: 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  age.*/.static ch
f850: 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 20 20 22  ar zHelp[] =.  "
f860: 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c  .backup ?DB? FIL
f870: 45 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42  E      Backup DB
f880: 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e   (default \"main
f890: 5c 22 29 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20  \") to FILE\n". 
f8a0: 20 22 2e 62 61 69 6c 20 4f 4e 7c 4f 46 46 20 20   ".bail ON|OFF  
f8b0: 20 20 20 20 20 20 20 20 20 53 74 6f 70 20 61 66           Stop af
f8c0: 74 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65  ter hitting an e
f8d0: 72 72 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f  rror.  Default O
f8e0: 46 46 5c 6e 22 0a 20 20 22 2e 64 61 74 61 62 61  FF\n".  ".databa
f8f0: 73 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ses             
f900: 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66  List names and f
f910: 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65 64  iles of attached
f920: 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a 20 20   databases\n".  
f930: 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e  ".dump ?TABLE? .
f940: 2e 2e 20 20 20 20 20 20 44 75 6d 70 20 74 68 65  ..      Dump the
f950: 20 64 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20   database in an 
f960: 53 51 4c 20 74 65 78 74 20 66 6f 72 6d 61 74 5c  SQL text format\
f970: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
f990: 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
f9a0: 64 2c 20 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62  d, only dump tab
f9b0: 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a  les matching\n".
f9c0: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45              LIKE
f9e0: 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c   pattern TABLE.\
f9f0: 6e 22 0a 20 20 22 2e 65 63 68 6f 20 4f 4e 7c 4f  n".  ".echo ON|O
fa00: 46 46 20 20 20 20 20 20 20 20 20 20 20 54 75 72  FF           Tur
fa10: 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f  n command echo o
fa20: 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
fa30: 65 78 69 74 20 20 20 20 20 20 20 20 20 20 20 20  exit            
fa40: 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
fa50: 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65  program\n".  ".e
fa60: 78 70 6c 61 69 6e 20 4f 4e 7c 4f 46 46 20 20 20  xplain ON|OFF   
fa70: 20 20 20 20 20 54 75 72 6e 20 6f 75 74 70 75 74       Turn output
fa80: 20 6d 6f 64 65 20 73 75 69 74 61 62 6c 65 20 66   mode suitable f
fa90: 6f 72 20 45 58 50 4c 41 49 4e 20 6f 6e 20 6f 72  or EXPLAIN on or
faa0: 20 6f 66 66 2e 5c 6e 22 0a 23 69 66 20 21 64 65   off.\n".#if !de
fab0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fac0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
fad0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
fae0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
faf0: 29 0a 20 20 22 2e 67 65 6e 66 6b 65 79 20 3f 4f  ).  ".genfkey ?O
fb00: 50 54 49 4f 4e 53 3f 20 20 20 20 20 4f 70 74 69  PTIONS?     Opti
fb10: 6f 6e 73 20 61 72 65 3a 5c 6e 22 0a 20 20 22 20  ons are:\n".  " 
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 20 20 20 20 20 20 20 20 2d 2d 6e 6f 2d 64 72 6f          --no-dro
fb40: 70 3a 20 44 6f 20 6e 6f 74 20 64 72 6f 70 20 6f  p: Do not drop o
fb50: 6c 64 20 66 6b 65 79 20 74 72 69 67 67 65 72 73  ld fkey triggers
fb60: 2e 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  .\n".  "        
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb80: 20 2d 2d 69 67 6e 6f 72 65 2d 65 72 72 6f 72 73   --ignore-errors
fb90: 3a 20 49 67 6e 6f 72 65 20 74 61 62 6c 65 73 20  : Ignore tables 
fba0: 77 69 74 68 20 66 6b 65 79 20 65 72 72 6f 72 73  with fkey errors
fbb0: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 2d 2d 65 78 65 63 3a 20 45 78 65 63 75 74 65 20  --exec: Execute 
fbe0: 67 65 6e 65 72 61 74 65 64 20 53 51 4c 20 69 6d  generated SQL im
fbf0: 6d 65 64 69 61 74 65 6c 79 5c 6e 22 0a 20 20 22  mediately\n".  "
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 20 20 53 65 65 20 66 69 6c 65 20         See file 
fc20: 74 6f 6f 6c 2f 67 65 6e 66 6b 65 79 2e 52 45 41  tool/genfkey.REA
fc30: 44 4d 45 20 69 6e 20 74 68 65 20 73 6f 75 72 63  DME in the sourc
fc40: 65 20 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  e \n".  "       
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 64 69 73 74 72 69 62 75 74 69 6f 6e 20 66 6f 72  distribution for
fc70: 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61   further informa
fc80: 74 69 6f 6e 2e 5c 6e 22 0a 23 65 6e 64 69 66 0a  tion.\n".#endif.
fc90: 20 20 22 2e 68 65 61 64 65 72 28 73 29 20 4f 4e    ".header(s) ON
fca0: 7c 4f 46 46 20 20 20 20 20 20 54 75 72 6e 20 64  |OFF      Turn d
fcb0: 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72  isplay of header
fcc0: 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  s on or off\n". 
fcd0: 20 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20   ".help         
fce0: 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
fcf0: 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20  is message\n".  
fd00: 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41  ".import FILE TA
fd10: 42 4c 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64  BLE     Import d
fd20: 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ata from FILE in
fd30: 74 6f 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 2e  to TABLE\n".  ".
fd40: 69 6e 64 69 63 65 73 20 3f 54 41 42 4c 45 3f 20  indices ?TABLE? 
fd50: 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73        Show names
fd60: 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 5c   of all indices\
fd70: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
fd90: 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
fda0: 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64  d, only show ind
fdb0: 69 63 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c  ices for tables\
fdc0: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
fde0: 61 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74  atching LIKE pat
fdf0: 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23  tern TABLE.\n".#
fe00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fe10: 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e  BLE_IOTRACE.  ".
fe20: 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20  iotrace FILE    
fe30: 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f        Enable I/O
fe40: 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67   diagnostic logg
fe50: 69 6e 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23  ing to FILE\n".#
fe60: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
fe70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
fe80: 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61  XTENSION.  ".loa
fe90: 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20  d FILE ?ENTRY?  
fea0: 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e     Load an exten
feb0: 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22 0a  sion library\n".
fec0: 23 65 6e 64 69 66 0a 20 20 22 2e 6d 6f 64 65 20  #endif.  ".mode 
fed0: 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20  MODE ?TABLE?    
fee0: 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65   Set output mode
fef0: 20 77 68 65 72 65 20 4d 4f 44 45 20 69 73 20 6f   where MODE is o
ff00: 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20 20  ne of:\n".  "   
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 20 20 20 20 63 73 76 20 20 20 20 20 20 43        csv      C
ff30: 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76  omma-separated v
ff40: 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  alues\n".  "    
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65       column   Le
ff70: 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d  ft-aligned colum
ff80: 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68  ns.  (See .width
ff90: 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  )\n".  "        
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c   html     HTML <
ffc0: 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a 20  table> code\n". 
ffd0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
ffe0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 73 65 72             inser
fff0: 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73  t   SQL insert s
10000 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41  tatements for TA
10010 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  BLE\n".  "      
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20     line     One 
10040 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c 6e  value per line\n
10050 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
10070 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64 65  st     Values de
10080 6c 69 6d 69 74 65 64 20 62 79 20 2e 73 65 70 61  limited by .sepa
10090 72 61 74 6f 72 20 73 74 72 69 6e 67 5c 6e 22 0a  rator string\n".
100a0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
100b0 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 73              tabs
100c0 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74       Tab-separat
100d0 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22  ed values\n".  "
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 20 20 20 74 63 6c 20 20 20 20           tcl    
10100 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65    TCL list eleme
10110 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76  nts\n".  ".nullv
10120 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20 20  alue STRING     
10130 20 50 72 69 6e 74 20 53 54 52 49 4e 47 20 69 6e   Print STRING in
10140 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76   place of NULL v
10150 61 6c 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 75 74  alues\n".  ".out
10160 70 75 74 20 46 49 4c 45 4e 41 4d 45 20 20 20 20  put FILENAME    
10170 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
10180 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20  o FILENAME\n".  
10190 22 2e 6f 75 74 70 75 74 20 73 74 64 6f 75 74 20  ".output stdout 
101a0 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
101b0 70 75 74 20 74 6f 20 74 68 65 20 73 63 72 65 65  put to the scree
101c0 6e 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20  n\n".  ".prompt 
101d0 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52  MAIN CONTINUE  R
101e0 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64  eplace the stand
101f0 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20  ard prompts\n". 
10200 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20   ".quit         
10210 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
10220 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20  is program\n".  
10230 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20  ".read FILENAME 
10240 20 20 20 20 20 20 20 20 45 78 65 63 75 74 65 20          Execute 
10250 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c  SQL in FILENAME\
10260 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f  n".  ".restore ?
10270 44 42 3f 20 46 49 4c 45 20 20 20 20 20 52 65 73  DB? FILE     Res
10280 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tore content of 
10290 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61  DB (default \"ma
102a0 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c  in\") from FILE\
102b0 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 54  n".  ".schema ?T
102c0 41 42 4c 45 3f 20 20 20 20 20 20 20 20 53 68 6f  ABLE?        Sho
102d0 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  w the CREATE sta
102e0 74 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 20 20  tements\n".  "  
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20         If TABLE 
10310 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
10320 73 68 6f 77 20 74 61 62 6c 65 73 20 6d 61 74 63  show tables matc
10330 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20  hing\n".  "     
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e      LIKE pattern
10360 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 73   TABLE.\n".  ".s
10370 65 70 61 72 61 74 6f 72 20 53 54 52 49 4e 47 20  eparator STRING 
10380 20 20 20 20 20 43 68 61 6e 67 65 20 73 65 70 61       Change sepa
10390 72 61 74 6f 72 20 75 73 65 64 20 62 79 20 6f 75  rator used by ou
103a0 74 70 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69  tput mode and .i
103b0 6d 70 6f 72 74 5c 6e 22 0a 20 20 22 2e 73 68 6f  mport\n".  ".sho
103c0 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
103d0 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72     Show the curr
103e0 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76  ent values for v
103f0 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 5c  arious settings\
10400 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54  n".  ".tables ?T
10410 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69 73  ABLE?        Lis
10420 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
10430 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66   If TABLE specif
10460 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20 74  ied, only list t
10470 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e  ables matching\n
10480 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49                LI
104a0 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
104b0 2e 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74  .\n".  ".timeout
104c0 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 54   MS            T
104d0 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65  ry opening locke
104e0 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20  d tables for MS 
104f0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a  milliseconds\n".
10500 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 20 4e 55    ".width NUM NU
10510 4d 20 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f  M ...     Set co
10520 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20  lumn widths for 
10530 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c  \"column\" mode\
10540 6e 22 0a 3b 0a 0a 73 74 61 74 69 63 20 63 68 61  n".;..static cha
10550 72 20 7a 54 69 6d 65 72 48 65 6c 70 5b 5d 20 3d  r zTimerHelp[] =
10560 0a 20 20 22 2e 74 69 6d 65 72 20 4f 4e 7c 4f 46  .  ".timer ON|OF
10570 46 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  F          Turn 
10580 74 68 65 20 43 50 55 20 74 69 6d 65 72 20 6d 65  the CPU timer me
10590 61 73 75 72 65 6d 65 6e 74 20 6f 6e 20 6f 72 20  asurement on or 
105a0 6f 66 66 5c 6e 22 0a 3b 0a 0a 2f 2a 20 46 6f 72  off\n".;../* For
105b0 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
105c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
105d0 63 65 73 73 5f 69 6e 70 75 74 28 73 74 72 75 63  cess_input(struc
105e0 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
105f0 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a  *p, FILE *in);..
10600 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
10610 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
10620 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20  open.  If it is 
10630 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69  not, then open i
10640 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61  t.  If.** the da
10650 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20  tabase fails to 
10660 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65  open, print an e
10670 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
10680 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   exit..*/.static
10690 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 73 74   void open_db(st
106a0 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
106b0 74 61 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ta *p){.  if( p-
106c0 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  >db==0 ){.    sq
106d0 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44  lite3_open(p->zD
106e0 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
106f0 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 70 2d 3e  b);.    db = p->
10700 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 20 26  db;.    if( db &
10710 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
10720 65 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e(db)==SQLITE_OK
10730 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10740 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
10750 6e 28 64 62 2c 20 22 73 68 65 6c 6c 73 74 61 74  n(db, "shellstat
10760 69 63 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55  ic", 0, SQLITE_U
10770 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
10780 20 20 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e    shellstaticFun
10790 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  c, 0, 0);.    }.
107a0 20 20 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c      if( db==0 ||
107b0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
107c0 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 20  te3_errcode(db) 
107d0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
107e0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
107f0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
10800 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
10810 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
10820 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
10830 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
10840 28 64 62 29 29 3b 0a 20 20 20 20 20 20 65 78 69  (db));.      exi
10850 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  t(1);.    }.#ifn
10860 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10870 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
10880 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
10890 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
108a0 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64  (p->db, 1);.#end
108b0 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
108c0 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74  Do C-language st
108d0 79 6c 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a  yle dequoting..*
108e0 2a 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e  *.**    \t    ->
108f0 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20   tab.**    \n   
10900 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20   -> newline.**  
10910 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
10920 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
10930 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20   \NNN  -> ascii 
10940 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e  character NNN in
10950 20 6f 63 74 61 6c 0a 2a 2a 20 20 20 20 5c 5c 20   octal.**    \\ 
10960 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68 0a     -> backslash.
10970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
10980 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
10990 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  es(char *z){.  i
109a0 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
109b0 63 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  c;.  for(i=j=0; 
109c0 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
109d0 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, j++){.    if
109e0 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
109f0 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
10a00 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6e 27 20       if( c=='n' 
10a10 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
10a20 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \n';.      }else
10a30 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20   if( c=='t' ){. 
10a40 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b         c = '\t';
10a50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
10a60 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20   c=='r' ){.     
10a70 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20     c = '\r';.   
10a80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d     }else if( c>=
10a90 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b  '0' && c<='7' ){
10aa0 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30  .        c -= '0
10ab0 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ';.        if( z
10ac0 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
10ad0 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
10ae0 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
10af0 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
10b00 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
10b10 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
10b20 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
10b30 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
10b40 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
10b50 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
10b60 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
10b70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10b90 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
10ba0 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  c;.  }.  z[j] = 
10bb0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  0;.}../*.** Inte
10bc0 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61 20  rpret zArg as a 
10bd0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20  boolean value.  
10be0 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 30 20  Return either 0 
10bf0 6f 72 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  or 1..*/.static 
10c00 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  int booleanValue
10c10 28 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20  (char *zArg){.  
10c20 69 6e 74 20 76 61 6c 20 3d 20 61 74 6f 69 28 7a  int val = atoi(z
10c30 41 72 67 29 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  Arg);.  int j;. 
10c40 20 66 6f 72 28 6a 3d 30 3b 20 7a 41 72 67 5b 6a   for(j=0; zArg[j
10c50 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 41 72  ]; j++){.    zAr
10c60 67 5b 6a 5d 20 3d 20 28 63 68 61 72 29 74 6f 6c  g[j] = (char)tol
10c70 6f 77 65 72 28 7a 41 72 67 5b 6a 5d 29 3b 0a 20  ower(zArg[j]);. 
10c80 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28   }.  if( strcmp(
10c90 7a 41 72 67 2c 22 6f 6e 22 29 3d 3d 30 20 29 7b  zArg,"on")==0 ){
10ca0 0a 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a 20 20  .    val = 1;.  
10cb0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10cc0 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20  (zArg,"yes")==0 
10cd0 29 7b 0a 20 20 20 20 76 61 6c 20 3d 20 31 3b 0a  ){.    val = 1;.
10ce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 61 6c    }.  return val
10cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  ;.}../*.** If an
10d00 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69   input line begi
10d10 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e  ns with "." then
10d20 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
10d30 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65  tine to.** proce
10d40 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  ss that line..**
10d50 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
10d60 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
10d70 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
10d80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10d90 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
10da0 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 73 74  (char *zLine, st
10db0 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
10dc0 74 61 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 20  ta *p){.  int i 
10dd0 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  = 1;.  int nArg 
10de0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b  = 0;.  int n, c;
10df0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
10e00 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d   char *azArg[50]
10e10 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
10e20 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74  e input line int
10e30 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  o tokens..  */. 
10e40 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d   while( zLine[i]
10e50 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69   && nArg<ArraySi
10e60 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20  ze(azArg) ){.   
10e70 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
10e80 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
10e90 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b  Line[i]) ){ i++;
10ea0 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
10eb0 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [i]==0 ) break;.
10ec0 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d      if( zLine[i]
10ed0 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b  =='\'' || zLine[
10ee0 69 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  i]=='"' ){.     
10ef0 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69   int delim = zLi
10f00 6e 65 5b 69 2b 2b 5d 3b 0a 20 20 20 20 20 20 61  ne[i++];.      a
10f10 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
10f20 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20  zLine[i];.      
10f30 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20  while( zLine[i] 
10f40 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 64 65 6c  && zLine[i]!=del
10f50 69 6d 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  im ){ i++; }.   
10f60 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d     if( zLine[i]=
10f70 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
10f80 20 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30    zLine[i++] = 0
10f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10fa0 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29  if( delim=='"' )
10fb0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
10fc0 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
10fd0 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
10fe0 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
10ff0 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b  ++] = &zLine[i];
11000 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
11010 69 6e 65 5b 69 5d 20 26 26 20 21 69 73 73 70 61  ine[i] && !isspa
11020 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
11030 72 29 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69  r)zLine[i]) ){ i
11040 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
11050 7a 4c 69 6e 65 5b 69 5d 20 29 20 7a 4c 69 6e 65  zLine[i] ) zLine
11060 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [i++] = 0;.     
11070 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
11080 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
11090 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  1]);.    }.  }..
110a0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
110b0 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a   input line..  *
110c0 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  /.  if( nArg==0 
110d0 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
110e0 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72  o tokens, no err
110f0 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c  or */.  n = strl
11100 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  en30(azArg[0]);.
11110 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30    c = azArg[0][0
11120 5d 3b 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  ];.  if( c=='b' 
11130 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
11140 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
11150 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 20 26 26 20  ckup", n)==0 && 
11160 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 63 6f  nArg>1 ){.    co
11170 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
11180 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
11190 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71  har *zDb;.    sq
111a0 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20  lite3 *pDest;.  
111b0 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
111c0 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
111d0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
111e0 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
111f0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
11200 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
11210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
11220 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67  DestFile = azArg
11230 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d  [2];.      zDb =
11240 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d   azArg[1];.    }
11250 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11260 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c 65  3_open(zDestFile
11270 2c 20 26 70 44 65 73 74 29 3b 0a 20 20 20 20 69  , &pDest);.    i
11280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11290 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
112a0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
112b0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
112c0 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69  %s\"\n", zDestFi
112d0 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
112e0 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
112f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
11300 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
11310 64 62 28 70 29 3b 0a 20 20 20 20 70 42 61 63 6b  db(p);.    pBack
11320 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
11330 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20  kup_init(pDest, 
11340 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a  "main", p->db, z
11350 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
11360 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
11370 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
11380 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
11390 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
113a0 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 73 71  Dest));.      sq
113b0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
113c0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
113d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   1;.    }.    wh
113e0 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
113f0 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
11400 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
11410 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
11420 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
11430 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
11440 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11450 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
11460 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
11470 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  lse{.      fprin
11480 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
11490 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
114a0 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 29  3_errmsg(pDest))
114b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
114c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
114d0 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
114e0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
114f0 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
11500 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
11510 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30  ], "bail", n)==0
11520 20 26 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20   && nArg>1 ){.  
11530 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20    bail_on_error 
11540 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
11550 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73  zArg[1]);.  }els
11560 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
11570 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  && n>1 && strncm
11580 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74  p(azArg[0], "dat
11590 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29  abases", n)==0 )
115a0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 61 6c  {.    struct cal
115b0 6c 62 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b  lback_data data;
115c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
115d0 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e  sg = 0;.    open
115e0 5f 64 62 28 70 29 3b 0a 20 20 20 20 6d 65 6d 63  _db(p);.    memc
115f0 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
11600 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
11610 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
11620 3d 20 31 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f  = 1;.    data.mo
11630 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  de = MODE_Column
11640 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c 57 69  ;.    data.colWi
11650 64 74 68 5b 30 5d 20 3d 20 33 3b 0a 20 20 20 20  dth[0] = 3;.    
11660 64 61 74 61 2e 63 6f 6c 57 69 64 74 68 5b 31 5d  data.colWidth[1]
11670 20 3d 20 31 35 3b 0a 20 20 20 20 64 61 74 61 2e   = 15;.    data.
11680 63 6f 6c 57 69 64 74 68 5b 32 5d 20 3d 20 35 38  colWidth[2] = 58
11690 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d  ;.    data.cnt =
116a0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
116b0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41  exec(p->db, "PRA
116c0 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73  GMA database_lis
116d0 74 3b 20 22 2c 20 63 61 6c 6c 62 61 63 6b 2c 20  t; ", callback, 
116e0 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
116f0 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  ;.    if( zErrMs
11700 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  g ){.      fprin
11710 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
11720 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
11730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11740 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
11750 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
11760 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
11770 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
11780 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
11790 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  dump", n)==0 ){.
117a0 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
117b0 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f  g = 0;.    open_
117c0 64 62 28 70 29 3b 0a 20 20 20 20 2f 2a 20 57 68  db(p);.    /* Wh
117d0 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
117e0 61 20 22 64 75 6d 70 22 2c 20 74 68 65 20 63 6f  a "dump", the co
117f0 6e 74 65 6e 74 20 6d 69 67 68 74 20 61 70 70 65  ntent might appe
11800 61 72 20 69 6e 20 61 6e 20 6f 72 64 65 72 0a 20  ar in an order. 
11810 20 20 20 2a 2a 20 77 68 69 63 68 20 63 61 75 73     ** which caus
11820 65 73 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  es immediate for
11830 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
11840 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f 6c 61  ints to be viola
11850 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 64  ted..    ** So d
11860 69 73 61 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b  isable foreign-k
11870 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e  ey constraint en
11880 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70 72 65  forcement to pre
11890 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e 20 2a  vent problems. *
118a0 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  /.    fprintf(p-
118b0 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f  >out, "PRAGMA fo
118c0 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c  reign_keys=OFF;\
118d0 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  n");.    fprintf
118e0 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20  (p->out, "BEGIN 
118f0 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29  TRANSACTION;\n")
11900 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c  ;.    p->writabl
11910 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  eSchema = 0;.   
11920 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
11930 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69  >db, "PRAGMA wri
11940 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22  table_schema=ON"
11950 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11960 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
11970 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
11980 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 0a 20  dump_query(p, . 
11990 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
119a0 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
119b0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
119c0 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
119d0 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20  RE sql NOT NULL 
119e0 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65  AND type=='table
119f0 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c  ' AND name!='sql
11a00 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 2c 20  ite_sequence'", 
11a10 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
11a20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
11a30 5f 71 75 65 72 79 28 70 2c 20 0a 20 20 20 20 20  _query(p, .     
11a40 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
11a50 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20   type, sql FROM 
11a60 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
11a70 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 6e          "WHERE n
11a80 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73 65 71  ame=='sqlite_seq
11a90 75 65 6e 63 65 27 22 2c 20 30 0a 20 20 20 20 20  uence'", 0.     
11aa0 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61   );.      run_ta
11ab0 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
11ac0 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 0a 20 20  ->out, p->db,.  
11ad0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
11ae0 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
11af0 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
11b00 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
11b10 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  LL AND type IN (
11b20 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
11b30 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a 20 20  ','view')", 0.  
11b40 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
11b50 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
11b60 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
11b70 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
11b80 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63      zShellStatic
11b90 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
11ba0 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
11bb0 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
11bc0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
11bd0 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
11be0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
11bf0 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  er ".          "
11c00 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c  WHERE tbl_name L
11c10 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28  IKE shellstatic(
11c20 29 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62  ) AND type=='tab
11c30 6c 65 27 22 0a 20 20 20 20 20 20 20 20 20 20 22  le'".          "
11c40 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55    AND sql NOT NU
11c50 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LL", 0);.       
11c60 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f   run_table_dump_
11c70 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20 70 2d  query(p->out, p-
11c80 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22  >db,.          "
11c90 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
11ca0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
11cb0 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45            "WHERE
11cc0 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20   sql NOT NULL". 
11cd0 20 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20           "  AND 
11ce0 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27  type IN ('index'
11cf0 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77  ,'trigger','view
11d00 27 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ')".          " 
11d10 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49   AND tbl_name LI
11d20 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29  KE shellstatic()
11d30 22 2c 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a  ", 0.        );.
11d40 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74          zShellSt
11d50 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  atic = 0;.      
11d60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
11d70 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
11d80 61 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  a ){.      fprin
11d90 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47  tf(p->out, "PRAG
11da0 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
11db0 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20  ma=OFF;\n");.   
11dc0 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63     p->writableSc
11dd0 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  hema = 0;.    }.
11de0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
11df0 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
11e00 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
11e10 4f 46 46 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  OFF", 0, 0, 0);.
11e20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
11e30 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
11e40 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
11e50 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
11e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11e70 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
11e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
11e90 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
11ea0 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20  COMMIT;\n");.   
11eb0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
11ec0 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
11ed0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
11ee0 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  cho", n)==0 && n
11ef0 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 70 2d 3e  Arg>1 ){.    p->
11f00 65 63 68 6f 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e  echoOn = boolean
11f10 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
11f20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
11f30 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
11f40 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69  p(azArg[0], "exi
11f50 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
11f60 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65   rc = 2;.  }else
11f70 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
11f80 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
11f90 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e  0], "explain", n
11fa0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
11fb0 76 61 6c 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20  val = nArg>=2 ? 
11fc0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
11fd0 72 67 5b 31 5d 29 20 3a 20 31 3b 0a 20 20 20 20  rg[1]) : 1;.    
11fe0 69 66 28 76 61 6c 20 3d 3d 20 31 29 20 7b 0a 20  if(val == 1) {. 
11ff0 20 20 20 20 20 69 66 28 21 70 2d 3e 65 78 70 6c       if(!p->expl
12000 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 29 20 7b  ainPrev.valid) {
12010 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 70 6c  .        p->expl
12020 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3d 20  ainPrev.valid = 
12030 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  1;.        p->ex
12040 70 6c 61 69 6e 50 72 65 76 2e 6d 6f 64 65 20 3d  plainPrev.mode =
12050 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20   p->mode;.      
12060 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76    p->explainPrev
12070 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d  .showHeader = p-
12080 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20  >showHeader;.   
12090 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 65       memcpy(p->e
120a0 78 70 6c 61 69 6e 50 72 65 76 2e 63 6f 6c 57 69  xplainPrev.colWi
120b0 64 74 68 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 2c  dth,p->colWidth,
120c0 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 57 69 64  sizeof(p->colWid
120d0 74 68 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  th));.      }.  
120e0 20 20 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20      /* We could 
120f0 70 75 74 20 74 68 69 73 20 63 6f 64 65 20 75 6e  put this code un
12100 64 65 72 20 74 68 65 20 21 70 2d 3e 65 78 70 6c  der the !p->expl
12110 61 69 6e 56 61 6c 69 64 0a 20 20 20 20 20 20 2a  ainValid.      *
12120 2a 20 63 6f 6e 64 69 74 69 6f 6e 20 73 6f 20 74  * condition so t
12130 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
12140 65 78 65 63 75 74 65 20 69 66 20 77 65 20 61 72  execute if we ar
12150 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 20  e already in.   
12160 20 20 20 2a 2a 20 65 78 70 6c 61 69 6e 20 6d 6f     ** explain mo
12170 64 65 2e 20 48 6f 77 65 76 65 72 2c 20 61 6c 77  de. However, alw
12180 61 79 73 20 65 78 65 63 75 74 69 6e 67 20 69 74  ays executing it
12190 20 61 6c 6c 6f 77 73 20 75 73 20 61 6e 20 65 61   allows us an ea
121a0 73 79 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  sy.      ** was 
121b0 74 6f 20 72 65 73 65 74 20 74 6f 20 65 78 70 6c  to reset to expl
121c0 61 69 6e 20 6d 6f 64 65 20 69 6e 20 63 61 73 65  ain mode in case
121d0 20 74 68 65 20 75 73 65 72 20 70 72 65 76 69 6f   the user previo
121e0 75 73 6c 79 0a 20 20 20 20 20 20 2a 2a 20 64 69  usly.      ** di
121f0 64 20 61 6e 20 2e 65 78 70 6c 61 69 6e 20 66 6f  d an .explain fo
12200 6c 6c 6f 77 65 64 20 62 79 20 61 20 2e 77 69 64  llowed by a .wid
12210 74 68 2c 20 2e 6d 6f 64 65 20 6f 72 20 2e 68 65  th, .mode or .he
12220 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ader.      ** co
12230 6d 6d 61 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  mmand..      */.
12240 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
12250 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20  MODE_Explain;.  
12260 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65      p->showHeade
12270 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 65 6d  r = 1;.      mem
12280 73 65 74 28 70 2d 3e 63 6f 6c 57 69 64 74 68 2c  set(p->colWidth,
12290 30 2c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63  0,ArraySize(p->c
122a0 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20 20 20  olWidth));.     
122b0 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 30 5d 20   p->colWidth[0] 
122c0 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 4;            
122d0 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2a 2f        /* addr */
122e0 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
122f0 74 68 5b 31 5d 20 3d 20 31 33 3b 20 20 20 20 20  th[1] = 13;     
12300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
12310 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 70  pcode */.      p
12320 2d 3e 63 6f 6c 57 69 64 74 68 5b 32 5d 20 3d 20  ->colWidth[2] = 
12330 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4;              
12340 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
12350 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 33     p->colWidth[3
12360 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20  ] = 4;          
12370 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
12380 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
12390 74 68 5b 34 5d 20 3d 20 34 3b 20 20 20 20 20 20  th[4] = 4;      
123a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
123b0 33 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f  3 */.      p->co
123c0 6c 57 69 64 74 68 5b 35 5d 20 3d 20 31 33 3b 20  lWidth[5] = 13; 
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123e0 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 70  /* P4 */.      p
123f0 2d 3e 63 6f 6c 57 69 64 74 68 5b 36 5d 20 3d 20  ->colWidth[6] = 
12400 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
12410 20 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20      /* P5 */.   
12420 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 37     p->colWidth[7
12430 5d 20 3d 20 31 33 3b 20 20 20 20 20 20 20 20 20  ] = 13;         
12440 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
12450 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ent */.    }else
12460 20 69 66 20 28 70 2d 3e 65 78 70 6c 61 69 6e 50   if (p->explainP
12470 72 65 76 2e 76 61 6c 69 64 29 20 7b 0a 20 20 20  rev.valid) {.   
12480 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65     p->explainPre
12490 76 2e 76 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  v.valid = 0;.   
124a0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e     p->mode = p->
124b0 65 78 70 6c 61 69 6e 50 72 65 76 2e 6d 6f 64 65  explainPrev.mode
124c0 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48  ;.      p->showH
124d0 65 61 64 65 72 20 3d 20 70 2d 3e 65 78 70 6c 61  eader = p->expla
124e0 69 6e 50 72 65 76 2e 73 68 6f 77 48 65 61 64 65  inPrev.showHeade
124f0 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
12500 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 70 2d 3e 65  p->colWidth,p->e
12510 78 70 6c 61 69 6e 50 72 65 76 2e 63 6f 6c 57 69  xplainPrev.colWi
12520 64 74 68 2c 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  dth,sizeof(p->co
12530 6c 57 69 64 74 68 29 29 3b 0a 20 20 20 20 7d 0a  lWidth));.    }.
12540 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 21 64 65    }else..#if !de
12550 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12560 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
12570 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
12580 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12590 29 0a 20 20 69 66 28 20 63 3d 3d 27 67 27 20 26  ).  if( c=='g' &
125a0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
125b0 30 5d 2c 20 22 67 65 6e 66 6b 65 79 22 2c 20 6e  0], "genfkey", n
125c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 47 65 6e 66  )==0 ){.    Genf
125d0 6b 65 79 43 6d 64 20 63 6d 64 3b 0a 20 20 20 20  keyCmd cmd;.    
125e0 69 66 28 20 30 3d 3d 67 65 6e 66 6b 65 79 50 61  if( 0==genfkeyPa
125f0 72 73 65 41 72 67 73 28 26 63 6d 64 2c 20 26 61  rseArgs(&cmd, &a
12600 7a 41 72 67 5b 31 5d 2c 20 6e 41 72 67 2d 31 29  zArg[1], nArg-1)
12610 20 29 7b 0a 20 20 20 20 20 20 63 6d 64 2e 64 62   ){.      cmd.db
12620 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 20 20   = p->db;.      
12630 63 6d 64 2e 70 43 62 20 3d 20 70 3b 0a 20 20 20  cmd.pCb = p;.   
12640 20 20 20 67 65 6e 66 6b 65 79 5f 63 72 65 61 74     genfkey_creat
12650 65 5f 74 72 69 67 67 65 72 73 28 70 2d 3e 64 62  e_triggers(p->db
12660 2c 20 22 6d 61 69 6e 22 2c 20 28 76 6f 69 64 20  , "main", (void 
12670 2a 29 26 63 6d 64 2c 20 67 65 6e 66 6b 65 79 43  *)&cmd, genfkeyC
12680 6d 64 43 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  mdCb);.    }.  }
12690 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
126a0 66 28 20 63 3d 3d 27 68 27 20 26 26 20 28 73 74  f( c=='h' && (st
126b0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
126c0 22 68 65 61 64 65 72 22 2c 20 6e 29 3d 3d 30 20  "header", n)==0 
126d0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
126e0 20 20 20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72      strncmp(azAr
126f0 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c  g[0], "headers",
12700 20 6e 29 3d 3d 30 20 29 26 26 20 6e 41 72 67 3e   n)==0 )&& nArg>
12710 31 20 29 7b 0a 20 20 20 20 70 2d 3e 73 68 6f 77  1 ){.    p->show
12720 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e  Header = boolean
12730 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
12740 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
12750 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  c=='h' && strncm
12760 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c  p(azArg[0], "hel
12770 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
12780 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12790 22 25 73 22 2c 7a 48 65 6c 70 29 3b 0a 20 20 20  "%s",zHelp);.   
127a0 20 69 66 28 20 48 41 53 5f 54 49 4d 45 52 20 29   if( HAS_TIMER )
127b0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
127c0 73 74 64 65 72 72 2c 22 25 73 22 2c 7a 54 69 6d  stderr,"%s",zTim
127d0 65 72 48 65 6c 70 29 3b 0a 20 20 20 20 7d 0a 20  erHelp);.    }. 
127e0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
127f0 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
12800 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72  azArg[0], "impor
12810 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  t", n)==0 && nAr
12820 67 3e 3d 33 20 29 7b 0a 20 20 20 20 63 68 61 72  g>=3 ){.    char
12830 20 2a 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67   *zTable = azArg
12840 5b 32 5d 3b 20 20 20 20 2f 2a 20 49 6e 73 65 72  [2];    /* Inser
12850 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  t data into this
12860 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68   table */.    ch
12870 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72  ar *zFile = azAr
12880 67 5b 31 5d 3b 20 20 20 20 20 2f 2a 20 54 68 65  g[1];     /* The
12890 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
128a0 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61   to extract data
128b0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
128c0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55  stmt *pStmt = NU
128d0 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d 65  LL; /* A stateme
128e0 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  nt */.    int nC
128f0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
12900 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12910 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
12920 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
12930 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
12940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12950 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
12960 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a   an SQL string *
12970 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20  /.    int i, j; 
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12990 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
129a0 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  rs */.    int nS
129b0 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
129c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
129d0 6f 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 73  of bytes in p->s
129e0 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20  eparator[] */.  
129f0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a10 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
12a20 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  t */.    char *z
12a30 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Line;           
12a40 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
12a50 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66   line of input f
12a60 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  rom the file */.
12a70 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
12a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a90 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65  /* zLine[] broke
12aa0 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e  n up into column
12ab0 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  s */.    char *z
12ac0 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20  Commit;         
12ad0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63       /* How to c
12ae0 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f  ommit changes */
12af0 20 20 20 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e     .    FILE *in
12b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12b10 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74      /* The input
12b20 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
12b30 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20   lineno = 0;    
12b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
12b50 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   number of input
12b60 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f 70   file */..    op
12b70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 6e 53  en_db(p);.    nS
12b80 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
12b90 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  >separator);.   
12ba0 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
12bb0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
12bc0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f  derr, "Error: no
12bd0 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72  n-null separator
12be0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d   required for im
12bf0 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
12c00 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
12c10 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
12c20 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
12c30 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c  CT * FROM '%q'",
12c40 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
12c50 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
12c60 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
12c70 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
12c80 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
12c90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12ca0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
12cb0 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
12cc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12cd0 5f 70 72 65 70 61 72 65 28 70 2d 3e 64 62 2c 20  _prepare(p->db, 
12ce0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
12cf0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12d00 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
12d10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12d20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c    if (pStmt) sql
12d30 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
12d40 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 70 72 69  tmt);.      fpri
12d50 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
12d60 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
12d70 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
12d80 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
12d90 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
12da0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
12db0 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
12dc0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
12dd0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
12de0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tmt = 0;.    if(
12df0 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72   nCol==0 ) retur
12e00 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d  n 0; /* no colum
12e10 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
12e20 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f      zSql = mallo
12e30 63 28 20 6e 42 79 74 65 20 2b 20 32 30 20 2b 20  c( nByte + 20 + 
12e40 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66  nCol*2 );.    if
12e50 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
12e60 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
12e70 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
12e80 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
12e90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12ea0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
12eb0 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32  snprintf(nByte+2
12ec0 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
12ed0 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45   INTO '%q' VALUE
12ee0 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  S(?", zTable);. 
12ef0 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28     j = strlen30(
12f00 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
12f10 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
12f20 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
12f30 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
12f40 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
12f50 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
12f60 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
12f70 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
12f80 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
12f90 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  pare(p->db, zSql
12fa0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
12fb0 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29  ;.    free(zSql)
12fc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
12fd0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
12fe0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
12ff0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
13000 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
13010 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74  if (pStmt) sqlit
13020 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
13030 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
13040 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e   1;.    }.    in
13050 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
13060 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69  "rb");.    if( i
13070 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  n==0 ){.      fp
13080 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
13090 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
130a0 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  n \"%s\"\n", zFi
130b0 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
130c0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
130d0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
130e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a   1;.    }.    az
130f0 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69  Col = malloc( si
13100 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28  zeof(azCol[0])*(
13110 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69  nCol+1) );.    i
13120 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
13130 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
13140 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74  err, "Error: out
13150 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
13160 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29        fclose(in)
13170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13180 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
13190 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
131a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
131b0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
131c0 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29  BEGIN", 0, 0, 0)
131d0 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20  ;.    zCommit = 
131e0 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68  "COMMIT";.    wh
131f0 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f  ile( (zLine = lo
13200 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69  cal_getline(0, i
13210 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n))!=0 ){.      
13220 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69  char *z;.      i
13230 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65   = 0;.      line
13240 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f  no++;.      azCo
13250 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20  l[0] = zLine;.  
13260 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a      for(i=0, z=z
13270 4c 69 6e 65 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d  Line; *z && *z!=
13280 27 5c 6e 27 20 26 26 20 2a 7a 21 3d 27 5c 72 27  '\n' && *z!='\r'
13290 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
132a0 69 66 28 20 2a 7a 3d 3d 70 2d 3e 73 65 70 61 72  if( *z==p->separ
132b0 61 74 6f 72 5b 30 5d 20 26 26 20 73 74 72 6e 63  ator[0] && strnc
132c0 6d 70 28 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74  mp(z, p->separat
132d0 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a  or, nSep)==0 ){.
132e0 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30            *z = 0
132f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
13300 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
13310 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  <nCol ){.       
13320 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20       azCol[i] = 
13330 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20  &z[nSep];.      
13340 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d        z += nSep-
13350 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
13360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13370 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 20   /* end for */. 
13380 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20       *z = 0;.   
13390 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c     if( i+1!=nCol
133a0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
133b0 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
133c0 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72              "Err
133d0 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20  or: %s line %d: 
133e0 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
133f0 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20  mns of data but 
13400 66 6f 75 6e 64 20 25 64 5c 6e 22 2c 0a 20 20 20  found %d\n",.   
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
13420 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c  le, lineno, nCol
13430 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
13440 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
13450 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 66 72  ACK";.        fr
13460 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
13470 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
13480 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f     break; /* fro
13490 6d 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 20  m while */.     
134a0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
134b0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
134c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
134d0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
134e0 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20   i+1, azCol[i], 
134f0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
13500 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
13510 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
13520 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
13530 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
13540 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72  pStmt);.      fr
13550 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
13560 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  OK ){.        fp
13580 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
13590 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
135a0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
135b0 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
135c0 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
135d0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
135e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a         break; /*
135f0 20 66 72 6f 6d 20 77 68 69 6c 65 20 2a 2f 0a 20   from while */. 
13600 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
13610 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20  end while */.   
13620 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20   free(azCol);.  
13630 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
13640 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
13650 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  ze(pStmt);.    s
13660 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
13670 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  b, zCommit, 0, 0
13680 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  , 0);.  }else.. 
13690 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73   if( c=='i' && s
136a0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
136b0 20 22 69 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d   "indices", n)==
136c0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
136d0 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 64 61  callback_data da
136e0 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
136f0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f  rrMsg = 0;.    o
13700 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 6d  pen_db(p);.    m
13710 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
13720 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
13730 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
13740 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
13750 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  .mode = MODE_Lis
13760 74 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  t;.    if( nArg=
13770 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =1 ){.      rc =
13780 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
13790 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 22 53 45  >db,.        "SE
137a0 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
137b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
137c0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
137d0 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 6e  pe='index' AND n
137e0 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
137f0 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20  lite_%' ".      
13800 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20    "UNION ALL ". 
13810 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
13820 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
13830 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20  temp_master ".  
13840 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
13850 65 3d 27 69 6e 64 65 78 27 20 22 0a 20 20 20 20  e='index' ".    
13860 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 31 22      "ORDER BY 1"
13870 2c 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61  ,.        callba
13880 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
13890 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Msg.      );.   
138a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
138b0 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41  hellStatic = azA
138c0 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  rg[1];.      rc 
138d0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
138e0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 22 53  ->db,.        "S
138f0 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
13900 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
13910 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
13920 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20  ype='index' AND 
13930 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68  tbl_name LIKE sh
13940 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a 20 20  ellstatic() ".  
13950 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c        "UNION ALL
13960 20 22 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45   ".        "SELE
13970 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
13980 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
13990 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
139a0 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e   type='index' AN
139b0 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
139c0 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a  shellstatic() ".
139d0 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
139e0 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20 63 61  Y 1",.        ca
139f0 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
13a00 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b  zErrMsg.      );
13a10 0a 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61  .      zShellSta
13a20 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  tic = 0;.    }. 
13a30 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
13a40 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
13a50 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
13a60 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
13a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13a80 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
13a90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
13aa0 65 6c 73 65 20 69 66 28 20 72 63 20 21 3d 20 53  else if( rc != S
13ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13ac0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
13ad0 2c 22 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e  ,"Error: queryin
13ae0 67 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  g sqlite_master 
13af0 61 6e 64 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  and sqlite_temp_
13b00 6d 61 73 74 65 72 5c 6e 22 29 3b 0a 20 20 20 20  master\n");.    
13b10 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
13b20 20 20 7d 65 6c 73 65 0a 0a 23 69 66 64 65 66 20    }else..#ifdef 
13b30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
13b40 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27  TRACE.  if( c=='
13b50 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
13b60 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65  Arg[0], "iotrace
13b70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
13b80 65 78 74 65 72 6e 20 76 6f 69 64 20 28 2a 73 71  extern void (*sq
13b90 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
13ba0 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b  nst char*, ...);
13bb0 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65  .    if( iotrace
13bc0 20 26 26 20 69 6f 74 72 61 63 65 21 3d 73 74 64   && iotrace!=std
13bd0 6f 75 74 20 29 20 66 63 6c 6f 73 65 28 69 6f 74  out ) fclose(iot
13be0 72 61 63 65 29 3b 0a 20 20 20 20 69 6f 74 72 61  race);.    iotra
13bf0 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ce = 0;.    if( 
13c00 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
13c10 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
13c20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
13c30 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
13c40 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20  ], "-")==0 ){.  
13c50 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
13c60 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e  ce = iotracePrin
13c70 74 66 3b 0a 20 20 20 20 20 20 69 6f 74 72 61 63  tf;.      iotrac
13c80 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20  e = stdout;.    
13c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74  }else{.      iot
13ca0 72 61 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41  race = fopen(azA
13cb0 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20  rg[1], "w");.   
13cc0 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d     if( iotrace==
13cd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
13ce0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
13cf0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
13d00 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
13d10 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  g[1]);.        s
13d20 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
13d30 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
13d40 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
13d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
13d60 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65  oTrace = iotrace
13d70 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a  Printf;.      }.
13d80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
13d90 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
13da0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
13db0 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20 63  XTENSION.  if( c
13dc0 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70  =='l' && strncmp
13dd0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61 64  (azArg[0], "load
13de0 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
13df0 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=2 ){.    const
13e00 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a   char *zFile, *z
13e10 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a  Proc;.    char *
13e20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
13e30 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31   zFile = azArg[1
13e40 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e  ];.    zProc = n
13e50 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32  Arg>=3 ? azArg[2
13e60 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f  ] : 0;.    open_
13e70 64 62 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  db(p);.    rc = 
13e80 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
13e90 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46  ension(p->db, zF
13ea0 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72  ile, zProc, &zEr
13eb0 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72  rMsg);.    if( r
13ec0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13ed0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
13ee0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
13ef0 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
13f00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13f10 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
13f20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
13f30 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
13f40 20 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20    if( c=='m' && 
13f50 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
13f60 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20  , "mode", n)==0 
13f70 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  && nArg>=2 ){.  
13f80 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65    int n2 = strle
13f90 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n30(azArg[1]);. 
13fa0 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
13fb0 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 22 2c 6e  zArg[1],"line",n
13fc0 32 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c  2)==0.        ||
13fd0 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70  .        strncmp
13fe0 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73  (azArg[1],"lines
13ff0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
14000 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
14010 5f 4c 69 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65  _Line;.    }else
14020 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
14030 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 22 2c 6e  rg[1],"column",n
14040 32 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  2)==0.          
14050 20 20 20 20 7c 7c 0a 20 20 20 20 20 20 20 20 20      ||.         
14060 20 20 20 20 20 73 74 72 6e 63 6d 70 28 61 7a 41       strncmp(azA
14070 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c  rg[1],"columns",
14080 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
14090 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
140a0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  olumn;.    }else
140b0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
140c0 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29  rg[1],"list",n2)
140d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
140e0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
140f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14100 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
14110 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29  ,"html",n2)==0 )
14120 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
14130 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20  = MODE_Html;.   
14140 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
14150 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c  mp(azArg[1],"tcl
14160 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
14170 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
14180 5f 54 63 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  _Tcl;.    }else 
14190 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72  if( strncmp(azAr
141a0 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d  g[1],"csv",n2)==
141b0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
141c0 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20  de = MODE_Csv;. 
141d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
141e0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
141f0 73 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73  separator), p->s
14200 65 70 61 72 61 74 6f 72 2c 20 22 2c 22 29 3b 0a  eparator, ",");.
14210 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
14220 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
14230 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  tabs",n2)==0 ){.
14240 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
14250 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20  MODE_List;.     
14260 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14270 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61  f(sizeof(p->sepa
14280 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70 61 72  rator), p->separ
14290 61 74 6f 72 2c 20 22 5c 74 22 29 3b 0a 20 20 20  ator, "\t");.   
142a0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
142b0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73  mp(azArg[1],"ins
142c0 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ert",n2)==0 ){. 
142d0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
142e0 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
142f0 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b    if( nArg>=3 ){
14300 0a 20 20 20 20 20 20 20 20 73 65 74 5f 74 61 62  .        set_tab
14310 6c 65 5f 6e 61 6d 65 28 70 2c 20 61 7a 41 72 67  le_name(p, azArg
14320 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [2]);.      }els
14330 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 5f 74  e{.        set_t
14340 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 22 74 61  able_name(p, "ta
14350 62 6c 65 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ble");.      }. 
14360 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20     }else {.     
14370 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14380 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f  "Error: mode sho
14390 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22  uld be one of: "
143a0 0a 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  .         "colum
143b0 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65 72  n csv html inser
143c0 74 20 6c 69 6e 65 20 6c 69 73 74 20 74 61 62 73  t line list tabs
143d0 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20   tcl\n");.      
143e0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
143f0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
14400 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'n' && strncmp(a
14410 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61  zArg[0], "nullva
14420 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  lue", n)==0 && n
14430 41 72 67 3d 3d 32 20 29 20 7b 0a 20 20 20 20 73  Arg==2 ) {.    s
14440 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
14450 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 76 61  sizeof(p->nullva
14460 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 76 61 6c  lue), p->nullval
14470 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
14480 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c           "%.*s",
14490 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28   (int)ArraySize(
144a0 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c  p->nullvalue)-1,
144b0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65   azArg[1]);.  }e
144c0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f  lse..  if( c=='o
144d0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
144e0 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c  rg[0], "output",
144f0 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d   n)==0 && nArg==
14500 32 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  2 ){.    if( p->
14510 6f 75 74 21 3d 73 74 64 6f 75 74 20 29 7b 0a 20  out!=stdout ){. 
14520 20 20 20 20 20 66 63 6c 6f 73 65 28 70 2d 3e 6f       fclose(p->o
14530 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ut);.    }.    i
14540 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
14550 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20  1],"stdout")==0 
14560 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  ){.      p->out 
14570 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
14580 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
14590 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69  (sizeof(p->outfi
145a0 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c  le), p->outfile,
145b0 20 22 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20   "stdout");.    
145c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
145d0 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72  out = fopen(azAr
145e0 67 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20  g[1], "wb");.   
145f0 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30     if( p->out==0
14600 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
14610 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
14620 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20  r: cannot write 
14630 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  to \"%s\"\n", az
14640 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
14650 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
14660 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
14670 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
14680 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
14690 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
146a0 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70  f(p->outfile), p
146b0 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c  ->outfile, "%s",
146c0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
146d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
146e0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20  e..  if( c=='p' 
146f0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
14700 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e  [0], "prompt", n
14710 29 3d 3d 30 20 26 26 20 28 6e 41 72 67 3d 3d 32  )==0 && (nArg==2
14720 20 7c 7c 20 6e 41 72 67 3d 3d 33 29 29 7b 0a 20   || nArg==3)){. 
14730 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32     if( nArg >= 2
14740 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
14750 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41  y(mainPrompt,azA
14760 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79  rg[1],(int)Array
14770 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29  Size(mainPrompt)
14780 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  -1);.    }.    i
14790 66 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a  f( nArg >= 3) {.
147a0 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f        strncpy(co
147b0 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41  ntinuePrompt,azA
147c0 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79  rg[2],(int)Array
147d0 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f  Size(continuePro
147e0 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
147f0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
14800 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='q' && strncmp(
14810 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22  azArg[0], "quit"
14820 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , n)==0 ){.    r
14830 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a  c = 2;.  }else..
14840 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20    if( c=='r' && 
14850 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
14860 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22  azArg[0], "read"
14870 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
14880 3d 32 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a  =2 ){.    FILE *
14890 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72  alt = fopen(azAr
148a0 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20  g[1], "rb");.   
148b0 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20   if( alt==0 ){. 
148c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
148d0 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e  err,"Error: cann
148e0 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
148f0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
14900 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
14910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
14920 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  = process_input(
14930 70 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66  p, alt);.      f
14940 63 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20  close(alt);.    
14950 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
14960 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20   c=='r' && n>=3 
14970 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
14980 5b 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c 20  [0], "restore", 
14990 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20  n)==0 && nArg>1 
149a0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
149b0 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20  r *zSrcFile;.   
149c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
149d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
149e0 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Src;.    sqlite3
149f0 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
14a00 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f  ;.    int nTimeo
14a10 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ut = 0;..    if(
14a20 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
14a30 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41    zSrcFile = azA
14a40 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44 62  rg[1];.      zDb
14a50 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d   = "main";.    }
14a60 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 72 63  else{.      zSrc
14a70 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  File = azArg[2];
14a80 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41  .      zDb = azA
14a90 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  rg[1];.    }.   
14aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
14ab0 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53  en(zSrcFile, &pS
14ac0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  rc);.    if( rc!
14ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14ae0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
14af0 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
14b00 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
14b10 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20  ", zSrcFile);.  
14b20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
14b30 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
14b40 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
14b50 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
14b60 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
14b70 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
14b80 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72  (p->db, zDb, pSr
14b90 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20  c, "main");.    
14ba0 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
14bb0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
14bc0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
14bd0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
14be0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
14bf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
14c00 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
14c10 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
14c20 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
14c30 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
14c40 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
14c50 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
14c60 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
14c70 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20  QLITE_BUSY  ){. 
14c80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14c90 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
14ca0 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74      if( nTimeout
14cb0 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b  ++ >= 3 ) break;
14cc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14cd0 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20  _sleep(100);.   
14ce0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
14cf0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
14d00 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
14d10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14d20 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14d30 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
14d40 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
14d50 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
14d60 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
14d70 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
14d80 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72  rr, "Error: sour
14d90 63 65 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ce database is b
14da0 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  usy\n");.      r
14db0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
14dc0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
14dd0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
14de0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
14df0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
14e00 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
14e10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63   }.    sqlite3_c
14e20 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 7d 65  lose(pSrc);.  }e
14e30 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
14e40 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
14e50 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c  rg[0], "schema",
14e60 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   n)==0 ){.    st
14e70 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
14e80 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  ta data;.    cha
14e90 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
14ea0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
14eb0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
14ec0 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
14ed0 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
14ee0 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
14ef0 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
14f00 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20  E_Semi;.    if( 
14f10 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 20 20  nArg>1 ){.      
14f20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
14f30 28 69 3d 30 3b 20 61 7a 41 72 67 5b 31 5d 5b 69  (i=0; azArg[1][i
14f40 5d 3b 20 69 2b 2b 29 20 61 7a 41 72 67 5b 31 5d  ]; i++) azArg[1]
14f50 5b 69 5d 20 3d 20 28 63 68 61 72 29 74 6f 6c 6f  [i] = (char)tolo
14f60 77 65 72 28 61 7a 41 72 67 5b 31 5d 5b 69 5d 29  wer(azArg[1][i])
14f70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
14f80 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73 71 6c  mp(azArg[1],"sql
14f90 69 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20  ite_master")==0 
14fa0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
14fb0 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e  *new_argv[2], *n
14fc0 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20  ew_colv[2];.    
14fd0 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20      new_argv[0] 
14fe0 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  = "CREATE TABLE 
14ff0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 28 5c  sqlite_master (\
15000 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
15010 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70 65           "  type
15020 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  "  name text,\n"
15050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15060 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61         "  tbl_na
15070 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e    "  rootpage in
150a0 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20  teger,\n".      
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150c0 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20  "  sql text\n". 
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20 20 20       ")";.      
150f0 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20    new_argv[1] = 
15100 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63  0;.        new_c
15110 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a  olv[0] = "sql";.
15120 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76          new_colv
15130 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
15140 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c   callback(&data,
15150 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65   1, new_argv, ne
15160 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20 20  w_colv);.       
15170 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15180 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15190 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
151a0 2c 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  ,"sqlite_temp_ma
151b0 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ster")==0 ){.   
151c0 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61       char *new_a
151d0 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c  rgv[2], *new_col
151e0 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65  v[2];.        ne
151f0 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43 52 45  w_argv[0] = "CRE
15200 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73  ATE TEMP TABLE s
15210 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
15220 72 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  r (\n".         
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
15240 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
15270 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
15280 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62             "  tb
15290 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a  l_name text,\n".
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67        "  rootpag
152c0 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20  e integer,\n".  
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c      "  sql text\
152f0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
15300 20 20 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20           ")";.  
15310 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31        new_argv[1
15320 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  ] = 0;.        n
15330 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71  ew_colv[0] = "sq
15340 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  l";.        new_
15350 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  colv[1] = 0;.   
15360 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64       callback(&d
15370 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76  ata, 1, new_argv
15380 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20  , new_colv);.   
15390 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
153a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
153b0 7b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c  {.        zShell
153c0 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67 5b 31  Static = azArg[1
153d0 5d 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ];.        rc = 
153e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
153f0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  db,.          "S
15400 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 22  ELECT sql FROM "
15410 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 28 53  .          "  (S
15420 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74  ELECT sql sql, t
15430 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61  ype type, tbl_na
15440 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d  me tbl_name, nam
15450 65 20 6e 61 6d 65 22 0a 20 20 20 20 20 20 20 20  e name".        
15460 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73 71 6c    "     FROM sql
15470 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e  ite_master UNION
15480 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20   ALL".          
15490 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20  "   SELECT sql, 
154a0 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
154b0 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
154c0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a  _temp_master) ".
154d0 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45            "WHERE
154e0 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73   tbl_name LIKE s
154f0 68 65 6c 6c 73 74 61 74 69 63 28 29 20 41 4e 44  hellstatic() AND
15500 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e   type!='meta' AN
15510 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 22 0a  D sql NOTNULL ".
15520 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
15530 20 42 59 20 73 75 62 73 74 72 28 74 79 70 65 2c   BY substr(type,
15540 32 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20 20 20  2,1), name",.   
15550 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c         callback,
15560 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
15570 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c  );.        zShel
15580 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20  lStatic = 0;.   
15590 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
155a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
155b0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
155c0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
155d0 73 71 6c 20 46 52 4f 4d 20 22 0a 20 20 20 20 20  sql FROM ".     
155e0 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20 73      "  (SELECT s
155f0 71 6c 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70  ql sql, type typ
15600 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f  e, tbl_name tbl_
15610 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 22  name, name name"
15620 0a 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20  .         "     
15630 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
15640 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20  er UNION ALL".  
15650 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43         "   SELEC
15660 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c  T sql, type, tbl
15670 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 46 52 4f 4d  _name, name FROM
15680 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
15690 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 20 20  ter) ".         
156a0 22 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65  "WHERE type!='me
156b0 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e  ta' AND sql NOTN
156c0 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  ULL AND name NOT
156d0 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
156e0 22 0a 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  ".         "ORDE
156f0 52 20 42 59 20 73 75 62 73 74 72 28 74 79 70 65  R BY substr(type
15700 2c 32 2c 31 29 2c 20 6e 61 6d 65 22 2c 0a 20 20  ,2,1), name",.  
15710 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c         callback,
15720 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
15730 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
15740 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
15750 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
15760 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
15770 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
15780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
15790 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
157a0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
157b0 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21 3d 20  }else if( rc != 
157c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
157d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
157e0 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72 79 69  r,"Error: queryi
157f0 6e 67 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ng schema inform
15800 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20  ation\n");.     
15810 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
15820 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  se{.      rc = 0
15830 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
15840 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
15850 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
15860 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22 2c 20  ], "separator", 
15870 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32  n)==0 && nArg==2
15880 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15890 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
158a0 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2c 20 70  p->separator), p
158b0 2d 3e 73 65 70 61 72 61 74 6f 72 2c 0a 20 20 20  ->separator,.   
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 73    "%.*s", (int)s
158e0 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74  izeof(p->separat
158f0 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29  or)-1, azArg[1])
15900 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
15910 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
15920 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68  mp(azArg[0], "sh
15930 6f 77 22 2c 20 6e 29 3d 3d 30 29 7b 0a 20 20 20  ow", n)==0){.   
15940 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 70 72 69   int i;.    fpri
15950 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39  ntf(p->out,"%9.9
15960 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c  s: %s\n","echo",
15970 20 70 2d 3e 65 63 68 6f 4f 6e 20 3f 20 22 6f 6e   p->echoOn ? "on
15980 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20  " : "off");.    
15990 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
159a0 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 78  %9.9s: %s\n","ex
159b0 70 6c 61 69 6e 22 2c 20 70 2d 3e 65 78 70 6c 61  plain", p->expla
159c0 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3f 20 22  inPrev.valid ? "
159d0 6f 6e 22 20 3a 22 6f 66 66 22 29 3b 0a 20 20 20  on" :"off");.   
159e0 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
159f0 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 68  "%9.9s: %s\n","h
15a00 65 61 64 65 72 73 22 2c 20 70 2d 3e 73 68 6f 77  eaders", p->show
15a10 48 65 61 64 65 72 20 3f 20 22 6f 6e 22 20 3a 20  Header ? "on" : 
15a20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69  "off");.    fpri
15a30 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39  ntf(p->out,"%9.9
15a40 73 3a 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c  s: %s\n","mode",
15a50 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f   modeDescr[p->mo
15a60 64 65 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  de]);.    fprint
15a70 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
15a80 20 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29   ", "nullvalue")
15a90 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  ;.      output_c
15aa0 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
15ab0 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
15ac0 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
15ad0 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
15ae0 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
15af0 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6f 75  %9.9s: %s\n","ou
15b00 74 70 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tput",.         
15b10 20 20 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f     strlen30(p->o
15b20 75 74 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74  utfile) ? p->out
15b30 66 69 6c 65 20 3a 20 22 73 74 64 6f 75 74 22 29  file : "stdout")
15b40 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  ;.    fprintf(p-
15b50 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c 20  >out,"%9.9s: ", 
15b60 22 73 65 70 61 72 61 74 6f 72 22 29 3b 0a 20 20  "separator");.  
15b70 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
15b80 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 73  ing(p->out, p->s
15b90 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
15ba0 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
15bb0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69   "\n");.    fpri
15bc0 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39  ntf(p->out,"%9.9
15bd0 73 3a 20 22 2c 22 77 69 64 74 68 22 29 3b 0a 20  s: ","width");. 
15be0 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69     for (i=0;i<(i
15bf0 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
15c00 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70 2d 3e  colWidth) && p->
15c10 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20 30  colWidth[i] != 0
15c20 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 66 70  ;i++) {.      fp
15c30 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 64  rintf(p->out,"%d
15c40 20 22 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69   ",p->colWidth[i
15c50 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  ]);.    }.    fp
15c60 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e  rintf(p->out,"\n
15c70 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ");.  }else..  i
15c80 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31  f( c=='t' && n>1
15c90 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
15ca0 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20  g[0], "tables", 
15cb0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  n)==0 ){.    cha
15cc0 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20  r **azResult;.  
15cd0 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20 20 20 20    int nRow;.    
15ce0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
15cf0 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20     open_db(p);. 
15d00 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29     if( nArg==1 )
15d10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15d20 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 70  ite3_get_table(p
15d30 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 22 53  ->db,.        "S
15d40 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
15d50 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
15d60 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
15d70 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
15d80 27 76 69 65 77 27 29 20 41 4e 44 20 6e 61 6d 65  'view') AND name
15d90 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74   NOT LIKE 'sqlit
15da0 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20 20 22  e_%' ".        "
15db0 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20  UNION ALL ".    
15dc0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
15dd0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
15de0 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  p_master ".     
15df0 20 20 20 22 57 48 45 52 45 20 74 79 70 65 20 49     "WHERE type I
15e00 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77  N ('table','view
15e10 27 29 20 22 0a 20 20 20 20 20 20 20 20 22 4f 52  ') ".        "OR
15e20 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20  DER BY 1",.     
15e30 20 20 20 26 61 7a 52 65 73 75 6c 74 2c 20 26 6e     &azResult, &n
15e40 52 6f 77 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67  Row, 0, &zErrMsg
15e50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
15e60 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 68 65 6c  lse{.      zShel
15e70 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67 5b  lStatic = azArg[
15e80 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1];.      rc = s
15e90 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
15ea0 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
15eb0 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
15ec0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
15ed0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
15ee0 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65   type IN ('table
15ef0 27 2c 27 76 69 65 77 27 29 20 41 4e 44 20 6e 61  ','view') AND na
15f00 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61  me LIKE shellsta
15f10 74 69 63 28 29 20 22 0a 20 20 20 20 20 20 20 20  tic() ".        
15f20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20  "UNION ALL ".   
15f30 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
15f40 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65  e FROM sqlite_te
15f50 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  mp_master ".    
15f60 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65 20      "WHERE type 
15f70 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65  IN ('table','vie
15f80 77 27 29 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b  w') AND name LIK
15f90 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20  E shellstatic() 
15fa0 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ".        "ORDER
15fb0 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20   BY 1",.        
15fc0 26 61 7a 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77  &azResult, &nRow
15fd0 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20  , 0, &zErrMsg.  
15fe0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 53 68      );.      zSh
15ff0 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20  ellStatic = 0;. 
16000 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72     }.    if( zEr
16010 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70  rMsg ){.      fp
16020 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
16030 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
16040 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
16050 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
16060 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
16070 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
16080 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  c != SQLITE_OK )
16090 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
160a0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 71  stderr,"Error: q
160b0 75 65 72 79 69 6e 67 20 73 71 6c 69 74 65 5f 6d  uerying sqlite_m
160c0 61 73 74 65 72 20 61 6e 64 20 73 71 6c 69 74 65  aster and sqlite
160d0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 5c 6e 22 29  _temp_master\n")
160e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
160f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16100 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e   int len, maxlen
16110 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
16120 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  i, j;.      int 
16130 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e  nPrintCol, nPrin
16140 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28  tRow;.      for(
16150 69 3d 31 3b 20 69 3c 3d 6e 52 6f 77 3b 20 69 2b  i=1; i<=nRow; i+
16160 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
16170 61 7a 52 65 73 75 6c 74 5b 69 5d 3d 3d 30 20 29  azResult[i]==0 )
16180 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16190 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33     len = strlen3
161a0 30 28 61 7a 52 65 73 75 6c 74 5b 69 5d 29 3b 0a  0(azResult[i]);.
161b0 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
161c0 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20  maxlen ) maxlen 
161d0 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  = len;.      }. 
161e0 20 20 20 20 20 6e 50 72 69 6e 74 43 6f 6c 20 3d       nPrintCol =
161f0 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b 0a   80/(maxlen+2);.
16200 20 20 20 20 20 20 69 66 28 20 6e 50 72 69 6e 74        if( nPrint
16210 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e 74 43 6f  Col<1 ) nPrintCo
16220 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50 72  l = 1;.      nPr
16230 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2b  intRow = (nRow +
16240 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20 31 29 2f   nPrintCol - 1)/
16250 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20 20 20 20  nPrintCol;.     
16260 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 72 69   for(i=0; i<nPri
16270 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  ntRow; i++){.   
16280 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20       for(j=i+1; 
16290 6a 3c 3d 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69  j<=nRow; j+=nPri
162a0 6e 74 52 6f 77 29 7b 0a 20 20 20 20 20 20 20 20  ntRow){.        
162b0 20 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c    char *zSp = j<
162c0 3d 6e 50 72 69 6e 74 52 6f 77 20 3f 20 22 22 20  =nPrintRow ? "" 
162d0 3a 20 22 20 20 22 3b 0a 20 20 20 20 20 20 20 20  : "  ";.        
162e0 20 20 70 72 69 6e 74 66 28 22 25 73 25 2d 2a 73    printf("%s%-*s
162f0 22 2c 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 20  ", zSp, maxlen, 
16300 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a  azResult[j] ? az
16310 52 65 73 75 6c 74 5b 6a 5d 20 3a 20 22 22 29 3b  Result[j] : "");
16320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16330 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
16340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16350 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f     sqlite3_free_
16360 74 61 62 6c 65 28 61 7a 52 65 73 75 6c 74 29 3b  table(azResult);
16370 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
16380 63 3d 3d 27 74 27 20 26 26 20 6e 3e 34 20 26 26  c=='t' && n>4 &&
16390 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
163a0 5d 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 6e 29  ], "timeout", n)
163b0 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d 32 20 29  ==0 && nArg>=2 )
163c0 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29  {.    open_db(p)
163d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  ;.    sqlite3_bu
163e0 73 79 5f 74 69 6d 65 6f 75 74 28 70 2d 3e 64 62  sy_timeout(p->db
163f0 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29  , atoi(azArg[1])
16400 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 48  );.  }else if( H
16410 41 53 5f 54 49 4d 45 52 20 26 26 20 63 3d 3d 27  AS_TIMER && c=='
16420 74 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74  t' && n>=5 && st
16430 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
16440 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 26  "timer", n)==0 &
16450 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20  & nArg>1 ){.    
16460 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 62 6f  enableTimer = bo
16470 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
16480 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  [1]);.  }else if
16490 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72 6e  ( c=='w' && strn
164a0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 77  cmp(azArg[0], "w
164b0 69 64 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  idth", n)==0 ){.
164c0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 61      int j;.    a
164d0 73 73 65 72 74 28 20 6e 41 72 67 3c 3d 41 72 72  ssert( nArg<=Arr
164e0 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 3b  aySize(azArg) );
164f0 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c  .    for(j=1; j<
16500 6e 41 72 67 20 26 26 20 6a 3c 41 72 72 61 79 53  nArg && j<ArrayS
16510 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29  ize(p->colWidth)
16520 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; j++){.      p-
16530 3e 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20 3d  >colWidth[j-1] =
16540 20 61 74 6f 69 28 61 7a 41 72 67 5b 6a 5d 29 3b   atoi(azArg[j]);
16550 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
16560 20 20 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28    {.    fprintf(
16570 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
16580 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20  unknown command 
16590 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d  or invalid argum
165a0 65 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20  ents: ".      " 
165b0 5c 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22  \"%s\". Enter \"
165c0 2e 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70  .help\" for help
165d0 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a  \n", azArg[0]);.
165e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
165f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16600 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
16610 55 45 20 69 66 20 61 20 73 65 6d 69 63 6f 6c 6f  UE if a semicolo
16620 6e 20 6f 63 63 75 72 73 20 61 6e 79 77 68 65 72  n occurs anywher
16630 65 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 4e  e in the first N
16640 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 6f   characters.** o
16650 66 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 0a 2a 2f  f string z[]..*/
16660 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 63 6f 6e  .static int _con
16670 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28  tains_semicolon(
16680 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
16690 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nt N){.  int i;.
166a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
166b0 69 2b 2b 29 7b 20 20 69 66 28 20 7a 5b 69 5d 3d  i++){  if( z[i]=
166c0 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 31 3b  =';' ) return 1;
166d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
166e0 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
166f0 73 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f  see if a line co
16700 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
16710 6f 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a  of whitespace..*
16720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c  /.static int _al
16730 6c 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e  l_whitespace(con
16740 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66  st char *z){.  f
16750 6f 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  or(; *z; z++){. 
16760 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28 2a     if( isspace(*
16770 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
16780 7a 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  z) ) continue;. 
16790 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26     if( *z=='/' &
167a0 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20  & z[1]=='*' ){. 
167b0 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
167c0 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
167d0 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d  (*z!='*' || z[1]
167e0 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d  !='/') ){ z++; }
167f0 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30  .      if( *z==0
16800 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
16810 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f     z++;.      co
16820 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
16830 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26    if( *z=='-' &&
16840 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[1]=='-' ){.  
16850 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20      z += 2;.    
16860 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
16870 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20  z!='\n' ){ z++; 
16880 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
16890 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
168a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
168b0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
168c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
168d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
168e0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 69  n TRUE if the li
168f0 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20 61  ne typed in is a
16900 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65  n SQL command te
16910 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a  rminator other.*
16920 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f  * than a semi-co
16930 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65  lon.  The SQL Se
16940 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20  rver style "go" 
16950 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72  command is under
16960 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74  stood.** as is t
16970 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a  he Oracle "/"..*
16980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 69 73  /.static int _is
16990 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61  _command_termina
169a0 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tor(const char *
169b0 7a 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c 65 28  zLine){.  while(
169c0 20 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67   isspace(*(unsig
169d0 6e 65 64 20 63 68 61 72 2a 29 7a 4c 69 6e 65 29  ned char*)zLine)
169e0 20 29 7b 20 7a 4c 69 6e 65 2b 2b 3b 20 7d 3b 0a   ){ zLine++; };.
169f0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d    if( zLine[0]==
16a00 27 2f 27 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74  '/' && _all_whit
16a10 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 31 5d  espace(&zLine[1]
16a20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16a30 31 3b 20 20 2f 2a 20 4f 72 61 63 6c 65 20 2a 2f  1;  /* Oracle */
16a40 0a 20 20 7d 0a 20 20 69 66 28 20 74 6f 6c 6f 77  .  }.  if( tolow
16a50 65 72 28 7a 4c 69 6e 65 5b 30 5d 29 3d 3d 27 67  er(zLine[0])=='g
16a60 27 20 26 26 20 74 6f 6c 6f 77 65 72 28 7a 4c 69  ' && tolower(zLi
16a70 6e 65 5b 31 5d 29 3d 3d 27 6f 27 0a 20 20 20 20  ne[1])=='o'.    
16a80 20 20 20 20 20 26 26 20 5f 61 6c 6c 5f 77 68 69       && _all_whi
16a90 74 65 73 70 61 63 65 28 26 7a 4c 69 6e 65 5b 32  tespace(&zLine[2
16aa0 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
16ab0 20 31 3b 20 20 2f 2a 20 53 51 4c 20 53 65 72 76   1;  /* SQL Serv
16ac0 65 72 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  er */.  }.  retu
16ad0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
16ae0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 53  eturn true if zS
16af0 71 6c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  ql is a complete
16b00 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
16b10 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
16b20 20 69 74 0a 2a 2a 20 65 6e 64 73 20 69 6e 20 74   it.** ends in t
16b30 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 73  he middle of a s
16b40 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 6f 72  tring literal or
16b50 20 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74   C-style comment
16b60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16b70 5f 69 73 5f 63 6f 6d 70 6c 65 74 65 28 63 68 61  _is_complete(cha
16b80 72 20 2a 7a 53 71 6c 2c 20 69 6e 74 20 6e 53 71  r *zSql, int nSq
16b90 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  l){.  int rc;.  
16ba0 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
16bb0 74 75 72 6e 20 31 3b 0a 20 20 7a 53 71 6c 5b 6e  turn 1;.  zSql[n
16bc0 53 71 6c 5d 20 3d 20 27 3b 27 3b 0a 20 20 7a 53  Sql] = ';';.  zS
16bd0 71 6c 5b 6e 53 71 6c 2b 31 5d 20 3d 20 30 3b 0a  ql[nSql+1] = 0;.
16be0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
16bf0 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29 3b 0a 20  omplete(zSql);. 
16c00 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 30 3b   zSql[nSql] = 0;
16c10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16c20 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75  ./*.** Read inpu
16c30 74 20 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70  t from *in and p
16c40 72 6f 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a  rocess it.  If *
16c50 69 6e 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74  in==0 then input
16c60 0a 2a 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69  .** is interacti
16c70 76 65 20 2d 20 74 68 65 20 75 73 65 72 20 69 73  ve - the user is
16c80 20 74 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20   typing it it.  
16c90 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74  Otherwise, input
16ca0 0a 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72  .** is coming fr
16cb0 6f 6d 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76  om a file or dev
16cc0 69 63 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69  ice.  A prompt i
16cd0 73 20 69 73 73 75 65 64 20 61 6e 64 20 68 69 73  s issued and his
16ce0 74 6f 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64  tory.** is saved
16cf0 20 6f 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69   only if input i
16d00 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20  s interactive.  
16d10 41 6e 20 69 6e 74 65 72 72 75 70 74 20 73 69 67  An interrupt sig
16d20 6e 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73  nal will.** caus
16d30 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
16d40 6f 20 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65  o exit immediate
16d50 6c 79 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74  ly, unless input
16d60 20 69 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e   is interactive.
16d70 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
16d80 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
16d90 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
16da0 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  t process_input(
16db0 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
16dc0 64 61 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69  data *p, FILE *i
16dd0 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e  n){.  char *zLin
16de0 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  e = 0;.  char *z
16df0 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Sql = 0;.  int n
16e00 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Sql = 0;.  int n
16e10 53 71 6c 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  SqlPrior = 0;.  
16e20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
16e30 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65   int rc;.  int e
16e40 72 72 43 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rrCnt = 0;.  int
16e50 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 69   lineno = 0;.  i
16e60 6e 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30  nt startline = 0
16e70 3b 0a 0a 20 20 77 68 69 6c 65 28 20 65 72 72 43  ;..  while( errC
16e80 6e 74 3d 3d 30 20 7c 7c 20 21 62 61 69 6c 5f 6f  nt==0 || !bail_o
16e90 6e 5f 65 72 72 6f 72 20 7c 7c 20 28 69 6e 3d 3d  n_error || (in==
16ea0 30 20 26 26 20 73 74 64 69 6e 5f 69 73 5f 69 6e  0 && stdin_is_in
16eb0 74 65 72 61 63 74 69 76 65 29 20 29 7b 0a 20 20  teractive) ){.  
16ec0 20 20 66 66 6c 75 73 68 28 70 2d 3e 6f 75 74 29    fflush(p->out)
16ed0 3b 0a 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65  ;.    free(zLine
16ee0 29 3b 0a 20 20 20 20 7a 4c 69 6e 65 20 3d 20 6f  );.    zLine = o
16ef0 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 7a 53  ne_input_line(zS
16f00 71 6c 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28  ql, in);.    if(
16f10 20 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20   zLine==0 ){.   
16f20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 57 65     break;  /* We
16f30 20 68 61 76 65 20 72 65 61 63 68 65 64 20 45 4f   have reached EO
16f40 46 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  F */.    }.    i
16f50 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  f( seenInterrupt
16f60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 6e   ){.      if( in
16f70 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
16f80 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74     seenInterrupt
16f90 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
16fa0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66  lineno++;.    if
16fb0 28 20 28 7a 53 71 6c 3d 3d 30 20 7c 7c 20 7a 53  ( (zSql==0 || zS
16fc0 71 6c 5b 30 5d 3d 3d 30 29 20 26 26 20 5f 61 6c  ql[0]==0) && _al
16fd0 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 4c 69  l_whitespace(zLi
16fe0 6e 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ne) ) continue;.
16ff0 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 20 26 26      if( zLine &&
17000 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 26   zLine[0]=='.' &
17010 26 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  & nSql==0 ){.   
17020 20 20 20 69 66 28 20 70 2d 3e 65 63 68 6f 4f 6e     if( p->echoOn
17030 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22   ) printf("%s\n"
17040 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , zLine);.      
17050 72 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d  rc = do_meta_com
17060 6d 61 6e 64 28 7a 4c 69 6e 65 2c 20 70 29 3b 0a  mand(zLine, p);.
17070 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 32 20        if( rc==2 
17080 29 7b 20 2f 2a 20 65 78 69 74 20 72 65 71 75 65  ){ /* exit reque
17090 73 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  sted */.        
170a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
170b0 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  se if( rc ){.   
170c0 20 20 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20       errCnt++;. 
170d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
170e0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
170f0 20 69 66 28 20 5f 69 73 5f 63 6f 6d 6d 61 6e 64   if( _is_command
17100 5f 74 65 72 6d 69 6e 61 74 6f 72 28 7a 4c 69 6e  _terminator(zLin
17110 65 29 20 26 26 20 5f 69 73 5f 63 6f 6d 70 6c 65  e) && _is_comple
17120 74 65 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 29  te(zSql, nSql) )
17130 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  {.      memcpy(z
17140 4c 69 6e 65 2c 22 3b 22 2c 32 29 3b 0a 20 20 20  Line,";",2);.   
17150 20 7d 0a 20 20 20 20 6e 53 71 6c 50 72 69 6f 72   }.    nSqlPrior
17160 20 3d 20 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28   = nSql;.    if(
17170 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
17180 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
17190 6f 72 28 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d  or(i=0; zLine[i]
171a0 20 26 26 20 69 73 73 70 61 63 65 28 28 75 6e 73   && isspace((uns
171b0 69 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e 65  igned char)zLine
171c0 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
171d0 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 21     if( zLine[i]!
171e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 53  =0 ){.        nS
171f0 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c  ql = strlen30(zL
17200 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 53  ine);.        zS
17210 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53 71  ql = malloc( nSq
17220 6c 2b 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l+3 );.        i
17230 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
17240 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
17250 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
17260 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
17270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 69  );.          exi
17280 74 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t(1);.        }.
17290 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
172a0 53 71 6c 2c 20 7a 4c 69 6e 65 2c 20 6e 53 71 6c  Sql, zLine, nSql
172b0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61  +1);.        sta
172c0 72 74 6c 69 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b  rtline = lineno;
172d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
172e0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  se{.      int le
172f0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69  n = strlen30(zLi
17300 6e 65 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20  ne);.      zSql 
17310 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 53 71 6c 2c  = realloc( zSql,
17320 20 6e 53 71 6c 20 2b 20 6c 65 6e 20 2b 20 34 20   nSql + len + 4 
17330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 71  );.      if( zSq
17340 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
17350 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
17360 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
17370 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
17380 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
17390 20 7d 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6e 53   }.      zSql[nS
173a0 71 6c 2b 2b 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20  ql++] = '\n';.  
173b0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 71 6c      memcpy(&zSql
173c0 5b 6e 53 71 6c 5d 2c 20 7a 4c 69 6e 65 2c 20 6c  [nSql], zLine, l
173d0 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6e 53 71  en+1);.      nSq
173e0 6c 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  l += len;.    }.
173f0 20 20 20 20 69 66 28 20 7a 53 71 6c 20 26 26 20      if( zSql && 
17400 5f 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63 6f  _contains_semico
17410 6c 6f 6e 28 26 7a 53 71 6c 5b 6e 53 71 6c 50 72  lon(&zSql[nSqlPr
17420 69 6f 72 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50  ior], nSql-nSqlP
17430 72 69 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20  rior).          
17440 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
17450 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29 20  _complete(zSql) 
17460 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 20  ){.      p->cnt 
17470 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f  = 0;.      open_
17480 64 62 28 70 29 3b 0a 20 20 20 20 20 20 42 45 47  db(p);.      BEG
17490 49 4e 5f 54 49 4d 45 52 3b 0a 20 20 20 20 20 20  IN_TIMER;.      
174a0 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28  rc = shell_exec(
174b0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65  p->db, zSql, she
174c0 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  ll_callback, p, 
174d0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
174e0 20 45 4e 44 5f 54 49 4d 45 52 3b 0a 20 20 20 20   END_TIMER;.    
174f0 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72    if( rc || zErr
17500 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Msg ){.        c
17510 68 61 72 20 7a 50 72 65 66 69 78 5b 31 30 30 5d  har zPrefix[100]
17520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
17530 21 3d 30 20 7c 7c 20 21 73 74 64 69 6e 5f 69 73  !=0 || !stdin_is
17540 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a  _interactive ){.
17550 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17560 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
17570 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65  f(zPrefix), zPre
17580 66 69 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20  fix, .          
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175a0 20 22 45 72 72 6f 72 3a 20 6e 65 61 72 20 6c 69   "Error: near li
175b0 6e 65 20 25 64 3a 22 2c 20 73 74 61 72 74 6c 69  ne %d:", startli
175c0 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ne);.        }el
175d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
175e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
175f0 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20  izeof(zPrefix), 
17600 7a 50 72 65 66 69 78 2c 20 22 45 72 72 6f 72 3a  zPrefix, "Error:
17610 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
17620 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73        if( zErrMs
17630 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
17640 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
17650 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72  , "%s %s\n", zPr
17660 65 66 69 78 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  efix, zErrMsg);.
17670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17680 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
17690 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 4d  .          zErrM
176a0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
176b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
176c0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
176d0 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65   "%s %s\n", zPre
176e0 66 69 78 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  fix, sqlite3_err
176f0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
17700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
17710 72 72 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  rrCnt++;.      }
17720 0a 20 20 20 20 20 20 66 72 65 65 28 7a 53 71 6c  .      free(zSql
17730 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  );.      zSql = 
17740 30 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20  0;.      nSql = 
17750 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
17760 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 69  f( zSql ){.    i
17770 66 28 20 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70  f( !_all_whitesp
17780 61 63 65 28 7a 53 71 6c 29 20 29 20 66 70 72 69  ace(zSql) ) fpri
17790 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
177a0 6f 72 3a 20 69 6e 63 6f 6d 70 6c 65 74 65 20 53  or: incomplete S
177b0 51 4c 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 29  QL: %s\n", zSql)
177c0 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29  ;.    free(zSql)
177d0 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 4c 69  ;.  }.  free(zLi
177e0 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 72  ne);.  return er
177f0 72 43 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rCnt;.}../*.** R
17800 65 74 75 72 6e 20 61 20 70 61 74 68 6e 61 6d 65  eturn a pathname
17810 20 77 68 69 63 68 20 69 73 20 74 68 65 20 75 73   which is the us
17820 65 72 27 73 20 68 6f 6d 65 20 64 69 72 65 63 74  er's home direct
17830 6f 72 79 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74  ory.  A.** 0 ret
17840 75 72 6e 20 69 6e 64 69 63 61 74 65 73 20 61 6e  urn indicates an
17850 20 65 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b   error of some k
17860 69 6e 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ind.  Space to h
17870 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  old the.** resul
17880 74 69 6e 67 20 73 74 72 69 6e 67 20 69 73 20 6f  ting string is o
17890 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
178a0 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
178b0 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
178c0 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 65 20  should free the 
178d0 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
178e0 63 20 63 68 61 72 20 2a 66 69 6e 64 5f 68 6f 6d  c char *find_hom
178f0 65 5f 64 69 72 28 76 6f 69 64 29 7b 0a 20 20 63  e_dir(void){.  c
17900 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20  har *home_dir = 
17910 4e 55 4c 4c 3b 0a 0a 23 69 66 20 21 64 65 66 69  NULL;..#if !defi
17920 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
17930 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26  defined(WIN32) &
17940 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32  & !defined(__OS2
17950 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  __) && !defined(
17960 5f 57 49 4e 33 32 5f 57 43 45 29 20 26 26 20 21  _WIN32_WCE) && !
17970 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
17980 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52   && !defined(_WR
17990 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 73 74 72 75  S_KERNEL).  stru
179a0 63 74 20 70 61 73 73 77 64 20 2a 70 77 65 6e 74  ct passwd *pwent
179b0 3b 0a 20 20 75 69 64 5f 74 20 75 69 64 20 3d 20  ;.  uid_t uid = 
179c0 67 65 74 75 69 64 28 29 3b 0a 20 20 69 66 28 20  getuid();.  if( 
179d0 28 70 77 65 6e 74 3d 67 65 74 70 77 75 69 64 28  (pwent=getpwuid(
179e0 75 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  uid)) != NULL) {
179f0 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20  .    home_dir = 
17a00 70 77 65 6e 74 2d 3e 70 77 5f 64 69 72 3b 0a 20  pwent->pw_dir;. 
17a10 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64   }.#endif..#if d
17a20 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
17a30 45 29 0a 20 20 2f 2a 20 57 69 6e 64 6f 77 73 20  E).  /* Windows 
17a40 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69  CE (arm-wince-mi
17a50 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65  ngw32ce-gcc) doe
17a60 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 67 65  s not provide ge
17a70 74 65 6e 76 28 29 0a 20 20 20 2a 2f 0a 20 20 68  tenv().   */.  h
17a80 6f 6d 65 5f 64 69 72 20 3d 20 73 74 72 64 75 70  ome_dir = strdup
17a90 28 22 2f 22 29 3b 0a 23 65 6c 73 65 0a 0a 23 69  ("/");.#else..#i
17aa0 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
17ab0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
17ac0 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  32) || defined(_
17ad0 5f 4f 53 32 5f 5f 29 0a 20 20 69 66 20 28 21 68  _OS2__).  if (!h
17ae0 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68  ome_dir) {.    h
17af0 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76  ome_dir = getenv
17b00 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b  ("USERPROFILE");
17b10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
17b20 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a  f (!home_dir) {.
17b30 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67      home_dir = g
17b40 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20  etenv("HOME");. 
17b50 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
17b60 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
17b70 65 64 28 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  ed(WIN32) || def
17b80 69 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a 20 20  ined(__OS2__).  
17b90 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b  if (!home_dir) {
17ba0 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 72 69 76  .    char *zDriv
17bb0 65 2c 20 2a 7a 50 61 74 68 3b 0a 20 20 20 20 69  e, *zPath;.    i
17bc0 6e 74 20 6e 3b 0a 20 20 20 20 7a 44 72 69 76 65  nt n;.    zDrive
17bd0 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 44   = getenv("HOMED
17be0 52 49 56 45 22 29 3b 0a 20 20 20 20 7a 50 61 74  RIVE");.    zPat
17bf0 68 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45  h = getenv("HOME
17c00 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20  PATH");.    if( 
17c10 7a 44 72 69 76 65 20 26 26 20 7a 50 61 74 68 20  zDrive && zPath 
17c20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72  ){.      n = str
17c30 6c 65 6e 33 30 28 7a 44 72 69 76 65 29 20 2b 20  len30(zDrive) + 
17c40 73 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20  strlen30(zPath) 
17c50 2b 20 31 3b 0a 20 20 20 20 20 20 68 6f 6d 65 5f  + 1;.      home_
17c60 64 69 72 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20  dir = malloc( n 
17c70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 6d  );.      if( hom
17c80 65 5f 64 69 72 3d 3d 30 20 29 20 72 65 74 75 72  e_dir==0 ) retur
17c90 6e 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n 0;.      sqlit
17ca0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 68  e3_snprintf(n, h
17cb0 6f 6d 65 5f 64 69 72 2c 20 22 25 73 25 73 22 2c  ome_dir, "%s%s",
17cc0 20 7a 44 72 69 76 65 2c 20 7a 50 61 74 68 29 3b   zDrive, zPath);
17cd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 6f  .      return ho
17ce0 6d 65 5f 64 69 72 3b 0a 20 20 20 20 7d 0a 20 20  me_dir;.    }.  
17cf0 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 22 63 3a    home_dir = "c:
17d00 5c 5c 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  \\";.  }.#endif.
17d10 0a 23 65 6e 64 69 66 20 2f 2a 20 21 5f 57 49 4e  .#endif /* !_WIN
17d20 33 32 5f 57 43 45 20 2a 2f 0a 0a 20 20 69 66 28  32_WCE */..  if(
17d30 20 68 6f 6d 65 5f 64 69 72 20 29 7b 0a 20 20 20   home_dir ){.   
17d40 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
17d50 30 28 68 6f 6d 65 5f 64 69 72 29 20 2b 20 31 3b  0(home_dir) + 1;
17d60 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 6d  .    char *z = m
17d70 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20  alloc( n );.    
17d80 69 66 28 20 7a 20 29 20 6d 65 6d 63 70 79 28 7a  if( z ) memcpy(z
17d90 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 6e 29 3b 0a  , home_dir, n);.
17da0 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 7a      home_dir = z
17db0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
17dc0 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a 2f 2a 0a  home_dir;.}../*.
17dd0 2a 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72  ** Read input fr
17de0 6f 6d 20 74 68 65 20 66 69 6c 65 20 67 69 76 65  om the file give
17df0 6e 20 62 79 20 73 71 6c 69 74 65 72 63 5f 6f 76  n by sqliterc_ov
17e00 65 72 72 69 64 65 2e 20 20 4f 72 20 69 66 20 74  erride.  Or if t
17e10 68 61 74 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  hat.** parameter
17e20 20 69 73 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 69   is NULL, take i
17e30 6e 70 75 74 20 66 72 6f 6d 20 7e 2f 2e 73 71 6c  nput from ~/.sql
17e40 69 74 65 72 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75  iterc.**.** Retu
17e50 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
17e60 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61  f errors..*/.sta
17e70 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f  tic int process_
17e80 73 71 6c 69 74 65 72 63 28 0a 20 20 73 74 72 75  sqliterc(.  stru
17e90 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
17ea0 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 43   *p,        /* C
17eb0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74  onfiguration dat
17ec0 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  a */.  const cha
17ed0 72 20 2a 73 71 6c 69 74 65 72 63 5f 6f 76 65 72  r *sqliterc_over
17ee0 72 69 64 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ride   /* Name o
17ef0 66 20 63 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e  f config file. N
17f00 55 4c 4c 20 74 6f 20 75 73 65 20 64 65 66 61 75  ULL to use defau
17f10 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  lt */.){.  char 
17f20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c  *home_dir = NULL
17f30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
17f40 73 71 6c 69 74 65 72 63 20 3d 20 73 71 6c 69 74  sqliterc = sqlit
17f50 65 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20  erc_override;.  
17f60 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a  char *zBuf = 0;.
17f70 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c    FILE *in = NUL
17f80 4c 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20  L;.  int nBuf;. 
17f90 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20   int rc = 0;..  
17fa0 69 66 20 28 73 71 6c 69 74 65 72 63 20 3d 3d 20  if (sqliterc == 
17fb0 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65  NULL) {.    home
17fc0 5f 64 69 72 20 3d 20 66 69 6e 64 5f 68 6f 6d 65  _dir = find_home
17fd0 5f 64 69 72 28 29 3b 0a 20 20 20 20 69 66 28 20  _dir();.    if( 
17fe0 68 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 7b 0a 23  home_dir==0 ){.#
17ff0 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54  if !defined(__RT
18000 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64  P__) && !defined
18010 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20  (_WRS_KERNEL).  
18020 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
18030 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 63  rr,"%s: Error: c
18040 61 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 79 6f 75  annot locate you
18050 72 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79  r home directory
18060 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a 23 65 6e  \n", Argv0);.#en
18070 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
18080 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42   1;.    }.    nB
18090 75 66 20 3d 20 73 74 72 6c 65 6e 33 30 28 68 6f  uf = strlen30(ho
180a0 6d 65 5f 64 69 72 29 20 2b 20 31 36 3b 0a 20 20  me_dir) + 16;.  
180b0 20 20 7a 42 75 66 20 3d 20 6d 61 6c 6c 6f 63 28    zBuf = malloc(
180c0 20 6e 42 75 66 20 29 3b 0a 20 20 20 20 69 66 28   nBuf );.    if(
180d0 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20   zBuf==0 ){.    
180e0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
180f0 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 6f 75 74  ,"%s: Error: out
18100 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 2c 41 72   of memory\n",Ar
18110 67 76 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  gv0);.      retu
18120 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
18130 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
18140 28 6e 42 75 66 2c 20 7a 42 75 66 2c 22 25 73 2f  (nBuf, zBuf,"%s/
18150 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f  .sqliterc",home_
18160 64 69 72 29 3b 0a 20 20 20 20 66 72 65 65 28 68  dir);.    free(h
18170 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20 73 71  ome_dir);.    sq
18180 6c 69 74 65 72 63 20 3d 20 28 63 6f 6e 73 74 20  literc = (const 
18190 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20 7d 0a  char*)zBuf;.  }.
181a0 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c    in = fopen(sql
181b0 69 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69  iterc,"rb");.  i
181c0 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28  f( in ){.    if(
181d0 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
181e0 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 66  ctive ){.      f
181f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 2d  printf(stderr,"-
18200 2d 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75 72  - Loading resour
18210 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c 73  ces from %s\n",s
18220 71 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d 0a  qliterc);.    }.
18230 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73      rc = process
18240 5f 69 6e 70 75 74 28 70 2c 69 6e 29 3b 0a 20 20  _input(p,in);.  
18250 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
18260 7d 0a 20 20 66 72 65 65 28 7a 42 75 66 29 3b 0a  }.  free(zBuf);.
18270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18280 2f 2a 0a 2a 2a 20 53 68 6f 77 20 61 76 61 69 6c  /*.** Show avail
18290 61 62 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  able command lin
182a0 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61  e options.*/.sta
182b0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
182c0 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20 0a 20 20 22  Options[] = .  "
182d0 20 20 20 2d 69 6e 69 74 20 66 69 6c 65 6e 61 6d     -init filenam
182e0 65 20 20 20 20 20 20 20 72 65 61 64 2f 70 72 6f  e       read/pro
182f0 63 65 73 73 20 6e 61 6d 65 64 20 66 69 6c 65 5c  cess named file\
18300 6e 22 0a 20 20 22 20 20 20 2d 65 63 68 6f 20 20  n".  "   -echo  
18310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
18320 69 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66  int commands bef
18330 6f 72 65 20 65 78 65 63 75 74 69 6f 6e 5c 6e 22  ore execution\n"
18340 0a 20 20 22 20 20 20 2d 5b 6e 6f 5d 68 65 61 64  .  "   -[no]head
18350 65 72 20 20 20 20 20 20 20 20 20 20 74 75 72 6e  er          turn
18360 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f   headers on or o
18370 66 66 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 69  ff\n".  "   -bai
18380 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
18390 20 73 74 6f 70 20 61 66 74 65 72 20 68 69 74 74   stop after hitt
183a0 69 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a  ing an error\n".
183b0 20 20 22 20 20 20 2d 69 6e 74 65 72 61 63 74 69    "   -interacti
183c0 76 65 20 20 20 20 20 20 20 20 20 66 6f 72 63 65  ve         force
183d0 20 69 6e 74 65 72 61 63 74 69 76 65 20 49 2f 4f   interactive I/O
183e0 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 74 63 68  \n".  "   -batch
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
18400 6f 72 63 65 20 62 61 74 63 68 20 49 2f 4f 5c 6e  orce batch I/O\n
18410 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e 20  ".  "   -column 
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
18430 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
18440 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22 20  'column'\n".  " 
18450 20 20 2d 63 73 76 20 20 20 20 20 20 20 20 20 20    -csv          
18460 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75         set outpu
18470 74 20 6d 6f 64 65 20 74 6f 20 27 63 73 76 27 5c  t mode to 'csv'\
18480 6e 22 0a 20 20 22 20 20 20 2d 68 74 6d 6c 20 20  n".  "   -html  
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
184a0 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
184b0 20 48 54 4d 4c 5c 6e 22 0a 20 20 22 20 20 20 2d   HTML\n".  "   -
184c0 6c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20  line            
184d0 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d      set output m
184e0 6f 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c 6e 22  ode to 'line'\n"
184f0 0a 20 20 22 20 20 20 2d 6c 69 73 74 20 20 20 20  .  "   -list    
18500 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
18510 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
18520 6c 69 73 74 27 5c 6e 22 0a 20 20 22 20 20 20 2d  list'\n".  "   -
18530 73 65 70 61 72 61 74 6f 72 20 27 78 27 20 20 20  separator 'x'   
18540 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 66      set output f
18550 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72 20 28  ield separator (
18560 7c 29 5c 6e 22 0a 20 20 22 20 20 20 2d 6e 75 6c  |)\n".  "   -nul
18570 6c 76 61 6c 75 65 20 27 74 65 78 74 27 20 20 20  lvalue 'text'   
18580 20 73 65 74 20 74 65 78 74 20 73 74 72 69 6e 67   set text string
18590 20 66 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 73   for NULL values
185a0 5c 6e 22 0a 20 20 22 20 20 20 2d 76 65 72 73 69  \n".  "   -versi
185b0 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 73  on             s
185c0 68 6f 77 20 53 51 4c 69 74 65 20 76 65 72 73 69  how SQLite versi
185d0 6f 6e 5c 6e 22 0a 3b 0a 73 74 61 74 69 63 20 76  on\n".;.static v
185e0 6f 69 64 20 75 73 61 67 65 28 69 6e 74 20 73 68  oid usage(int sh
185f0 6f 77 44 65 74 61 69 6c 29 7b 0a 20 20 66 70 72  owDetail){.  fpr
18600 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
18610 20 20 20 22 55 73 61 67 65 3a 20 25 73 20 5b 4f     "Usage: %s [O
18620 50 54 49 4f 4e 53 5d 20 46 49 4c 45 4e 41 4d 45  PTIONS] FILENAME
18630 20 5b 53 51 4c 5d 5c 6e 22 20 20 0a 20 20 20 20   [SQL]\n"  .    
18640 20 20 22 46 49 4c 45 4e 41 4d 45 20 69 73 20 74    "FILENAME is t
18650 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 53 51  he name of an SQ
18660 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 41  Lite database. A
18670 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
18680 20 63 72 65 61 74 65 64 5c 6e 22 0a 20 20 20 20   created\n".    
18690 20 20 22 69 66 20 74 68 65 20 66 69 6c 65 20 64    "if the file d
186a0 6f 65 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73  oes not previous
186b0 6c 79 20 65 78 69 73 74 2e 5c 6e 22 2c 20 41 72  ly exist.\n", Ar
186c0 67 76 30 29 3b 0a 20 20 69 66 28 20 73 68 6f 77  gv0);.  if( show
186d0 44 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 66 70  Detail ){.    fp
186e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f  rintf(stderr, "O
186f0 50 54 49 4f 4e 53 20 69 6e 63 6c 75 64 65 3a 5c  PTIONS include:\
18700 6e 25 73 22 2c 20 7a 4f 70 74 69 6f 6e 73 29 3b  n%s", zOptions);
18710 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
18720 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
18730 73 65 20 74 68 65 20 2d 68 65 6c 70 20 6f 70 74  se the -help opt
18740 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
18750 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e  al information\n
18760 22 29 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28 31  ");.  }.  exit(1
18770 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
18780 69 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65  ialize the state
18790 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
187a0 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76  data.*/.static v
187b0 6f 69 64 20 6d 61 69 6e 5f 69 6e 69 74 28 73 74  oid main_init(st
187c0 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
187d0 74 61 20 2a 64 61 74 61 29 20 7b 0a 20 20 6d 65  ta *data) {.  me
187e0 6d 73 65 74 28 64 61 74 61 2c 20 30 2c 20 73 69  mset(data, 0, si
187f0 7a 65 6f 66 28 2a 64 61 74 61 29 29 3b 0a 20 20  zeof(*data));.  
18800 64 61 74 61 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44  data->mode = MOD
18810 45 5f 4c 69 73 74 3b 0a 20 20 6d 65 6d 63 70 79  E_List;.  memcpy
18820 28 64 61 74 61 2d 3e 73 65 70 61 72 61 74 6f 72  (data->separator
18830 2c 22 7c 22 2c 20 32 29 3b 0a 20 20 64 61 74 61  ,"|", 2);.  data
18840 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  ->showHeader = 0
18850 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
18860 69 6e 74 66 28 73 69 7a 65 6f 66 28 6d 61 69 6e  intf(sizeof(main
18870 50 72 6f 6d 70 74 29 2c 20 6d 61 69 6e 50 72 6f  Prompt), mainPro
18880 6d 70 74 2c 22 73 71 6c 69 74 65 3e 20 22 29 3b  mpt,"sqlite> ");
18890 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
188a0 6e 74 66 28 73 69 7a 65 6f 66 28 63 6f 6e 74 69  ntf(sizeof(conti
188b0 6e 75 65 50 72 6f 6d 70 74 29 2c 20 63 6f 6e 74  nuePrompt), cont
188c0 69 6e 75 65 50 72 6f 6d 70 74 2c 22 20 20 20 2e  inuePrompt,"   .
188d0 2e 2e 3e 20 22 29 3b 0a 7d 0a 0a 69 6e 74 20 6d  ..> ");.}..int m
188e0 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
188f0 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68  ar **argv){.  ch
18900 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
18910 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61  .  struct callba
18920 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20  ck_data data;.  
18930 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 69  const char *zIni
18940 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 68 61  tFile = 0;.  cha
18950 72 20 2a 7a 46 69 72 73 74 43 6d 64 20 3d 20 30  r *zFirstCmd = 0
18960 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
18970 20 72 63 20 3d 20 30 3b 0a 0a 20 20 41 72 67 76   rc = 0;..  Argv
18980 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6d  0 = argv[0];.  m
18990 61 69 6e 5f 69 6e 69 74 28 26 64 61 74 61 29 3b  ain_init(&data);
189a0 0a 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  .  stdin_is_inte
189b0 72 61 63 74 69 76 65 20 3d 20 69 73 61 74 74 79  ractive = isatty
189c0 28 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  (0);..  /* Make 
189d0 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76  sure we have a v
189e0 61 6c 69 64 20 73 69 67 6e 61 6c 20 68 61 6e 64  alid signal hand
189f0 6c 65 72 20 65 61 72 6c 79 2c 20 62 65 66 6f 72  ler early, befor
18a00 65 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  e anything.  ** 
18a10 65 6c 73 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20  else is done..  
18a20 2a 2f 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54  */.#ifdef SIGINT
18a30 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54  .  signal(SIGINT
18a40 2c 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64  , interrupt_hand
18a50 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ler);.#endif..  
18a60 2f 2a 20 44 6f 20 61 6e 20 69 6e 69 74 69 61 6c  /* Do an initial
18a70 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68   pass through th
18a80 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61  e command-line a
18a90 72 67 75 6d 65 6e 74 20 74 6f 20 6c 6f 63 61 74  rgument to locat
18aa0 65 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20  e.  ** the name 
18ab0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18ac0 66 69 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6f  file, the name o
18ad0 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  f the initializa
18ae0 74 69 6f 6e 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  tion file,.  ** 
18af0 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 63 6f  and the first co
18b00 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 75 74 65  mmand to execute
18b10 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31  ..  */.  for(i=1
18b20 3b 20 69 3c 61 72 67 63 2d 31 3b 20 69 2b 2b 29  ; i<argc-1; i++)
18b30 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
18b40 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30     if( argv[i][0
18b50 5d 21 3d 27 2d 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='-' ) break;.
18b60 20 20 20 20 7a 20 3d 20 61 72 67 76 5b 69 5d 3b      z = argv[i];
18b70 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
18b80 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
18b90 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73  ) z++;.    if( s
18ba0 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
18bb0 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30 20 7c  separator")==0 |
18bc0 7c 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  | strcmp(argv[i]
18bd0 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d  ,"-nullvalue")==
18be0 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  0 ){.      i++;.
18bf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
18c00 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 69  rcmp(argv[i],"-i
18c10 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nit")==0 ){.    
18c20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 49 6e    i++;.      zIn
18c30 69 74 46 69 6c 65 20 3d 20 61 72 67 76 5b 69 5d  itFile = argv[i]
18c40 3b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  ;.    /* Need to
18c50 20 63 68 65 63 6b 20 66 6f 72 20 62 61 74 63 68   check for batch
18c60 20 6d 6f 64 65 20 68 65 72 65 20 74 6f 20 73 6f   mode here to so
18c70 20 77 65 20 63 61 6e 20 61 76 6f 69 64 20 70 72   we can avoid pr
18c80 69 6e 74 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e  inting.    ** in
18c90 66 6f 72 6d 61 74 69 6f 6e 61 6c 20 6d 65 73 73  formational mess
18ca0 61 67 65 73 20 28 6c 69 6b 65 20 66 72 6f 6d 20  ages (like from 
18cb0 70 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72 63  process_sqliterc
18cc0 29 20 62 65 66 6f 72 65 20 0a 20 20 20 20 2a 2a  ) before .    **
18cd0 20 77 65 20 64 6f 20 74 68 65 20 61 63 74 75 61   we do the actua
18ce0 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  l processing of 
18cf0 61 72 67 75 6d 65 6e 74 73 20 6c 61 74 65 72 20  arguments later 
18d00 69 6e 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73  in a second pass
18d10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c  ..    */.    }el
18d20 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
18d30 67 76 5b 69 5d 2c 22 2d 62 61 74 63 68 22 29 3d  gv[i],"-batch")=
18d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  =0 ){.      i++;
18d50 0a 20 20 20 20 20 20 73 74 64 69 6e 5f 69 73 5f  .      stdin_is_
18d60 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20 30 3b  interactive = 0;
18d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
18d80 20 69 3c 61 72 67 63 20 29 7b 0a 23 69 66 20 64   i<argc ){.#if d
18d90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 53  efined(SQLITE_OS
18da0 5f 4f 53 32 29 20 26 26 20 53 51 4c 49 54 45 5f  _OS2) && SQLITE_
18db0 4f 53 5f 4f 53 32 0a 20 20 20 20 64 61 74 61 2e  OS_OS2.    data.
18dc0 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  zDbFilename = (c
18dd0 6f 6e 73 74 20 63 68 61 72 20 2a 29 63 6f 6e 76  onst char *)conv
18de0 65 72 74 43 70 50 61 74 68 54 6f 55 74 66 38 28  ertCpPathToUtf8(
18df0 20 61 72 67 76 5b 69 2b 2b 5d 20 29 3b 0a 23 65   argv[i++] );.#e
18e00 6c 73 65 0a 20 20 20 20 64 61 74 61 2e 7a 44 62  lse.    data.zDb
18e10 46 69 6c 65 6e 61 6d 65 20 3d 20 61 72 67 76 5b  Filename = argv[
18e20 69 2b 2b 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  i++];.#endif.  }
18e30 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51  else{.#ifndef SQ
18e40 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
18e50 44 42 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46  DB.    data.zDbF
18e60 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f  ilename = ":memo
18e70 72 79 3a 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ry:";.#else.    
18e80 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65  data.zDbFilename
18e90 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d   = 0;.#endif.  }
18ea0 0a 20 20 69 66 28 20 69 3c 61 72 67 63 20 29 7b  .  if( i<argc ){
18eb0 0a 20 20 20 20 7a 46 69 72 73 74 43 6d 64 20 3d  .    zFirstCmd =
18ec0 20 61 72 67 76 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a   argv[i++];.  }.
18ed0 20 20 64 61 74 61 2e 6f 75 74 20 3d 20 73 74 64    data.out = std
18ee0 6f 75 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  out;..#ifdef SQL
18ef0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
18f00 42 0a 20 20 69 66 28 20 64 61 74 61 2e 7a 44 62  B.  if( data.zDb
18f10 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
18f20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
18f30 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 6e 6f  r,"%s: Error: no
18f40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
18f50 6d 65 20 73 70 65 63 69 66 69 65 64 5c 6e 22 2c  me specified\n",
18f60 20 41 72 67 76 30 29 3b 0a 20 20 20 20 72 65 74   Argv0);.    ret
18f70 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
18f80 66 0a 0a 20 20 2f 2a 20 47 6f 20 61 68 65 61 64  f..  /* Go ahead
18f90 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 64 61   and open the da
18fa0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
18fb0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
18fc0 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 66  .  If the.  ** f
18fd0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
18fe0 73 74 2c 20 64 65 6c 61 79 20 6f 70 65 6e 69 6e  st, delay openin
18ff0 67 20 69 74 2e 20 20 54 68 69 73 20 70 72 65 76  g it.  This prev
19000 65 6e 74 73 20 65 6d 70 74 79 20 64 61 74 61 62  ents empty datab
19010 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 66  ase.  ** files f
19020 72 6f 6d 20 62 65 69 6e 67 20 63 72 65 61 74 65  rom being create
19030 64 20 69 66 20 61 20 75 73 65 72 20 6d 69 73 74  d if a user mist
19040 79 70 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ypes the databas
19050 65 20 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 0a  e name argument.
19060 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 71 6c 69    ** to the sqli
19070 74 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  te command-line 
19080 74 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tool..  */.  if(
19090 20 61 63 63 65 73 73 28 64 61 74 61 2e 7a 44 62   access(data.zDb
190a0 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 20  Filename, 0)==0 
190b0 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 26  ){.    open_db(&
190c0 64 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  data);.  }..  /*
190d0 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 69   Process the ini
190e0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65  tialization file
190f0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
19100 2e 20 20 49 66 20 6e 6f 20 2d 69 6e 69 74 20 6f  .  If no -init o
19110 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 67 69  ption.  ** is gi
19120 76 65 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ven on the comma
19130 6e 64 20 6c 69 6e 65 2c 20 6c 6f 6f 6b 20 66 6f  nd line, look fo
19140 72 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20 7e  r a file named ~
19150 2f 2e 73 71 6c 69 74 65 72 63 20 61 6e 64 0a 20  /.sqliterc and. 
19160 20 2a 2a 20 74 72 79 20 74 6f 20 70 72 6f 63 65   ** try to proce
19170 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 72 63  ss it..  */.  rc
19180 20 3d 20 70 72 6f 63 65 73 73 5f 73 71 6c 69 74   = process_sqlit
19190 65 72 63 28 26 64 61 74 61 2c 7a 49 6e 69 74 46  erc(&data,zInitF
191a0 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3e 30  ile);.  if( rc>0
191b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
191c0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  c;.  }..  /* Mak
191d0 65 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73 20  e a second pass 
191e0 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6d 6d  through the comm
191f0 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
19200 74 20 61 6e 64 20 73 65 74 0a 20 20 2a 2a 20 6f  t and set.  ** o
19210 70 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 65  ptions.  This se
19220 63 6f 6e 64 20 70 61 73 73 20 69 73 20 64 65 6c  cond pass is del
19230 61 79 65 64 20 75 6e 74 69 6c 20 61 66 74 65 72  ayed until after
19240 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
19250 69 6f 6e 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  ion.  ** file is
19260 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20 74 68   processed so th
19270 61 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  at the command-l
19280 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69  ine arguments wi
19290 6c 6c 20 6f 76 65 72 72 69 64 65 0a 20 20 2a 2a  ll override.  **
192a0 20 73 65 74 74 69 6e 67 73 20 69 6e 20 74 68 65   settings in the
192b0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
192c0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  file..  */.  for
192d0 28 69 3d 31 3b 20 69 3c 61 72 67 63 20 26 26 20  (i=1; i<argc && 
192e0 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 3b  argv[i][0]=='-';
192f0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
19300 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  *z = argv[i];.  
19310 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20    if( z[1]=='-' 
19320 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ z++; }.    if
19330 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69  ( strcmp(z,"-ini
19340 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
19350 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i++;.    }else i
19360 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74  f( strcmp(z,"-ht
19370 6d 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ml")==0 ){.     
19380 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
19390 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73  E_Html;.    }els
193a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
193b0 2d 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20  -list")==0 ){.  
193c0 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
193d0 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d  MODE_List;.    }
193e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
193f0 7a 2c 22 2d 6c 69 6e 65 22 29 3d 3d 30 20 29 7b  z,"-line")==0 ){
19400 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
19410 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20   = MODE_Line;.  
19420 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
19430 6d 70 28 7a 2c 22 2d 63 6f 6c 75 6d 6e 22 29 3d  mp(z,"-column")=
19440 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
19450 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c  .mode = MODE_Col
19460 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  umn;.    }else i
19470 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 73  f( strcmp(z,"-cs
19480 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  v")==0 ){.      
19490 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
194a0 5f 43 73 76 3b 0a 20 20 20 20 20 20 6d 65 6d 63  _Csv;.      memc
194b0 70 79 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f  py(data.separato
194c0 72 2c 22 2c 22 2c 32 29 3b 0a 20 20 20 20 7d 65  r,",",2);.    }e
194d0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
194e0 2c 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d  ,"-separator")==
194f0 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  0 ){.      i++;.
19500 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
19510 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61  printf(sizeof(da
19520 74 61 2e 73 65 70 61 72 61 74 6f 72 29 2c 20 64  ta.separator), d
19530 61 74 61 2e 73 65 70 61 72 61 74 6f 72 2c 0a 20  ata.separator,. 
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 28 69 6e        "%.*s",(in
19560 74 29 73 69 7a 65 6f 66 28 64 61 74 61 2e 73 65  t)sizeof(data.se
19570 70 61 72 61 74 6f 72 29 2d 31 2c 61 72 67 76 5b  parator)-1,argv[
19580 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
19590 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 75  f( strcmp(z,"-nu
195a0 6c 6c 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a  llvalue")==0 ){.
195b0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
195c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
195d0 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 6e 75  f(sizeof(data.nu
195e0 6c 6c 76 61 6c 75 65 29 2c 20 64 61 74 61 2e 6e  llvalue), data.n
195f0 75 6c 6c 76 61 6c 75 65 2c 0a 20 20 20 20 20 20  ullvalue,.      
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 22 25 2e 2a 73 22 2c 28 69 6e 74 29 73 69 7a   "%.*s",(int)siz
19620 65 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c  eof(data.nullval
19630 75 65 29 2d 31 2c 61 72 67 76 5b 69 5d 29 3b 0a  ue)-1,argv[i]);.
19640 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
19650 72 63 6d 70 28 7a 2c 22 2d 68 65 61 64 65 72 22  rcmp(z,"-header"
19660 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
19670 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
19680 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
19690 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 6f 68 65   strcmp(z,"-nohe
196a0 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ader")==0 ){.   
196b0 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
196c0 65 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  er = 0;.    }els
196d0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
196e0 2d 65 63 68 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  -echo")==0 ){.  
196f0 20 20 20 20 64 61 74 61 2e 65 63 68 6f 4f 6e 20      data.echoOn 
19700 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
19710 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61  f( strcmp(z,"-ba
19720 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  il")==0 ){.     
19730 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d   bail_on_error =
19740 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
19750 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 65 72  ( strcmp(z,"-ver
19760 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sion")==0 ){.   
19770 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22     printf("%s\n"
19780 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  , sqlite3_libver
19790 73 69 6f 6e 28 29 29 3b 0a 20 20 20 20 20 20 72  sion());.      r
197a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
197b0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
197c0 22 2d 69 6e 74 65 72 61 63 74 69 76 65 22 29 3d  "-interactive")=
197d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 64 69  =0 ){.      stdi
197e0 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
197f0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
19800 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62  if( strcmp(z,"-b
19810 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  atch")==0 ){.   
19820 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65     stdin_is_inte
19830 72 61 63 74 69 76 65 20 3d 20 30 3b 0a 20 20 20  ractive = 0;.   
19840 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
19850 70 28 7a 2c 22 2d 68 65 6c 70 22 29 3d 3d 30 20  p(z,"-help")==0 
19860 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 2d  || strcmp(z, "--
19870 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  help")==0 ){.   
19880 20 20 20 75 73 61 67 65 28 31 29 3b 0a 20 20 20     usage(1);.   
19890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
198a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
198b0 3a 20 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e  : Error: unknown
198c0 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
198d0 41 72 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20 20  Argv0, z);.     
198e0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
198f0 22 55 73 65 20 2d 68 65 6c 70 20 66 6f 72 20 61  "Use -help for a
19900 20 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73   list of options
19910 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  .\n");.      ret
19920 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
19930 0a 0a 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d  ..  if( zFirstCm
19940 64 20 29 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20  d ){.    /* Run 
19950 6a 75 73 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64  just the command
19960 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
19970 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a  e database name.
19980 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a      */.    if( z
19990 46 69 72 73 74 43 6d 64 5b 30 5d 3d 3d 27 2e 27  FirstCmd[0]=='.'
199a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64   ){.      rc = d
199b0 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a  o_meta_command(z
199c0 46 69 72 73 74 43 6d 64 2c 20 26 64 61 74 61 29  FirstCmd, &data)
199d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
199e0 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  c;.    }else{.  
199f0 20 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74      open_db(&dat
19a00 61 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  a);.      rc = s
19a10 68 65 6c 6c 5f 65 78 65 63 28 64 61 74 61 2e 64  hell_exec(data.d
19a20 62 2c 20 7a 46 69 72 73 74 43 6d 64 2c 20 73 68  b, zFirstCmd, sh
19a30 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64  ell_callback, &d
19a40 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
19a50 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73        if( zErrMs
19a60 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
19a70 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
19a80 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
19a90 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
19aa0 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f 20 72  return rc!=0 ? r
19ab0 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  c : 1;.      }el
19ac0 73 65 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  se if( rc!=0 ){.
19ad0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
19ae0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75  stderr,"Error: u
19af0 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63 65 73 73  nable to process
19b00 20 53 51 4c 20 5c 22 25 73 5c 22 5c 6e 22 2c 20   SQL \"%s\"\n", 
19b10 7a 46 69 72 73 74 43 6d 64 29 3b 0a 20 20 20 20  zFirstCmd);.    
19b20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19b30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19b40 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 75 6e  else{.    /* Run
19b50 20 63 6f 6d 6d 61 6e 64 73 20 72 65 63 65 69 76   commands receiv
19b60 65 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64  ed from standard
19b70 20 69 6e 70 75 74 0a 20 20 20 20 2a 2f 0a 20 20   input.    */.  
19b80 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69    if( stdin_is_i
19b90 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a 20 20  nteractive ){.  
19ba0 20 20 20 20 63 68 61 72 20 2a 7a 48 6f 6d 65 3b      char *zHome;
19bb0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 48 69  .      char *zHi
19bc0 73 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 20  story = 0;.     
19bd0 20 69 6e 74 20 6e 48 69 73 74 6f 72 79 3b 0a 20   int nHistory;. 
19be0 20 20 20 20 20 70 72 69 6e 74 66 28 0a 20 20 20       printf(.   
19bf0 20 20 20 20 20 22 53 51 4c 69 74 65 20 76 65 72       "SQLite ver
19c00 73 69 6f 6e 20 25 73 5c 6e 22 0a 20 20 20 20 20  sion %s\n".     
19c10 20 20 20 22 45 6e 74 65 72 20 5c 22 2e 68 65 6c     "Enter \".hel
19c20 70 5c 22 20 66 6f 72 20 69 6e 73 74 72 75 63 74  p\" for instruct
19c30 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20 20 20  ions\n".        
19c40 22 45 6e 74 65 72 20 53 51 4c 20 73 74 61 74 65  "Enter SQL state
19c50 6d 65 6e 74 73 20 74 65 72 6d 69 6e 61 74 65 64  ments terminated
19c60 20 77 69 74 68 20 61 20 5c 22 3b 5c 22 5c 6e 22   with a \";\"\n"
19c70 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
19c80 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 0a 20  3_libversion(). 
19c90 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 48       );.      zH
19ca0 6f 6d 65 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f  ome = find_home_
19cb0 64 69 72 28 29 3b 0a 20 20 20 20 20 20 69 66 28  dir();.      if(
19cc0 20 7a 48 6f 6d 65 20 29 7b 0a 20 20 20 20 20 20   zHome ){.      
19cd0 20 20 6e 48 69 73 74 6f 72 79 20 3d 20 73 74 72    nHistory = str
19ce0 6c 65 6e 33 30 28 7a 48 6f 6d 65 29 20 2b 20 32  len30(zHome) + 2
19cf0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  0;.        if( (
19d00 7a 48 69 73 74 6f 72 79 20 3d 20 6d 61 6c 6c 6f  zHistory = mallo
19d10 63 28 6e 48 69 73 74 6f 72 79 29 29 21 3d 30 20  c(nHistory))!=0 
19d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
19d30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 48  ite3_snprintf(nH
19d40 69 73 74 6f 72 79 2c 20 7a 48 69 73 74 6f 72 79  istory, zHistory
19d50 2c 22 25 73 2f 2e 73 71 6c 69 74 65 5f 68 69 73  ,"%s/.sqlite_his
19d60 74 6f 72 79 22 2c 20 7a 48 6f 6d 65 29 3b 0a 20  tory", zHome);. 
19d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19d80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
19d90 45 5f 52 45 41 44 4c 49 4e 45 29 20 26 26 20 48  E_READLINE) && H
19da0 41 56 45 5f 52 45 41 44 4c 49 4e 45 3d 3d 31 0a  AVE_READLINE==1.
19db0 20 20 20 20 20 20 69 66 28 20 7a 48 69 73 74 6f        if( zHisto
19dc0 72 79 20 29 20 72 65 61 64 5f 68 69 73 74 6f 72  ry ) read_histor
19dd0 79 28 7a 48 69 73 74 6f 72 79 29 3b 0a 23 65 6e  y(zHistory);.#en
19de0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 70  dif.      rc = p
19df0 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61  rocess_input(&da
19e00 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ta, 0);.      if
19e10 28 20 7a 48 69 73 74 6f 72 79 20 29 7b 0a 20 20  ( zHistory ){.  
19e20 20 20 20 20 20 20 73 74 69 66 6c 65 5f 68 69 73        stifle_his
19e30 74 6f 72 79 28 31 30 30 29 3b 0a 20 20 20 20 20  tory(100);.     
19e40 20 20 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79     write_history
19e50 28 7a 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20  (zHistory);.    
19e60 20 20 20 20 66 72 65 65 28 7a 48 69 73 74 6f 72      free(zHistor
19e70 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
19e80 20 20 66 72 65 65 28 7a 48 6f 6d 65 29 3b 0a 20    free(zHome);. 
19e90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19ea0 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70  rc = process_inp
19eb0 75 74 28 26 64 61 74 61 2c 20 73 74 64 69 6e 29  ut(&data, stdin)
19ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65  ;.    }.  }.  se
19ed0 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 26 64 61  t_table_name(&da
19ee0 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  ta, 0);.  if( db
19ef0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
19f00 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 21 3d 53  te3_close(db)!=S
19f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19f20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
19f30 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20  ,"Error: cannot 
19f40 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 20 5c  close database \
19f50 22 25 73 5c 22 5c 6e 22 2c 20 73 71 6c 69 74 65  "%s\"\n", sqlite
19f60 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
19f70 20 20 20 20 20 72 63 2b 2b 3b 0a 20 20 20 20 7d       rc++;.    }
19f80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19f90 3b 0a 7d 0a                                      ;.}.