/ Hex Artifact Content
Login

Artifact bbe7818ff5bc8614105ceb81ad67b8bdc0b671dd:


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 2f 0a 23 69 66 20 64 65 66 69 6e  es..*/.#if defin
01f0: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0200: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 2f 2a 20  fined(WIN32)./* 
0210: 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 63 6f  This needs to co
0220: 6d 65 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  me before any in
0230: 63 6c 75 64 65 73 20 66 6f 72 20 4d 53 56 43 20  cludes for MSVC 
0240: 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 23 64 65 66  compiler */.#def
0250: 69 6e 65 20 5f 43 52 54 5f 53 45 43 55 52 45 5f  ine _CRT_SECURE_
0260: 4e 4f 5f 57 41 52 4e 49 4e 47 53 0a 23 65 6e 64  NO_WARNINGS.#end
0270: 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  if..#include <st
0280: 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dlib.h>.#include
0290: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
02a0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
02b0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
02c0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  h>.#include "sql
02d0: 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ite3.h".#include
02e0: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c   <ctype.h>.#incl
02f0: 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 0a  ude <stdarg.h>..
0300: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49  #if !defined(_WI
0310: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
0320: 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  (WIN32) && !defi
0330: 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a 23 20 69  ned(__OS2__).# i
0340: 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68  nclude <signal.h
0350: 3e 0a 23 20 69 66 20 21 64 65 66 69 6e 65 64 28  >.# if !defined(
0360: 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66  __RTP__) && !def
0370: 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
0380: 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77  ).#  include <pw
0390: 64 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 20 69  d.h>.# endif.# i
03a0: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
03b0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
03c0: 2f 74 79 70 65 73 2e 68 3e 0a 23 65 6e 64 69 66  /types.h>.#endif
03d0: 0a 0a 23 69 66 64 65 66 20 5f 5f 4f 53 32 5f 5f  ..#ifdef __OS2__
03e0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  .# include <unis
03f0: 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  td.h>.#endif..#i
0400: 66 64 65 66 20 48 41 56 45 5f 45 44 49 54 4c 49  fdef HAVE_EDITLI
0410: 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 65 64  NE.# include <ed
0420: 69 74 6c 69 6e 65 2f 65 64 69 74 6c 69 6e 65 2e  itline/editline.
0430: 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  h>.#endif.#if de
0440: 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c  fined(HAVE_READL
0450: 49 4e 45 29 20 26 26 20 48 41 56 45 5f 52 45 41  INE) && HAVE_REA
0460: 44 4c 49 4e 45 3d 3d 31 0a 23 20 69 6e 63 6c 75  DLINE==1.# inclu
0470: 64 65 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61  de <readline/rea
0480: 64 6c 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  dline.h>.# inclu
0490: 64 65 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73  de <readline/his
04a0: 74 6f 72 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  tory.h>.#endif.#
04b0: 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45  if !defined(HAVE
04c0: 5f 45 44 49 54 4c 49 4e 45 29 20 26 26 20 28 21  _EDITLINE) && (!
04d0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
04e0: 44 4c 49 4e 45 29 20 7c 7c 20 48 41 56 45 5f 52  DLINE) || HAVE_R
04f0: 45 41 44 4c 49 4e 45 21 3d 31 29 0a 23 20 64 65  EADLINE!=1).# de
0500: 66 69 6e 65 20 72 65 61 64 6c 69 6e 65 28 70 29  fine readline(p)
0510: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 70   local_getline(p
0520: 2c 73 74 64 69 6e 29 0a 23 20 64 65 66 69 6e 65  ,stdin).# define
0530: 20 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a   add_history(X).
0540: 23 20 64 65 66 69 6e 65 20 72 65 61 64 5f 68 69  # define read_hi
0550: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0560: 65 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  e write_history(
0570: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 74 69 66  X).# define stif
0580: 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 65  le_history(X).#e
0590: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
05a0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
05b0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e  ined(WIN32).# in
05c0: 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 64 65  clude <io.h>.#de
05d0: 66 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f  fine isatty(h) _
05e0: 69 73 61 74 74 79 28 68 29 0a 23 64 65 66 69 6e  isatty(h).#defin
05f0: 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20 5f 61  e access(f,m) _a
0600: 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29 0a 23  ccess((f),(m)).#
0610: 65 6c 73 65 0a 2f 2a 20 4d 61 6b 65 20 73 75 72  else./* Make sur
0620: 65 20 69 73 61 74 74 79 28 29 20 68 61 73 20 61  e isatty() has a
0630: 20 70 72 6f 74 6f 74 79 70 65 2e 0a 2a 2f 0a 65   prototype..*/.e
0640: 78 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79  xtern int isatty
0650: 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ();.#endif..#if 
0660: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
0670: 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43  CE)./* Windows C
0680: 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e  E (arm-wince-min
0690: 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73  gw32ce-gcc) does
06a0: 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61   not provide isa
06b0: 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65  tty(). * thus we
06c0: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74   always assume t
06d0: 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f  hat we have a co
06e0: 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20  nsole. That can 
06f0: 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e  be. * overridden
0700: 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68   with the -batch
0710: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70   command line op
0720: 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e  tion.. */.#defin
0730: 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65  e isatty(x) 1.#e
0740: 6e 64 69 66 0a 0a 2f 2a 20 54 72 75 65 20 69 66  ndif../* True if
0750: 20 74 68 65 20 74 69 6d 65 72 20 69 73 20 65 6e   the timer is en
0760: 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63 20  abled */.static 
0770: 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d 65 72 20  int enableTimer 
0780: 3d 20 30 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  = 0;..#if !defin
0790: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
07a0: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
07b0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f   !defined(__OS2_
07c0: 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
07d0: 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69  _RTP__) && !defi
07e0: 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29  ned(_WRS_KERNEL)
07f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0800: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0810: 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e  <sys/resource.h>
0820: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
0830: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
0840: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
0850: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
0860: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
0870: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
0880: 3b 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74  ;../*.** Begin t
0890: 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  iming an operati
08a0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
08b0: 64 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69  d beginTimer(voi
08c0: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
08d0: 54 69 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74  Timer ){.    get
08e0: 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45  rusage(RUSAGE_SE
08f0: 4c 46 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20  LF, &sBegin);.  
0900: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
0910: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
0920: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
0930: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
0940: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
0950: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
0960: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
0970: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
0980: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
0990: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
09a0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
09b0: 2a 30 2e 30 30 30 30 30 31 20 2b 20 0a 20 20 20  *0.000001 + .   
09c0: 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70        (double)(p
09d0: 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53  End->tv_sec - pS
09e0: 74 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d  tart->tv_sec);.}
09f0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
0a00: 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73  e timing results
0a10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0a20: 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b   endTimer(void){
0a30: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d  .  if( enableTim
0a40: 65 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  er ){.    struct
0a50: 20 72 75 73 61 67 65 20 73 45 6e 64 3b 0a 20 20   rusage sEnd;.  
0a60: 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
0a70: 47 45 5f 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b  GE_SELF, &sEnd);
0a80: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 50 55  .    printf("CPU
0a90: 20 54 69 6d 65 3a 20 75 73 65 72 20 25 66 20 73   Time: user %f s
0aa0: 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20  ys %f\n",.      
0ab0: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
0ac0: 6e 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e  n.ru_utime, &sEn
0ad0: 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20  d.ru_utime),.   
0ae0: 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 73 42      timeDiff(&sB
0af0: 65 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26  egin.ru_stime, &
0b00: 73 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b  sEnd.ru_stime));
0b10: 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  .  }.}..#define 
0b20: 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69  BEGIN_TIMER begi
0b30: 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65  nTimer().#define
0b40: 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69   END_TIMER endTi
0b50: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41  mer().#define HA
0b60: 53 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66  S_TIMER 1..#elif
0b70: 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   (defined(_WIN32
0b80: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
0b90: 33 32 29 29 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  32))..#include <
0ba0: 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a 20 53  windows.h>../* S
0bb0: 61 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e  aved resource in
0bc0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
0bd0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
0be0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73  n operation */.s
0bf0: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72  tatic HANDLE hPr
0c00: 6f 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49  ocess;.static FI
0c10: 4c 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42  LETIME ftKernelB
0c20: 65 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c  egin;.static FIL
0c30: 45 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69  ETIME ftUserBegi
0c40: 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c 20  n;.typedef BOOL 
0c50: 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f 43  (WINAPI *GETPROC
0c60: 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20 4c  TIMES)(HANDLE, L
0c70: 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c  PFILETIME, LPFIL
0c80: 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ETIME, LPFILETIM
0c90: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a  E, LPFILETIME);.
0ca0: 73 74 61 74 69 63 20 47 45 54 50 52 4f 43 54 49  static GETPROCTI
0cb0: 4d 45 53 20 67 65 74 50 72 6f 63 65 73 73 54 69  MES getProcessTi
0cc0: 6d 65 73 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a  mesAddr = NULL;.
0cd0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
0ce0: 73 65 65 20 69 66 20 77 65 20 68 61 76 65 20 74  see if we have t
0cf0: 69 6d 65 72 20 73 75 70 70 6f 72 74 2e 20 20 52  imer support.  R
0d00: 65 74 75 72 6e 20 31 20 69 66 20 6e 65 63 65 73  eturn 1 if neces
0d10: 73 61 72 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20  sary.** support 
0d20: 66 6f 75 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20  found (or found 
0d30: 70 72 65 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a  previously)..*/.
0d40: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 54 69  static int hasTi
0d50: 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  mer(void){.  if(
0d60: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
0d70: 41 64 64 72 20 29 7b 0a 20 20 20 20 72 65 74 75  Addr ){.    retu
0d80: 72 6e 20 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn 1;.  } else {
0d90: 0a 20 20 20 20 2f 2a 20 47 65 74 50 72 6f 63 65  .    /* GetProce
0da0: 73 73 54 69 6d 65 73 28 29 20 69 73 6e 27 74 20  ssTimes() isn't 
0db0: 73 75 70 70 6f 72 74 65 64 20 69 6e 20 57 49 4e  supported in WIN
0dc0: 39 35 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65  95 and some othe
0dd0: 72 20 57 69 6e 64 6f 77 73 20 76 65 72 73 69 6f  r Windows versio
0de0: 6e 73 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 69  ns..    ** See i
0df0: 66 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65  f the version we
0e00: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
0e10: 68 61 73 20 69 74 2c 20 61 6e 64 20 69 66 20 69  has it, and if i
0e20: 74 20 64 6f 65 73 2c 20 73 61 76 65 20 6f 66 66  t does, save off
0e30: 0a 20 20 20 20 2a 2a 20 61 20 70 6f 69 6e 74 65  .    ** a pointe
0e40: 72 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20  r to it and the 
0e50: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
0e60: 68 61 6e 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  handle..    */. 
0e70: 20 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47 65     hProcess = Ge
0e80: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28  tCurrentProcess(
0e90: 29 3b 0a 20 20 20 20 69 66 28 20 68 50 72 6f 63  );.    if( hProc
0ea0: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 48 49 4e  ess ){.      HIN
0eb0: 53 54 41 4e 43 45 20 68 69 6e 73 74 4c 69 62 20  STANCE hinstLib 
0ec0: 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54 45  = LoadLibrary(TE
0ed0: 58 54 28 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c  XT("Kernel32.dll
0ee0: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e  "));.      if( N
0ef0: 55 4c 4c 20 21 3d 20 68 69 6e 73 74 4c 69 62 20  ULL != hinstLib 
0f00: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 74 50 72  ){.        getPr
0f10: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d  ocessTimesAddr =
0f20: 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29 20   (GETPROCTIMES) 
0f30: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 68  GetProcAddress(h
0f40: 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72 6f  instLib, "GetPro
0f50: 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20 20  cessTimes");.   
0f60: 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d       if( NULL !=
0f70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
0f80: 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Addr ){.        
0f90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46 72      }.        Fr
0fb0: 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74 4c  eeLibrary(hinstL
0fc0: 69 62 29 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  ib); .      }.  
0fd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0fe0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   0;.}../*.** Beg
0ff0: 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65  in timing an ope
1000: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
1010: 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72   void beginTimer
1020: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
1030: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
1040: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1050: 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45   ){.    FILETIME
1060: 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45   ftCreation, ftE
1070: 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63  xit;.    getProc
1080: 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72  essTimesAddr(hPr
1090: 6f 63 65 73 73 2c 20 26 66 74 43 72 65 61 74 69  ocess, &ftCreati
10a0: 6f 6e 2c 20 26 66 74 45 78 69 74 2c 20 26 66 74  on, &ftExit, &ft
10b0: 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74  KernelBegin, &ft
10c0: 55 73 65 72 42 65 67 69 6e 29 3b 0a 20 20 7d 0a  UserBegin);.  }.
10d0: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
10e0: 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74   difference of t
10f0: 77 6f 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  wo FILETIME stru
1100: 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a  cts in seconds *
1110: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
1120: 74 69 6d 65 44 69 66 66 28 46 49 4c 45 54 49 4d  timeDiff(FILETIM
1130: 45 20 2a 70 53 74 61 72 74 2c 20 46 49 4c 45 54  E *pStart, FILET
1140: 49 4d 45 20 2a 70 45 6e 64 29 7b 0a 20 20 73 71  IME *pEnd){.  sq
1150: 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34 53 74  lite_int64 i64St
1160: 61 72 74 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  art = *((sqlite_
1170: 69 6e 74 36 34 20 2a 29 20 70 53 74 61 72 74 29  int64 *) pStart)
1180: 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ;.  sqlite_int64
1190: 20 69 36 34 45 6e 64 20 3d 20 2a 28 28 73 71 6c   i64End = *((sql
11a0: 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 45 6e  ite_int64 *) pEn
11b0: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 6f  d);.  return (do
11c0: 75 62 6c 65 29 20 28 28 69 36 34 45 6e 64 20 2d  uble) ((i64End -
11d0: 20 69 36 34 53 74 61 72 74 29 20 2f 20 31 30 30   i64Start) / 100
11e0: 30 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a  00000.0);.}../*.
11f0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d  ** Print the tim
1200: 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a  ing results..*/.
1210: 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54  static void endT
1220: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
1230: 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26  ( enableTimer &&
1240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1250: 41 64 64 72 29 7b 0a 20 20 20 20 46 49 4c 45 54  Addr){.    FILET
1260: 49 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20  IME ftCreation, 
1270: 66 74 45 78 69 74 2c 20 66 74 4b 65 72 6e 65 6c  ftExit, ftKernel
1280: 45 6e 64 2c 20 66 74 55 73 65 72 45 6e 64 3b 0a  End, ftUserEnd;.
1290: 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69      getProcessTi
12a0: 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73  mesAddr(hProcess
12b0: 2c 20 26 66 74 43 72 65 61 74 69 6f 6e 2c 20 26  , &ftCreation, &
12c0: 66 74 45 78 69 74 2c 20 26 66 74 4b 65 72 6e 65  ftExit, &ftKerne
12d0: 6c 45 6e 64 2c 20 26 66 74 55 73 65 72 45 6e 64  lEnd, &ftUserEnd
12e0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  );.    printf("C
12f0: 50 55 20 54 69 6d 65 3a 20 75 73 65 72 20 25 66  PU Time: user %f
1300: 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20   sys %f\n",.    
1310: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 55     timeDiff(&ftU
1320: 73 65 72 42 65 67 69 6e 2c 20 26 66 74 55 73 65  serBegin, &ftUse
1330: 72 45 6e 64 29 2c 0a 20 20 20 20 20 20 20 74 69  rEnd),.       ti
1340: 6d 65 44 69 66 66 28 26 66 74 4b 65 72 6e 65 6c  meDiff(&ftKernel
1350: 42 65 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c  Begin, &ftKernel
1360: 45 6e 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64  End));.  }.}..#d
1370: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
1380: 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23  R beginTimer().#
1390: 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52  define END_TIMER
13a0: 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66   endTimer().#def
13b0: 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 68 61  ine HAS_TIMER ha
13c0: 73 54 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a  sTimer()..#else.
13d0: 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49  #define BEGIN_TI
13e0: 4d 45 52 20 0a 23 64 65 66 69 6e 65 20 45 4e 44  MER .#define END
13f0: 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20 48  _TIMER.#define H
1400: 41 53 5f 54 49 4d 45 52 20 30 0a 23 65 6e 64 69  AS_TIMER 0.#endi
1410: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f  f../*.** Used to
1420: 20 70 72 65 76 65 6e 74 20 77 61 72 6e 69 6e 67   prevent warning
1430: 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70  s about unused p
1440: 61 72 61 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65  arameters.*/.#de
1450: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
1460: 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28  METER(x) (void)(
1470: 78 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  x)../*.** If the
1480: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20   following flag 
1490: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d  is set, then com
14a0: 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73  mand execution s
14b0: 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72  tops.** at an er
14c0: 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ror if we are no
14d0: 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a  t interactive..*
14e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 69  /.static int bai
14f0: 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a  l_on_error = 0;.
1500: 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74  ./*.** Threat st
1510: 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61  din as an intera
1520: 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20 74  ctive input if t
1530: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1540: 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65  iable.** is true
1550: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  .  Otherwise, as
1560: 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f  sume stdin is co
1570: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c  nnected to a fil
1580: 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74  e or pipe..*/.st
1590: 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69  atic int stdin_i
15a0: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
15b0: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  1;../*.** The fo
15c0: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f  llowing is the o
15d0: 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62  pen SQLite datab
15e0: 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20  ase.  We make a 
15f0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
1600: 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73 74  is database a st
1610: 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f  atic variable so
1620: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
1630: 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74  accessed.** by t
1640: 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65  he SIGINT handle
1650: 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64  r to interrupt d
1660: 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73 69  atabase processi
1670: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ng..*/.static sq
1680: 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a  lite3 *db = 0;..
1690: 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e  /*.** True if an
16a0: 20 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74   interrupt (Cont
16b0: 72 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20  rol-C) has been 
16c0: 72 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61  received..*/.sta
16d0: 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74  tic volatile int
16e0: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d   seenInterrupt =
16f0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   0;../*.** This 
1700: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f  is the name of o
1710: 75 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69  ur program. It i
1720: 73 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c  s set in main(),
1730: 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75   used.** in a nu
1740: 6d 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c  mber of other pl
1750: 61 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72  aces, mostly for
1760: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
1770: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1780: 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *Argv0;../*.** P
1790: 72 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49  rompt strings. I
17a0: 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61  nitialized in ma
17b0: 69 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74  in. Settable wit
17c0: 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d  h.**   .prompt m
17d0: 61 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a  ain continue.*/.
17e0: 73 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e  static char main
17f0: 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20  Prompt[20];     
1800: 2f 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72  /* First line pr
1810: 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22  ompt. default: "
1820: 73 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74  sqlite> "*/.stat
1830: 69 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65  ic char continue
1840: 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43  Prompt[20]; /* C
1850: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d  ontinuation prom
1860: 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20  pt. default: "  
1870: 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a   ...> " */../*.*
1880: 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72 61 63  * Write I/O trac
1890: 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  es to the follow
18a0: 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23  ing stream..*/.#
18b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18c0: 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74  BLE_IOTRACE.stat
18d0: 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65  ic FILE *iotrace
18e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
18f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1900: 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69 6e   works like prin
1910: 74 66 20 69 6e 20 74 68 61 74 20 69 74 73 20 66  tf in that its f
1920: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1930: 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72   a.** format str
1940: 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71 75 65  ing and subseque
1950: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  nt arguments are
1960: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75   values to be su
1970: 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69 6e 20  bstituted.** in 
1980: 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65 6c 64  place of % field
1990: 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f  s.  The result o
19a0: 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 68 69  f formatting thi
19b0: 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 77  s string.** is w
19c0: 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72 61 63  ritten to iotrac
19d0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
19e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
19f0: 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  CE.static void i
1a00: 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f 6e  otracePrintf(con
1a10: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1a20: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1a30: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
1a40: 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d  .  if( iotrace==
1a50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  0 ) return;.  va
1a60: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
1a70: 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  at);.  z = sqlit
1a80: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72  e3_vmprintf(zFor
1a90: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1aa0: 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74  nd(ap);.  fprint
1ab0: 66 28 69 6f 74 72 61 63 65 2c 20 22 25 73 22 2c  f(iotrace, "%s",
1ac0: 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   z);.  sqlite3_f
1ad0: 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  ree(z);.}.#endif
1ae0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  .../*.** Determi
1af0: 6e 65 73 20 69 66 20 61 20 73 74 72 69 6e 67 20  nes if a string 
1b00: 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6e  is a number of n
1b10: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1b20: 74 20 69 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74  t isNumber(const
1b30: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72   char *z, int *r
1b40: 65 61 6c 6e 75 6d 29 7b 0a 20 20 69 66 28 20 2a  ealnum){.  if( *
1b50: 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b  z=='-' || *z=='+
1b60: 27 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 21  ' ) z++;.  if( !
1b70: 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20  isdigit(*z) ){. 
1b80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1b90: 0a 20 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 72 65  .  z++;.  if( re
1ba0: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
1bb0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
1bc0: 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b  sdigit(*z) ){ z+
1bd0: 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  +; }.  if( *z=='
1be0: 2e 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  .' ){.    z++;. 
1bf0: 20 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28     if( !isdigit(
1c00: 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  *z) ) return 0;.
1c10: 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67      while( isdig
1c20: 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d  it(*z) ){ z++; }
1c30: 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  .    if( realnum
1c40: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b   ) *realnum = 1;
1c50: 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  .  }.  if( *z=='
1c60: 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b  e' || *z=='E' ){
1c70: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
1c80: 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d  ( *z=='+' || *z=
1c90: 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
1ca0: 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a 29  if( !isdigit(*z)
1cb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1cc0: 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28   while( isdigit(
1cd0: 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  *z) ){ z++; }.  
1ce0: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
1cf0: 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20  *realnum = 1;.  
1d00: 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30  }.  return *z==0
1d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f  ;.}../*.** A glo
1d20: 62 61 6c 20 63 68 61 72 2a 20 61 6e 64 20 61 6e  bal char* and an
1d30: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f   SQL function to
1d40: 20 61 63 63 65 73 73 20 69 74 73 20 63 75 72 72   access its curr
1d50: 65 6e 74 20 76 61 6c 75 65 20 0a 2a 2a 20 66 72  ent value .** fr
1d60: 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 53 51 4c  om within an SQL
1d70: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
1d80: 20 70 72 6f 67 72 61 6d 20 75 73 65 64 20 74 6f   program used to
1d90: 20 75 73 65 20 74 68 65 20 0a 2a 2a 20 73 71 6c   use the .** sql
1da0: 69 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  ite_exec_printf(
1db0: 29 20 41 50 49 20 74 6f 20 73 75 62 73 74 69 74  ) API to substit
1dc0: 75 65 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f  ue a string into
1dd0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
1de0: 74 2e 0a 2a 2a 20 54 68 65 20 63 6f 72 72 65 63  t..** The correc
1df0: 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 69 73  t way to do this
1e00: 20 77 69 74 68 20 73 71 6c 69 74 65 33 20 69 73   with sqlite3 is
1e10: 20 74 6f 20 75 73 65 20 74 68 65 20 62 69 6e 64   to use the bind
1e20: 20 41 50 49 2c 20 62 75 74 0a 2a 2a 20 73 69 6e   API, but.** sin
1e30: 63 65 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20  ce the shell is 
1e40: 62 75 69 6c 74 20 61 72 6f 75 6e 64 20 74 68 65  built around the
1e50: 20 63 61 6c 6c 62 61 63 6b 20 70 61 72 61 64 69   callback paradi
1e60: 67 6d 20 69 74 20 77 6f 75 6c 64 20 62 65 20 61  gm it would be a
1e70: 20 6c 6f 74 0a 2a 2a 20 6f 66 20 77 6f 72 6b 2e   lot.** of work.
1e80: 20 49 6e 73 74 65 61 64 20 6a 75 73 74 20 75 73   Instead just us
1e90: 65 20 74 68 69 73 20 68 61 63 6b 2c 20 77 68 69  e this hack, whi
1ea0: 63 68 20 69 73 20 71 75 69 74 65 20 68 61 72 6d  ch is quite harm
1eb0: 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
1ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 68 65  const char *zShe
1ed0: 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 73 74  llStatic = 0;.st
1ee0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 73  atic void shells
1ef0: 74 61 74 69 63 46 75 6e 63 28 0a 20 20 73 71 6c  taticFunc(.  sql
1f00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1f10: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
1f20: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
1f30: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 61  ue **argv.){.  a
1f40: 73 73 65 72 74 28 20 30 3d 3d 61 72 67 63 20 29  ssert( 0==argc )
1f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 68 65  ;.  assert( zShe
1f60: 6c 6c 53 74 61 74 69 63 20 29 3b 0a 20 20 55 4e  llStatic );.  UN
1f70: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
1f80: 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
1f90: 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a  ARAMETER(argv);.
1fa0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1fb0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
1fc0: 53 68 65 6c 6c 53 74 61 74 69 63 2c 20 2d 31 2c  ShellStatic, -1,
1fd0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1fe0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1ff0: 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20  routine reads a 
2000: 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f  line of text fro
2010: 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65  m FILE in, store
2020: 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e  s.** the text in
2030: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
2040: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
2050: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nd returns a poi
2060: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74  nter.** to the t
2070: 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65  ext.  NULL is re
2080: 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66  turned at end of
2090: 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c   file, or if mal
20a0: 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a  loc().** fails..
20b0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
20c0: 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61  ace is like "rea
20d0: 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f  dline" but no co
20e0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69  mmand-line editi
20f0: 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a  ng.** is done..*
2100: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
2110: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
2120: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
2130: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
2140: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
2150: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  e;.  int n;.  in
2160: 74 20 65 6f 6c 3b 0a 0a 20 20 69 66 28 20 7a 50  t eol;..  if( zP
2170: 72 6f 6d 70 74 20 26 26 20 2a 7a 50 72 6f 6d 70  rompt && *zPromp
2180: 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  t ){.    printf(
2190: 22 25 73 22 2c 7a 50 72 6f 6d 70 74 29 3b 0a 20  "%s",zPrompt);. 
21a0: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
21b0: 29 3b 0a 20 20 7d 0a 20 20 6e 4c 69 6e 65 20 3d  );.  }.  nLine =
21c0: 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20   100;.  zLine = 
21d0: 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b  malloc( nLine );
21e0: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20  .  if( zLine==0 
21f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
2200: 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a  = 0;.  eol = 0;.
2210: 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b    while( !eol ){
2220: 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e  .    if( n+100>n
2230: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Line ){.      nL
2240: 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20  ine = nLine*2 + 
2250: 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  100;.      zLine
2260: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
2270: 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
2280: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
2290: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
22a0: 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c     if( fgets(&zL
22b0: 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20  ine[n], nLine - 
22c0: 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n, in)==0 ){.   
22d0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
22e0: 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e         free(zLin
22f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
2300: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
2310: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
2320: 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b  ;.      eol = 1;
2330: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2340: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
2350: 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20  Line[n] ){ n++; 
2360: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
2370: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
2380: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
2390: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
23a0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
23b0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
23c0: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
23d0: 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20     eol = 1;.    
23e0: 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20  }.  }.  zLine = 
23f0: 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20  realloc( zLine, 
2400: 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  n+1 );.  return 
2410: 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zLine;.}../*.** 
2420: 52 65 74 72 69 65 76 65 20 61 20 73 69 6e 67 6c  Retrieve a singl
2430: 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
2440: 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 72 69  text..**.** zPri
2450: 6f 72 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f  or is a string o
2460: 66 20 70 72 69 6f 72 20 74 65 78 74 20 72 65 74  f prior text ret
2470: 72 69 65 76 65 64 2e 20 20 49 66 20 6e 6f 74 20  rieved.  If not 
2480: 74 68 65 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72  the empty.** str
2490: 69 6e 67 2c 20 74 68 65 6e 20 69 73 73 75 65 20  ing, then issue 
24a0: 61 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70  a continuation p
24b0: 72 6f 6d 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rompt..*/.static
24c0: 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74   char *one_input
24d0: 5f 6c 69 6e 65 28 63 6f 6e 73 74 20 63 68 61 72  _line(const char
24e0: 20 2a 7a 50 72 69 6f 72 2c 20 46 49 4c 45 20 2a   *zPrior, FILE *
24f0: 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72  in){.  char *zPr
2500: 6f 6d 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52  ompt;.  char *zR
2510: 65 73 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21  esult;.  if( in!
2520: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2530: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
2540: 2c 20 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28  , in);.  }.  if(
2550: 20 7a 50 72 69 6f 72 20 26 26 20 7a 50 72 69 6f   zPrior && zPrio
2560: 72 5b 30 5d 20 29 7b 0a 20 20 20 20 7a 50 72 6f  r[0] ){.    zPro
2570: 6d 70 74 20 3d 20 63 6f 6e 74 69 6e 75 65 50 72  mpt = continuePr
2580: 6f 6d 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ompt;.  }else{. 
2590: 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20 6d 61 69     zPrompt = mai
25a0: 6e 50 72 6f 6d 70 74 3b 0a 20 20 7d 0a 20 20 7a  nPrompt;.  }.  z
25b0: 52 65 73 75 6c 74 20 3d 20 72 65 61 64 6c 69 6e  Result = readlin
25c0: 65 28 7a 50 72 6f 6d 70 74 29 3b 0a 23 69 66 20  e(zPrompt);.#if 
25d0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
25e0: 44 4c 49 4e 45 29 20 26 26 20 48 41 56 45 5f 52  DLINE) && HAVE_R
25f0: 45 41 44 4c 49 4e 45 3d 3d 31 0a 20 20 69 66 28  EADLINE==1.  if(
2600: 20 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52 65   zResult && *zRe
2610: 73 75 6c 74 20 29 20 61 64 64 5f 68 69 73 74 6f  sult ) add_histo
2620: 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e  ry(zResult);.#en
2630: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  dif.  return zRe
2640: 73 75 6c 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20  sult;.}..struct 
2650: 70 72 65 76 69 6f 75 73 5f 6d 6f 64 65 5f 64 61  previous_mode_da
2660: 74 61 20 7b 0a 20 20 69 6e 74 20 76 61 6c 69 64  ta {.  int valid
2670: 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74  ;        /* Is t
2680: 68 65 72 65 20 6c 65 67 69 74 20 64 61 74 61 20  here legit data 
2690: 69 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e  in here? */.  in
26a0: 74 20 6d 6f 64 65 3b 0a 20 20 69 6e 74 20 73 68  t mode;.  int sh
26b0: 6f 77 48 65 61 64 65 72 3b 0a 20 20 69 6e 74 20  owHeader;.  int 
26c0: 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 0a 7d  colWidth[100];.}
26d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 70 6f 69 6e  ;../*.** An poin
26e0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
26f0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
2700: 74 75 72 65 20 69 73 20 70 61 73 73 65 64 20 66  ture is passed f
2710: 72 6f 6d 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  rom.** the main 
2720: 70 72 6f 67 72 61 6d 20 74 6f 20 74 68 65 20 63  program to the c
2730: 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 69  allback.  This i
2740: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e  s used to commun
2750: 69 63 61 74 65 0a 2a 2a 20 73 74 61 74 65 20 61  icate.** state a
2760: 6e 64 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74  nd mode informat
2770: 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63  ion..*/.struct c
2780: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 7b 0a 20  allback_data {. 
2790: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
27a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
27b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
27c0: 20 65 63 68 6f 4f 6e 3b 20 20 20 20 20 20 20 20   echoOn;        
27d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
27e0: 63 68 6f 20 69 6e 70 75 74 20 63 6f 6d 6d 61 6e  cho input comman
27f0: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74  ds */.  int stat
2800: 73 4f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  sOn;           /
2810: 2a 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61  * True to displa
2820: 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 20 62  y memory stats b
2830: 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c  efore each final
2840: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ize */.  int cnt
2850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2860: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
2870: 6f 72 64 73 20 64 69 73 70 6c 61 79 65 64 20 73  ords displayed s
2880: 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49 4c 45 20  o far */.  FILE 
2890: 2a 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  *out;           
28a0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
28b0: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ts here */.  int
28c0: 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20   mode;          
28d0: 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70 75 74      /* An output
28e0: 20 6d 6f 64 65 20 73 65 74 74 69 6e 67 20 2a 2f   mode setting */
28f0: 0a 20 20 69 6e 74 20 77 72 69 74 61 62 6c 65 53  .  int writableS
2900: 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75  chema;    /* Tru
2910: 65 20 69 66 20 50 52 41 47 4d 41 20 77 72 69 74  e if PRAGMA writ
2920: 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a  able_schema=ON *
2930: 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64  /.  int showHead
2940: 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  er;        /* Tr
2950: 75 65 20 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d  ue to show colum
2960: 6e 20 6e 61 6d 65 73 20 69 6e 20 4c 69 73 74 20  n names in List 
2970: 6f 72 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a  or Column mode *
2980: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 54  /.  char *zDestT
2990: 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61  able;      /* Na
29a0: 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74 69 6f  me of destinatio
29b0: 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d 4f 44  n table when MOD
29c0: 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68  E_Insert */.  ch
29d0: 61 72 20 73 65 70 61 72 61 74 6f 72 5b 32 30 5d  ar separator[20]
29e0: 3b 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f  ;    /* Separato
29f0: 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20  r character for 
2a00: 4d 4f 44 45 5f 4c 69 73 74 20 2a 2f 0a 20 20 69  MODE_List */.  i
2a10: 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d  nt colWidth[100]
2a20: 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74  ;     /* Request
2a30: 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  ed width of each
2a40: 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20   column when in 
2a50: 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20  column mode*/.  
2a60: 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b  int actualWidth[
2a70: 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c  100];  /* Actual
2a80: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
2a90: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
2aa0: 6e 75 6c 6c 76 61 6c 75 65 5b 32 30 5d 3b 20 20  nullvalue[20];  
2ab0: 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f    /* The text to
2ac0: 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55   print when a NU
2ad0: 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
2ae0: 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  om.             
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2b00: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2b10: 20 73 74 72 75 63 74 20 70 72 65 76 69 6f 75 73   struct previous
2b20: 5f 6d 6f 64 65 5f 64 61 74 61 20 65 78 70 6c 61  _mode_data expla
2b30: 69 6e 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  inPrev;.        
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 2f 2a 20 48 6f 6c 64 73 20 74 68 65 20 6d 6f   /* Holds the mo
2b60: 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6a  de information j
2b70: 75 73 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20  ust before.     
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 2a 2a 20 2e 65 78 70 6c 61 69 6e 20      ** .explain 
2ba0: 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74  ON */.  char out
2bb0: 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41  file[FILENAME_MA
2bc0: 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  X]; /* Filename 
2bd0: 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f  for *out */.  co
2be0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 46 69 6c  nst char *zDbFil
2bf0: 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d  ename;    /* nam
2c00: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2c10: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  e file */.  cons
2c20: 74 20 63 68 61 72 20 2a 7a 56 66 73 3b 20 20 20  t char *zVfs;   
2c30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2c40: 6f 66 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  of VFS to use */
2c50: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2c60: 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72  *pStmt;   /* Cur
2c70: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69  rent statement i
2c80: 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45  f any. */.  FILE
2c90: 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20   *pLog;         
2ca0: 20 20 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20     /* Write log 
2cb0: 6f 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 7d  output here */.}
2cc0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
2cd0: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d  re the allowed m
2ce0: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
2cf0: 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30   MODE_Line     0
2d00: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
2d10: 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b  per line.  Blank
2d20: 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65   line between re
2d30: 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  cords */.#define
2d40: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31   MODE_Column   1
2d50: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
2d60: 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74  per line in neat
2d70: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66   columns */.#def
2d80: 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20  ine MODE_List   
2d90: 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f    2  /* One reco
2da0: 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68  rd per line with
2db0: 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a   a separator */.
2dc0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d  #define MODE_Sem
2dd0: 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65  i     3  /* Same
2de0: 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75   as MODE_List bu
2df0: 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20  t append ";" to 
2e00: 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65  each line */.#de
2e10: 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20  fine MODE_Html  
2e20: 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74     4  /* Generat
2e30: 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65  e an XHTML table
2e40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
2e50: 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20  _Insert   5  /* 
2e60: 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e  Generate SQL "in
2e70: 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73  sert" statements
2e80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
2e90: 5f 54 63 6c 20 20 20 20 20 20 36 20 20 2f 2a 20  _Tcl      6  /* 
2ea0: 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20  Generate ANSI-C 
2eb0: 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c  or TCL quoted el
2ec0: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
2ed0: 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20  e MODE_Csv      
2ee0: 37 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69  7  /* Quote stri
2ef0: 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65  ngs, numbers are
2f00: 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e   plain */.#defin
2f10: 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20  e MODE_Explain  
2f20: 38 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f  8  /* Like MODE_
2f30: 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e  Column, but do n
2f40: 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61  ot truncate data
2f50: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73   */..static cons
2f60: 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63  t char *modeDesc
2f70: 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22  r[] = {.  "line"
2f80: 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20  ,.  "column",.  
2f90: 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22  "list",.  "semi"
2fa0: 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69  ,.  "html",.  "i
2fb0: 6e 73 65 72 74 22 2c 0a 20 20 22 74 63 6c 22 2c  nsert",.  "tcl",
2fc0: 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70  .  "csv",.  "exp
2fd0: 6c 61 69 6e 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  lain",.};../*.**
2fe0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
2ff0: 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a  nts in an array.
3000: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79  */.#define Array
3010: 53 69 7a 65 28 58 29 20 20 28 69 6e 74 29 28 73  Size(X)  (int)(s
3020: 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28  izeof(X)/sizeof(
3030: 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  X[0]))../*.** Co
3040: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c  mpute a string l
3050: 65 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c 69  ength that is li
3060: 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20 63 61  mited to what ca
3070: 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  n be stored in.*
3080: 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20  * lower 30 bits 
3090: 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e  of a 32-bit sign
30a0: 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  ed integer..*/.s
30b0: 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e  tatic int strlen
30c0: 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  30(const char *z
30d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
30e0: 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65  *z2 = z;.  while
30f0: 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d  ( *z2 ){ z2++; }
3100: 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66 66 66  .  return 0x3fff
3110: 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20  ffff & (int)(z2 
3120: 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  - z);.}../*.** A
3130: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
3140: 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
3150: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
3160: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c  atic void shellL
3170: 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  og(void *pArg, i
3180: 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e  nt iErrCode, con
3190: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  st char *zMsg){.
31a0: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
31b0: 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72  k_data *p = (str
31c0: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
31d0: 61 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  a*)pArg;.  if( p
31e0: 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75  ->pLog==0 ) retu
31f0: 72 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 2d  rn;.  fprintf(p-
3200: 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c  >pLog, "(%d) %s\
3210: 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d  n", iErrCode, zM
3220: 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d  sg);.  fflush(p-
3230: 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pLog);.}../*.**
3240: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
3250: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65  n string as a he
3260: 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28  x-encoded blob (
3270: 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f  eg. X'1234' ).*/
3280: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
3290: 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c  put_hex_blob(FIL
32a0: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f  E *out, const vo
32b0: 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  id *pBlob, int n
32c0: 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Blob){.  int i;.
32d0: 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20    char *zBlob = 
32e0: 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20  (char *)pBlob;. 
32f0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27   fprintf(out,"X'
3300: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
3310: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 66 70  <nBlob; i++){ fp
3320: 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78 22  rintf(out,"%02x"
3330: 2c 7a 42 6c 6f 62 5b 69 5d 29 3b 20 7d 0a 20 20  ,zBlob[i]); }.  
3340: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29  fprintf(out,"'")
3350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
3360: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
3370: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
3380: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
3390: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
33a0: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ons..*/.static v
33b0: 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  oid output_quote
33c0: 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  d_string(FILE *o
33d0: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
33e0: 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  z){.  int i;.  i
33f0: 6e 74 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 0a  nt nSingle = 0;.
3400: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
3410: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
3420: 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 53 69 6e  [i]=='\'' ) nSin
3430: 67 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  gle++;.  }.  if(
3440: 20 6e 53 69 6e 67 6c 65 3d 3d 30 20 29 7b 0a 20   nSingle==0 ){. 
3450: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
3460: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
3470: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
3480: 75 74 2c 22 27 22 29 3b 0a 20 20 20 20 77 68 69  ut,"'");.    whi
3490: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
34a0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26  for(i=0; z[i] &&
34b0: 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b   z[i]!='\''; i++
34c0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d  ){}.      if( i=
34d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
34e0: 72 69 6e 74 66 28 6f 75 74 2c 22 27 27 22 29 3b  rintf(out,"''");
34f0: 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  .        z++;.  
3500: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
3510: 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  i]=='\'' ){.    
3520: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
3530: 22 25 2e 2a 73 27 27 22 2c 69 2c 7a 29 3b 0a 20  "%.*s''",i,z);. 
3540: 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b         z += i+1;
3550: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3560: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
3570: 74 2c 22 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20  t,"%s",z);.     
3580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3590: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  }.    }.    fpri
35a0: 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20  ntf(out,"'");.  
35b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  }.}../*.** Outpu
35c0: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
35d0: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 61  ng as a quoted a
35e0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f 72  ccording to C or
35f0: 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c   TCL quoting rul
3600: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
3610: 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69  id output_c_stri
3620: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
3630: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
3640: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a  unsigned int c;.
3650: 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74    fputc('"', out
3660: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  );.  while( (c =
3670: 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20   *(z++))!=0 ){. 
3680: 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29     if( c=='\\' )
3690: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
36a0: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
36b0: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
36c0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74  }else if( c=='\t
36d0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
36e0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
36f0: 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75     fputc('t', ou
3700: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
3710: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
3720: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
3730: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
3740: 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('n', out);.    
3750: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72  }else if( c=='\r
3760: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
3770: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
3780: 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75     fputc('r', ou
3790: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
37a0: 28 20 21 69 73 70 72 69 6e 74 28 63 29 20 29 7b  ( !isprint(c) ){
37b0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
37c0: 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26  ut, "\\%03o", c&
37d0: 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0xff);.    }else
37e0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
37f0: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   out);.    }.  }
3800: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
3810: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  t);.}../*.** Out
3820: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
3830: 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63  ring with charac
3840: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70  ters that are sp
3850: 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c  ecial to.** HTML
3860: 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61   escaped..*/.sta
3870: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
3880: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45  html_string(FILE
3890: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
38a0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
38b0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
38c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b     for(i=0;   z[
38d0: 69 5d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  i] .            
38e0: 26 26 20 7a 5b 69 5d 21 3d 27 3c 27 20 0a 20 20  && z[i]!='<' .  
38f0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
3900: 5d 21 3d 27 26 27 20 0a 20 20 20 20 20 20 20 20  ]!='&' .        
3910: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27      && z[i]!='>'
3920: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
3930: 20 7a 5b 69 5d 21 3d 27 5c 22 27 20 0a 20 20 20   z[i]!='\"' .   
3940: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
3950: 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  !='\'';.        
3960: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
3970: 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  >0 ){.      fpri
3980: 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69  ntf(out,"%.*s",i
3990: 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,z);.    }.    i
39a0: 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a  f( z[i]=='<' ){.
39b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
39c0: 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&lt;");.    }
39d0: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
39e0: 26 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  &' ){.      fpri
39f0: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
3a00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3a10: 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20  z[i]=='>' ){.   
3a20: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
3a30: 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  &gt;");.    }els
3a40: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27  e if( z[i]=='\"'
3a50: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3a60: 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b  f(out,"&quot;");
3a70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
3a80: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  [i]=='\'' ){.   
3a90: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
3aa0: 26 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  &#39;");.    }el
3ab0: 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
3ac0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20  .    }.    z += 
3ad0: 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  i + 1;.  }.}../*
3ae0: 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63  .** If a field c
3af0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72  ontains any char
3b00: 61 63 74 65 72 20 69 64 65 6e 74 69 66 69 65 64  acter identified
3b10: 20 62 79 20 61 20 31 20 69 6e 20 74 68 65 20 66   by a 1 in the f
3b20: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61  ollowing.** arra
3b30: 79 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69  y, then the stri
3b40: 6e 67 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65  ng must be quote
3b50: 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74  d for CSV..*/.st
3b60: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3b70: 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d  needCsvQuote[] =
3b80: 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c   {.  1, 1, 1, 1,
3b90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
3ba0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3bb0: 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31   1, 1,   .  1, 1
3bc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3bd0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
3be0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
3bf0: 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30  .  1, 0, 1, 0, 0
3c00: 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20  , 0, 0, 1,   0, 
3c10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3c20: 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c  , 0, .  0, 0, 0,
3c30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3c40: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
3c50: 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20   0, 0, 0, .  0, 
3c60: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3c70: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
3c80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  0, 0, 0, 0, 0, .
3c90: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
3ca0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
3cb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3cc0: 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20   0, .  0, 0, 0, 
3cd0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
3ce0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3cf0: 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30  0, 0, 0, .  0, 0
3d00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3d10: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
3d20: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 0a 20  , 0, 0, 0, 1, . 
3d30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3d40: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
3d50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3d60: 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c  1,   .  1, 1, 1,
3d70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3d80: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
3d90: 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31   1, 1, 1,   .  1
3da0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3db0: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
3dc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3dd0: 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31     .  1, 1, 1, 1
3de0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
3df0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3e00: 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20  , 1, 1,   .  1, 
3e10: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
3e20: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
3e30: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
3e40: 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   .  1, 1, 1, 1, 
3e50: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
3e60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3e70: 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c  1, 1,   .  1, 1,
3e80: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
3e90: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
3ea0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
3eb0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
3ec0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
3ed0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3ee0: 20 31 2c 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   1,   .};../*.**
3ef0: 20 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65   Output a single
3f00: 20 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41   term of CSV.  A
3f10: 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 73 65 70 61  ctually, p->sepa
3f20: 72 61 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  rator is used fo
3f30: 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74  r.** the separat
3f40: 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  or, which may or
3f50: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f   may not be a co
3f60: 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 76 61 6c  mma.  p->nullval
3f70: 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c  ue is.** the nul
3f80: 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67  l value.  String
3f90: 73 20 61 72 65 20 71 75 6f 74 65 64 20 75 73 69  s are quoted usi
3fa0: 6e 67 20 41 4e 53 49 2d 43 20 72 75 6c 65 73 2e  ng ANSI-C rules.
3fb0: 20 20 4e 75 6d 62 65 72 73 0a 2a 2a 20 61 70 70    Numbers.** app
3fc0: 65 61 72 20 6f 75 74 73 69 64 65 20 6f 66 20 71  ear outside of q
3fd0: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
3fe0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76   void output_csv
3ff0: 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  (struct callback
4000: 5f 64 61 74 61 20 2a 70 2c 20 63 6f 6e 73 74 20  _data *p, const 
4010: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65  char *z, int bSe
4020: 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20  p){.  FILE *out 
4030: 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20  = p->out;.  if( 
4040: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  z==0 ){.    fpri
4050: 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e  ntf(out,"%s",p->
4060: 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 7d 65  nullvalue);.  }e
4070: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
4080: 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d 20 73      int nSep = s
4090: 74 72 6c 65 6e 33 30 28 70 2d 3e 73 65 70 61 72  trlen30(p->separ
40a0: 61 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  ator);.    for(i
40b0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
40c0: 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73        if( needCs
40d0: 76 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65  vQuote[((unsigne
40e0: 64 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 20 0a  d char*)z)[i]] .
40f0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69           || (z[i
4100: 5d 3d 3d 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b  ]==p->separator[
4110: 30 5d 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  0] && .         
4120: 20 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20      (nSep==1 || 
4130: 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 73 65 70  memcmp(z, p->sep
4140: 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30  arator, nSep)==0
4150: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  )) ){.        i 
4160: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
4170: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4180: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29  }.    if( i==0 )
4190: 7b 0a 20 20 20 20 20 20 70 75 74 63 28 27 22 27  {.      putc('"'
41a0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 6f  , out);.      fo
41b0: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
41c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
41d0: 5b 69 5d 3d 3d 27 22 27 20 29 20 70 75 74 63 28  [i]=='"' ) putc(
41e0: 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  '"', out);.     
41f0: 20 20 20 70 75 74 63 28 7a 5b 69 5d 2c 20 6f 75     putc(z[i], ou
4200: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
4210: 20 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29    putc('"', out)
4220: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4230: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
4240: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  "%s", z);.    }.
4250: 20 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29    }.  if( bSep )
4260: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  {.    fprintf(p-
4270: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73  >out, "%s", p->s
4280: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d  eparator);.  }.}
4290: 0a 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a  ..#ifdef SIGINT.
42a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
42b0: 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65  ne runs when the
42c0: 20 75 73 65 72 20 70 72 65 73 73 65 73 20 43 74   user presses Ct
42d0: 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rl-C.*/.static v
42e0: 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61  oid interrupt_ha
42f0: 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65  ndler(int NotUse
4300: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
4310: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
4320: 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  .  seenInterrupt
4330: 20 3d 20 31 3b 0a 20 20 69 66 28 20 64 62 20 29   = 1;.  if( db )
4340: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
4350: 70 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  pt(db);.}.#endif
4360: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
4370: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
4380: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 68  tine that the sh
4390: 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ell.** invokes f
43a0: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
43b0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
43c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
43d0: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ll_callback(void
43e0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
43f0: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
4400: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 69 6e  char **azCol, in
4410: 74 20 2a 61 69 54 79 70 65 29 7b 0a 20 20 69 6e  t *aiType){.  in
4420: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 61  t i;.  struct ca
4430: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d  llback_data *p =
4440: 20 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63   (struct callbac
4450: 6b 5f 64 61 74 61 2a 29 70 41 72 67 3b 0a 0a 20  k_data*)pArg;.. 
4460: 20 73 77 69 74 63 68 28 20 70 2d 3e 6d 6f 64 65   switch( p->mode
4470: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44   ){.    case MOD
4480: 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  E_Line: {.      
4490: 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20  int w = 5;.     
44a0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
44b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
44c0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
44d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
44e0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  len = strlen30(a
44f0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
4500: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
4510: 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20    if( len>w ) w 
4520: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  = len;.      }. 
4530: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
4540: 2b 3e 30 20 29 20 66 70 72 69 6e 74 66 28 70 2d  +>0 ) fprintf(p-
4550: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
4560: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
4570: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
4580: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
4590: 22 25 2a 73 20 3d 20 25 73 5c 6e 22 2c 20 77 2c  "%*s = %s\n", w,
45a0: 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20   azCol[i],.     
45b0: 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
45c0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
45d0: 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a   p->nullvalue);.
45e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
45f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4600: 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  ase MODE_Explain
4610: 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  :.    case MODE_
4620: 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20  Column: {.      
4630: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
4640: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
4650: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
4660: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
4670: 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  w, n;.          
4680: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
4690: 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a  p->colWidth) ){.
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
46b0: 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a  p->colWidth[i];.
46c0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
46d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
46e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
46f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
4700: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4710: 20 20 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    w = strlen30(a
4720: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
4730: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
4740: 20 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29        if( w<10 )
4750: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
4760: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33       n = strlen3
4770: 30 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  0(azArg && azArg
4780: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
4790: 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a   p->nullvalue);.
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
47b0: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
47c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
47d0: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
47e0: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
47f0: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
4800: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
4810: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
4820: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
4830: 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  f( p->showHeader
4840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4850: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
4860: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 61 7a  %-*.*s%s",w,w,az
4870: 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d  Col[i], i==nArg-
4880: 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b  1 ? "\n": "  ");
4890: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
48a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
48b0: 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  f( p->showHeader
48c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
48d0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
48e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
48f0: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
4900: 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53      if( i<ArrayS
4910: 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64  ize(p->actualWid
4920: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
4930: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74        w = p->act
4940: 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  ualWidth[i];.   
4950: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
4970: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
4980: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4990: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
49a0: 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 22  "%-*.*s%s",w,w,"
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20  ---".           
49e0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d          "-------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ---",.          
4a30: 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72            i==nAr
4a40: 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22  g-1 ? "\n": "  "
4a50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
4a60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4a70: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
4a80: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
4a90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
4aa0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
4ab0: 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20    int w;.       
4ac0: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
4ad0: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
4ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77   ){.           w
4af0: 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74   = p->actualWidt
4b00: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  h[i];.        }e
4b10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
4b20: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
4b30: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
4b40: 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  >mode==MODE_Expl
4b50: 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  ain && azArg[i] 
4b60: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 73  && .           s
4b70: 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d  trlen30(azArg[i]
4b80: 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>w ){.         
4b90: 20 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   w = strlen30(az
4ba0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
4bb0: 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   }.        fprin
4bc0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a  tf(p->out,"%-*.*
4bd0: 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20  s%s",w,w,.      
4be0: 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f        azArg[i] ?
4bf0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
4c00: 75 6c 6c 76 61 6c 75 65 2c 20 69 3d 3d 6e 41 72  ullvalue, i==nAr
4c10: 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22  g-1 ? "\n": "  "
4c20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4c40: 20 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69    case MODE_Semi
4c50: 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  :.    case MODE_
4c60: 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  List: {.      if
4c70: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
4c80: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
4c90: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
4ca0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
4cb0: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
4cc0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22  tf(p->out,"%s%s"
4cd0: 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41  ,azCol[i], i==nA
4ce0: 72 67 2d 31 20 3f 20 22 5c 6e 22 20 3a 20 70 2d  rg-1 ? "\n" : p-
4cf0: 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  >separator);.   
4d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4d10: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
4d20: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
4d40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4d50: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
4d60: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
4d70: 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75  z==0 ) z = p->nu
4d80: 6c 6c 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  llvalue;.       
4d90: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
4da0: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
4db0: 20 20 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20     if( i<nArg-1 
4dc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
4dd0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
4de0: 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  ", p->separator)
4df0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
4e00: 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
4e10: 45 5f 53 65 6d 69 20 29 7b 0a 20 20 20 20 20 20  E_Semi ){.      
4e20: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
4e30: 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut, ";\n");.    
4e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4e50: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
4e60: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
4e70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4e80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e90: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48  .    case MODE_H
4ea0: 74 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  tml: {.      if(
4eb0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
4ec0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
4ed0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
4ee0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
4ef0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
4f00: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
4f10: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
4f20: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29  f(p->out,"<TH>")
4f30: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
4f40: 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70  ut_html_string(p
4f50: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
4f60: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
4f70: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48  ntf(p->out,"</TH
4f80: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  >\n");.        }
4f90: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
4fa0: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e  (p->out,"</TR>\n
4fb0: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
4fc0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
4fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 70   break;.      fp
4fe0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
4ff0: 52 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  R>");.      for(
5000: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
5010: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
5020: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22  tf(p->out,"<TD>"
5030: 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  );.        outpu
5040: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d  t_html_string(p-
5050: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
5060: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
5070: 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullvalue);.     
5080: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5090: 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20  t,"</TD>\n");.  
50a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
50b0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
50c0: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  >\n");.      bre
50d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
50e0: 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20  se MODE_Tcl: {. 
50f0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
5100: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
5110: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
5120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
5130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5140: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
5150: 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69  g(p->out,azCol[i
5160: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
5170: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  ");.          fp
5180: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
5190: 73 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  s", p->separator
51a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
51b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
51c0: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
51d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
51e0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
51f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5200: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5210: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
5220: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
5230: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
5240: 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b  : p->nullvalue);
5250: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
5260: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
5270: 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  ->separator);.  
5280: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
5290: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
52a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
52b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
52c0: 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20  DE_Csv: {.      
52d0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
52e0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
52f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
5300: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
5310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
5320: 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c  put_csv(p, azCol
5330: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
5340: 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a   "", i<nArg-1);.
5350: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5360: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5370: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ,"\n");.      }.
5380: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
5390: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
53a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
53b0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
53c0: 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61   output_csv(p, a
53d0: 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d  zArg[i], i<nArg-
53e0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
53f0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5400: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ,"\n");.      br
5410: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
5420: 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a  ase MODE_Insert:
5430: 20 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b   {.      p->cnt+
5440: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  +;.      if( azA
5450: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
5460: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5470: 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f  out,"INSERT INTO
5480: 20 25 73 20 56 41 4c 55 45 53 28 22 2c 70 2d 3e   %s VALUES(",p->
5490: 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20  zDestTable);.   
54a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
54b0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
54c0: 20 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 69    char *zSep = i
54d0: 3e 30 20 3f 20 22 2c 22 3a 20 22 22 3b 0a 20 20  >0 ? ",": "";.  
54e0: 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67        if( (azArg
54f0: 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79  [i]==0) || (aiTy
5500: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
5510: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
5520: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
5530: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 4e 55 4c  tf(p->out,"%sNUL
5540: 4c 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20  L",zSep);.      
5550: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
5560: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
5570: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
5580: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
5590: 65 70 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28  ep[0] ) fprintf(
55a0: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65 70  p->out,"%s",zSep
55b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
55c0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
55d0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
55e0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
55f0: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
5600: 20 28 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c   (aiType[i]==SQL
5610: 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  ITE_INTEGER || a
5620: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
5630: 5f 46 4c 4f 41 54 29 20 29 7b 0a 20 20 20 20 20  _FLOAT) ){.     
5640: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5650: 6f 75 74 2c 22 25 73 25 73 22 2c 7a 53 65 70 2c  out,"%s%s",zSep,
5660: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
5670: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
5680: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
5690: 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  ]==SQLITE_BLOB &
56a0: 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  & p->pStmt ){.  
56b0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
56c0: 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69  id *pBlob = sqli
56d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
56e0: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
56f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
5700: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
5710: 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d  mn_bytes(p->pStm
5720: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
5730: 20 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66   if( zSep[0] ) f
5740: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5750: 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20  s",zSep);.      
5760: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
5770: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
5780: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
5790: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
57a0: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
57b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
57c0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
57d0: 25 73 25 73 22 2c 7a 53 65 70 2c 20 61 7a 41 72  %s%s",zSep, azAr
57e0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
57f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5800: 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70  if( zSep[0] ) fp
5810: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
5820: 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20  ",zSep);.       
5830: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
5840: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
5850: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
5860: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5870: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5880: 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  t,");\n");.     
5890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
58a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
58b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
58c0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
58d0: 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c  ine that the SQL
58e0: 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69  ite library.** i
58f0: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
5900: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
5910: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
5920: 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f   int callback(vo
5930: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
5940: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
5950: 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  , char **azCol){
5960: 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64  .  /* since we d
5970: 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69  on't have type i
5980: 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68  nfo, call the sh
5990: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74  ell_callback wit
59a0: 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  h a NULL value *
59b0: 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c  /.  return shell
59c0: 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
59d0: 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43  nArg, azArg, azC
59e0: 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a  ol, NULL);.}../*
59f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
5a00: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69  ination table fi
5a10: 65 6c 64 20 6f 66 20 74 68 65 20 63 61 6c 6c 62  eld of the callb
5a20: 61 63 6b 5f 64 61 74 61 20 73 74 72 75 63 74 75  ack_data structu
5a30: 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  re to.** the nam
5a40: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67  e of the table g
5a50: 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e  iven.  Escape an
5a60: 79 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  y quote characte
5a70: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62  rs in the.** tab
5a80: 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  le name..*/.stat
5a90: 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c  ic void set_tabl
5aa0: 65 5f 6e 61 6d 65 28 73 74 72 75 63 74 20 63 61  e_name(struct ca
5ab0: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20  llback_data *p, 
5ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5ad0: 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  e){.  int i, n;.
5ae0: 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 3b    int needQuote;
5af0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69  .  char *z;..  i
5b00: 66 28 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  f( p->zDestTable
5b10: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e   ){.    free(p->
5b20: 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20  zDestTable);.   
5b30: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
5b40: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e   0;.  }.  if( zN
5b50: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
5b60: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 21  .  needQuote = !
5b70: 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65  isalpha((unsigne
5b80: 64 20 63 68 61 72 29 2a 7a 4e 61 6d 65 29 20 26  d char)*zName) &
5b90: 26 20 2a 7a 4e 61 6d 65 21 3d 27 5f 27 3b 0a 20  & *zName!='_';. 
5ba0: 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 4e 61 6d   for(i=n=0; zNam
5bb0: 65 5b 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b  e[i]; i++, n++){
5bc0: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75  .    if( !isalnu
5bd0: 6d 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  m((unsigned char
5be0: 29 7a 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e  )zName[i]) && zN
5bf0: 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 7b 0a 20  ame[i]!='_' ){. 
5c00: 20 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d       needQuote =
5c10: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e   1;.      if( zN
5c20: 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e  ame[i]=='\'' ) n
5c30: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
5c40: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
5c50: 6e 20 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d  n += 2;.  z = p-
5c60: 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61  >zDestTable = ma
5c70: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69  lloc( n+1 );.  i
5c80: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f( z==0 ){.    f
5c90: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
5ca0: 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
5cb0: 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
5cc0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  t(1);.  }.  n = 
5cd0: 30 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  0;.  if( needQuo
5ce0: 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c  te ) z[n++] = '\
5cf0: 27 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a  '';.  for(i=0; z
5d00: 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  Name[i]; i++){. 
5d10: 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d     z[n++] = zNam
5d20: 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e  e[i];.    if( zN
5d30: 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 7a  ame[i]=='\'' ) z
5d40: 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [n++] = '\'';.  
5d50: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
5d60: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27  e ) z[n++] = '\'
5d70: 27 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d  ';.  z[n] = 0;.}
5d80: 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74 68  ../* zIn is eith
5d90: 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  er a pointer to 
5da0: 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65  a NULL-terminate
5db0: 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f  d string in memo
5dc0: 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  ry obtained.** f
5dd0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72  rom malloc(), or
5de0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e   a NULL pointer.
5df0: 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e   The string poin
5e00: 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70 65 6e  ted to by zAppen
5e10: 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 74 6f  d is.** added to
5e20: 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20 72 65   zIn, and the re
5e30: 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 69 6e  sult returned in
5e40: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5e50: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
5e60: 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20 77 61  ** zIn, if it wa
5e70: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20 66  s not NULL, is f
5e80: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  reed..**.** If t
5e90: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
5ea0: 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f 74  t, quote, is not
5eb0: 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74 20 69   '\0', then it i
5ec0: 73 20 75 73 65 64 20 61 73 20 61 20 0a 2a 2a 20  s used as a .** 
5ed0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
5ee0: 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a  for zAppend..*/.
5ef0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 70 70  static char *app
5f00: 65 6e 64 54 65 78 74 28 63 68 61 72 20 2a 7a 49  endText(char *zI
5f10: 6e 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  n, char const *z
5f20: 41 70 70 65 6e 64 2c 20 63 68 61 72 20 71 75 6f  Append, char quo
5f30: 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  te){.  int len;.
5f40: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
5f50: 41 70 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e 33  Append = strlen3
5f60: 30 28 7a 41 70 70 65 6e 64 29 3b 0a 20 20 69 6e  0(zAppend);.  in
5f70: 74 20 6e 49 6e 20 3d 20 28 7a 49 6e 3f 73 74 72  t nIn = (zIn?str
5f80: 6c 65 6e 33 30 28 7a 49 6e 29 3a 30 29 3b 0a 0a  len30(zIn):0);..
5f90: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
5fa0: 6e 49 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f  nIn+1;.  if( quo
5fb0: 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d  te ){.    len +=
5fc0: 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   2;.    for(i=0;
5fd0: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
5fe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70  {.      if( zApp
5ff0: 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20  end[i]==quote ) 
6000: 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  len++;.    }.  }
6010: 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 68 61 72 20  ..  zIn = (char 
6020: 2a 29 72 65 61 6c 6c 6f 63 28 7a 49 6e 2c 20 6c  *)realloc(zIn, l
6030: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 49 6e 20  en);.  if( !zIn 
6040: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6050: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f 74  .  }..  if( quot
6060: 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  e ){.    char *z
6070: 43 73 72 20 3d 20 26 7a 49 6e 5b 6e 49 6e 5d 3b  Csr = &zIn[nIn];
6080: 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71  .    *zCsr++ = q
6090: 75 6f 74 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  uote;.    for(i=
60a0: 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b  0; i<nAppend; i+
60b0: 2b 29 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72 2b  +){.      *zCsr+
60c0: 2b 20 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a  + = zAppend[i];.
60d0: 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e        if( zAppen
60e0: 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a 7a  d[i]==quote ) *z
60f0: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
6100: 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b 2b     }.    *zCsr++
6110: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 2a 7a   = quote;.    *z
6120: 43 73 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20  Csr++ = '\0';.  
6130: 20 20 61 73 73 65 72 74 28 20 28 7a 43 73 72 2d    assert( (zCsr-
6140: 7a 49 6e 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 7d  zIn)==len );.  }
6150: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79  else{.    memcpy
6160: 28 26 7a 49 6e 5b 6e 49 6e 5d 2c 20 7a 41 70 70  (&zIn[nIn], zApp
6170: 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20  end, nAppend);. 
6180: 20 20 20 7a 49 6e 5b 6c 65 6e 2d 31 5d 20 3d 20     zIn[len-1] = 
6190: 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  '\0';.  }..  ret
61a0: 75 72 6e 20 7a 49 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn zIn;.}.../*.
61b0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
61c0: 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ry statement tha
61d0: 74 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 72  t has a single r
61e0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 50  esult column.  P
61f0: 72 69 6e 74 0a 2a 2a 20 74 68 61 74 20 72 65 73  rint.** that res
6200: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6f 6e 20 61 20  ult column on a 
6210: 6c 69 6e 65 20 62 79 20 69 74 73 65 6c 66 20 77  line by itself w
6220: 69 74 68 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20  ith a semicolon 
6230: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
6240: 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 2c 20  * This is used, 
6250: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
6260: 73 68 6f 77 20 74 68 65 20 73 63 68 65 6d 61 20  show the schema 
6270: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
6280: 62 79 0a 2a 2a 20 71 75 65 72 79 69 6e 67 20 74  by.** querying t
6290: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
62a0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
62b0: 63 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f  c int run_table_
62c0: 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 46 49  dump_query(.  FI
62d0: 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20  LE *out,        
62e0: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 6f 75        /* Send ou
62f0: 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 73  tput here */.  s
6300: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
6310: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6320: 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  se to query */. 
6330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
6340: 6c 65 63 74 2c 20 20 20 20 2f 2a 20 53 45 4c 45  lect,    /* SELE
6350: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
6360: 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20  extract content 
6370: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6380: 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 2f 2a 20  *zFirstRow   /* 
6390: 50 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69 72  Print before fir
63a0: 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e  st row, if not N
63b0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
63c0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63  te3_stmt *pSelec
63d0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  t;.  int rc;.  r
63e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
63f0: 61 72 65 28 64 62 2c 20 7a 53 65 6c 65 63 74 2c  are(db, zSelect,
6400: 20 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30   -1, &pSelect, 0
6410: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6420: 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65  ITE_OK || !pSele
6430: 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ct ){.    return
6440: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
6450: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
6460: 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  lect);.  while( 
6470: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
6480: 7b 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74  {.    if( zFirst
6490: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 66 70 72  Row ){.      fpr
64a0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
64b0: 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20  zFirstRow);.    
64c0: 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b    zFirstRow = 0;
64d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
64e0: 74 66 28 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  tf(out, "%s;\n",
64f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
6500: 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29  text(pSelect, 0)
6510: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
6520: 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
6530: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6540: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6550: 28 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 2f 2a  (pSelect);.}../*
6560: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
6570: 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20  ce and save off 
6580: 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74  current error st
6590: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
65a0: 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d  char *save_err_m
65b0: 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sg(.  sqlite3 *d
65c0: 62 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b            /* 
65d0: 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72  Database to quer
65e0: 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  y */.){.  int nE
65f0: 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e  rrMsg = 1+strlen
6600: 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  30(sqlite3_errms
6610: 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a  g(db));.  char *
6620: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
6630: 33 5f 6d 61 6c 6c 6f 63 28 6e 45 72 72 4d 73 67  3_malloc(nErrMsg
6640: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
6650: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
6660: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f  ErrMsg, sqlite3_
6670: 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72  errmsg(db), nErr
6680: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Msg);.  }.  retu
6690: 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f  rn zErrMsg;.}../
66a0: 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d  *.** Display mem
66b0: 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74  ory stats..*/.st
66c0: 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79  atic int display
66d0: 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65  _stats(.  sqlite
66e0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
66f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
6700: 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
6710: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
6720: 64 61 74 61 20 2a 70 41 72 67 2c 20 2f 2a 20 50  data *pArg, /* P
6730: 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74  ointer to struct
6740: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a   callback_data *
6750: 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20  /.  int bReset  
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
6780: 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b   the stats */.){
6790: 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
67a0: 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20 20 69 66  nt iHiwtr;..  if
67b0: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
67c0: 6f 75 74 20 29 7b 0a 20 20 20 20 0a 20 20 20 20  out ){.    .    
67d0: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
67e0: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
67f0: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
6800: 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
6810: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
6820: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66  , bReset);.    f
6830: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
6840: 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a 20  , "Memory Used: 
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6860: 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20          %d (max 
6870: 25 64 29 20 62 79 74 65 73 5c 6e 22 2c 20 69 43  %d) bytes\n", iC
6880: 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  ur, iHiwtr);.   
6890: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
68a0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
68b0: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
68c0: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
68d0: 4e 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  NT, &iCur, &iHiw
68e0: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
68f0: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
6900: 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f  ut, "Number of O
6910: 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63  utstanding Alloc
6920: 61 74 69 6f 6e 73 3a 20 20 20 25 64 20 28 6d 61  ations:   %d (ma
6930: 78 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 20  x %d)\n", iCur, 
6940: 69 48 69 77 74 72 29 3b 0a 2f 2a 0a 2a 2a 20 4e  iHiwtr);./*.** N
6950: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  ot currently use
6960: 64 20 62 79 20 74 68 65 20 43 4c 49 2e 0a 2a 2a  d by the CLI..**
6970: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
6980: 72 20 3d 20 2d 31 3b 0a 2a 2a 20 20 20 20 73 71  r = -1;.**    sq
6990: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
69a0: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
69b0: 41 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75 72  ACHE_USED, &iCur
69c0: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
69d0: 74 29 3b 0a 2a 2a 20 20 20 20 66 70 72 69 6e 74  t);.**    fprint
69e0: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75  f(pArg->out, "Nu
69f0: 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50  mber of Pcache P
6a00: 61 67 65 73 20 55 73 65 64 3a 20 20 20 20 20 20  ages Used:      
6a10: 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 20 70     %d (max %d) p
6a20: 61 67 65 73 5c 6e 22 2c 20 69 43 75 72 2c 20 69  ages\n", iCur, i
6a30: 48 69 77 74 72 29 3b 0a 2a 2f 0a 20 20 20 20 69  Hiwtr);.*/.    i
6a40: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
6a50: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  1;.    sqlite3_s
6a60: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
6a70: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
6a80: 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26  ERFLOW, &iCur, &
6a90: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
6aa0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
6ab0: 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20  g->out, "Number 
6ac0: 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c  of Pcache Overfl
6ad0: 6f 77 20 42 79 74 65 73 3a 20 20 20 20 20 25 64  ow Bytes:     %d
6ae0: 20 28 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c   (max %d) bytes\
6af0: 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  n", iCur, iHiwtr
6b00: 29 3b 0a 2f 2a 0a 2a 2a 20 4e 6f 74 20 63 75 72  );./*.** Not cur
6b10: 72 65 6e 74 6c 79 20 75 73 65 64 20 62 79 20 74  rently used by t
6b20: 68 65 20 43 4c 49 2e 0a 2a 2a 20 20 20 20 69 48  he CLI..**    iH
6b30: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
6b40: 3b 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.**    sqlite3_
6b50: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
6b60: 41 54 55 53 5f 53 43 52 41 54 43 48 5f 55 53 45  ATUS_SCRATCH_USE
6b70: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
6b80: 72 2c 20 62 52 65 73 65 74 29 3b 0a 2a 2a 20 20  r, bReset);.**  
6b90: 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e    fprintf(pArg->
6ba0: 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  out, "Number of 
6bb0: 53 63 72 61 74 63 68 20 41 6c 6c 6f 63 61 74 69  Scratch Allocati
6bc0: 6f 6e 73 20 55 73 65 64 3a 20 20 25 64 20 28 6d  ons Used:  %d (m
6bd0: 61 78 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c  ax %d)\n", iCur,
6be0: 20 69 48 69 77 74 72 29 3b 0a 2a 2f 0a 20 20 20   iHiwtr);.*/.   
6bf0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
6c00: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
6c10: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
6c20: 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f 4f 56  TATUS_SCRATCH_OV
6c30: 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26  ERFLOW, &iCur, &
6c40: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
6c50: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
6c60: 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20  g->out, "Number 
6c70: 6f 66 20 53 63 72 61 74 63 68 20 4f 76 65 72 66  of Scratch Overf
6c80: 6c 6f 77 20 42 79 74 65 73 3a 20 20 20 20 25 64  low Bytes:    %d
6c90: 20 28 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c   (max %d) bytes\
6ca0: 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  n", iCur, iHiwtr
6cb0: 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
6cc0: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
6cd0: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51  qlite3_status(SQ
6ce0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
6cf0: 4f 43 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20  OC_SIZE, &iCur, 
6d00: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
6d10: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41  ;.    fprintf(pA
6d20: 72 67 2d 3e 6f 75 74 2c 20 22 4c 61 72 67 65 73  rg->out, "Larges
6d30: 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20  t Allocation:   
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
6d50: 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 48 69 77  d bytes\n", iHiw
6d60: 74 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  tr);.    iHiwtr 
6d70: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
6d80: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28   sqlite3_status(
6d90: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
6da0: 47 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 26 69  GECACHE_SIZE, &i
6db0: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
6dc0: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
6dd0: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
6de0: 61 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c  argest Pcache Al
6df0: 6c 6f 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20  location:       
6e00: 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
6e10: 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 69 48   iHiwtr);.    iH
6e20: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
6e30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
6e40: 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54  atus(SQLITE_STAT
6e50: 55 53 5f 53 43 52 41 54 43 48 5f 53 49 5a 45 2c  US_SCRATCH_SIZE,
6e60: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
6e70: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70   bReset);.    fp
6e80: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
6e90: 20 22 4c 61 72 67 65 73 74 20 53 63 72 61 74 63   "Largest Scratc
6ea0: 68 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20  h Allocation:   
6eb0: 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
6ec0: 6e 22 2c 20 69 48 69 77 74 72 29 3b 0a 23 69 66  n", iHiwtr);.#if
6ed0: 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54  def YYTRACKMAXST
6ee0: 41 43 4b 44 45 50 54 48 0a 20 20 20 20 69 48 69  ACKDEPTH.    iHi
6ef0: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
6f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61  .    sqlite3_sta
6f10: 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55  tus(SQLITE_STATU
6f20: 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20  S_PARSER_STACK, 
6f30: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
6f40: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
6f50: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
6f60: 22 44 65 65 70 65 73 74 20 50 61 72 73 65 72 20  "Deepest Parser 
6f70: 53 74 61 63 6b 3a 20 20 20 20 20 20 20 20 20 20  Stack:          
6f80: 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64        %d (max %d
6f90: 29 5c 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77  )\n", iCur, iHiw
6fa0: 74 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  tr);.#endif.  }.
6fb0: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
6fc0: 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 29  Arg->out && db )
6fd0: 7b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  {.    iHiwtr = i
6fe0: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
6ff0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
7000: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
7010: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53  TUS_LOOKASIDE_US
7020: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
7030: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
7040: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
7050: 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53  ut, "Lookaside S
7060: 6c 6f 74 73 20 55 73 65 64 3a 20 20 20 20 20 20  lots Used:      
7070: 20 20 20 20 20 20 20 20 20 20 25 64 20 28 6d 61            %d (ma
7080: 78 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 20  x %d)\n", iCur, 
7090: 69 48 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c  iHiwtr);.    sql
70a0: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
70b0: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
70c0: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54  US_LOOKASIDE_HIT
70d0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
70e0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66  , bReset);.    f
70f0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
7100: 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f  , "Successful lo
7110: 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74 73  okaside attempts
7120: 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69  :       %d\n", i
7130: 48 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69  Hiwtr);.    sqli
7140: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
7150: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
7160: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
7170: 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20 26 69  _SIZE, &iCur, &i
7180: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
7190: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
71a0: 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64  ->out, "Lookasid
71b0: 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74  e failures due t
71c0: 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c  o size:      %d\
71d0: 6e 22 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  n", iHiwtr);.   
71e0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
71f0: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
7200: 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
7210: 5f 4d 49 53 53 5f 46 55 4c 4c 2c 20 26 69 43 75  _MISS_FULL, &iCu
7220: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
7230: 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  et);.    fprintf
7240: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
7250: 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
7260: 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20  due to OOM:     
7270: 20 20 25 64 5c 6e 22 2c 20 69 48 69 77 74 72 29    %d\n", iHiwtr)
7280: 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
7290: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
72a0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
72b0: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
72c0: 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20  TUS_CACHE_USED, 
72d0: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
72e0: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
72f0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
7300: 22 50 61 67 65 72 20 48 65 61 70 20 55 73 61 67  "Pager Heap Usag
7310: 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
7320: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
7330: 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 20 20 69  ", iCur); .    i
7340: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
7350: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
7360: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
7370: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48  ITE_DBSTATUS_SCH
7380: 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  EMA_USED, &iCur,
7390: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
73a0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
73b0: 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d  Arg->out, "Schem
73c0: 61 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20  a Heap Usage:   
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75  %d bytes\n", iCu
73f0: 72 29 3b 20 0a 20 20 20 20 69 48 69 77 74 72 20  r); .    iHiwtr 
7400: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
7410: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
7420: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
7430: 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44  STATUS_STMT_USED
7440: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
7450: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66  , bReset);.    f
7460: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
7470: 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61  , "Statement Hea
7480: 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67  p/Lookaside Usag
7490: 65 3a 20 20 20 20 20 20 25 64 20 62 79 74 65 73  e:      %d bytes
74a0: 5c 6e 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 7d  \n", iCur); .  }
74b0: 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ..  if( pArg && 
74c0: 70 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20  pArg->out && db 
74d0: 26 26 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29  && pArg->pStmt )
74e0: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  {.    iCur = sql
74f0: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
7500: 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
7510: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
7520: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 20 62  FULLSCAN_STEP, b
7530: 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69  Reset);.    fpri
7540: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
7550: 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a 20  Fullscan Steps: 
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
7580: 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
7590: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
75a0: 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
75b0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
75c0: 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b 0a  _SORT, bReset);.
75d0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
75e0: 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70 65  ->out, "Sort Ope
75f0: 72 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20  rations:        
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
7610: 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
7620: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
7630: 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
7640: 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
7650: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
7660: 45 58 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  EX, bReset);.   
7670: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
7680: 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49  ut, "Autoindex I
7690: 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20  nserts:         
76a0: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
76b0: 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 72   iCur);.  }..  r
76c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
76d0: 2a 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74  * Execute a stat
76e0: 65 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20  ement or set of 
76f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69  statements.  Pri
7700: 6e 74 20 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c  nt .** any resul
7710: 74 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64  t rows/columns d
7720: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
7730: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 0a 2a 2a  current mode .**
7740: 20 73 65 74 20 76 69 61 20 74 68 65 20 73 75 70   set via the sup
7750: 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a  plied callback..
7760: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 76 65  **.** This is ve
7770: 72 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51  ry similar to SQ
7780: 4c 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e 20  Lite's built-in 
7790: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 0a  sqlite3_exec() .
77a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78 63 65  ** function exce
77b0: 70 74 20 69 74 20 74 61 6b 65 73 20 61 20 73 6c  pt it takes a sl
77c0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
77d0: 20 63 61 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 6e   callback .** an
77e0: 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61 20  d callback data 
77f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
7800: 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65 78  tic int shell_ex
7810: 65 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ec(.  sqlite3 *d
7820: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7840: 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74    /* An open dat
7850: 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
7860: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7880: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f         /* SQL to
7890: 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f   be evaluated */
78a0: 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
78b0: 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
78c0: 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a  ar**,char**,int*
78d0: 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  ),   /* Callback
78e0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 6e             /* (n
7920: 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  ot the same as s
7930: 71 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a  qlite3_exec) */.
7940: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
7950: 6b 5f 64 61 74 61 20 2a 70 41 72 67 2c 20 20 20  k_data *pArg,   
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7970: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75   Pointer to stru
7980: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
7990: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
79a0: 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77    /* Error msg w
79d0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
79e0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
79f0: 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20   *pStmt = NULL; 
7a00: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
7a10: 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a   to execute. */.
7a20: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7a30: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7a40: 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
7a50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7a60: 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20   *zLeftover;    
7a70: 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66        /* Tail of
7a80: 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c   unprocessed SQL
7a90: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 7a 45 72 72   */..  if( pzErr
7aa0: 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  Msg ){.    *pzEr
7ab0: 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  rMsg = NULL;.  }
7ac0: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b  ..  while( zSql[
7ad0: 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b  0] && (SQLITE_OK
7ae0: 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 72   == rc) ){.    r
7af0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
7b00: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
7b10: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c   -1, &pStmt, &zL
7b20: 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66  eftover);.    if
7b30: 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72  ( SQLITE_OK != r
7b40: 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  c ){.      if( p
7b50: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
7b60: 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
7b70: 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b  ave_err_msg(db);
7b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7b90: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  se{.      if( !p
7ba0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
7bb0: 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  /* this happens 
7bc0: 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72  for a comment or
7bd0: 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a   white-space */.
7be0: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a          zSql = z
7bf0: 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20  Leftover;.      
7c00: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
7c10: 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c  (zSql[0]) ) zSql
7c20: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ++;.        cont
7c30: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
7c40: 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66       /* save off
7c50: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
7c60: 61 74 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e  atment handle an
7c70: 64 20 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e  d reset row coun
7c80: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
7c90: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
7ca0: 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  Arg->pStmt = pSt
7cb0: 6d 74 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67  mt;.        pArg
7cc0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->cnt = 0;.     
7cd0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68   }..      /* ech
7ce0: 6f 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  o the sql statem
7cf0: 65 6e 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a  ent if echo on *
7d00: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
7d10: 20 26 26 20 70 41 72 67 2d 3e 65 63 68 6f 4f 6e   && pArg->echoOn
7d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
7d30: 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71 6c  t char *zStmtSql
7d40: 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
7d50: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 66  Stmt);.        f
7d60: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
7d70: 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53  , "%s\n", zStmtS
7d80: 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20  ql ? zStmtSql : 
7d90: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  zSql);.      }..
7da0: 20 20 20 20 20 20 2f 2a 20 70 65 72 66 6f 72 6d        /* perform
7db0: 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e   the first step.
7dc0: 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c    this will tell
7dd0: 20 75 73 20 69 66 20 77 65 0a 20 20 20 20 20 20   us if we.      
7de0: 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c 74  ** have a result
7df0: 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20   set or not and 
7e00: 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e 0a  how wide it is..
7e10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
7e20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
7e30: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 2f  (pStmt);.      /
7e40: 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72  * if we have a r
7e50: 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a  esult set... */.
7e60: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
7e70: 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20  _ROW == rc ){.  
7e80: 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68        /* if we h
7e90: 61 76 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e  ave a callback..
7ea0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
7eb0: 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20   xCallback ){.  
7ec0: 20 20 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63          /* alloc
7ed0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 63 6f  ate space for co
7ee0: 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c 75  l name ptr, valu
7ef0: 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65 20  e ptr, and type 
7f00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
7f10: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
7f20: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
7f30: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 76  mt);.          v
7f40: 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c  oid *pData = sql
7f50: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 33 2a 6e 43  ite3_malloc(3*nC
7f60: 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20  ol*sizeof(const 
7f70: 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20  char*) + 1);.   
7f80: 20 20 20 20 20 20 20 69 66 28 20 21 70 44 61 74         if( !pDat
7f90: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  a ){.           
7fa0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
7fb0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  EM;.          }e
7fc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7fd0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d   char **azCols =
7fe0: 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b   (char **)pData;
7ff0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f        /* Names o
8000: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
8010: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
8020: 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20  char **azVals = 
8030: 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20  &azCols[nCol];  
8040: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
8050: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
8060: 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69  nt *aiTypes = (i
8070: 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f  nt *)&azVals[nCo
8080: 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79  l]; /* Result ty
8090: 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pes */.         
80a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
80b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a        assert(siz
80c0: 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65  eof(int) <= size
80d0: 6f 66 28 63 68 61 72 20 2a 29 29 3b 20 0a 20 20  of(char *)); .  
80e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 76            /* sav
80f0: 65 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f  e off ptrs to co
8100: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
8110: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
8120: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
8130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
8140: 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72  zCols[i] = (char
8150: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
8160: 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  n_name(pStmt, i)
8170: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8180: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a              do{.
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
81a0: 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61 74   extract the dat
81b0: 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65 73  a and data types
81c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
81d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
81e0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
81f0: 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
8200: 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  i] = (char *)sql
8210: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
8220: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
8230: 20 20 20 20 20 20 20 20 20 20 20 20 61 69 54 79              aiTy
8240: 70 65 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  pes[i] = sqlite3
8250: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
8260: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
8270: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 7a 56          if( !azV
8280: 61 6c 73 5b 69 5d 20 26 26 20 28 61 69 54 79 70  als[i] && (aiTyp
8290: 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55  es[i]!=SQLITE_NU
82a0: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LL) ){.         
82b0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
82c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
82e0: 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72  eak; /* from for
82f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
8300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8310: 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72      } /* end for
8320: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
8330: 20 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e     /* if data an
8340: 64 20 74 79 70 65 73 20 65 78 74 72 61 63 74 65  d types extracte
8350: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e  d successfully..
8360: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
8370: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
8380: 57 20 3d 3d 20 72 63 20 29 7b 20 0a 20 20 20 20  W == rc ){ .    
8390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
83a0: 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64  all the supplied
83b0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
83c0: 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61  he result row da
83d0: 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ta */.          
83e0: 20 20 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62        if( xCallb
83f0: 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20  ack(pArg, nCol, 
8400: 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20  azVals, azCols, 
8410: 61 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20  aiTypes) ){.    
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
8430: 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b   = SQLITE_ABORT;
8440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8460: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
8470: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
8480: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
8490: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
84a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
84b0: 20 20 7d 20 77 68 69 6c 65 28 20 53 51 4c 49 54    } while( SQLIT
84c0: 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b 0a 20  E_ROW == rc );. 
84d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
84e0: 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a  e3_free(pData);.
84f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8500: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8510: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
8520: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8530: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
8540: 20 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65           } while
8550: 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 52  ( rc == SQLITE_R
8560: 4f 57 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OW );.        }.
8570: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
8580: 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74  * print usage st
8590: 61 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20  ats if stats on 
85a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
85b0: 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73  g && pArg->stats
85c0: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
85d0: 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20  splay_stats(db, 
85e0: 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pArg, 0);.      
85f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  }..      /* Fina
8600: 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65  lize the stateme
8610: 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65 64  nt just executed
8620: 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c  . If this fails,
8630: 20 73 61 76 65 20 61 20 0a 20 20 20 20 20 20 2a   save a .      *
8640: 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72  * copy of the er
8650: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68  ror message. Oth
8660: 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c  erwise, set zSql
8670: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
8680: 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73  .      ** next s
8690: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
86a0: 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ute. */.      rc
86b0: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
86c0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
86d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
86e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _OK ){.        z
86f0: 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
8700: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
8710: 69 73 73 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29  isspace(zSql[0])
8720: 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
8730: 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72   }else if( pzErr
8740: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
8750: 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
8760: 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
8770: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63     }..      /* c
8780: 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20  lear saved stmt 
8790: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
87a0: 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
87b0: 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20      pArg->pStmt 
87c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
87d0: 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64      }.  } /* end
87e0: 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74   while */..  ret
87f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
8800: 2a 20 54 68 69 73 20 69 73 20 61 20 64 69 66 66  * This is a diff
8810: 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72  erent callback r
8820: 6f 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72 20  outine used for 
8830: 64 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74 61  dumping the data
8840: 62 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f  base..** Each ro
8850: 77 20 72 65 63 65 69 76 65 64 20 62 79 20 74 68  w received by th
8860: 69 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73  is callback cons
8870: 69 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ists of a table 
8880: 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62  name,.** the tab
8890: 6c 65 20 74 79 70 65 20 28 22 69 6e 64 65 78 22  le type ("index"
88a0: 20 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e 64   or "table") and
88b0: 20 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20 74   SQL to create t
88c0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  he table..** Thi
88d0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
88e0: 20 70 72 69 6e 74 20 74 65 78 74 20 73 75 66 66   print text suff
88f0: 69 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65 61  icient to recrea
8900: 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  te the table..*/
8910: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d 70  .static int dump
8920: 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _callback(void *
8930: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
8940: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
8950: 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69  ar **azCol){.  i
8960: 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
8970: 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63  har *zTable;.  c
8980: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
8990: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
89a0: 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zSql;.  const ch
89b0: 61 72 20 2a 7a 50 72 65 70 53 74 6d 74 20 3d 20  ar *zPrepStmt = 
89c0: 30 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c  0;.  struct call
89d0: 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28  back_data *p = (
89e0: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
89f0: 64 61 74 61 20 2a 29 70 41 72 67 3b 0a 0a 20 20  data *)pArg;..  
8a00: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8a10: 28 61 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 6e  (azCol);.  if( n
8a20: 41 72 67 21 3d 33 20 29 20 72 65 74 75 72 6e 20  Arg!=3 ) return 
8a30: 31 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a  1;.  zTable = az
8a40: 41 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20  Arg[0];.  zType 
8a50: 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53  = azArg[1];.  zS
8a60: 71 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20  ql = azArg[2];. 
8a70: 20 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a   .  if( strcmp(z
8a80: 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73  Table, "sqlite_s
8a90: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
8aa0: 20 20 20 20 7a 50 72 65 70 53 74 6d 74 20 3d 20      zPrepStmt = 
8ab0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c  "DELETE FROM sql
8ac0: 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22  ite_sequence;\n"
8ad0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
8ae0: 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  rcmp(zTable, "sq
8af0: 6c 69 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20  lite_stat1")==0 
8b00: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  ){.    fprintf(p
8b10: 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
8b20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
8b30: 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
8b40: 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
8b50: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
8b60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8b70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
8b80: 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
8b90: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
8ba0: 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
8bb0: 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
8bc0: 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
8bd0: 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
8be0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
8bf0: 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
8c00: 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22  le_schema=ON;\n"
8c10: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
8c20: 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a  ableSchema = 1;.
8c30: 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d      }.    zIns =
8c40: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8c50: 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  (.       "INSERT
8c60: 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73   INTO sqlite_mas
8c70: 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ter(type,name,tb
8c80: 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c  l_name,rootpage,
8c90: 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41  sql)".       "VA
8ca0: 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71  LUES('table','%q
8cb0: 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22  ','%q',0,'%q');"
8cc0: 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c  ,.       zTable,
8cd0: 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a   zTable, zSql);.
8ce0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
8cf0: 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73  ut, "%s\n", zIns
8d00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
8d10: 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72  ree(zIns);.    r
8d20: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
8d30: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  {.    fprintf(p-
8d40: 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a  >out, "%s;\n", z
8d50: 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Sql);.  }..  if(
8d60: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22   strcmp(zType, "
8d70: 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  table")==0 ){.  
8d80: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
8d90: 70 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a  pTableInfo = 0;.
8da0: 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6c 65 63      char *zSelec
8db0: 74 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  t = 0;.    char 
8dc0: 2a 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b  *zTableInfo = 0;
8dd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 20  .    char *zTmp 
8de0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f  = 0;.    int nRo
8df0: 77 20 3d 20 30 3b 0a 20 20 20 0a 20 20 20 20 7a  w = 0;.   .    z
8e00: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65  TableInfo = appe
8e10: 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66  ndText(zTableInf
8e20: 6f 2c 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65  o, "PRAGMA table
8e30: 5f 69 6e 66 6f 28 22 2c 20 30 29 3b 0a 20 20 20  _info(", 0);.   
8e40: 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70   zTableInfo = ap
8e50: 70 65 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49  pendText(zTableI
8e60: 6e 66 6f 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27  nfo, zTable, '"'
8e70: 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66  );.    zTableInf
8e80: 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  o = appendText(z
8e90: 54 61 62 6c 65 49 6e 66 6f 2c 20 22 29 3b 22 2c  TableInfo, ");",
8ea0: 20 30 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73   0);..    rc = s
8eb0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
8ec0: 2d 3e 64 62 2c 20 7a 54 61 62 6c 65 49 6e 66 6f  ->db, zTableInfo
8ed0: 2c 20 2d 31 2c 20 26 70 54 61 62 6c 65 49 6e 66  , -1, &pTableInf
8ee0: 6f 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  o, 0);.    free(
8ef0: 7a 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20  zTableInfo);.   
8f00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8f10: 4f 4b 20 7c 7c 20 21 70 54 61 62 6c 65 49 6e 66  OK || !pTableInf
8f20: 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  o ){.      retur
8f30: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
8f40: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
8f50: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 53  Text(zSelect, "S
8f60: 45 4c 45 43 54 20 27 49 4e 53 45 52 54 20 49 4e  ELECT 'INSERT IN
8f70: 54 4f 20 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20  TO ' || ", 0);. 
8f80: 20 20 20 7a 54 6d 70 20 3d 20 61 70 70 65 6e 64     zTmp = append
8f90: 54 65 78 74 28 7a 54 6d 70 2c 20 7a 54 61 62 6c  Text(zTmp, zTabl
8fa0: 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 69 66 28  e, '"');.    if(
8fb0: 20 7a 54 6d 70 20 29 7b 0a 20 20 20 20 20 20 7a   zTmp ){.      z
8fc0: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
8fd0: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54 6d  ext(zSelect, zTm
8fe0: 70 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 7d 0a  p, '\'');.    }.
8ff0: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
9000: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
9010: 2c 20 22 20 7c 7c 20 27 20 56 41 4c 55 45 53 28  , " || ' VALUES(
9020: 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20 20  ' || ", 0);.    
9030: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
9040: 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20  p(pTableInfo);. 
9050: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
9060: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
9070: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
9080: 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
9090: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
90a0: 6d 6e 5f 74 65 78 74 28 70 54 61 62 6c 65 49 6e  mn_text(pTableIn
90b0: 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a 53  fo, 1);.      zS
90c0: 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65  elect = appendTe
90d0: 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 71 75 6f  xt(zSelect, "quo
90e0: 74 65 28 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  te(", 0);.      
90f0: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
9100: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54  Text(zSelect, zT
9110: 65 78 74 2c 20 27 22 27 29 3b 0a 20 20 20 20 20  ext, '"');.     
9120: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
9130: 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a  ep(pTableInfo);.
9140: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
9150: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
9160: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
9170: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
9180: 2c 20 22 29 20 7c 7c 20 27 2c 27 20 7c 7c 20 22  , ") || ',' || "
9190: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
91a0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 6c 65  e{.        zSele
91b0: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
91c0: 7a 53 65 6c 65 63 74 2c 20 22 29 20 22 2c 20 30  zSelect, ") ", 0
91d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
91e0: 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nRow++;.    }. 
91f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
9200: 66 69 6e 61 6c 69 7a 65 28 70 54 61 62 6c 65 49  finalize(pTableI
9210: 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nfo);.    if( rc
9220: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e  !=SQLITE_OK || n
9230: 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Row==0 ){.      
9240: 66 72 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a 20  free(zSelect);. 
9250: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9260: 20 20 20 7d 0a 20 20 20 20 7a 53 65 6c 65 63 74     }.    zSelect
9270: 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53   = appendText(zS
9280: 65 6c 65 63 74 2c 20 22 7c 7c 20 27 29 27 20 46  elect, "|| ')' F
9290: 52 4f 4d 20 20 22 2c 20 30 29 3b 0a 20 20 20 20  ROM  ", 0);.    
92a0: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
92b0: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54  Text(zSelect, zT
92c0: 61 62 6c 65 2c 20 27 22 27 29 3b 0a 0a 20 20 20  able, '"');..   
92d0: 20 72 63 20 3d 20 72 75 6e 5f 74 61 62 6c 65 5f   rc = run_table_
92e0: 64 75 6d 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75  dump_query(p->ou
92f0: 74 2c 20 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63  t, p->db, zSelec
9300: 74 2c 20 7a 50 72 65 70 53 74 6d 74 29 3b 0a 20  t, zPrepStmt);. 
9310: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9320: 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
9330: 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70     zSelect = app
9340: 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c  endText(zSelect,
9350: 20 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69   " ORDER BY rowi
9360: 64 20 44 45 53 43 22 2c 20 30 29 3b 0a 20 20 20  d DESC", 0);.   
9370: 20 20 20 72 63 20 3d 20 72 75 6e 5f 74 61 62 6c     rc = run_tabl
9380: 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2d 3e  e_dump_query(p->
9390: 6f 75 74 2c 20 70 2d 3e 64 62 2c 20 7a 53 65 6c  out, p->db, zSel
93a0: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ect, 0);.    }. 
93b0: 20 20 20 69 66 28 20 7a 53 65 6c 65 63 74 20 29     if( zSelect )
93c0: 20 66 72 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a   free(zSelect);.
93d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
93e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75  }../*.** Run zQu
93f0: 65 72 79 2e 20 20 55 73 65 20 64 75 6d 70 5f 63  ery.  Use dump_c
9400: 61 6c 6c 62 61 63 6b 28 29 20 61 73 20 74 68 65  allback() as the
9410: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
9420: 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  e so that.** the
9430: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
9440: 20 71 75 65 72 79 20 61 72 65 20 6f 75 74 70 75   query are outpu
9450: 74 20 61 73 20 53 51 4c 20 73 74 61 74 65 6d 65  t as SQL stateme
9460: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  nts..**.** If we
9470: 20 67 65 74 20 61 20 53 51 4c 49 54 45 5f 43 4f   get a SQLITE_CO
9480: 52 52 55 50 54 20 65 72 72 6f 72 2c 20 72 65 72  RRUPT error, rer
9490: 75 6e 20 74 68 65 20 71 75 65 72 79 20 61 66 74  un the query aft
94a0: 65 72 20 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20  er appending.** 
94b0: 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20  "ORDER BY rowid 
94c0: 44 45 53 43 22 20 74 6f 20 74 68 65 20 65 6e 64  DESC" to the end
94d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
94e0: 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
94f0: 71 75 65 72 79 28 0a 20 20 73 74 72 75 63 74 20  query(.  struct 
9500: 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70  callback_data *p
9510: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
9520: 2a 7a 51 75 65 72 79 2c 0a 20 20 63 68 61 72 20  *zQuery,.  char 
9530: 2a 2a 70 7a 45 72 72 4d 73 67 0a 29 7b 0a 20 20  **pzErrMsg.){.  
9540: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
9550: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
9560: 62 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f  b, zQuery, dump_
9570: 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 70 7a 45  callback, p, pzE
9580: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
9590: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
95a0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 51   ){.    char *zQ
95b0: 32 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  2;.    int len =
95c0: 20 73 74 72 6c 65 6e 33 30 28 7a 51 75 65 72 79   strlen30(zQuery
95d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 7a 45 72 72  );.    if( pzErr
95e0: 4d 73 67 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Msg ) sqlite3_fr
95f0: 65 65 28 2a 70 7a 45 72 72 4d 73 67 29 3b 0a 20  ee(*pzErrMsg);. 
9600: 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28     zQ2 = malloc(
9610: 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20   len+100 );.    
9620: 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74  if( zQ2==0 ) ret
9630: 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
9640: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
9650: 65 6f 66 28 7a 51 32 29 2c 20 7a 51 32 2c 20 22  eof(zQ2), zQ2, "
9660: 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
9670: 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29  d DESC", zQuery)
9680: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
9690: 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
96a0: 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Q2, dump_callbac
96b0: 6b 2c 20 70 2c 20 70 7a 45 72 72 4d 73 67 29 3b  k, p, pzErrMsg);
96c0: 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
96d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
96e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
96f0: 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65  f a help message
9700: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
9710: 7a 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 62 61  zHelp[] =.  ".ba
9720: 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20  ckup ?DB? FILE  
9730: 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64      Backup DB (d
9740: 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29  efault \"main\")
9750: 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e   to FILE\n".  ".
9760: 62 61 69 6c 20 4f 4e 7c 4f 46 46 20 20 20 20 20  bail ON|OFF     
9770: 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72        Stop after
9780: 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
9790: 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c  r.  Default OFF\
97a0: 6e 22 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73  n".  ".databases
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
97c0: 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65  t names and file
97d0: 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  s of attached da
97e0: 74 61 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64  tabases\n".  ".d
97f0: 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
9800: 20 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61       Dump the da
9810: 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c  tabase in an SQL
9820: 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a   text format\n".
9830: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
9840: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
9850: 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20  ABLE specified, 
9860: 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73  only dump tables
9870: 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22   matching\n".  "
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61           LIKE pa
98a0: 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a  ttern TABLE.\n".
98b0: 20 20 22 2e 65 63 68 6f 20 4f 4e 7c 4f 46 46 20    ".echo ON|OFF 
98c0: 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63            Turn c
98d0: 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f  ommand echo on o
98e0: 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 78 69  r off\n".  ".exi
98f0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
9900: 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f     Exit this pro
9910: 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 6c  gram\n".  ".expl
9920: 61 69 6e 20 3f 4f 4e 7c 4f 46 46 3f 20 20 20 20  ain ?ON|OFF?    
9930: 20 20 54 75 72 6e 20 6f 75 74 70 75 74 20 6d 6f    Turn output mo
9940: 64 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  de suitable for 
9950: 45 58 50 4c 41 49 4e 20 6f 6e 20 6f 72 20 6f 66  EXPLAIN on or of
9960: 66 2e 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  f.\n".  "       
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 57 69 74 68 20 6e 6f 20 61 72 67 73 2c 20    With no args, 
9990: 69 74 20 74 75 72 6e 73 20 45 58 50 4c 41 49 4e  it turns EXPLAIN
99a0: 20 6f 6e 2e 5c 6e 22 0a 20 20 22 2e 68 65 61 64   on.\n".  ".head
99b0: 65 72 28 73 29 20 4f 4e 7c 4f 46 46 20 20 20 20  er(s) ON|OFF    
99c0: 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f    Turn display o
99d0: 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20  f headers on or 
99e0: 6f 66 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20  off\n".  ".help 
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 53 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61   Show this messa
9a10: 67 65 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74  ge\n".  ".import
9a20: 20 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20   FILE TABLE     
9a30: 49 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d  Import data from
9a40: 20 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45   FILE into TABLE
9a50: 5c 6e 22 0a 20 20 22 2e 69 6e 64 69 63 65 73 20  \n".  ".indices 
9a60: 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 68  ?TABLE?       Sh
9a70: 6f 77 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  ow names of all 
9a80: 69 6e 64 69 63 65 73 5c 6e 22 0a 20 20 22 20 20  indices\n".  "  
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20         If TABLE 
9ab0: 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
9ac0: 73 68 6f 77 20 69 6e 64 69 63 65 73 20 66 6f 72  show indices for
9ad0: 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20   tables\n".  "  
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20         matching 
9b00: 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
9b10: 4c 45 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51  LE.\n".#ifdef SQ
9b20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
9b30: 41 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20  ACE.  ".iotrace 
9b40: 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 45 6e  FILE          En
9b50: 61 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73  able I/O diagnos
9b60: 74 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46  tic logging to F
9b70: 49 4c 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 23 69  ILE\n".#endif.#i
9b80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9b90: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
9ba0: 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f  .  ".load FILE ?
9bb0: 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64 20  ENTRY?     Load 
9bc0: 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62  an extension lib
9bd0: 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a 20  rary\n".#endif. 
9be0: 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20   ".log FILE|off 
9bf0: 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f           Turn lo
9c00: 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e  gging on or off.
9c10: 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74    FILE can be st
9c20: 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a 20  derr/stdout\n". 
9c30: 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41   ".mode MODE ?TA
9c40: 42 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75 74  BLE?     Set out
9c50: 70 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20 4d  put mode where M
9c60: 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e  ODE is one of:\n
9c70: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73                cs
9c90: 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70  v      Comma-sep
9ca0: 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22  arated values\n"
9cb0: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
9cd0: 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e  umn   Left-align
9ce0: 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65  ed columns.  (Se
9cf0: 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20 22  e .width)\n".  "
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20 20           html   
9d20: 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63    HTML <table> c
9d30: 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ode\n".  "      
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20     insert   SQL 
9d60: 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  insert statement
9d70: 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20  s for TABLE\n". 
9d80: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
9d90: 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 20             line 
9da0: 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65      One value pe
9db0: 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20 20  r line\n".  "   
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 56        list     V
9de0: 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20  alues delimited 
9df0: 62 79 20 2e 73 65 70 61 72 61 74 6f 72 20 73 74  by .separator st
9e00: 72 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20  ring\n".  "     
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62      tabs     Tab
9e30: 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65  -separated value
9e40: 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69   tcl      TCL li
9e70: 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20  st elements\n". 
9e80: 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52   ".nullvalue STR
9e90: 49 4e 47 20 20 20 20 20 20 50 72 69 6e 74 20 53  ING      Print S
9ea0: 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f  TRING in place o
9eb0: 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22  f NULL values\n"
9ec0: 0a 20 20 22 2e 6f 75 74 70 75 74 20 46 49 4c 45  .  ".output FILE
9ed0: 4e 41 4d 45 20 20 20 20 20 20 20 53 65 6e 64 20  NAME       Send 
9ee0: 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 4e 41  output to FILENA
9ef0: 4d 45 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74  ME\n".  ".output
9f00: 20 73 74 64 6f 75 74 20 20 20 20 20 20 20 20 20   stdout         
9f10: 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 74  Send output to t
9f20: 68 65 20 73 63 72 65 65 6e 5c 6e 22 0a 20 20 22  he screen\n".  "
9f30: 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e  .prompt MAIN CON
9f40: 54 49 4e 55 45 20 20 52 65 70 6c 61 63 65 20 74  TINUE  Replace t
9f50: 68 65 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d  he standard prom
9f60: 70 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20  pts\n".  ".quit 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72   Exit this progr
9f90: 61 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20 46  am\n".  ".read F
9fa0: 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20  ILENAME         
9fb0: 45 78 65 63 75 74 65 20 53 51 4c 20 69 6e 20 46  Execute SQL in F
9fc0: 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 72  ILENAME\n".  ".r
9fd0: 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45  estore ?DB? FILE
9fe0: 20 20 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e       Restore con
9ff0: 74 65 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61  tent of DB (defa
a000: 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72  ult \"main\") fr
a010: 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73  om FILE\n".  ".s
a020: 63 68 65 6d 61 20 3f 54 41 42 4c 45 3f 20 20 20  chema ?TABLE?   
a030: 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 43 52       Show the CR
a040: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 5c  EATE statements\
a050: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
a070: 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
a080: 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 74 61 62  d, only show tab
a090: 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a  les matching\n".
a0a0: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45              LIKE
a0c0: 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c   pattern TABLE.\
a0d0: 6e 22 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72  n".  ".separator
a0e0: 20 53 54 52 49 4e 47 20 20 20 20 20 20 43 68 61   STRING      Cha
a0f0: 6e 67 65 20 73 65 70 61 72 61 74 6f 72 20 75 73  nge separator us
a100: 65 64 20 62 79 20 6f 75 74 70 75 74 20 6d 6f 64  ed by output mod
a110: 65 20 61 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22  e and .import\n"
a120: 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20  .  ".show       
a130: 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20             Show 
a140: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
a150: 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73  es for various s
a160: 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20 22 2e 73  ettings\n".  ".s
a170: 74 61 74 73 20 4f 4e 7c 4f 46 46 20 20 20 20 20  tats ON|OFF     
a180: 20 20 20 20 20 54 75 72 6e 20 73 74 61 74 73 20       Turn stats 
a190: 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
a1a0: 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20  .tables ?TABLE? 
a1b0: 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65         List name
a1c0: 73 20 6f 66 20 74 61 62 6c 65 73 5c 6e 22 0a 20  s of tables\n". 
a1d0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
a1e0: 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
a1f0: 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
a200: 6e 6c 79 20 6c 69 73 74 20 74 61 62 6c 65 73 20  nly list tables 
a210: 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20  matching\n".  " 
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74          LIKE pat
a240: 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20  tern TABLE.\n". 
a250: 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20   ".timeout MS   
a260: 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65           Try ope
a270: 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c  ning locked tabl
a280: 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73  es for MS millis
a290: 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 77 69  econds\n".  ".wi
a2a0: 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e  dth NUM1 NUM2 ..
a2b0: 2e 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77  .   Set column w
a2c0: 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75  idths for \"colu
a2d0: 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 3b 0a 0a  mn\" mode\n".;..
a2e0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 54 69 6d  static char zTim
a2f0: 65 72 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 74  erHelp[] =.  ".t
a300: 69 6d 65 72 20 4f 4e 7c 4f 46 46 20 20 20 20 20  imer ON|OFF     
a310: 20 20 20 20 20 54 75 72 6e 20 74 68 65 20 43 50       Turn the CP
a320: 55 20 74 69 6d 65 72 20 6d 65 61 73 75 72 65 6d  U timer measurem
a330: 65 6e 74 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  ent on or off\n"
a340: 0a 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .;../* Forward r
a350: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
a360: 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69  ic int process_i
a370: 6e 70 75 74 28 73 74 72 75 63 74 20 63 61 6c 6c  nput(struct call
a380: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46 49  back_data *p, FI
a390: 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20  LE *in);../*.** 
a3a0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
a3b0: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
a3c0: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
a3d0: 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
a3e0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
a3f0: 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
a400: 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
a410: 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a430: 6f 70 65 6e 5f 64 62 28 73 74 72 75 63 74 20 63  open_db(struct c
a440: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29  allback_data *p)
a450: 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  {.  if( p->db==0
a460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a470: 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  open(p->zDbFilen
a480: 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ame, &p->db);.  
a490: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
a4a0: 20 20 69 66 28 20 64 62 20 26 26 20 73 71 6c 69    if( db && sqli
a4b0: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3d  te3_errcode(db)=
a4c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a4d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
a4e0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
a4f0: 22 73 68 65 6c 6c 73 74 61 74 69 63 22 2c 20 30  "shellstatic", 0
a500: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
a510: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 68 65 6c  ,.          shel
a520: 6c 73 74 61 74 69 63 46 75 6e 63 2c 20 30 2c 20  lstaticFunc, 0, 
a530: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
a540: 28 20 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54  ( db==0 || SQLIT
a550: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
a560: 72 63 6f 64 65 28 64 62 29 20 29 7b 0a 20 20 20  rcode(db) ){.   
a570: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
a580: 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65  r,"Error: unable
a590: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
a5a0: 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c  e \"%s\": %s\n",
a5b0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a   .          p->z
a5c0: 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69  DbFilename, sqli
a5d0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
a5e0: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
a5f0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
a600: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
a610: 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c  XTENSION.    sql
a620: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
a630: 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62  _extension(p->db
a640: 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 1);.#endif.  }
a650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c  .}../*.** Do C-l
a660: 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65  anguage style de
a670: 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  quoting..**.**  
a680: 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a    \t    -> tab.*
a690: 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65  *    \n    -> ne
a6a0: 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 72 20 20  wline.**    \r  
a6b0: 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65    -> carriage re
a6c0: 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20  turn.**    \NNN 
a6d0: 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61 63   -> ascii charac
a6e0: 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c  ter NNN in octal
a6f0: 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20  .**    \\    -> 
a700: 62 61 63 6b 73 6c 61 73 68 0a 2a 2f 0a 73 74 61  backslash.*/.sta
a710: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
a720: 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 63 68 61  _backslashes(cha
a730: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  r *z){.  int i, 
a740: 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66  j;.  char c;.  f
a750: 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a  or(i=j=0; (c = z
a760: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b  [i])!=0; i++, j+
a770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +){.    if( c=='
a780: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  \\' ){.      c =
a790: 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69   z[++i];.      i
a7a0: 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20  f( c=='n' ){.   
a7b0: 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20       c = '\n';. 
a7c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
a7d0: 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20  =='t' ){.       
a7e0: 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20   c = '\t';.     
a7f0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72   }else if( c=='r
a800: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
a810: 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\r';.      }el
a820: 73 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26  se if( c>='0' &&
a830: 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20   c<='7' ){.     
a840: 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20     c -= '0';.   
a850: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e       if( z[i+1]>
a860: 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d  ='0' && z[i+1]<=
a870: 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '7' ){.         
a880: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
a890: 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69  c = (c<<3) + z[i
a8a0: 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ] - '0';.       
a8b0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27     if( z[i+1]>='
a8c0: 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37  0' && z[i+1]<='7
a8d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
a8e0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
a8f0: 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a    c = (c<<3) + z
a900: 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  [i] - '0';.     
a910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a930: 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d     z[j] = c;.  }
a940: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[j] = 0;.}..
a950: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
a960: 7a 41 72 67 20 61 73 20 61 20 62 6f 6f 6c 65 61  zArg as a boolea
a970: 6e 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e  n value.  Return
a980: 20 65 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a   either 0 or 1..
a990: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f  */.static int bo
a9a0: 6f 6c 65 61 6e 56 61 6c 75 65 28 63 68 61 72 20  oleanValue(char 
a9b0: 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 76 61  *zArg){.  int va
a9c0: 6c 20 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b 0a  l = atoi(zArg);.
a9d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
a9e0: 3d 30 3b 20 7a 41 72 67 5b 6a 5d 3b 20 6a 2b 2b  =0; zArg[j]; j++
a9f0: 29 7b 0a 20 20 20 20 7a 41 72 67 5b 6a 5d 20 3d  ){.    zArg[j] =
aa00: 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28 7a   (char)tolower(z
aa10: 41 72 67 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20 69  Arg[j]);.  }.  i
aa20: 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
aa30: 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 76  on")==0 ){.    v
aa40: 61 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  al = 1;.  }else 
aa50: 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
aa60: 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "yes")==0 ){.   
aa70: 20 76 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20   val = 1;.  }.  
aa80: 72 65 74 75 72 6e 20 76 61 6c 3b 0a 7d 0a 0a 2f  return val;.}../
aa90: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74  *.** If an input
aaa0: 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74   line begins wit
aab0: 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b  h "." then invok
aac0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
aad0: 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61  o.** process tha
aae0: 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  t line..**.** Re
aaf0: 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c  turn 1 on error,
ab00: 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20   2 to exit, and 
ab10: 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
ab20: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65  static int do_me
ab30: 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20  ta_command(char 
ab40: 2a 7a 4c 69 6e 65 2c 20 73 74 72 75 63 74 20 63  *zLine, struct c
ab50: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29  allback_data *p)
ab60: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 31 3b 0a 20  {.  int i = 1;. 
ab70: 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20   int nArg = 0;. 
ab80: 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74   int n, c;.  int
ab90: 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20   rc = 0;.  char 
aba0: 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f  *azArg[50];..  /
abb0: 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
abc0: 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65  t line into toke
abd0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ns..  */.  while
abe0: 28 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 6e 41  ( zLine[i] && nA
abf0: 72 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41  rg<ArraySize(azA
ac00: 72 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  rg) ){.    while
ac10: 28 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ( isspace((unsig
ac20: 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e 65 5b 69  ned char)zLine[i
ac30: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
ac40: 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 30   if( zLine[i]==0
ac50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
ac60: 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 27 27  ( zLine[i]=='\''
ac70: 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 22   || zLine[i]=='"
ac80: 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ' ){.      int d
ac90: 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 69 2b 2b  elim = zLine[i++
aca0: 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  ];.      azArg[n
acb0: 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
acc0: 69 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  i];.      while(
acd0: 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69   zLine[i] && zLi
ace0: 6e 65 5b 69 5d 21 3d 64 65 6c 69 6d 20 29 7b 20  ne[i]!=delim ){ 
acf0: 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  i++; }.      if(
ad00: 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 64 65 6c 69 6d   zLine[i]==delim
ad10: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
ad20: 65 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  e[i++] = 0;.    
ad30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
ad40: 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c  lim=='"' ) resol
ad50: 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
ad60: 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
ad70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ad80: 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20  azArg[nArg++] = 
ad90: 26 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20  &zLine[i];.     
ada0: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d   while( zLine[i]
adb0: 20 26 26 20 21 69 73 73 70 61 63 65 28 28 75 6e   && !isspace((un
adc0: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4c 69 6e  signed char)zLin
add0: 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  e[i]) ){ i++; }.
ade0: 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
adf0: 69 5d 20 29 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20  i] ) zLine[i++] 
ae00: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c  = 0;.      resol
ae10: 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
ae20: 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
ae30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
ae40: 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74  rocess the input
ae50: 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   line..  */.  if
ae60: 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75  ( nArg==0 ) retu
ae70: 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65  rn 0; /* no toke
ae80: 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
ae90: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    n = strlen30(a
aea0: 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20  zArg[0]);.  c = 
aeb0: 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 69  azArg[0][0];.  i
aec0: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
aed0: 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
aee0: 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c  rg[0], "backup",
aef0: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31   n)==0 && nArg>1
af00: 20 26 26 20 6e 41 72 67 3c 34 29 7b 0a 20 20 20   && nArg<4){.   
af10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
af20: 73 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  stFile;.    cons
af30: 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20  t char *zDb;.   
af40: 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b   sqlite3 *pDest;
af50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
af60: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
af70: 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
af80: 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65  .      zDestFile
af90: 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
afa0: 20 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b     zDb = "main";
afb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
afc0: 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a    zDestFile = az
afd0: 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44  Arg[2];.      zD
afe0: 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  b = azArg[1];.  
aff0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
b000: 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46  ite3_open(zDestF
b010: 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20  ile, &pDest);.  
b020: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b030: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72  _OK ){.      fpr
b040: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
b050: 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
b060: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73   \"%s\"\n", zDes
b070: 74 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  tFile);.      sq
b080: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
b090: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
b0a0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70   1;.    }.    op
b0b0: 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 70 42  en_db(p);.    pB
b0c0: 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
b0d0: 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
b0e0: 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62  t, "main", p->db
b0f0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
b100: 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
b110: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
b120: 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
b130: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
b140: 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
b150: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
b160: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Dest);.      ret
b170: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
b180: 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73   while(  (rc = s
b190: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74  qlite3_backup_st
b1a0: 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29  ep(pBackup,100))
b1b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a  ==SQLITE_OK ){}.
b1c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
b1d0: 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75  up_finish(pBacku
b1e0: 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
b1f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
b200: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
b210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
b220: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
b230: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
b240: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
b250: 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t));.      rc = 
b260: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
b270: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
b280: 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
b290: 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
b2a0: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
b2b0: 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29  g[0], "bail", n)
b2c0: 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 26 26  ==0 && nArg>1 &&
b2d0: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 62   nArg<3 ){.    b
b2e0: 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62  ail_on_error = b
b2f0: 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
b300: 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  g[1]);.  }else..
b310: 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
b320: 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
b330: 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61  zArg[0], "databa
b340: 73 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  ses", n)==0 && n
b350: 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 74  Arg==1 ){.    st
b360: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
b370: 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  ta data;.    cha
b380: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
b390: 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a      open_db(p);.
b3a0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
b3b0: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
b3c0: 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
b3d0: 77 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  wHeader = 1;.   
b3e0: 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
b3f0: 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 64 61  E_Column;.    da
b400: 74 61 2e 63 6f 6c 57 69 64 74 68 5b 30 5d 20 3d  ta.colWidth[0] =
b410: 20 33 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c   3;.    data.col
b420: 57 69 64 74 68 5b 31 5d 20 3d 20 31 35 3b 0a 20  Width[1] = 15;. 
b430: 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68     data.colWidth
b440: 5b 32 5d 20 3d 20 35 38 3b 0a 20 20 20 20 64 61  [2] = 58;.    da
b450: 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  ta.cnt = 0;.    
b460: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
b470: 64 62 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61  db, "PRAGMA data
b480: 62 61 73 65 5f 6c 69 73 74 3b 20 22 2c 20 63 61  base_list; ", ca
b490: 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
b4a0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
b4b0: 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
b4c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
b4d0: 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
b4e0: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
b4f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
b500: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
b510: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
b520: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
b530: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
b540: 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e  rg[0], "dump", n
b550: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29  )==0 && nArg<3 )
b560: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  {.    char *zErr
b570: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65  Msg = 0;.    ope
b580: 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 2f 2a 20  n_db(p);.    /* 
b590: 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
b5a0: 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65 20  k a "dump", the 
b5b0: 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61 70  content might ap
b5c0: 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65 72  pear in an order
b5d0: 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63 61  .    ** which ca
b5e0: 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20 66  uses immediate f
b5f0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
b600: 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f  raints to be vio
b610: 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f  lated..    ** So
b620: 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67 6e   disable foreign
b630: 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  -key constraint 
b640: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70  enforcement to p
b650: 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e  revent problems.
b660: 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
b670: 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
b680: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46  foreign_keys=OFF
b690: 3b 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  ;\n");.    fprin
b6a0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49  tf(p->out, "BEGI
b6b0: 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e  N TRANSACTION;\n
b6c0: 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61  ");.    p->writa
b6d0: 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  bleSchema = 0;. 
b6e0: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
b6f0: 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
b700: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
b710: 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
b720: 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b    if( nArg==1 ){
b730: 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d  .      run_schem
b740: 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20  a_dump_query(p, 
b750: 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
b760: 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
b770: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
b780: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
b790: 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
b7a0: 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62  L AND type=='tab
b7b0: 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73  le' AND name!='s
b7c0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22  qlite_sequence'"
b7d0: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
b7e0: 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
b7f0: 6d 70 5f 71 75 65 72 79 28 70 2c 20 0a 20 20 20  mp_query(p, .   
b800: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
b810: 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f  e, type, sql FRO
b820: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
b830: 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
b840: 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73   name=='sqlite_s
b850: 65 71 75 65 6e 63 65 27 22 2c 20 30 0a 20 20 20  equence'", 0.   
b860: 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f     );.      run_
b870: 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
b880: 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 64 62 2c 0a  (p->out, p->db,.
b890: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
b8a0: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
b8b0: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
b8c0: 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20   "WHERE sql NOT 
b8d0: 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e  NULL AND type IN
b8e0: 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
b8f0: 65 72 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a  er','view')", 0.
b900: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
b910: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
b920: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
b930: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b940: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
b950: 69 63 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ic = azArg[i];. 
b960: 20 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d         run_schem
b970: 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a  a_dump_query(p,.
b980: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
b990: 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
b9a0: 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
b9b0: 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20  ster ".         
b9c0: 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65   "WHERE tbl_name
b9d0: 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69   LIKE shellstati
b9e0: 63 28 29 20 41 4e 44 20 74 79 70 65 3d 3d 27 74  c() AND type=='t
b9f0: 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 20  able'".         
ba00: 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20   "  AND sql NOT 
ba10: 4e 55 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20  NULL", 0);.     
ba20: 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d     run_table_dum
ba30: 70 5f 71 75 65 72 79 28 70 2d 3e 6f 75 74 2c 20  p_query(p->out, 
ba40: 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
ba50: 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
ba60: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
ba70: 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45  ".          "WHE
ba80: 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  RE sql NOT NULL"
ba90: 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e  .          "  AN
baa0: 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
bab0: 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
bac0: 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ew')".          
bad0: 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20  "  AND tbl_name 
bae0: 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63  LIKE shellstatic
baf0: 28 29 22 2c 20 30 0a 20 20 20 20 20 20 20 20 29  ()", 0.        )
bb00: 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c  ;.        zShell
bb10: 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20  Static = 0;.    
bb20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
bb30: 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68  ( p->writableSch
bb40: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ema ){.      fpr
bb50: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
bb60: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
bb70: 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20  hema=OFF;\n");. 
bb80: 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
bb90: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
bba0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  }.    sqlite3_ex
bbb0: 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
bbc0: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
bbd0: 61 3d 4f 46 46 22 2c 20 30 2c 20 30 2c 20 30 29  a=OFF", 0, 0, 0)
bbe0: 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  ;.    if( zErrMs
bbf0: 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  g ){.      fprin
bc00: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
bc10: 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
bc20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bc30: 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
bc40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc50: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
bc60: 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20   "COMMIT;\n");. 
bc70: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
bc80: 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
bc90: 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
bca0: 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 26 26  "echo", n)==0 &&
bcb0: 20 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c   nArg>1 && nArg<
bcc0: 33 20 29 7b 0a 20 20 20 20 70 2d 3e 65 63 68 6f  3 ){.    p->echo
bcd0: 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  On = booleanValu
bce0: 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
bcf0: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
bd00: 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
bd10: 41 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20  Arg[0], "exit", 
bd20: 6e 29 3d 3d 30 20 20 26 26 20 6e 41 72 67 3d 3d  n)==0  && nArg==
bd30: 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b  1 ){.    rc = 2;
bd40: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
bd50: 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
bd60: 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
bd70: 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20  lain", n)==0 && 
bd80: 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 69 6e  nArg<3 ){.    in
bd90: 74 20 76 61 6c 20 3d 20 6e 41 72 67 3e 3d 32 20  t val = nArg>=2 
bda0: 3f 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ? booleanValue(a
bdb0: 7a 41 72 67 5b 31 5d 29 20 3a 20 31 3b 0a 20 20  zArg[1]) : 1;.  
bdc0: 20 20 69 66 28 76 61 6c 20 3d 3d 20 31 29 20 7b    if(val == 1) {
bdd0: 0a 20 20 20 20 20 20 69 66 28 21 70 2d 3e 65 78  .      if(!p->ex
bde0: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 29  plainPrev.valid)
bdf0: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78   {.        p->ex
be00: 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20  plainPrev.valid 
be10: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
be20: 65 78 70 6c 61 69 6e 50 72 65 76 2e 6d 6f 64 65  explainPrev.mode
be30: 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
be40: 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72      p->explainPr
be50: 65 76 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ev.showHeader = 
be60: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20  p->showHeader;. 
be70: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d         memcpy(p-
be80: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 63 6f 6c  >explainPrev.col
be90: 57 69 64 74 68 2c 70 2d 3e 63 6f 6c 57 69 64 74  Width,p->colWidt
bea0: 68 2c 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 57  h,sizeof(p->colW
beb0: 69 64 74 68 29 29 3b 0a 20 20 20 20 20 20 7d 0a  idth));.      }.
bec0: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 6f 75 6c        /* We coul
bed0: 64 20 70 75 74 20 74 68 69 73 20 63 6f 64 65 20  d put this code 
bee0: 75 6e 64 65 72 20 74 68 65 20 21 70 2d 3e 65 78  under the !p->ex
bef0: 70 6c 61 69 6e 56 61 6c 69 64 0a 20 20 20 20 20  plainValid.     
bf00: 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 20 73 6f   ** condition so
bf10: 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
bf20: 74 20 65 78 65 63 75 74 65 20 69 66 20 77 65 20  t execute if we 
bf30: 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
bf40: 20 20 20 20 20 2a 2a 20 65 78 70 6c 61 69 6e 20       ** explain 
bf50: 6d 6f 64 65 2e 20 48 6f 77 65 76 65 72 2c 20 61  mode. However, a
bf60: 6c 77 61 79 73 20 65 78 65 63 75 74 69 6e 67 20  lways executing 
bf70: 69 74 20 61 6c 6c 6f 77 73 20 75 73 20 61 6e 20  it allows us an 
bf80: 65 61 73 79 0a 20 20 20 20 20 20 2a 2a 20 77 61  easy.      ** wa
bf90: 73 20 74 6f 20 72 65 73 65 74 20 74 6f 20 65 78  s to reset to ex
bfa0: 70 6c 61 69 6e 20 6d 6f 64 65 20 69 6e 20 63 61  plain mode in ca
bfb0: 73 65 20 74 68 65 20 75 73 65 72 20 70 72 65 76  se the user prev
bfc0: 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 2a 2a 20  iously.      ** 
bfd0: 64 69 64 20 61 6e 20 2e 65 78 70 6c 61 69 6e 20  did an .explain 
bfe0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 2e 77  followed by a .w
bff0: 69 64 74 68 2c 20 2e 6d 6f 64 65 20 6f 72 20 2e  idth, .mode or .
c000: 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
c010: 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20 20 20 2a  command..      *
c020: 2f 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  /.      p->mode 
c030: 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
c040: 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61        p->showHea
c050: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  der = 1;.      m
c060: 65 6d 73 65 74 28 70 2d 3e 63 6f 6c 57 69 64 74  emset(p->colWidt
c070: 68 2c 30 2c 41 72 72 61 79 53 69 7a 65 28 70 2d  h,0,ArraySize(p-
c080: 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20  >colWidth));.   
c090: 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 30     p->colWidth[0
c0a0: 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20  ] = 4;          
c0b0: 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20          /* addr 
c0c0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  */.      p->colW
c0d0: 69 64 74 68 5b 31 5d 20 3d 20 31 33 3b 20 20 20  idth[1] = 13;   
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c0f0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   opcode */.     
c100: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 32 5d 20   p->colWidth[2] 
c110: 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 4;            
c120: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
c130: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
c140: 5b 33 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20  [3] = 4;        
c150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
c160: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  */.      p->colW
c170: 69 64 74 68 5b 34 5d 20 3d 20 34 3b 20 20 20 20  idth[4] = 4;    
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c190: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e   P3 */.      p->
c1a0: 63 6f 6c 57 69 64 74 68 5b 35 5d 20 3d 20 31 33  colWidth[5] = 13
c1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c1c0: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
c1d0: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 36 5d 20   p->colWidth[6] 
c1e0: 3d 20 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 2;            
c1f0: 20 20 20 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20        /* P5 */. 
c200: 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
c210: 5b 37 5d 20 3d 20 31 33 3b 20 20 20 20 20 20 20  [7] = 13;       
c220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
c230: 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 65 6c  mment */.    }el
c240: 73 65 20 69 66 20 28 70 2d 3e 65 78 70 6c 61 69  se if (p->explai
c250: 6e 50 72 65 76 2e 76 61 6c 69 64 29 20 7b 0a 20  nPrev.valid) {. 
c260: 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50       p->explainP
c270: 72 65 76 2e 76 61 6c 69 64 20 3d 20 30 3b 0a 20  rev.valid = 0;. 
c280: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70       p->mode = p
c290: 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 6d 6f  ->explainPrev.mo
c2a0: 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f  de;.      p->sho
c2b0: 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 65 78 70  wHeader = p->exp
c2c0: 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77 48 65 61  lainPrev.showHea
c2d0: 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  der;.      memcp
c2e0: 79 28 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 70 2d  y(p->colWidth,p-
c2f0: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 63 6f 6c  >explainPrev.col
c300: 57 69 64 74 68 2c 73 69 7a 65 6f 66 28 70 2d 3e  Width,sizeof(p->
c310: 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20 20  colWidth));.    
c320: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
c330: 20 63 3d 3d 27 68 27 20 26 26 20 28 73 74 72 6e   c=='h' && (strn
c340: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68  cmp(azArg[0], "h
c350: 65 61 64 65 72 22 2c 20 6e 29 3d 3d 30 20 7c 7c  eader", n)==0 ||
c360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c370: 20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b    strncmp(azArg[
c380: 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c 20 6e  0], "headers", n
c390: 29 3d 3d 30 29 20 26 26 20 6e 41 72 67 3e 31 20  )==0) && nArg>1 
c3a0: 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20  && nArg<3 ){.   
c3b0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
c3c0: 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
c3d0: 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65  Arg[1]);.  }else
c3e0: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
c3f0: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
c400: 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d  0], "help", n)==
c410: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
c420: 28 73 74 64 65 72 72 2c 22 25 73 22 2c 7a 48 65  (stderr,"%s",zHe
c430: 6c 70 29 3b 0a 20 20 20 20 69 66 28 20 48 41 53  lp);.    if( HAS
c440: 5f 54 49 4d 45 52 20 29 7b 0a 20 20 20 20 20 20  _TIMER ){.      
c450: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
c460: 25 73 22 2c 7a 54 69 6d 65 72 48 65 6c 70 29 3b  %s",zTimerHelp);
c470: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
c480: 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
c490: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
c4a0: 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d  , "import", n)==
c4b0: 30 20 26 26 20 6e 41 72 67 3d 3d 33 20 29 7b 0a  0 && nArg==3 ){.
c4c0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65      char *zTable
c4d0: 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20   = azArg[2];    
c4e0: 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
c4f0: 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a  nto this table *
c500: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c  /.    char *zFil
c510: 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 20 20 20  e = azArg[1];   
c520: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
c530: 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72  om which to extr
c540: 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  act data */.    
c550: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
c560: 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41  tmt = NULL; /* A
c570: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
c580: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5a0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
c5b0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
c5c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
c5d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c5e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c5f0: 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
c600: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
c610: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
c620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c630: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
c640: 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c660: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c670: 20 69 6e 20 70 2d 3e 73 65 70 61 72 61 74 6f 72   in p->separator
c680: 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
c690: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
c6a0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
c6b0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
c6c0: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c6e0: 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
c6f0: 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
c700: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
c710: 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
c720: 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
c730: 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
c740: 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
c750: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c770: 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
c780: 61 6e 67 65 73 20 2a 2f 20 20 20 0a 20 20 20 20  anges */   .    
c790: 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c7b0: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
c7c0: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
c7d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c7e0: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
c7f0: 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
c800: 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29  ..    open_db(p)
c810: 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72  ;.    nSep = str
c820: 6c 65 6e 33 30 28 70 2d 3e 73 65 70 61 72 61 74  len30(p->separat
c830: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  or);.    if( nSe
c840: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  p==0 ){.      fp
c850: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
c860: 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73  rror: non-null s
c870: 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
c880: 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  d for import\n")
c890: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
c8a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
c8b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
c8c0: 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
c8d0: 4d 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29  M '%q'", zTable)
c8e0: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
c8f0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
c900: 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
c910: 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r: out of memory
c920: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
c930: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
c940: 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
c950: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
c960: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
c970: 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
c980: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
c990: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c9a0: 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
c9b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 20 28 70 53   ){.      if (pS
c9c0: 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e  tmt) sqlite3_fin
c9d0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
c9e0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
c9f0: 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
ca00: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
ca10: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (db));.      ret
ca20: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
ca30: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
ca40: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
ca50: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
ca60: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
ca70: 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  ;.    pStmt = 0;
ca80: 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30  .    if( nCol==0
ca90: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
caa0: 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65  no columns, no e
cab0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c  rror */.    zSql
cac0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65   = malloc( nByte
cad0: 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 20 + nCol*2 )
cae0: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
caf0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
cb00: 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
cb10: 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r: out of memory
cb20: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
cb30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
cb40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
cb50: 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c  (nByte+20, zSql,
cb60: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25   "INSERT INTO '%
cb70: 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54  q' VALUES(?", zT
cb80: 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73  able);.    j = s
cb90: 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
cba0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43     for(i=1; i<nC
cbb0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
cbc0: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b  zSql[j++] = ',';
cbd0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
cbe0: 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20   = '?';.    }.  
cbf0: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29    zSql[j++] = ')
cc00: 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d  ';.    zSql[j] =
cc10: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
cc20: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e  ite3_prepare(p->
cc30: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
cc40: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72  Stmt, 0);.    fr
cc50: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
cc60: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 70  ( rc ){.      fp
cc70: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
cc80: 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
cc90: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
cca0: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d  ;.      if (pStm
ccb0: 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  t) sqlite3_final
ccc0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
ccd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
cce0: 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  }.    in = fopen
ccf0: 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  (zFile, "rb");. 
cd00: 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
cd10: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
cd20: 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
cd30: 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
cd40: 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  \n", zFile);.   
cd50: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
cd60: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
cd70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
cd80: 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
cd90: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
cda0: 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
cdb0: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
cdc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
cdd0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
cde0: 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
cdf0: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 63  ry\n");.      fc
ce00: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
ce10: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
ce20: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
ce30: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
ce40: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
ce50: 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  p->db, "BEGIN", 
ce60: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
ce70: 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
ce80: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
ce90: 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
cea0: 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
ceb0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
cec0: 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
ced0: 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
cee0: 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a      azCol[0] = z
cef0: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
cf00: 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a  i=0, z=zLine; *z
cf10: 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26 20   && *z!='\n' && 
cf20: 2a 7a 21 3d 27 5c 72 27 3b 20 7a 2b 2b 29 7b 0a  *z!='\r'; z++){.
cf30: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d          if( *z==
cf40: 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30 5d 20  p->separator[0] 
cf50: 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 70 2d  && strncmp(z, p-
cf60: 3e 73 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70  >separator, nSep
cf70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
cf80: 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20    *z = 0;.      
cf90: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
cfa0: 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b     if( i<nCol ){
cfb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43  .            azC
cfc0: 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d  ol[i] = &z[nSep]
cfd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  ;.            z 
cfe0: 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20  += nSep-1;.     
cff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
d000: 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20  .      } /* end 
d010: 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 2a 7a 20  for */.      *z 
d020: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 0;.      if( i
d030: 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  +1!=nCol ){.    
d040: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d050: 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
d060: 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c      "Error: %s l
d070: 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64  ine %d: expected
d080: 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   %d columns of d
d090: 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64  ata but found %d
d0a0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
d0b0: 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
d0c0: 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
d0d0: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
d0e0: 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
d0f0: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
d100: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
d110: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
d120: 3b 20 2f 2a 20 66 72 6f 6d 20 77 68 69 6c 65 20  ; /* from while 
d130: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
d140: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
d150: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d160: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
d170: 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a  t(pStmt, i+1, az
d180: 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49  Col[i], -1, SQLI
d190: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
d1a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d1b0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
d1c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d1d0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
d1e0: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
d1f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d200: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d210: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
d220: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
d230: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
d240: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20  sg(db));.       
d250: 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c   zCommit = "ROLL
d260: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 72  BACK";.        r
d270: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  c = 1;.        b
d280: 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 77 68  reak; /* from wh
d290: 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ile */.      }. 
d2a0: 20 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c     } /* end whil
d2b0: 65 20 2a 2f 0a 20 20 20 20 66 72 65 65 28 61 7a  e */.    free(az
d2c0: 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65  Col);.    fclose
d2d0: 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (in);.    sqlite
d2e0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
d2f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
d300: 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43 6f 6d 6d  xec(p->db, zComm
d310: 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  it, 0, 0, 0);.  
d320: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
d330: 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
d340: 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63 65  zArg[0], "indice
d350: 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  s", n)==0 && nAr
d360: 67 3c 33 20 29 7b 0a 20 20 20 20 73 74 72 75 63  g<3 ){.    struc
d370: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
d380: 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a  data;.    char *
d390: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
d3a0: 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20   open_db(p);.   
d3b0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
d3c0: 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
d3d0: 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
d3e0: 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
d3f0: 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  ta.mode = MODE_L
d400: 69 73 74 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  ist;.    if( nAr
d410: 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  g==1 ){.      rc
d420: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
d430: 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 22  p->db,.        "
d440: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
d450: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
d460: 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
d470: 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44  type='index' AND
d480: 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
d490: 73 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20  sqlite_%' ".    
d4a0: 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22      "UNION ALL "
d4b0: 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
d4c0: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
d4d0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a  e_temp_master ".
d4e0: 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
d4f0: 79 70 65 3d 27 69 6e 64 65 78 27 20 22 0a 20 20  ype='index' ".  
d500: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
d510: 31 22 2c 0a 20 20 20 20 20 20 20 20 63 61 6c 6c  1",.        call
d520: 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
d530: 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
d540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d550: 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61  zShellStatic = a
d560: 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72  zArg[1];.      r
d570: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
d580: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
d590: 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
d5a0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
d5b0: 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
d5c0: 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e   type='index' AN
d5d0: 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
d5e0: 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a  shellstatic() ".
d5f0: 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41          "UNION A
d600: 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45  LL ".        "SE
d610: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
d620: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
d630: 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
d640: 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
d650: 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  AND tbl_name LIK
d660: 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20  E shellstatic() 
d670: 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ".        "ORDER
d680: 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20   BY 1",.        
d690: 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
d6a0: 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20   &zErrMsg.      
d6b0: 29 3b 0a 20 20 20 20 20 20 7a 53 68 65 6c 6c 53  );.      zShellS
d6c0: 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 7d  tatic = 0;.    }
d6d0: 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
d6e0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
d6f0: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
d700: 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
d710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d720: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
d730: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
d740: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21 3d   }else if( rc !=
d750: 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20   SQLITE_OK ){.  
d760: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d770: 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72 79  rr,"Error: query
d780: 69 6e 67 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ing sqlite_maste
d790: 72 20 61 6e 64 20 73 71 6c 69 74 65 5f 74 65 6d  r and sqlite_tem
d7a0: 70 5f 6d 61 73 74 65 72 5c 6e 22 29 3b 0a 20 20  p_master\n");.  
d7b0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d7c0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 64 65  }.  }else..#ifde
d7d0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d7e0: 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d  IOTRACE.  if( c=
d7f0: 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
d800: 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61  azArg[0], "iotra
d810: 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
d820: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28 2a    extern void (*
d830: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28  sqlite3IoTrace)(
d840: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e  const char*, ...
d850: 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61  );.    if( iotra
d860: 63 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d 73  ce && iotrace!=s
d870: 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28 69  tdout ) fclose(i
d880: 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f 74  otrace);.    iot
d890: 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  race = 0;.    if
d8a0: 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20  ( nArg<2 ){.    
d8b0: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
d8c0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
d8d0: 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
d8e0: 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a  [1], "-")==0 ){.
d8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
d900: 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72  race = iotracePr
d910: 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74 72  intf;.      iotr
d920: 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  ace = stdout;.  
d930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
d940: 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28 61  otrace = fopen(a
d950: 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20  zArg[1], "w");. 
d960: 20 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65       if( iotrace
d970: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
d980: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
d990: 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
d9a0: 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  en \"%s\"\n", az
d9b0: 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
d9c0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
d9d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
d9e0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
d9f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
da00: 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61  3IoTrace = iotra
da10: 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20  cePrintf;.      
da20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
da30: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
da40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
da50: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28  _EXTENSION.  if(
da60: 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63   c=='l' && strnc
da70: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f  mp(azArg[0], "lo
da80: 61 64 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  ad", n)==0 && nA
da90: 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e  rg>=2 ){.    con
daa0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
dab0: 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72  *zProc;.    char
dac0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
dad0: 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
dae0: 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  [1];.    zProc =
daf0: 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67   nArg>=3 ? azArg
db00: 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65  [2] : 0;.    ope
db10: 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20 72 63 20  n_db(p);.    rc 
db20: 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  = sqlite3_load_e
db30: 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20  xtension(p->db, 
db40: 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a  zFile, zProc, &z
db50: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
db60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
db70: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
db80: 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
db90: 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
dba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
dbb0: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
dbc0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
dbd0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
dbe0: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
dbf0: 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
dc00: 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30  0], "log", n)==0
dc10: 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20   && nArg>=2 ){. 
dc20: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dc30: 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
dc40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67  .    if( p->pLog
dc50: 20 26 26 20 70 2d 3e 70 4c 6f 67 21 3d 73 74 64   && p->pLog!=std
dc60: 6f 75 74 20 26 26 20 70 2d 3e 70 4c 6f 67 21 3d  out && p->pLog!=
dc70: 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20 20 20  stderr ){.      
dc80: 66 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b  fclose(p->pLog);
dc90: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d  .      p->pLog =
dca0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
dcb0: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
dcc0: 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20  stdout")==0 ){. 
dcd0: 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 73       p->pLog = s
dce0: 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65  tdout;.    }else
dcf0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
dd00: 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20  e, "stderr")==0 
dd10: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67  ){.      p->pLog
dd20: 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20 20 7d   = stderr;.    }
dd30: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
dd40: 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30  zFile, "off")==0
dd50: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f   ){.      p->pLo
dd60: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
dd70: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20  {.      p->pLog 
dd80: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
dd90: 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  w");.      if( p
dda0: 2d 3e 70 4c 6f 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pLog==0 ){.   
ddb0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
ddc0: 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
ddd0: 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
dde0: 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
ddf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
de00: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20  e..  if( c=='m' 
de10: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
de20: 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d  [0], "mode", n)=
de30: 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b  =0 && nArg==2 ){
de40: 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 74  .    int n2 = st
de50: 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29  rlen30(azArg[1])
de60: 3b 0a 20 20 20 20 69 66 28 20 28 6e 32 3d 3d 34  ;.    if( (n2==4
de70: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
de80: 67 5b 31 5d 2c 22 6c 69 6e 65 22 2c 6e 32 29 3d  g[1],"line",n2)=
de90: 3d 30 29 0a 20 20 20 20 20 20 20 20 7c 7c 0a 20  =0).        ||. 
dea0: 20 20 20 20 20 20 20 28 6e 32 3d 3d 35 20 26 26         (n2==5 &&
deb0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
dec0: 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30  ],"lines",n2)==0
ded0: 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  ) ){.      p->mo
dee0: 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a  de = MODE_Line;.
def0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6e      }else if( (n
df00: 32 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28  2==6 && strncmp(
df10: 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e  azArg[1],"column
df20: 22 2c 6e 32 29 3d 3d 30 29 0a 20 20 20 20 20 20  ",n2)==0).      
df30: 20 20 20 20 20 20 20 20 7c 7c 0a 20 20 20 20 20          ||.     
df40: 20 20 20 20 20 20 20 20 20 28 6e 32 3d 3d 37 20           (n2==7 
df50: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
df60: 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32  [1],"columns",n2
df70: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70  )==0) ){.      p
df80: 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f  ->mode = MODE_Co
df90: 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20  lumn;.    }else 
dfa0: 69 66 28 20 6e 32 3d 3d 34 20 26 26 20 73 74 72  if( n2==4 && str
dfb0: 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c  ncmp(azArg[1],"l
dfc0: 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ist",n2)==0 ){. 
dfd0: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
dfe0: 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d 65  ODE_List;.    }e
dff0: 6c 73 65 20 69 66 28 20 6e 32 3d 3d 34 20 26 26  lse if( n2==4 &&
e000: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
e010: 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20  ],"html",n2)==0 
e020: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
e030: 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
e040: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d 3d    }else if( n2==
e050: 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
e060: 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d  rg[1],"tcl",n2)=
e070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
e080: 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a  ode = MODE_Tcl;.
e090: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32      }else if( n2
e0a0: 3d 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  ==3 && strncmp(a
e0b0: 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32  zArg[1],"csv",n2
e0c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
e0d0: 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76  >mode = MODE_Csv
e0e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e0f0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
e100: 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2c 20 70  p->separator), p
e110: 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22 2c 22  ->separator, ","
e120: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
e130: 20 6e 32 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d   n2==4 && strncm
e140: 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73  p(azArg[1],"tabs
e150: 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
e160: 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
e170: 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  _List;.      sql
e180: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
e190: 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f  zeof(p->separato
e1a0: 72 29 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  r), p->separator
e1b0: 2c 20 22 5c 74 22 29 3b 0a 20 20 20 20 7d 65 6c  , "\t");.    }el
e1c0: 73 65 20 69 66 28 20 6e 32 3d 3d 36 20 26 26 20  se if( n2==6 && 
e1d0: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
e1e0: 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30  ,"insert",n2)==0
e1f0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
e200: 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
e210: 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65  .      set_table
e220: 5f 6e 61 6d 65 28 70 2c 20 22 74 61 62 6c 65 22  _name(p, "table"
e230: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20  );.    }else {. 
e240: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
e250: 65 72 72 2c 22 45 72 72 6f 72 3a 20 6d 6f 64 65  err,"Error: mode
e260: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
e270: 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22 63  f: ".         "c
e280: 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69  olumn csv html i
e290: 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20  nsert line list 
e2a0: 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20  tabs tcl\n");.  
e2b0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e2c0: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
e2d0: 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63   c=='m' && strnc
e2e0: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f  mp(azArg[0], "mo
e2f0: 64 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  de", n)==0 && nA
e300: 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 69 6e 74  rg==3 ){.    int
e310: 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61   n2 = strlen30(a
e320: 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66  zArg[1]);.    if
e330: 28 20 6e 32 3d 3d 36 20 26 26 20 73 74 72 6e 63  ( n2==6 && strnc
e340: 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73  mp(azArg[1],"ins
e350: 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ert",n2)==0 ){. 
e360: 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
e370: 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
e380: 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65    set_table_name
e390: 28 70 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  (p, azArg[2]);. 
e3a0: 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20     }else {.     
e3b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
e3c0: 20 22 45 72 72 6f 72 3a 20 69 6e 76 61 6c 69 64   "Error: invalid
e3d0: 20 61 72 67 75 6d 65 6e 74 73 3a 20 22 0a 20 20   arguments: ".  
e3e0: 20 20 20 20 20 20 22 20 5c 22 25 73 5c 22 2e 20        " \"%s\". 
e3f0: 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20  Enter \".help\" 
e400: 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 61 7a 41  for help\n", azA
e410: 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 72 63  rg[2]);.      rc
e420: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
e430: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e  lse..  if( c=='n
e440: 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
e450: 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75  rg[0], "nullvalu
e460: 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  e", n)==0 && nAr
e470: 67 3d 3d 32 20 29 20 7b 0a 20 20 20 20 73 71 6c  g==2 ) {.    sql
e480: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
e490: 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75  zeof(p->nullvalu
e4a0: 65 29 2c 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  e), p->nullvalue
e4b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e4c0: 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28         "%.*s", (
e4d0: 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
e4e0: 3e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 20 61  >nullvalue)-1, a
e4f0: 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73  zArg[1]);.  }els
e500: 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 20  e..  if( c=='o' 
e510: 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
e520: 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e  [0], "output", n
e530: 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20  )==0 && nArg==2 
e540: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  ){.    if( p->ou
e550: 74 21 3d 73 74 64 6f 75 74 20 29 7b 0a 20 20 20  t!=stdout ){.   
e560: 20 20 20 66 63 6c 6f 73 65 28 70 2d 3e 6f 75 74     fclose(p->out
e570: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e580: 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
e590: 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b  ,"stdout")==0 ){
e5a0: 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
e5b0: 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 73 71  stdout;.      sq
e5c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
e5d0: 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
e5e0: 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
e5f0: 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 7d 65  stdout");.    }e
e600: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  lse{.      p->ou
e610: 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b  t = fopen(azArg[
e620: 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20  1], "wb");.     
e630: 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29   if( p->out==0 )
e640: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
e650: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
e660: 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
e670: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
e680: 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  g[1]);.        p
e690: 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
e6a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
e6b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
e6c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e6d0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
e6e0: 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
e6f0: 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 61  outfile, "%s", a
e700: 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
e710: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
e720: 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26  .  if( c=='p' &&
e730: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
e740: 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29 3d  ], "prompt", n)=
e750: 3d 30 20 26 26 20 28 6e 41 72 67 3d 3d 32 20 7c  =0 && (nArg==2 |
e760: 7c 20 6e 41 72 67 3d 3d 33 29 29 7b 0a 20 20 20  | nArg==3)){.   
e770: 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20   if( nArg >= 2) 
e780: 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28  {.      strncpy(
e790: 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67  mainPrompt,azArg
e7a0: 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69  [1],(int)ArraySi
e7b0: 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31  ze(mainPrompt)-1
e7c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e7d0: 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20   nArg >= 3) {.  
e7e0: 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74      strncpy(cont
e7f0: 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67  inuePrompt,azArg
e800: 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69  [2],(int)ArraySi
e810: 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70  ze(continuePromp
e820: 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t)-1);.    }.  }
e830: 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
e840: 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  q' && strncmp(az
e850: 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20  Arg[0], "quit", 
e860: 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 31  n)==0 && nArg==1
e870: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a   ){.    rc = 2;.
e880: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
e890: 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='r' && n>=3 &&
e8a0: 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
e8b0: 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30  ], "read", n)==0
e8c0: 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20   && nArg==2 ){. 
e8d0: 20 20 20 46 49 4c 45 20 2a 61 6c 74 20 3d 20 66     FILE *alt = f
e8e0: 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22  open(azArg[1], "
e8f0: 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c  rb");.    if( al
e900: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
e910: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
e920: 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
e930: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
e940: 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[1]);.      rc 
e950: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
e960: 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65        rc = proce
e970: 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74 29  ss_input(p, alt)
e980: 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 61  ;.      fclose(a
e990: 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  lt);.    }.  }el
e9a0: 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27  se..  if( c=='r'
e9b0: 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
e9c0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72  cmp(azArg[0], "r
e9d0: 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 26  estore", n)==0 &
e9e0: 26 20 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67  & nArg>1 && nArg
e9f0: 3c 34 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  <4){.    const c
ea00: 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20  har *zSrcFile;. 
ea10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ea20: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
ea30: 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  *pSrc;.    sqlit
ea40: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
ea50: 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d  up;.    int nTim
ea60: 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  eout = 0;..    i
ea70: 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
ea80: 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61      zSrcFile = a
ea90: 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a  zArg[1];.      z
eaa0: 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
eab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
eac0: 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32  rcFile = azArg[2
ead0: 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 61  ];.      zDb = a
eae0: 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 0a 20  zArg[1];.    }. 
eaf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
eb00: 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26  open(zSrcFile, &
eb10: 70 53 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pSrc);.    if( r
eb20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
eb30: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
eb40: 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
eb50: 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
eb60: 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a  \n", zSrcFile);.
eb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
eb80: 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20  ose(pSrc);.     
eb90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
eba0: 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b  .    open_db(p);
ebb0: 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
ebc0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
ebd0: 69 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70  it(p->db, zDb, p
ebe0: 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Src, "main");.  
ebf0: 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
ec00: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
ec10: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
ec20: 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
ec30: 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
ec40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
ec50: 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20  lose(pSrc);.    
ec60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
ec70: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  }.    while( (rc
ec80: 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
ec90: 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
eca0: 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  00))==SQLITE_OK.
ecb0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d            || rc=
ecc0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b  =SQLITE_BUSY  ){
ecd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
ece0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
ecf0: 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f        if( nTimeo
ed00: 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61  ut++ >= 3 ) brea
ed10: 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  k;.        sqlit
ed20: 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20  e3_sleep(100);. 
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ed40: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
ed50: 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
ed60: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ed70: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
ed80: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
ed90: 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
eda0: 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53  TE_BUSY || rc==S
edb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
edc0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
edd0: 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f  derr, "Error: so
ede0: 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73  urce database is
edf0: 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20   busy\n");.     
ee00: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
ee10: 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  se{.      fprint
ee20: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
ee30: 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
ee40: 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
ee50: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
ee60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ee70: 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
ee80: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
ee90: 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
eea0: 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61  zArg[0], "schema
eeb0: 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
eec0: 3c 33 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  <3 ){.    struct
eed0: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 64   callback_data d
eee0: 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
eef0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
ef00: 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20  open_db(p);.    
ef10: 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c  memcpy(&data, p,
ef20: 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a   sizeof(data));.
ef30: 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
ef40: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74  der = 0;.    dat
ef50: 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65  a.mode = MODE_Se
ef60: 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  mi;.    if( nArg
ef70: 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
ef80: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
ef90: 3b 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20 69  ; azArg[1][i]; i
efa0: 2b 2b 29 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 20  ++) azArg[1][i] 
efb0: 3d 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28  = (char)tolower(
efc0: 61 7a 41 72 67 5b 31 5d 5b 69 5d 29 3b 0a 20 20  azArg[1][i]);.  
efd0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
efe0: 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f  zArg[1],"sqlite_
eff0: 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  master")==0 ){. 
f000: 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77         char *new
f010: 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63  _argv[2], *new_c
f020: 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  olv[2];.        
f030: 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43  new_argv[0] = "C
f040: 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69  REATE TABLE sqli
f050: 74 65 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20  te_master (\n". 
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78       "  type tex
f080: 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  t,\n".          
f090: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e              "  n
f0a0: 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74     "  tbl_name t
f0d0: 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
f0f0: 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65   rootpage intege
f100: 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  r,\n".          
f110: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73              "  s
f120: 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20  ql text\n".     
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65   ")";.        ne
f150: 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_argv[1] = 0;. 
f160: 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
f170: 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20  0] = "sql";.    
f180: 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20      new_colv[1] 
f190: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c  = 0;.        cal
f1a0: 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20  lback(&data, 1, 
f1b0: 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f  new_argv, new_co
f1c0: 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  lv);.        rc 
f1d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f1e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
f1f0: 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73 71  cmp(azArg[1],"sq
f200: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
f210: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f220: 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b   char *new_argv[
f230: 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d  2], *new_colv[2]
f240: 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
f250: 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54 45 20  gv[0] = "CREATE 
f260: 54 45 4d 50 20 54 41 42 4c 45 20 73 71 6c 69 74  TEMP TABLE sqlit
f270: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 28 5c  e_temp_master (\
f280: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
f290: 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70 65           "  type
f2a0: 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  "  name text,\n"
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f2e0: 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61         "  tbl_na
f2f0: 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e    "  rootpage in
f320: 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20  teger,\n".      
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20  "  sql text\n". 
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 20 20 20 20 22 29 22 3b 0a 20 20 20 20 20 20       ")";.      
f370: 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20    new_argv[1] = 
f380: 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63  0;.        new_c
f390: 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a  olv[0] = "sql";.
f3a0: 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76          new_colv
f3b0: 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
f3c0: 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c   callback(&data,
f3d0: 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65   1, new_argv, ne
f3e0: 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20 20  w_colv);.       
f3f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f400: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f410: 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
f420: 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  ic = azArg[1];. 
f430: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f440: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a  te3_exec(p->db,.
f450: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
f460: 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a 20 20 20  T sql FROM ".   
f470: 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43         "  (SELEC
f480: 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20  T sql sql, type 
f490: 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74  type, tbl_name t
f4a0: 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61  bl_name, name na
f4b0: 6d 65 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  me".          " 
f4c0: 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f      FROM sqlite_
f4d0: 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c  master UNION ALL
f4e0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ".          "   
f4f0: 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65  SELECT sql, type
f500: 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  , tbl_name, name
f510: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
f520: 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20  p_master) ".    
f530: 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
f540: 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c  _name LIKE shell
f550: 73 74 61 74 69 63 28 29 20 41 4e 44 20 74 79 70  static() AND typ
f560: 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71  e!='meta' AND sq
f570: 6c 20 4e 4f 54 4e 55 4c 4c 20 22 0a 20 20 20 20  l NOTNULL ".    
f580: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
f590: 73 75 62 73 74 72 28 74 79 70 65 2c 32 2c 31 29  substr(type,2,1)
f5a0: 2c 20 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20  , name",.       
f5b0: 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
f5c0: 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
f5d0: 20 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61         zShellSta
f5e0: 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tic = 0;.      }
f5f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f600: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
f610: 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
f620: 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
f630: 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20 20 20  FROM ".         
f640: 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73  "  (SELECT sql s
f650: 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74  ql, type type, t
f660: 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65  bl_name tbl_name
f670: 2c 20 6e 61 6d 65 20 6e 61 6d 65 22 0a 20 20 20  , name name".   
f680: 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d        "     FROM
f690: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55   sqlite_master U
f6a0: 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20  NION ALL".      
f6b0: 20 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71     "   SELECT sq
f6c0: 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  l, type, tbl_nam
f6d0: 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  e, name FROM sql
f6e0: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29  ite_temp_master)
f6f0: 20 22 0a 20 20 20 20 20 20 20 20 20 22 57 48 45   ".         "WHE
f700: 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20  RE type!='meta' 
f710: 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20  AND sql NOTNULL 
f720: 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
f730: 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20  E 'sqlite_%'".  
f740: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
f750: 20 73 75 62 73 74 72 28 74 79 70 65 2c 32 2c 31   substr(type,2,1
f760: 29 2c 20 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  ), name",.      
f770: 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
f780: 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20  ta, &zErrMsg.   
f790: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
f7a0: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
f7b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
f7c0: 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
f7d0: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
f7e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f7f0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
f800: 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
f810: 65 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49  e if( rc != SQLI
f820: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
f830: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
f840: 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20 73  rror: querying s
f850: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
f860: 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  n\n");.      rc 
f870: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
f880: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
f890: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
f8a0: 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
f8b0: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
f8c0: 73 65 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d  separator", n)==
f8d0: 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a  0 && nArg==2 ){.
f8e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
f8f0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73  intf(sizeof(p->s
f900: 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65  eparator), p->se
f910: 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20  parator,.       
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
f930: 2e 2a 73 22 2c 20 28 69 6e 74 29 73 69 7a 65 6f  .*s", (int)sizeo
f940: 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2d  f(p->separator)-
f950: 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  1, azArg[1]);.  
f960: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
f970: 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
f980: 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77 22 2c  zArg[0], "show",
f990: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d   n)==0 && nArg==
f9a0: 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  1 ){.    int i;.
f9b0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
f9c0: 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
f9d0: 2c 22 65 63 68 6f 22 2c 20 70 2d 3e 65 63 68 6f  ,"echo", p->echo
f9e0: 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66  On ? "on" : "off
f9f0: 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
fa00: 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25  p->out,"%9.9s: %
fa10: 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e 22 2c 20  s\n","explain", 
fa20: 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 76  p->explainPrev.v
fa30: 61 6c 69 64 20 3f 20 22 6f 6e 22 20 3a 22 6f 66  alid ? "on" :"of
fa40: 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  f");.    fprintf
fa50: 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20  (p->out,"%9.9s: 
fa60: 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73 22 2c  %s\n","headers",
fa70: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3f   p->showHeader ?
fa80: 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a   "on" : "off");.
fa90: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
faa0: 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
fab0: 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 44 65 73  ,"mode", modeDes
fac0: 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20  cr[p->mode]);.  
fad0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
fae0: 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22 6e 75 6c  ,"%9.9s: ", "nul
faf0: 6c 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20 20  lvalue");.      
fb00: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
fb10: 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 75 6c 6c 76  p->out, p->nullv
fb20: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 66 70 72  alue);.      fpr
fb30: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
fb40: 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
fb50: 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25  p->out,"%9.9s: %
fb60: 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c 0a 20  s\n","output",. 
fb70: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
fb80: 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c 65 29 20  n30(p->outfile) 
fb90: 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20 3a 20 22  ? p->outfile : "
fba0: 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 66 70  stdout");.    fp
fbb0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
fbc0: 2e 39 73 3a 20 22 2c 20 22 73 65 70 61 72 61 74  .9s: ", "separat
fbd0: 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70  or");.      outp
fbe0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
fbf0: 75 74 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  ut, p->separator
fc00: 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
fc10: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
fc20: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
fc30: 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
fc40: 2c 22 73 74 61 74 73 22 2c 20 70 2d 3e 73 74 61  ,"stats", p->sta
fc50: 74 73 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  tsOn ? "on" : "o
fc60: 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
fc70: 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
fc80: 20 22 2c 22 77 69 64 74 68 22 29 3b 0a 20 20 20   ","width");.   
fc90: 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74   for (i=0;i<(int
fca0: 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  )ArraySize(p->co
fcb0: 6c 57 69 64 74 68 29 20 26 26 20 70 2d 3e 63 6f  lWidth) && p->co
fcc0: 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69  lWidth[i] != 0;i
fcd0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 66 70 72 69  ++) {.      fpri
fce0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 64 20 22  ntf(p->out,"%d "
fcf0: 2c 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 29  ,p->colWidth[i])
fd00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
fd10: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
fd20: 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
fd30: 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
fd40: 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 74  mp(azArg[0], "st
fd50: 61 74 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  ats", n)==0 && n
fd60: 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c 33 20  Arg>1 && nArg<3 
fd70: 29 7b 0a 20 20 20 20 70 2d 3e 73 74 61 74 73 4f  ){.    p->statsO
fd80: 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  n = booleanValue
fd90: 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65  (azArg[1]);.  }e
fda0: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74  lse..  if( c=='t
fdb0: 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e  ' && n>1 && strn
fdc0: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74  cmp(azArg[0], "t
fdd0: 61 62 6c 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26  ables", n)==0 &&
fde0: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 63   nArg<3 ){.    c
fdf0: 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a  har **azResult;.
fe00: 20 20 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20 20      int nRow;.  
fe10: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b    char *zErrMsg;
fe20: 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b  .    open_db(p);
fe30: 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31  .    if( nArg==1
fe40: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
fe50: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
fe60: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
fe70: 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
fe80: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
fe90: 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
fea0: 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65   type IN ('table
feb0: 27 2c 27 76 69 65 77 27 29 20 41 4e 44 20 6e 61  ','view') AND na
fec0: 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c  me NOT LIKE 'sql
fed0: 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20  ite_%' ".       
fee0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20   "UNION ALL ".  
fef0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
ff00: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  me FROM sqlite_t
ff10: 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  emp_master ".   
ff20: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
ff30: 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69   IN ('table','vi
ff40: 65 77 27 29 20 22 0a 20 20 20 20 20 20 20 20 22  ew') ".        "
ff50: 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20  ORDER BY 1",.   
ff60: 20 20 20 20 20 26 61 7a 52 65 73 75 6c 74 2c 20       &azResult, 
ff70: 26 6e 52 6f 77 2c 20 30 2c 20 26 7a 45 72 72 4d  &nRow, 0, &zErrM
ff80: 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  sg.      );.    
ff90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 68  }else{.      zSh
ffa0: 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72  ellStatic = azAr
ffb0: 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  g[1];.      rc =
ffc0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
ffd0: 6c 65 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  le(p->db,.      
ffe0: 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46    "SELECT name F
fff0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
10000 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
10010 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62  RE type IN ('tab
10020 6c 65 27 2c 27 76 69 65 77 27 29 20 41 4e 44 20  le','view') AND 
10030 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73  name LIKE shells
10040 74 61 74 69 63 28 29 20 22 0a 20 20 20 20 20 20  tatic() ".      
10050 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20    "UNION ALL ". 
10060 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
10070 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
10080 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20  temp_master ".  
10090 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
100a0 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76  e IN ('table','v
100b0 69 65 77 27 29 20 41 4e 44 20 6e 61 6d 65 20 4c  iew') AND name L
100c0 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28  IKE shellstatic(
100d0 29 20 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44  ) ".        "ORD
100e0 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
100f0 20 20 26 61 7a 52 65 73 75 6c 74 2c 20 26 6e 52    &azResult, &nR
10100 6f 77 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 0a  ow, 0, &zErrMsg.
10110 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
10120 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b  ShellStatic = 0;
10130 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
10140 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
10150 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
10160 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
10170 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
10180 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
10190 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
101a0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
101b0 20 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc != SQLITE_OK
101c0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
101d0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
101e0 20 71 75 65 72 79 69 6e 67 20 73 71 6c 69 74 65   querying sqlite
101f0 5f 6d 61 73 74 65 72 20 61 6e 64 20 73 71 6c 69  _master and sqli
10200 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 5c 6e  te_temp_master\n
10210 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
10220 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10230 20 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c     int len, maxl
10240 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
10250 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e  t i, j;.      in
10260 74 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72  t nPrintCol, nPr
10270 69 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f  intRow;.      fo
10280 72 28 69 3d 31 3b 20 69 3c 3d 6e 52 6f 77 3b 20  r(i=1; i<=nRow; 
10290 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
102a0 28 20 61 7a 52 65 73 75 6c 74 5b 69 5d 3d 3d 30  ( azResult[i]==0
102b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
102c0 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
102d0 6e 33 30 28 61 7a 52 65 73 75 6c 74 5b 69 5d 29  n30(azResult[i])
102e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
102f0 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65  n>maxlen ) maxle
10300 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d  n = len;.      }
10310 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 43 6f 6c  .      nPrintCol
10320 20 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32 29   = 80/(maxlen+2)
10330 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72 69  ;.      if( nPri
10340 6e 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e 74  ntCol<1 ) nPrint
10350 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  Col = 1;.      n
10360 50 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f 77  PrintRow = (nRow
10370 20 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20 31   + nPrintCol - 1
10380 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20 20  )/nPrintCol;.   
10390 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50     for(i=0; i<nP
103a0 72 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20  rintRow; i++){. 
103b0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31         for(j=i+1
103c0 3b 20 6a 3c 3d 6e 52 6f 77 3b 20 6a 2b 3d 6e 50  ; j<=nRow; j+=nP
103d0 72 69 6e 74 52 6f 77 29 7b 0a 20 20 20 20 20 20  rintRow){.      
103e0 20 20 20 20 63 68 61 72 20 2a 7a 53 70 20 3d 20      char *zSp = 
103f0 6a 3c 3d 6e 50 72 69 6e 74 52 6f 77 20 3f 20 22  j<=nPrintRow ? "
10400 22 20 3a 20 22 20 20 22 3b 0a 20 20 20 20 20 20  " : "  ";.      
10410 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 25 2d      printf("%s%-
10420 2a 73 22 2c 20 7a 53 70 2c 20 6d 61 78 6c 65 6e  *s", zSp, maxlen
10430 2c 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20  , azResult[j] ? 
10440 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3a 20 22 22  azResult[j] : ""
10450 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10460 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22       printf("\n"
10470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10480 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10490 65 5f 74 61 62 6c 65 28 61 7a 52 65 73 75 6c 74  e_table(azResult
104a0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
104b0 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 38  ( c=='t' && n>=8
104c0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
104d0 67 5b 30 5d 2c 20 22 74 65 73 74 63 74 72 6c 22  g[0], "testctrl"
104e0 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e  , n)==0 && nArg>
104f0 3d 32 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =2 ){.    static
10500 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
10510 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
10520 72 20 2a 7a 43 74 72 6c 4e 61 6d 65 3b 20 20 20  r *zCtrlName;   
10530 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 73  /* Name of a tes
10540 74 2d 63 6f 6e 74 72 6f 6c 20 6f 70 74 69 6f 6e  t-control option
10550 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 63   */.       int c
10560 74 72 6c 43 6f 64 65 3b 20 20 20 20 20 20 20 20  trlCode;        
10570 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63      /* Integer c
10580 6f 64 65 20 66 6f 72 20 74 68 61 74 20 6f 70 74  ode for that opt
10590 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 20 61 43 74  ion */.    } aCt
105a0 72 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  rl[] = {.      {
105b0 20 22 70 72 6e 67 5f 73 61 76 65 22 2c 20 20 20   "prng_save",   
105c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
105d0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
105e0 41 56 45 20 20 20 20 20 20 20 20 20 20 20 20 20  AVE             
105f0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72 6e   },.      { "prn
10600 67 5f 72 65 73 74 6f 72 65 22 2c 20 20 20 20 20  g_restore",     
10610 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
10620 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
10630 45 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  E           },. 
10640 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72 65 73       { "prng_res
10650 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  et",            
10660 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
10670 50 52 4e 47 5f 52 45 53 45 54 20 20 20 20 20 20  PRNG_RESET      
10680 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
10690 7b 20 22 62 69 74 76 65 63 5f 74 65 73 74 22 2c  { "bitvec_test",
106a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
106b0 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
106c0 43 5f 54 45 53 54 20 20 20 20 20 20 20 20 20 20  C_TEST          
106d0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 61    },.      { "fa
106e0 75 6c 74 5f 69 6e 73 74 61 6c 6c 22 2c 20 20 20  ult_install",   
106f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
10700 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54  TCTRL_FAULT_INST
10710 41 4c 4c 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ALL          },.
10720 20 20 20 20 20 20 7b 20 22 62 65 6e 69 67 6e 5f        { "benign_
10730 6d 61 6c 6c 6f 63 5f 68 6f 6f 6b 73 22 2c 20 20  malloc_hooks",  
10740 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
10750 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  _BENIGN_MALLOC_H
10760 4f 4f 4b 53 20 20 20 20 7d 2c 0a 20 20 20 20 20  OOKS    },.     
10770 20 7b 20 22 70 65 6e 64 69 6e 67 5f 62 79 74 65   { "pending_byte
10780 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
10790 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
107a0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
107b0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61     },.      { "a
107c0 73 73 65 72 74 22 2c 20 20 20 20 20 20 20 20 20  ssert",         
107d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
107e0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 20 20  STCTRL_ASSERT   
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
10800 0a 20 20 20 20 20 20 7b 20 22 61 6c 77 61 79 73  .      { "always
10810 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
10820 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
10830 4c 5f 41 4c 57 41 59 53 20 20 20 20 20 20 20 20  L_ALWAYS        
10840 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10850 20 20 7b 20 22 72 65 73 65 72 76 65 22 2c 20 20    { "reserve",  
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
10870 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
10880 45 52 56 45 20 20 20 20 20 20 20 20 20 20 20 20  ERVE            
10890 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
108a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 22 2c 20  optimizations", 
108b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
108c0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
108d0 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20 7d  TIONS          }
108e0 2c 0a 20 20 20 20 20 20 7b 20 22 69 73 6b 65 79  ,.      { "iskey
108f0 77 6f 72 64 22 2c 20 20 20 20 20 20 20 20 20 20  word",          
10900 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
10910 52 4c 5f 49 53 4b 45 59 57 4f 52 44 20 20 20 20  RL_ISKEYWORD    
10920 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
10930 20 20 20 7b 20 22 70 67 68 64 72 73 7a 22 2c 20     { "pghdrsz", 
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
10950 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 47  LITE_TESTCTRL_PG
10960 48 44 52 53 5a 20 20 20 20 20 20 20 20 20 20 20  HDRSZ           
10970 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
10980 22 73 63 72 61 74 63 68 6d 61 6c 6c 6f 63 22 2c  "scratchmalloc",
10990 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
109a0 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
109b0 4d 41 4c 4c 4f 43 20 20 20 20 20 20 20 20 20 20  MALLOC          
109c0 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
109d0 74 20 74 65 73 74 63 74 72 6c 20 3d 20 2d 31 3b  t testctrl = -1;
109e0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  .    int rc = 0;
109f0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
10a00 20 20 20 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 0a     open_db(p);..
10a10 20 20 20 20 2f 2a 20 63 6f 6e 76 65 72 74 20 74      /* convert t
10a20 65 73 74 63 74 72 6c 20 74 65 78 74 20 6f 70 74  estctrl text opt
10a30 69 6f 6e 20 74 6f 20 76 61 6c 75 65 2e 20 61 6c  ion to value. al
10a40 6c 6f 77 20 61 6e 79 20 75 6e 69 71 75 65 20 70  low any unique p
10a50 72 65 66 69 78 0a 20 20 20 20 2a 2a 20 6f 66 20  refix.    ** of 
10a60 74 68 65 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c  the option name,
10a70 20 6f 72 20 61 20 6e 75 6d 65 72 69 63 61 6c 20   or a numerical 
10a80 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 6e 20  value. */.    n 
10a90 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  = strlen30(azArg
10aa0 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [1]);.    for(i=
10ab0 30 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f  0; i<(int)(sizeo
10ac0 66 28 61 43 74 72 6c 29 2f 73 69 7a 65 6f 66 28  f(aCtrl)/sizeof(
10ad0 61 43 74 72 6c 5b 30 5d 29 29 3b 20 69 2b 2b 29  aCtrl[0])); i++)
10ae0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
10af0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 43  cmp(azArg[1], aC
10b00 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65  trl[i].zCtrlName
10b10 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
10b20 20 20 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c     if( testctrl<
10b30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  0 ){.          t
10b40 65 73 74 63 74 72 6c 20 3d 20 61 43 74 72 6c 5b  estctrl = aCtrl[
10b50 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20 20  i].ctrlCode;.   
10b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10b70 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
10b80 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73  derr, "ambiguous
10b90 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 3a 20 5c 22   option name: \"
10ba0 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  %s\"\n", azArg[i
10bb0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ]);.          te
10bc0 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20  stctrl = -1;.   
10bd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10bf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
10c00 73 74 63 74 72 6c 3c 30 20 29 20 74 65 73 74 63  stctrl<0 ) testc
10c10 74 72 6c 20 3d 20 61 74 6f 69 28 61 7a 41 72 67  trl = atoi(azArg
10c20 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 74  [1]);.    if( (t
10c30 65 73 74 63 74 72 6c 3c 53 51 4c 49 54 45 5f 54  estctrl<SQLITE_T
10c40 45 53 54 43 54 52 4c 5f 46 49 52 53 54 29 20 7c  ESTCTRL_FIRST) |
10c50 7c 20 28 74 65 73 74 63 74 72 6c 3e 53 51 4c 49  | (testctrl>SQLI
10c60 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 41 53 54  TE_TESTCTRL_LAST
10c70 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
10c80 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
10c90 3a 20 69 6e 76 61 6c 69 64 20 74 65 73 74 63 74  : invalid testct
10ca0 72 6c 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22  rl option: %s\n"
10cb0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
10cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 77   }else{.      sw
10cd0 69 74 63 68 28 74 65 73 74 63 74 72 6c 29 7b 0a  itch(testctrl){.
10ce0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
10cf0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
10d00 28 69 6e 74 2c 20 64 62 2c 20 69 6e 74 29 20 2a  (int, db, int) *
10d10 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
10d20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
10d30 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20 20  PTIMIZATIONS:.  
10d40 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
10d50 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
10d60 56 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  VE:             
10d70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
10d80 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
10d90 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20        int opt = 
10da0 28 69 6e 74 29 73 74 72 74 6f 6c 28 61 7a 41 72  (int)strtol(azAr
10db0 67 5b 32 5d 2c 20 30 2c 20 30 29 3b 20 20 20 20  g[2], 0, 0);    
10dc0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
10dd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65   rc = sqlite3_te
10de0 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
10df0 74 72 6c 2c 20 70 2d 3e 64 62 2c 20 6f 70 74 29  trl, p->db, opt)
10e00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
10e10 69 6e 74 66 28 22 25 64 20 28 30 78 25 30 38 78  intf("%d (0x%08x
10e20 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20  )\n", rc, rc);. 
10e30 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
10e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
10e50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
10e60 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73  ror: testctrl %s
10e70 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20   takes a single 
10e80 69 6e 74 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20  int option\n",. 
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20     azArg[1]);.  
10eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ec0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
10ed0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
10ee0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 29  est_control(int)
10ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65   */.        case
10f00 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
10f10 5f 50 52 4e 47 5f 53 41 56 45 3a 20 20 20 20 20  _PRNG_SAVE:     
10f20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 63        .        c
10f30 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
10f40 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
10f50 3a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  :        .      
10f60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
10f70 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
10f80 54 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  T:.        case 
10f90 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
10fa0 50 47 48 44 52 53 5a 3a 20 20 20 20 20 20 20 20  PGHDRSZ:        
10fb0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
10fc0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
10fd0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
10fe0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
10ff0 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 29 3b 0a  trol(testctrl);.
11000 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
11010 74 66 28 22 25 64 20 28 30 78 25 30 38 78 29 5c  tf("%d (0x%08x)\
11020 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20 20 20  n", rc, rc);.   
11030 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
11040 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
11050 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
11060 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20 74  r: testctrl %s t
11070 61 6b 65 73 20 6e 6f 20 6f 70 74 69 6f 6e 73 5c  akes no options\
11080 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
11090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
110a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
110b0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
110c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
110d0 2c 20 75 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20  , uint) */.     
110e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
110f0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
11100 42 59 54 45 3a 20 20 20 20 20 20 20 20 0a 20 20  BYTE:        .  
11110 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
11120 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==3 ){.         
11130 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
11140 6f 70 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  opt = (unsigned 
11150 69 6e 74 29 61 74 6f 69 28 61 7a 41 72 67 5b 32  int)atoi(azArg[2
11160 5d 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ]);        .    
11170 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11180 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
11190 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29  l(testctrl, opt)
111a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
111b0 69 6e 74 66 28 22 25 64 20 28 30 78 25 30 38 78  intf("%d (0x%08x
111c0 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20  )\n", rc, rc);. 
111d0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
111e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
111f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
11200 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73  ror: testctrl %s
11210 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20   takes a single 
11220 75 6e 73 69 67 6e 65 64 22 0a 20 20 20 20 20 20  unsigned".      
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 22 20 69 6e 74 20 6f 70 74 69 6f       " int optio
11250 6e 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  n\n", azArg[1]);
11260 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11270 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11280 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
11290 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
112a0 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 69 6e  _control(int, in
112b0 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  t) */.        ca
112c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
112d0 52 4c 5f 41 53 53 45 52 54 3a 20 20 20 20 20 20  RL_ASSERT:      
112e0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
112f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
11300 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 20 20  TCTRL_ALWAYS:   
11310 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
11320 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
11330 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
11340 20 69 6e 74 20 6f 70 74 20 3d 20 61 74 6f 69 28   int opt = atoi(
11350 61 7a 41 72 67 5b 32 5d 29 3b 20 20 20 20 20 20  azArg[2]);      
11360 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72    .            r
11370 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
11380 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72  _control(testctr
11390 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20  l, opt);.       
113a0 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 20       printf("%d 
113b0 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c  (0x%08x)\n", rc,
113c0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
113d0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
113e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
113f0 65 72 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74  err,"Error: test
11400 63 74 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20  ctrl %s takes a 
11410 73 69 6e 67 6c 65 20 69 6e 74 20 6f 70 74 69 6f  single int optio
11420 6e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  n\n",.          
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20    azArg[1]);.   
11450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11460 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
11470 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
11480 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20  st_control(int, 
11490 63 68 61 72 20 2a 29 20 2a 2f 0a 23 69 66 64 65  char *) */.#ifde
114a0 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
114b0 52 44 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  RD.        case 
114c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
114d0 49 53 4b 45 59 57 4f 52 44 3a 20 20 20 20 20 20  ISKEYWORD:      
114e0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
114f0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
11500 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
11510 20 63 68 61 72 20 2a 6f 70 74 20 3d 20 61 7a 41   char *opt = azA
11520 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 0a 20  rg[2];        . 
11530 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
11540 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
11550 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f  trol(testctrl, o
11560 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pt);.           
11570 20 70 72 69 6e 74 66 28 22 25 64 20 28 30 78 25   printf("%d (0x%
11580 30 38 78 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29  08x)\n", rc, rc)
11590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ;.          } el
115a0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
115b0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
115c0 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74 72 6c  "Error: testctrl
115d0 20 25 73 20 74 61 6b 65 73 20 61 20 73 69 6e 67   %s takes a sing
115e0 6c 65 20 63 68 61 72 20 2a 20 6f 70 74 69 6f 6e  le char * option
115f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
11620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11630 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
11640 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
11650 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
11660 54 56 45 43 5f 54 45 53 54 3a 20 20 20 20 20 20  TVEC_TEST:      
11670 20 20 20 0a 20 20 20 20 20 20 20 20 63 61 73 65     .        case
11680 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
11690 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20  _FAULT_INSTALL: 
116a0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 63        .        c
116b0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
116c0 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
116d0 43 5f 48 4f 4f 4b 53 3a 20 0a 20 20 20 20 20 20  C_HOOKS: .      
116e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
116f0 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
11700 4c 4c 4f 43 3a 20 20 20 20 20 20 20 0a 20 20 20  LLOC:       .   
11710 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
11720 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
11730 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 43  stderr,"Error: C
11740 4c 49 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  LI support for t
11750 65 73 74 63 74 72 6c 20 25 73 20 6e 6f 74 20 69  estctrl %s not i
11760 6d 70 6c 65 6d 65 6e 74 65 64 5c 6e 22 2c 0a 20  mplemented\n",. 
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
11790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
117a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
117b0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27  se..  if( c=='t'
117c0 20 26 26 20 6e 3e 34 20 26 26 20 73 74 72 6e 63   && n>4 && strnc
117d0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69  mp(azArg[0], "ti
117e0 6d 65 6f 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26  meout", n)==0 &&
117f0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
11800 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20  open_db(p);.    
11810 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
11820 65 6f 75 74 28 70 2d 3e 64 62 2c 20 61 74 6f 69  eout(p->db, atoi
11830 28 61 7a 41 72 67 5b 31 5d 29 29 3b 0a 20 20 7d  (azArg[1]));.  }
11840 65 6c 73 65 0a 20 20 20 20 0a 20 20 69 66 28 20  else.    .  if( 
11850 48 41 53 5f 54 49 4d 45 52 20 26 26 20 63 3d 3d  HAS_TIMER && c==
11860 27 74 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73  't' && n>=5 && s
11870 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
11880 20 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 0a   "timer", n)==0.
11890 20 20 20 26 26 20 6e 41 72 67 3d 3d 32 0a 20 20     && nArg==2.  
118a0 29 7b 0a 20 20 20 20 65 6e 61 62 6c 65 54 69 6d  ){.    enableTim
118b0 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  er = booleanValu
118c0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
118d0 65 6c 73 65 0a 20 20 0a 20 20 69 66 28 20 63 3d  else.  .  if( c=
118e0 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='v' && strncmp(
118f0 61 7a 41 72 67 5b 30 5d 2c 20 22 76 65 72 73 69  azArg[0], "versi
11900 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  on", n)==0 ){.  
11910 20 20 70 72 69 6e 74 66 28 22 53 51 4c 69 74 65    printf("SQLite
11920 20 25 73 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %s %s\n",.     
11930 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65     sqlite3_libve
11940 72 73 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33  rsion(), sqlite3
11950 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
11960 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
11970 27 77 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'w' && strncmp(a
11980 7a 41 72 67 5b 30 5d 2c 20 22 77 69 64 74 68 22  zArg[0], "width"
11990 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e  , n)==0 && nArg>
119a0 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  1 ){.    int j;.
119b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
119c0 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72  <=ArraySize(azAr
119d0 67 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  g) );.    for(j=
119e0 31 3b 20 6a 3c 6e 41 72 67 20 26 26 20 6a 3c 41  1; j<nArg && j<A
119f0 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57  rraySize(p->colW
11a00 69 64 74 68 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  idth); j++){.   
11a10 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 6a     p->colWidth[j
11a20 2d 31 5d 20 3d 20 61 74 6f 69 28 61 7a 41 72 67  -1] = atoi(azArg
11a30 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  [j]);.    }.  }e
11a40 6c 73 65 0a 0a 20 20 7b 0a 20 20 20 20 66 70 72  lse..  {.    fpr
11a50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
11a60 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d  ror: unknown com
11a70 6d 61 6e 64 20 6f 72 20 69 6e 76 61 6c 69 64 20  mand or invalid 
11a80 61 72 67 75 6d 65 6e 74 73 3a 20 22 0a 20 20 20  arguments: ".   
11a90 20 20 20 22 20 5c 22 25 73 5c 22 2e 20 45 6e 74     " \"%s\". Ent
11aa0 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72  er \".help\" for
11ab0 20 68 65 6c 70 5c 6e 22 2c 20 61 7a 41 72 67 5b   help\n", azArg[
11ac0 30 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0]);.    rc = 1;
11ad0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
11ae0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11af0 72 6e 20 54 52 55 45 20 69 66 20 61 20 73 65 6d  rn TRUE if a sem
11b00 69 63 6f 6c 6f 6e 20 6f 63 63 75 72 73 20 61 6e  icolon occurs an
11b10 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 66 69  ywhere in the fi
11b20 72 73 74 20 4e 20 63 68 61 72 61 63 74 65 72 73  rst N characters
11b30 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 20 7a 5b  .** of string z[
11b40 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ]..*/.static int
11b50 20 5f 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63   _contains_semic
11b60 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  olon(const char 
11b70 2a 7a 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  *z, int N){.  in
11b80 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
11b90 69 3c 4e 3b 20 69 2b 2b 29 7b 20 20 69 66 28 20  i<N; i++){  if( 
11ba0 7a 5b 69 5d 3d 3d 27 3b 27 20 29 20 72 65 74 75  z[i]==';' ) retu
11bb0 72 6e 20 31 3b 20 7d 0a 20 20 72 65 74 75 72 6e  rn 1; }.  return
11bc0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73   0;.}../*.** Tes
11bd0 74 20 74 6f 20 73 65 65 20 69 66 20 61 20 6c 69  t to see if a li
11be0 6e 65 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  ne consists enti
11bf0 72 65 6c 79 20 6f 66 20 77 68 69 74 65 73 70 61  rely of whitespa
11c00 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
11c10 74 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63  t _all_whitespac
11c20 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  e(const char *z)
11c30 7b 0a 20 20 66 6f 72 28 3b 20 2a 7a 3b 20 7a 2b  {.  for(; *z; z+
11c40 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73 73 70  +){.    if( issp
11c50 61 63 65 28 2a 28 75 6e 73 69 67 6e 65 64 20 63  ace(*(unsigned c
11c60 68 61 72 2a 29 7a 29 20 29 20 63 6f 6e 74 69 6e  har*)z) ) contin
11c70 75 65 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  ue;.    if( *z==
11c80 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27  '/' && z[1]=='*'
11c90 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 32   ){.      z += 2
11ca0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  ;.      while( *
11cb0 7a 20 26 26 20 28 2a 7a 21 3d 27 2a 27 20 7c 7c  z && (*z!='*' ||
11cc0 20 7a 5b 31 5d 21 3d 27 2f 27 29 20 29 7b 20 7a   z[1]!='/') ){ z
11cd0 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
11ce0 2a 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  *z==0 ) return 0
11cf0 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ;.      z++;.   
11d00 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11d10 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27   }.    if( *z=='
11d20 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
11d30 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b  ){.      z += 2;
11d40 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  .      while( *z
11d50 20 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 29 7b 20   && *z!='\n' ){ 
11d60 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  z++; }.      if(
11d70 20 2a 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   *z==0 ) return 
11d80 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
11d90 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
11da0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
11db0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
11dc0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11dd0 68 65 20 6c 69 6e 65 20 74 79 70 65 64 20 69 6e  he line typed in
11de0 20 69 73 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61   is an SQL comma
11df0 6e 64 20 74 65 72 6d 69 6e 61 74 6f 72 20 6f 74  nd terminator ot
11e00 68 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 73 65  her.** than a se
11e10 6d 69 2d 63 6f 6c 6f 6e 2e 20 20 54 68 65 20 53  mi-colon.  The S
11e20 51 4c 20 53 65 72 76 65 72 20 73 74 79 6c 65 20  QL Server style 
11e30 22 67 6f 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  "go" command is 
11e40 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 61 73  understood.** as
11e50 20 69 73 20 74 68 65 20 4f 72 61 63 6c 65 20 22   is the Oracle "
11e60 2f 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  /"..*/.static in
11e70 74 20 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65  t _is_command_te
11e80 72 6d 69 6e 61 74 6f 72 28 63 6f 6e 73 74 20 63  rminator(const c
11e90 68 61 72 20 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77  har *zLine){.  w
11ea0 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
11eb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
11ec0 4c 69 6e 65 29 20 29 7b 20 7a 4c 69 6e 65 2b 2b  Line) ){ zLine++
11ed0 3b 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65  ; };.  if( zLine
11ee0 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61 6c 6c  [0]=='/' && _all
11ef0 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c 69  _whitespace(&zLi
11f00 6e 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20 72 65  ne[1]) ){.    re
11f10 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72 61 63  turn 1;  /* Orac
11f20 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  le */.  }.  if( 
11f30 74 6f 6c 6f 77 65 72 28 7a 4c 69 6e 65 5b 30 5d  tolower(zLine[0]
11f40 29 3d 3d 27 67 27 20 26 26 20 74 6f 6c 6f 77 65  )=='g' && tolowe
11f50 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27 6f 27  r(zLine[1])=='o'
11f60 0a 20 20 20 20 20 20 20 20 20 26 26 20 5f 61 6c  .         && _al
11f70 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c  l_whitespace(&zL
11f80 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20 20 72  ine[2]) ){.    r
11f90 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53 51 4c  eturn 1;  /* SQL
11fa0 20 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d 0a 20   Server */.  }. 
11fb0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
11fc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
11fd0 69 66 20 7a 53 71 6c 20 69 73 20 61 20 63 6f 6d  if zSql is a com
11fe0 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d  plete SQL statem
11ff0 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  ent.  Return fal
12000 73 65 20 69 66 20 69 74 0a 2a 2a 20 65 6e 64 73  se if it.** ends
12010 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
12020 66 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  f a string liter
12030 61 6c 20 6f 72 20 43 2d 73 74 79 6c 65 20 63 6f  al or C-style co
12040 6d 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  mment..*/.static
12050 20 69 6e 74 20 5f 69 73 5f 63 6f 6d 70 6c 65 74   int _is_complet
12060 65 28 63 68 61 72 20 2a 7a 53 71 6c 2c 20 69 6e  e(char *zSql, in
12070 74 20 6e 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72  t nSql){.  int r
12080 63 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  c;.  if( zSql==0
12090 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7a   ) return 1;.  z
120a0 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 27 3b 27 3b  Sql[nSql] = ';';
120b0 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b 31 5d 20  .  zSql[nSql+1] 
120c0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
120d0 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71  te3_complete(zSq
120e0 6c 29 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d  l);.  zSql[nSql]
120f0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
12100 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
12110 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 69 6e 20   input from *in 
12120 61 6e 64 20 70 72 6f 63 65 73 73 20 69 74 2e 20  and process it. 
12130 20 49 66 20 2a 69 6e 3d 3d 30 20 74 68 65 6e 20   If *in==0 then 
12140 69 6e 70 75 74 0a 2a 2a 20 69 73 20 69 6e 74 65  input.** is inte
12150 72 61 63 74 69 76 65 20 2d 20 74 68 65 20 75 73  ractive - the us
12160 65 72 20 69 73 20 74 79 70 69 6e 67 20 69 74 20  er is typing it 
12170 69 74 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  it.  Otherwise, 
12180 69 6e 70 75 74 0a 2a 2a 20 69 73 20 63 6f 6d 69  input.** is comi
12190 6e 67 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 6f  ng from a file o
121a0 72 20 64 65 76 69 63 65 2e 20 20 41 20 70 72 6f  r device.  A pro
121b0 6d 70 74 20 69 73 20 69 73 73 75 65 64 20 61 6e  mpt is issued an
121c0 64 20 68 69 73 74 6f 72 79 0a 2a 2a 20 69 73 20  d history.** is 
121d0 73 61 76 65 64 20 6f 6e 6c 79 20 69 66 20 69 6e  saved only if in
121e0 70 75 74 20 69 73 20 69 6e 74 65 72 61 63 74 69  put is interacti
121f0 76 65 2e 20 20 41 6e 20 69 6e 74 65 72 72 75 70  ve.  An interrup
12200 74 20 73 69 67 6e 61 6c 20 77 69 6c 6c 0a 2a 2a  t signal will.**
12210 20 63 61 75 73 65 20 74 68 69 73 20 72 6f 75 74   cause this rout
12220 69 6e 65 20 74 6f 20 65 78 69 74 20 69 6d 6d 65  ine to exit imme
12230 64 69 61 74 65 6c 79 2c 20 75 6e 6c 65 73 73 20  diately, unless 
12240 69 6e 70 75 74 20 69 73 20 69 6e 74 65 72 61 63  input is interac
12250 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tive..**.** Retu
12260 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
12270 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74   errors..*/.stat
12280 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69  ic int process_i
12290 6e 70 75 74 28 73 74 72 75 63 74 20 63 61 6c 6c  nput(struct call
122a0 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46 49  back_data *p, FI
122b0 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  LE *in){.  char 
122c0 2a 7a 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 63 68  *zLine = 0;.  ch
122d0 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20  ar *zSql = 0;.  
122e0 69 6e 74 20 6e 53 71 6c 20 3d 20 30 3b 0a 20 20  int nSql = 0;.  
122f0 69 6e 74 20 6e 53 71 6c 50 72 69 6f 72 20 3d 20  int nSqlPrior = 
12300 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  0;.  char *zErrM
12310 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
12320 69 6e 74 20 65 72 72 43 6e 74 20 3d 20 30 3b 0a  int errCnt = 0;.
12330 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30    int lineno = 0
12340 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e  ;.  int startlin
12350 65 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  e = 0;..  while(
12360 20 65 72 72 43 6e 74 3d 3d 30 20 7c 7c 20 21 62   errCnt==0 || !b
12370 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 7c 7c 20  ail_on_error || 
12380 28 69 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e 5f  (in==0 && stdin_
12390 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 29 20  is_interactive) 
123a0 29 7b 0a 20 20 20 20 66 66 6c 75 73 68 28 70 2d  ){.    fflush(p-
123b0 3e 6f 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28  >out);.    free(
123c0 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 4c 69 6e  zLine);.    zLin
123d0 65 20 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69  e = one_input_li
123e0 6e 65 28 7a 53 71 6c 2c 20 69 6e 29 3b 0a 20 20  ne(zSql, in);.  
123f0 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
12400 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  {.      break;  
12410 2f 2a 20 57 65 20 68 61 76 65 20 72 65 61 63 68  /* We have reach
12420 65 64 20 45 4f 46 20 2a 2f 0a 20 20 20 20 7d 0a  ed EOF */.    }.
12430 20 20 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65      if( seenInte
12440 72 72 75 70 74 20 29 7b 0a 20 20 20 20 20 20 69  rrupt ){.      i
12450 66 28 20 69 6e 21 3d 30 20 29 20 62 72 65 61 6b  f( in!=0 ) break
12460 3b 0a 20 20 20 20 20 20 73 65 65 6e 49 6e 74 65  ;.      seenInte
12470 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  rrupt = 0;.    }
12480 0a 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  .    lineno++;. 
12490 20 20 20 69 66 28 20 28 7a 53 71 6c 3d 3d 30 20     if( (zSql==0 
124a0 7c 7c 20 7a 53 71 6c 5b 30 5d 3d 3d 30 29 20 26  || zSql[0]==0) &
124b0 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63  & _all_whitespac
124c0 65 28 7a 4c 69 6e 65 29 20 29 20 63 6f 6e 74 69  e(zLine) ) conti
124d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69  nue;.    if( zLi
124e0 6e 65 20 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d  ne && zLine[0]==
124f0 27 2e 27 20 26 26 20 6e 53 71 6c 3d 3d 30 20 29  '.' && nSql==0 )
12500 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
12510 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22  choOn ) printf("
12520 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20  %s\n", zLine);. 
12530 20 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74       rc = do_met
12540 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65 2c  a_command(zLine,
12550 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   p);.      if( r
12560 63 3d 3d 32 20 29 7b 20 2f 2a 20 65 78 69 74 20  c==2 ){ /* exit 
12570 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 20  requested */.   
12580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12590 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29    }else if( rc )
125a0 7b 0a 20 20 20 20 20 20 20 20 65 72 72 43 6e 74  {.        errCnt
125b0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
125c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
125d0 7d 0a 20 20 20 20 69 66 28 20 5f 69 73 5f 63 6f  }.    if( _is_co
125e0 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74 6f 72  mmand_terminator
125f0 28 7a 4c 69 6e 65 29 20 26 26 20 5f 69 73 5f 63  (zLine) && _is_c
12600 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 2c 20 6e 53  omplete(zSql, nS
12610 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ql) ){.      mem
12620 63 70 79 28 7a 4c 69 6e 65 2c 22 3b 22 2c 32 29  cpy(zLine,";",2)
12630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 71 6c  ;.    }.    nSql
12640 50 72 69 6f 72 20 3d 20 6e 53 71 6c 3b 0a 20 20  Prior = nSql;.  
12650 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
12660 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
12670 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4c 69      for(i=0; zLi
12680 6e 65 5b 69 5d 20 26 26 20 69 73 73 70 61 63 65  ne[i] && isspace
12690 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
126a0 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b  zLine[i]); i++){
126b0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  }.      if( zLin
126c0 65 5b 69 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  e[i]!=0 ){.     
126d0 20 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e     nSql = strlen
126e0 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  30(zLine);.     
126f0 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
12700 28 20 6e 53 71 6c 2b 33 20 29 3b 0a 20 20 20 20  ( nSql+3 );.    
12710 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
12720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
12730 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
12740 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
12750 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ry\n");.        
12760 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
12770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
12780 63 70 79 28 7a 53 71 6c 2c 20 7a 4c 69 6e 65 2c  cpy(zSql, zLine,
12790 20 6e 53 71 6c 2b 31 29 3b 0a 20 20 20 20 20 20   nSql+1);.      
127a0 20 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 6c 69    startline = li
127b0 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  neno;.      }.  
127c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
127d0 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33  nt len = strlen3
127e0 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  0(zLine);.      
127f0 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 20  zSql = realloc( 
12800 7a 53 71 6c 2c 20 6e 53 71 6c 20 2b 20 6c 65 6e  zSql, nSql + len
12810 20 2b 20 34 20 29 3b 0a 20 20 20 20 20 20 69 66   + 4 );.      if
12820 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
12830 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
12840 65 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20  err,"Error: out 
12850 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
12860 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a         exit(1);.
12870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
12880 71 6c 5b 6e 53 71 6c 2b 2b 5d 20 3d 20 27 5c 6e  ql[nSql++] = '\n
12890 27 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ';.      memcpy(
128a0 26 7a 53 71 6c 5b 6e 53 71 6c 5d 2c 20 7a 4c 69  &zSql[nSql], zLi
128b0 6e 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  ne, len+1);.    
128c0 20 20 6e 53 71 6c 20 2b 3d 20 6c 65 6e 3b 0a 20    nSql += len;. 
128d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 71     }.    if( zSq
128e0 6c 20 26 26 20 5f 63 6f 6e 74 61 69 6e 73 5f 73  l && _contains_s
128f0 65 6d 69 63 6f 6c 6f 6e 28 26 7a 53 71 6c 5b 6e  emicolon(&zSql[n
12900 53 71 6c 50 72 69 6f 72 5d 2c 20 6e 53 71 6c 2d  SqlPrior], nSql-
12910 6e 53 71 6c 50 72 69 6f 72 29 0a 20 20 20 20 20  nSqlPrior).     
12920 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
12930 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 7a  lite3_complete(z
12940 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 70 2d  Sql) ){.      p-
12950 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >cnt = 0;.      
12960 6f 70 65 6e 5f 64 62 28 70 29 3b 0a 20 20 20 20  open_db(p);.    
12970 20 20 42 45 47 49 4e 5f 54 49 4d 45 52 3b 0a 20    BEGIN_TIMER;. 
12980 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f       rc = shell_
12990 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  exec(p->db, zSql
129a0 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  , shell_callback
129b0 2c 20 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , p, &zErrMsg);.
129c0 20 20 20 20 20 20 45 4e 44 5f 54 49 4d 45 52 3b        END_TIMER;
129d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 7c 7c  .      if( rc ||
129e0 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
129f0 20 20 20 20 63 68 61 72 20 7a 50 72 65 66 69 78      char zPrefix
12a00 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  [100];.        i
12a10 66 28 20 69 6e 21 3d 30 20 7c 7c 20 21 73 74 64  f( in!=0 || !std
12a20 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
12a30 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
12a40 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12a50 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c  sizeof(zPrefix),
12a60 20 7a 50 72 65 66 69 78 2c 20 0a 20 20 20 20 20   zPrefix, .     
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 65        "Error: ne
12a90 61 72 20 6c 69 6e 65 20 25 64 3a 22 2c 20 73 74  ar line %d:", st
12aa0 61 72 74 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20  artline);.      
12ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12ac0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12ad0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66  ntf(sizeof(zPref
12ae0 69 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 45  ix), zPrefix, "E
12af0 72 72 6f 72 3a 22 29 3b 0a 20 20 20 20 20 20 20  rror:");.       
12b00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
12b10 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20  ErrMsg!=0 ){.   
12b20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
12b30 74 64 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22  tderr, "%s %s\n"
12b40 2c 20 7a 50 72 65 66 69 78 2c 20 7a 45 72 72 4d  , zPrefix, zErrM
12b50 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  sg);.          s
12b60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
12b70 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
12b80 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
12b90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12ba0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
12bb0 64 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c  derr, "%s %s\n",
12bc0 20 7a 50 72 65 66 69 78 2c 20 73 71 6c 69 74 65   zPrefix, sqlite
12bd0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
12be0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12bf0 20 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20      errCnt++;.  
12c00 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65      }.      free
12c10 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53  (zSql);.      zS
12c20 71 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 53  ql = 0;.      nS
12c30 71 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ql = 0;.    }.  
12c40 7d 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a  }.  if( zSql ){.
12c50 20 20 20 20 69 66 28 20 21 5f 61 6c 6c 5f 77 68      if( !_all_wh
12c60 69 74 65 73 70 61 63 65 28 7a 53 71 6c 29 20 29  itespace(zSql) )
12c70 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
12c80 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
12c90 69 6e 63 6f 6d 70 6c 65 74 65 20 53 51 4c 3a 20  incomplete SQL: 
12ca0 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
12cb0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 7a 53 71    }.    free(zSq
12cc0 6c 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  l);.  }.  free(z
12cd0 4c 69 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Line);.  return 
12ce0 65 72 72 43 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  errCnt;.}../*.**
12cf0 20 52 65 74 75 72 6e 20 61 20 70 61 74 68 6e 61   Return a pathna
12d00 6d 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  me which is the 
12d10 75 73 65 72 27 73 20 68 6f 6d 65 20 64 69 72 65  user's home dire
12d20 63 74 6f 72 79 2e 20 20 41 0a 2a 2a 20 30 20 72  ctory.  A.** 0 r
12d30 65 74 75 72 6e 20 69 6e 64 69 63 61 74 65 73 20  eturn indicates 
12d40 61 6e 20 65 72 72 6f 72 20 6f 66 20 73 6f 6d 65  an error of some
12d50 20 6b 69 6e 64 2e 20 20 53 70 61 63 65 20 74 6f   kind.  Space to
12d60 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 73   hold the.** res
12d70 75 6c 74 69 6e 67 20 73 74 72 69 6e 67 20 69 73  ulting string is
12d80 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
12d90 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
12da0 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
12db0 6e 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68  n should free th
12dc0 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  e result..*/.sta
12dd0 74 69 63 20 63 68 61 72 20 2a 66 69 6e 64 5f 68  tic char *find_h
12de0 6f 6d 65 5f 64 69 72 28 76 6f 69 64 29 7b 0a 20  ome_dir(void){. 
12df0 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20   char *home_dir 
12e00 3d 20 4e 55 4c 4c 3b 0a 0a 23 69 66 20 21 64 65  = NULL;..#if !de
12e10 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26  fined(_WIN32) &&
12e20 20 21 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29   !defined(WIN32)
12e30 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f   && !defined(__O
12e40 53 32 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  S2__) && !define
12e50 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 20 26 26  d(_WIN32_WCE) &&
12e60 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f   !defined(__RTP_
12e70 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
12e80 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 73 74  WRS_KERNEL).  st
12e90 72 75 63 74 20 70 61 73 73 77 64 20 2a 70 77 65  ruct passwd *pwe
12ea0 6e 74 3b 0a 20 20 75 69 64 5f 74 20 75 69 64 20  nt;.  uid_t uid 
12eb0 3d 20 67 65 74 75 69 64 28 29 3b 0a 20 20 69 66  = getuid();.  if
12ec0 28 20 28 70 77 65 6e 74 3d 67 65 74 70 77 75 69  ( (pwent=getpwui
12ed0 64 28 75 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29  d(uid)) != NULL)
12ee0 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20   {.    home_dir 
12ef0 3d 20 70 77 65 6e 74 2d 3e 70 77 5f 64 69 72 3b  = pwent->pw_dir;
12f00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
12f10 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f   defined(_WIN32_
12f20 57 43 45 29 0a 20 20 2f 2a 20 57 69 6e 64 6f 77  WCE).  /* Window
12f30 73 20 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d  s CE (arm-wince-
12f40 6d 69 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64  mingw32ce-gcc) d
12f50 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20  oes not provide 
12f60 67 65 74 65 6e 76 28 29 0a 20 20 20 2a 2f 0a 20  getenv().   */. 
12f70 20 68 6f 6d 65 5f 64 69 72 20 3d 20 73 74 72 64   home_dir = strd
12f80 75 70 28 22 2f 22 29 3b 0a 23 65 6c 73 65 0a 0a  up("/");.#else..
12f90 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
12fa0 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
12fb0 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
12fc0 28 5f 5f 4f 53 32 5f 5f 29 0a 20 20 69 66 20 28  (__OS2__).  if (
12fd0 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20  !home_dir) {.   
12fe0 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65   home_dir = gete
12ff0 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
13000 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
13010 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20   if (!home_dir) 
13020 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d  {.    home_dir =
13030 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 3b   getenv("HOME");
13040 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  .  }..#if define
13050 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
13060 69 6e 65 64 28 57 49 4e 33 32 29 20 7c 7c 20 64  ined(WIN32) || d
13070 65 66 69 6e 65 64 28 5f 5f 4f 53 32 5f 5f 29 0a  efined(__OS2__).
13080 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29    if (!home_dir)
13090 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 72   {.    char *zDr
130a0 69 76 65 2c 20 2a 7a 50 61 74 68 3b 0a 20 20 20  ive, *zPath;.   
130b0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 7a 44 72 69   int n;.    zDri
130c0 76 65 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d  ve = getenv("HOM
130d0 45 44 52 49 56 45 22 29 3b 0a 20 20 20 20 7a 50  EDRIVE");.    zP
130e0 61 74 68 20 3d 20 67 65 74 65 6e 76 28 22 48 4f  ath = getenv("HO
130f0 4d 45 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66  MEPATH");.    if
13100 28 20 7a 44 72 69 76 65 20 26 26 20 7a 50 61 74  ( zDrive && zPat
13110 68 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  h ){.      n = s
13120 74 72 6c 65 6e 33 30 28 7a 44 72 69 76 65 29 20  trlen30(zDrive) 
13130 2b 20 73 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  + strlen30(zPath
13140 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 68 6f 6d  ) + 1;.      hom
13150 65 5f 64 69 72 20 3d 20 6d 61 6c 6c 6f 63 28 20  e_dir = malloc( 
13160 6e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  n );.      if( h
13170 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 20 72 65 74  ome_dir==0 ) ret
13180 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  urn 0;.      sql
13190 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c  ite3_snprintf(n,
131a0 20 68 6f 6d 65 5f 64 69 72 2c 20 22 25 73 25 73   home_dir, "%s%s
131b0 22 2c 20 7a 44 72 69 76 65 2c 20 7a 50 61 74 68  ", zDrive, zPath
131c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
131d0 68 6f 6d 65 5f 64 69 72 3b 0a 20 20 20 20 7d 0a  home_dir;.    }.
131e0 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 22      home_dir = "
131f0 63 3a 5c 5c 22 3b 0a 20 20 7d 0a 23 65 6e 64 69  c:\\";.  }.#endi
13200 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 5f 57  f..#endif /* !_W
13210 49 4e 33 32 5f 57 43 45 20 2a 2f 0a 0a 20 20 69  IN32_WCE */..  i
13220 66 28 20 68 6f 6d 65 5f 64 69 72 20 29 7b 0a 20  f( home_dir ){. 
13230 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
13240 6e 33 30 28 68 6f 6d 65 5f 64 69 72 29 20 2b 20  n30(home_dir) + 
13250 31 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  1;.    char *z =
13260 20 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20   malloc( n );.  
13270 20 20 69 66 28 20 7a 20 29 20 6d 65 6d 63 70 79    if( z ) memcpy
13280 28 7a 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 6e 29  (z, home_dir, n)
13290 3b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d  ;.    home_dir =
132a0 20 7a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   z;.  }..  retur
132b0 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a 2f  n home_dir;.}../
132c0 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74 20  *.** Read input 
132d0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 67 69  from the file gi
132e0 76 65 6e 20 62 79 20 73 71 6c 69 74 65 72 63 5f  ven by sqliterc_
132f0 6f 76 65 72 72 69 64 65 2e 20 20 4f 72 20 69 66  override.  Or if
13300 20 74 68 61 74 0a 2a 2a 20 70 61 72 61 6d 65 74   that.** paramet
13310 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 61 6b 65  er is NULL, take
13320 20 69 6e 70 75 74 20 66 72 6f 6d 20 7e 2f 2e 73   input from ~/.s
13330 71 6c 69 74 65 72 63 0a 2a 2a 0a 2a 2a 20 52 65  qliterc.**.** Re
13340 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
13350 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73   of errors..*/.s
13360 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73  tatic int proces
13370 73 5f 73 71 6c 69 74 65 72 63 28 0a 20 20 73 74  s_sqliterc(.  st
13380 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
13390 74 61 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ta *p,        /*
133a0 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64   Configuration d
133b0 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ata */.  const c
133c0 68 61 72 20 2a 73 71 6c 69 74 65 72 63 5f 6f 76  har *sqliterc_ov
133d0 65 72 72 69 64 65 20 20 20 2f 2a 20 4e 61 6d 65  erride   /* Name
133e0 20 6f 66 20 63 6f 6e 66 69 67 20 66 69 6c 65 2e   of config file.
133f0 20 4e 55 4c 4c 20 74 6f 20 75 73 65 20 64 65 66   NULL to use def
13400 61 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ault */.){.  cha
13410 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55  r *home_dir = NU
13420 4c 4c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  LL;.  const char
13430 20 2a 73 71 6c 69 74 65 72 63 20 3d 20 73 71 6c   *sqliterc = sql
13440 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a  iterc_override;.
13450 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30    char *zBuf = 0
13460 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 4e  ;.  FILE *in = N
13470 55 4c 4c 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b  ULL;.  int nBuf;
13480 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a  .  int rc = 0;..
13490 20 20 69 66 20 28 73 71 6c 69 74 65 72 63 20 3d    if (sqliterc =
134a0 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f  = NULL) {.    ho
134b0 6d 65 5f 64 69 72 20 3d 20 66 69 6e 64 5f 68 6f  me_dir = find_ho
134c0 6d 65 5f 64 69 72 28 29 3b 0a 20 20 20 20 69 66  me_dir();.    if
134d0 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 7b  ( home_dir==0 ){
134e0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
134f0 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
13500 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
13510 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
13520 64 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a  derr,"%s: Error:
13530 20 63 61 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 79   cannot locate y
13540 6f 75 72 20 68 6f 6d 65 20 64 69 72 65 63 74 6f  our home directo
13550 72 79 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a 23  ry\n", Argv0);.#
13560 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
13570 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
13580 6e 42 75 66 20 3d 20 73 74 72 6c 65 6e 33 30 28  nBuf = strlen30(
13590 68 6f 6d 65 5f 64 69 72 29 20 2b 20 31 36 3b 0a  home_dir) + 16;.
135a0 20 20 20 20 7a 42 75 66 20 3d 20 6d 61 6c 6c 6f      zBuf = mallo
135b0 63 28 20 6e 42 75 66 20 29 3b 0a 20 20 20 20 69  c( nBuf );.    i
135c0 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( zBuf==0 ){.  
135d0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
135e0 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 6f  rr,"%s: Error: o
135f0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 2c  ut of memory\n",
13600 41 72 67 76 30 29 3b 0a 20 20 20 20 20 20 72 65  Argv0);.      re
13610 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
13620 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
13630 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 22 25  tf(nBuf, zBuf,"%
13640 73 2f 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d  s/.sqliterc",hom
13650 65 5f 64 69 72 29 3b 0a 20 20 20 20 66 72 65 65  e_dir);.    free
13660 28 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20  (home_dir);.    
13670 73 71 6c 69 74 65 72 63 20 3d 20 28 63 6f 6e 73  sqliterc = (cons
13680 74 20 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20  t char*)zBuf;.  
13690 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73  }.  in = fopen(s
136a0 71 6c 69 74 65 72 63 2c 22 72 62 22 29 3b 0a 20  qliterc,"rb");. 
136b0 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69   if( in ){.    i
136c0 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  f( stdin_is_inte
136d0 72 61 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  ractive ){.     
136e0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
136f0 22 2d 2d 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f  "-- Loading reso
13700 75 72 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22  urces from %s\n"
13710 2c 73 71 6c 69 74 65 72 63 29 3b 0a 20 20 20 20  ,sqliterc);.    
13720 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65  }.    rc = proce
13730 73 73 5f 69 6e 70 75 74 28 70 2c 69 6e 29 3b 0a  ss_input(p,in);.
13740 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
13750 20 20 7d 0a 20 20 66 72 65 65 28 7a 42 75 66 29    }.  free(zBuf)
13760 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13770 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 61 76 61  ../*.** Show ava
13780 69 6c 61 62 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c  ilable command l
13790 69 6e 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73  ine options.*/.s
137a0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
137b0 20 7a 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20 0a 20   zOptions[] = . 
137c0 20 22 20 20 20 2d 68 65 6c 70 20 20 20 20 20 20   "   -help      
137d0 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 20 74            show t
137e0 68 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20  his message\n". 
137f0 20 22 20 20 20 2d 69 6e 69 74 20 66 69 6c 65 6e   "   -init filen
13800 61 6d 65 20 20 20 20 20 20 20 72 65 61 64 2f 70  ame       read/p
13810 72 6f 63 65 73 73 20 6e 61 6d 65 64 20 66 69 6c  rocess named fil
13820 65 5c 6e 22 0a 20 20 22 20 20 20 2d 65 63 68 6f  e\n".  "   -echo
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 70 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62  print commands b
13850 65 66 6f 72 65 20 65 78 65 63 75 74 69 6f 6e 5c  efore execution\
13860 6e 22 0a 20 20 22 20 20 20 2d 5b 6e 6f 5d 68 65  n".  "   -[no]he
13870 61 64 65 72 20 20 20 20 20 20 20 20 20 20 74 75  ader          tu
13880 72 6e 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72  rn headers on or
13890 20 6f 66 66 5c 6e 22 0a 20 20 22 20 20 20 2d 62   off\n".  "   -b
138a0 61 69 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ail             
138b0 20 20 20 73 74 6f 70 20 61 66 74 65 72 20 68 69     stop after hi
138c0 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e  tting an error\n
138d0 22 0a 20 20 22 20 20 20 2d 69 6e 74 65 72 61 63  ".  "   -interac
138e0 74 69 76 65 20 20 20 20 20 20 20 20 20 66 6f 72  tive         for
138f0 63 65 20 69 6e 74 65 72 61 63 74 69 76 65 20 49  ce interactive I
13900 2f 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 74  /O\n".  "   -bat
13910 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
13920 20 66 6f 72 63 65 20 62 61 74 63 68 20 49 2f 4f   force batch I/O
13930 5c 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d  \n".  "   -colum
13940 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  n              s
13950 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74  et output mode t
13960 6f 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20  o 'column'\n".  
13970 22 20 20 20 2d 63 73 76 20 20 20 20 20 20 20 20  "   -csv        
13980 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74           set out
13990 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 63 73 76  put mode to 'csv
139a0 27 5c 6e 22 0a 20 20 22 20 20 20 2d 68 74 6d 6c  '\n".  "   -html
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  set output mode 
139d0 74 6f 20 48 54 4d 4c 5c 6e 22 0a 20 20 22 20 20  to HTML\n".  "  
139e0 20 2d 6c 69 6e 65 20 20 20 20 20 20 20 20 20 20   -line          
139f0 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
13a00 20 6d 6f 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c   mode to 'line'\
13a10 6e 22 0a 20 20 22 20 20 20 2d 6c 69 73 74 20 20  n".  "   -list  
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
13a30 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
13a40 20 27 6c 69 73 74 27 5c 6e 22 0a 20 20 22 20 20   'list'\n".  "  
13a50 20 2d 73 65 70 61 72 61 74 6f 72 20 27 78 27 20   -separator 'x' 
13a60 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
13a70 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
13a80 20 28 7c 29 5c 6e 22 0a 20 20 22 20 20 20 2d 73   (|)\n".  "   -s
13a90 74 61 74 73 20 20 20 20 20 20 20 20 20 20 20 20  tats            
13aa0 20 20 20 70 72 69 6e 74 20 6d 65 6d 6f 72 79 20     print memory 
13ab0 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63  stats before eac
13ac0 68 20 66 69 6e 61 6c 69 7a 65 5c 6e 22 0a 20 20  h finalize\n".  
13ad0 22 20 20 20 2d 6e 75 6c 6c 76 61 6c 75 65 20 27  "   -nullvalue '
13ae0 74 65 78 74 27 20 20 20 20 73 65 74 20 74 65 78  text'    set tex
13af0 74 20 73 74 72 69 6e 67 20 66 6f 72 20 4e 55 4c  t string for NUL
13b00 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20  L values\n".  " 
13b10 20 20 2d 76 65 72 73 69 6f 6e 20 20 20 20 20 20    -version      
13b20 20 20 20 20 20 20 20 73 68 6f 77 20 53 51 4c 69         show SQLi
13b30 74 65 20 76 65 72 73 69 6f 6e 5c 6e 22 0a 20 20  te version\n".  
13b40 22 20 20 20 2d 76 66 73 20 4e 41 4d 45 20 20 20  "   -vfs NAME   
13b50 20 20 20 20 20 20 20 20 20 75 73 65 20 4e 41 4d           use NAM
13b60 45 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74  E as the default
13b70 20 56 46 53 5c 6e 22 0a 23 69 66 64 65 66 20 53   VFS\n".#ifdef S
13b80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53  QLITE_ENABLE_VFS
13b90 54 52 41 43 45 0a 20 20 22 20 20 20 2d 76 66 73  TRACE.  "   -vfs
13ba0 74 72 61 63 65 20 20 20 20 20 20 20 20 20 20 20  trace           
13bb0 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13bc0 6f 66 20 61 6c 6c 20 56 46 53 20 63 61 6c 6c 73  of all VFS calls
13bd0 5c 6e 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  \n".#endif.#ifde
13be0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13bf0 4d 55 4c 54 49 50 4c 45 58 0a 20 20 22 20 20 20  MULTIPLEX.  "   
13c00 2d 6d 75 6c 74 69 70 6c 65 78 20 20 20 20 20 20  -multiplex      
13c10 20 20 20 20 20 65 6e 61 62 6c 65 20 74 68 65 20       enable the 
13c20 6d 75 6c 74 69 70 6c 65 78 6f 72 20 56 46 53 5c  multiplexor VFS\
13c30 6e 22 0a 23 65 6e 64 69 66 0a 3b 0a 73 74 61 74  n".#endif.;.stat
13c40 69 63 20 76 6f 69 64 20 75 73 61 67 65 28 69 6e  ic void usage(in
13c50 74 20 73 68 6f 77 44 65 74 61 69 6c 29 7b 0a 20  t showDetail){. 
13c60 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
13c70 0a 20 20 20 20 20 20 22 55 73 61 67 65 3a 20 25  .      "Usage: %
13c80 73 20 5b 4f 50 54 49 4f 4e 53 5d 20 46 49 4c 45  s [OPTIONS] FILE
13c90 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22 20 20 0a  NAME [SQL]\n"  .
13ca0 20 20 20 20 20 20 22 46 49 4c 45 4e 41 4d 45 20        "FILENAME 
13cb0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
13cc0 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
13cd0 65 2e 20 41 20 6e 65 77 20 64 61 74 61 62 61 73  e. A new databas
13ce0 65 20 69 73 20 63 72 65 61 74 65 64 5c 6e 22 0a  e is created\n".
13cf0 20 20 20 20 20 20 22 69 66 20 74 68 65 20 66 69        "if the fi
13d00 6c 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76  le does not prev
13d10 69 6f 75 73 6c 79 20 65 78 69 73 74 2e 5c 6e 22  iously exist.\n"
13d20 2c 20 41 72 67 76 30 29 3b 0a 20 20 69 66 28 20  , Argv0);.  if( 
13d30 73 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a 20 20  showDetail ){.  
13d40 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
13d50 2c 20 22 4f 50 54 49 4f 4e 53 20 69 6e 63 6c 75  , "OPTIONS inclu
13d60 64 65 3a 5c 6e 25 73 22 2c 20 7a 4f 70 74 69 6f  de:\n%s", zOptio
13d70 6e 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ns);.  }else{.  
13d80 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
13d90 2c 20 22 55 73 65 20 74 68 65 20 2d 68 65 6c 70  , "Use the -help
13da0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 61 64 64 69   option for addi
13db0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
13dc0 6f 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 65 78  on\n");.  }.  ex
13dd0 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(1);.}../*.** 
13de0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
13df0 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
13e00 20 69 6e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74   in data.*/.stat
13e10 69 63 20 76 6f 69 64 20 6d 61 69 6e 5f 69 6e 69  ic void main_ini
13e20 74 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63  t(struct callbac
13e30 6b 5f 64 61 74 61 20 2a 64 61 74 61 29 20 7b 0a  k_data *data) {.
13e40 20 20 6d 65 6d 73 65 74 28 64 61 74 61 2c 20 30    memset(data, 0
13e50 2c 20 73 69 7a 65 6f 66 28 2a 64 61 74 61 29 29  , sizeof(*data))
13e60 3b 0a 20 20 64 61 74 61 2d 3e 6d 6f 64 65 20 3d  ;.  data->mode =
13e70 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 6d 65   MODE_List;.  me
13e80 6d 63 70 79 28 64 61 74 61 2d 3e 73 65 70 61 72  mcpy(data->separ
13e90 61 74 6f 72 2c 22 7c 22 2c 20 32 29 3b 0a 20 20  ator,"|", 2);.  
13ea0 64 61 74 61 2d 3e 73 68 6f 77 48 65 61 64 65 72  data->showHeader
13eb0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
13ec0 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
13ed0 4e 46 49 47 5f 55 52 49 2c 20 31 29 3b 0a 20 20  NFIG_URI, 1);.  
13ee0 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
13ef0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47  QLITE_CONFIG_LOG
13f00 2c 20 73 68 65 6c 6c 4c 6f 67 2c 20 64 61 74 61  , shellLog, data
13f10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
13f20 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 6d 61 69  rintf(sizeof(mai
13f30 6e 50 72 6f 6d 70 74 29 2c 20 6d 61 69 6e 50 72  nPrompt), mainPr
13f40 6f 6d 70 74 2c 22 73 71 6c 69 74 65 3e 20 22 29  ompt,"sqlite> ")
13f50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
13f60 69 6e 74 66 28 73 69 7a 65 6f 66 28 63 6f 6e 74  intf(sizeof(cont
13f70 69 6e 75 65 50 72 6f 6d 70 74 29 2c 20 63 6f 6e  inuePrompt), con
13f80 74 69 6e 75 65 50 72 6f 6d 70 74 2c 22 20 20 20  tinuePrompt,"   
13f90 2e 2e 2e 3e 20 22 29 3b 0a 20 20 73 71 6c 69 74  ...> ");.  sqlit
13fa0 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
13fb0 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
13fc0 52 45 41 44 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61  READ);.}..int ma
13fd0 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
13fe0 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61  r **argv){.  cha
13ff0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
14000 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
14010 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20 63  k_data data;.  c
14020 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 69 74  onst char *zInit
14030 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  File = 0;.  char
14040 20 2a 7a 46 69 72 73 74 43 6d 64 20 3d 20 30 3b   *zFirstCmd = 0;
14050 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
14060 72 63 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 73  rc = 0;..  if( s
14070 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 73 6f  trcmp(sqlite3_so
14080 75 72 63 65 69 64 28 29 2c 53 51 4c 49 54 45 5f  urceid(),SQLITE_
14090 53 4f 55 52 43 45 5f 49 44 29 21 3d 30 20 29 7b  SOURCE_ID)!=0 ){
140a0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
140b0 65 72 72 2c 20 22 53 51 4c 69 74 65 20 68 65 61  err, "SQLite hea
140c0 64 65 72 20 61 6e 64 20 73 6f 75 72 63 65 20 76  der and source v
140d0 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 5c  ersion mismatch\
140e0 6e 25 73 5c 6e 25 73 5c 6e 22 2c 0a 20 20 20 20  n%s\n%s\n",.    
140f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14100 73 6f 75 72 63 65 69 64 28 29 2c 20 53 51 4c 49  sourceid(), SQLI
14110 54 45 5f 53 4f 55 52 43 45 5f 49 44 29 3b 0a 20  TE_SOURCE_ID);. 
14120 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
14130 20 20 41 72 67 76 30 20 3d 20 61 72 67 76 5b 30    Argv0 = argv[0
14140 5d 3b 0a 20 20 6d 61 69 6e 5f 69 6e 69 74 28 26  ];.  main_init(&
14150 64 61 74 61 29 3b 0a 20 20 73 74 64 69 6e 5f 69  data);.  stdin_i
14160 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
14170 69 73 61 74 74 79 28 30 29 3b 0a 0a 20 20 2f 2a  isatty(0);..  /*
14180 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
14190 76 65 20 61 20 76 61 6c 69 64 20 73 69 67 6e 61  ve a valid signa
141a0 6c 20 68 61 6e 64 6c 65 72 20 65 61 72 6c 79 2c  l handler early,
141b0 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67   before anything
141c0 0a 20 20 2a 2a 20 65 6c 73 65 20 69 73 20 64 6f  .  ** else is do
141d0 6e 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ne..  */.#ifdef 
141e0 53 49 47 49 4e 54 0a 20 20 73 69 67 6e 61 6c 28  SIGINT.  signal(
141f0 53 49 47 49 4e 54 2c 20 69 6e 74 65 72 72 75 70  SIGINT, interrup
14200 74 5f 68 61 6e 64 6c 65 72 29 3b 0a 23 65 6e 64  t_handler);.#end
14210 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 69  if..  /* Do an i
14220 6e 69 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f  nitial pass thro
14230 75 67 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d  ugh the command-
14240 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  line argument to
14250 20 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65   locate.  ** the
14260 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
14270 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20  abase file, the 
14280 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 69 74  name of the init
14290 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2c  ialization file,
142a0 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f  .  ** the size o
142b0 66 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76  f the alternativ
142c0 65 20 6d 61 6c 6c 6f 63 20 68 65 61 70 2c 0a 20  e malloc heap,. 
142d0 20 2a 2a 20 61 6e 64 20 74 68 65 20 66 69 72 73   ** and the firs
142e0 74 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65  t command to exe
142f0 63 75 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  cute..  */.  for
14300 28 69 3d 31 3b 20 69 3c 61 72 67 63 2d 31 3b 20  (i=1; i<argc-1; 
14310 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
14320 7a 3b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b  z;.    if( argv[
14330 69 5d 5b 30 5d 21 3d 27 2d 27 20 29 20 62 72 65  i][0]!='-' ) bre
14340 61 6b 3b 0a 20 20 20 20 7a 20 3d 20 61 72 67 76  ak;.    z = argv
14350 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [i];.    if( z[0
14360 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='-' && z[1]==
14370 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69  '-' ) z++;.    i
14380 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
14390 5d 2c 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d  ],"-separator")=
143a0 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 61 72 67  =0 || strcmp(arg
143b0 76 5b 69 5d 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65  v[i],"-nullvalue
143c0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
143d0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
143e0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
143f0 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a  ,"-init")==0 ){.
14400 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
14410 20 7a 49 6e 69 74 46 69 6c 65 20 3d 20 61 72 67   zInitFile = arg
14420 76 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 4e 65 65  v[i];.    /* Nee
14430 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 62  d to check for b
14440 61 74 63 68 20 6d 6f 64 65 20 68 65 72 65 20 74  atch mode here t
14450 6f 20 73 6f 20 77 65 20 63 61 6e 20 61 76 6f 69  o so we can avoi
14460 64 20 70 72 69 6e 74 69 6e 67 0a 20 20 20 20 2a  d printing.    *
14470 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 61 6c 20  * informational 
14480 6d 65 73 73 61 67 65 73 20 28 6c 69 6b 65 20 66  messages (like f
14490 72 6f 6d 20 70 72 6f 63 65 73 73 5f 73 71 6c 69  rom process_sqli
144a0 74 65 72 63 29 20 62 65 66 6f 72 65 20 0a 20 20  terc) before .  
144b0 20 20 2a 2a 20 77 65 20 64 6f 20 74 68 65 20 61    ** we do the a
144c0 63 74 75 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ctual processing
144d0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6c 61   of arguments la
144e0 74 65 72 20 69 6e 20 61 20 73 65 63 6f 6e 64 20  ter in a second 
144f0 70 61 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pass..    */.   
14500 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
14510 70 28 61 72 67 76 5b 69 5d 2c 22 2d 62 61 74 63  p(argv[i],"-batc
14520 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
14530 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
14540 74 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  tive = 0;.    }e
14550 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
14560 72 67 76 5b 69 5d 2c 22 2d 68 65 61 70 22 29 3d  rgv[i],"-heap")=
14570 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
14580 6a 2c 20 63 3b 0a 20 20 20 20 20 20 63 6f 6e 73  j, c;.      cons
14590 74 20 63 68 61 72 20 2a 7a 53 69 7a 65 3b 0a 20  t char *zSize;. 
145a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
145b0 36 34 20 73 7a 48 65 61 70 3b 0a 0a 20 20 20 20  64 szHeap;..    
145c0 20 20 7a 53 69 7a 65 20 3d 20 61 72 67 76 5b 2b    zSize = argv[+
145d0 2b 69 5d 3b 0a 20 20 20 20 20 20 73 7a 48 65 61  +i];.      szHea
145e0 70 20 3d 20 61 74 6f 69 28 7a 53 69 7a 65 29 3b  p = atoi(zSize);
145f0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
14600 28 63 20 3d 20 7a 53 69 7a 65 5b 6a 5d 29 21 3d  (c = zSize[j])!=
14610 30 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; j++){.       
14620 20 69 66 28 20 63 3d 3d 27 4d 27 20 29 7b 20 73   if( c=='M' ){ s
14630 7a 48 65 61 70 20 2a 3d 20 31 30 30 30 30 30 30  zHeap *= 1000000
14640 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
14650 20 20 20 69 66 28 20 63 3d 3d 27 4b 27 20 29 7b     if( c=='K' ){
14660 20 73 7a 48 65 61 70 20 2a 3d 20 31 30 30 30 3b   szHeap *= 1000;
14670 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
14680 20 20 69 66 28 20 63 3d 3d 27 47 27 20 29 7b 20    if( c=='G' ){ 
14690 73 7a 48 65 61 70 20 2a 3d 20 31 30 30 30 30 30  szHeap *= 100000
146a0 30 30 30 30 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  0000; break; }. 
146b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
146c0 20 73 7a 48 65 61 70 3e 30 78 37 66 66 66 30 30   szHeap>0x7fff00
146d0 30 30 20 29 20 73 7a 48 65 61 70 20 3d 20 30 78  00 ) szHeap = 0x
146e0 37 66 66 66 30 30 30 30 3b 0a 23 69 66 20 64 65  7fff0000;.#if de
146f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
14700 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20  BLE_MEMSYS3) || 
14710 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
14720 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20  NABLE_MEMSYS5). 
14730 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e       sqlite3_con
14740 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
14750 47 5f 48 45 41 50 2c 20 6d 61 6c 6c 6f 63 28 28  G_HEAP, malloc((
14760 69 6e 74 29 73 7a 48 65 61 70 29 2c 20 28 69 6e  int)szHeap), (in
14770 74 29 73 7a 48 65 61 70 2c 20 36 34 29 3b 0a 23  t)szHeap, 64);.#
14780 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
14790 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52  ITE_ENABLE_VFSTR
147a0 41 43 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ACE.    }else if
147b0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
147c0 2c 22 2d 76 66 73 74 72 61 63 65 22 29 3d 3d 30  ,"-vfstrace")==0
147d0 20 29 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e   ){.      extern
147e0 20 69 6e 74 20 76 66 73 74 72 61 63 65 5f 72 65   int vfstrace_re
147f0 67 69 73 74 65 72 28 0a 20 20 20 20 20 20 20 20  gister(.        
14800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 72   const char *zTr
14810 61 63 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  aceName,.       
14820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
14830 6c 64 56 66 73 4e 61 6d 65 2c 0a 20 20 20 20 20  ldVfsName,.     
14840 20 20 20 20 69 6e 74 20 28 2a 78 4f 75 74 29 28      int (*xOut)(
14850 63 6f 6e 73 74 20 63 68 61 72 2a 2c 76 6f 69 64  const char*,void
14860 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 76 6f 69  *),.         voi
14870 64 20 2a 70 4f 75 74 41 72 67 2c 0a 20 20 20 20  d *pOutArg,.    
14880 20 20 20 20 20 69 6e 74 20 6d 61 6b 65 44 65 66       int makeDef
14890 61 75 6c 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  ault.      );.  
148a0 20 20 20 20 76 66 73 74 72 61 63 65 5f 72 65 67      vfstrace_reg
148b0 69 73 74 65 72 28 22 74 72 61 63 65 22 2c 30 2c  ister("trace",0,
148c0 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
148d0 61 72 2a 2c 76 6f 69 64 2a 29 29 66 70 75 74 73  ar*,void*))fputs
148e0 2c 73 74 64 65 72 72 2c 31 29 3b 0a 23 65 6e 64  ,stderr,1);.#end
148f0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
14900 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 50 4c 45  _ENABLE_MULTIPLE
14910 58 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  X.    }else if( 
14920 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
14930 2d 6d 75 6c 74 69 70 6c 65 78 22 29 3d 3d 30 20  -multiplex")==0 
14940 29 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20  ){.      extern 
14950 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74  int sqlite3_mult
14960 69 70 6c 65 5f 69 6e 69 74 69 61 6c 69 7a 65 28  iple_initialize(
14970 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
14980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14990 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61  multiplex_initia
149a0 6c 69 7a 65 28 30 2c 20 31 29 3b 0a 23 65 6e 64  lize(0, 1);.#end
149b0 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
149c0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
149d0 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20  "-vfs")==0 ){.  
149e0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
149f0 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
14a00 76 66 73 5f 66 69 6e 64 28 61 72 67 76 5b 2b 2b  vfs_find(argv[++
14a10 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  i]);.      if( p
14a20 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Vfs ){.        s
14a30 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
14a40 74 65 72 28 70 56 66 73 2c 20 31 29 3b 0a 20 20  ter(pVfs, 1);.  
14a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a60 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
14a70 72 2c 20 22 6e 6f 20 73 75 63 68 20 56 46 53 3a  r, "no such VFS:
14a80 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 72 67 76   \"%s\"\n", argv
14a90 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 65 78  [i]);.        ex
14aa0 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(1);.      }. 
14ab0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
14ac0 3c 61 72 67 63 20 29 7b 0a 23 69 66 20 64 65 66  <argc ){.#if def
14ad0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 53 5f 4f  ined(SQLITE_OS_O
14ae0 53 32 29 20 26 26 20 53 51 4c 49 54 45 5f 4f 53  S2) && SQLITE_OS
14af0 5f 4f 53 32 0a 20 20 20 20 64 61 74 61 2e 7a 44  _OS2.    data.zD
14b00 62 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 6f 6e  bFilename = (con
14b10 73 74 20 63 68 61 72 20 2a 29 63 6f 6e 76 65 72  st char *)conver
14b20 74 43 70 50 61 74 68 54 6f 55 74 66 38 28 20 61  tCpPathToUtf8( a
14b30 72 67 76 5b 69 2b 2b 5d 20 29 3b 0a 23 65 6c 73  rgv[i++] );.#els
14b40 65 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69  e.    data.zDbFi
14b50 6c 65 6e 61 6d 65 20 3d 20 61 72 67 76 5b 69 2b  lename = argv[i+
14b60 2b 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  +];.#endif.  }el
14b70 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se{.#ifndef SQLI
14b80 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
14b90 0a 20 20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c  .    data.zDbFil
14ba0 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79  ename = ":memory
14bb0 3a 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 61  :";.#else.    da
14bc0 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  ta.zDbFilename =
14bd0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20   0;.#endif.  }. 
14be0 20 69 66 28 20 69 3c 61 72 67 63 20 29 7b 0a 20   if( i<argc ){. 
14bf0 20 20 20 7a 46 69 72 73 74 43 6d 64 20 3d 20 61     zFirstCmd = a
14c00 72 67 76 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20  rgv[i++];.  }.  
14c10 69 66 28 20 69 3c 61 72 67 63 20 29 7b 0a 20 20  if( i<argc ){.  
14c20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14c30 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 74 6f 6f  ,"%s: Error: too
14c40 20 6d 61 6e 79 20 6f 70 74 69 6f 6e 73 3a 20 5c   many options: \
14c50 22 25 73 5c 22 5c 6e 22 2c 20 41 72 67 76 30 2c  "%s\"\n", Argv0,
14c60 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 66   argv[i]);.    f
14c70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
14c80 73 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c  se -help for a l
14c90 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c  ist of options.\
14ca0 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
14cb0 31 3b 0a 20 20 7d 0a 20 20 64 61 74 61 2e 6f 75  1;.  }.  data.ou
14cc0 74 20 3d 20 73 74 64 6f 75 74 3b 0a 0a 23 69 66  t = stdout;..#if
14cd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14ce0 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 64  MEMORYDB.  if( d
14cf0 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d  ata.zDbFilename=
14d00 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
14d10 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 45 72  f(stderr,"%s: Er
14d20 72 6f 72 3a 20 6e 6f 20 64 61 74 61 62 61 73 65  ror: no database
14d30 20 66 69 6c 65 6e 61 6d 65 20 73 70 65 63 69 66   filename specif
14d40 69 65 64 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a  ied\n", Argv0);.
14d50 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
14d60 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
14d70 6f 20 61 68 65 61 64 20 61 6e 64 20 6f 70 65 6e  o ahead and open
14d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14d90 6c 65 20 69 66 20 69 74 20 61 6c 72 65 61 64 79  le if it already
14da0 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65   exists.  If the
14db0 0a 20 20 2a 2a 20 66 69 6c 65 20 64 6f 65 73 20  .  ** file does 
14dc0 6e 6f 74 20 65 78 69 73 74 2c 20 64 65 6c 61 79  not exist, delay
14dd0 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20 20 54 68   opening it.  Th
14de0 69 73 20 70 72 65 76 65 6e 74 73 20 65 6d 70 74  is prevents empt
14df0 79 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  y database.  ** 
14e00 66 69 6c 65 73 20 66 72 6f 6d 20 62 65 69 6e 67  files from being
14e10 20 63 72 65 61 74 65 64 20 69 66 20 61 20 75 73   created if a us
14e20 65 72 20 6d 69 73 74 79 70 65 73 20 74 68 65 20  er mistypes the 
14e30 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61 72  database name ar
14e40 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74  gument.  ** to t
14e50 68 65 20 73 71 6c 69 74 65 20 63 6f 6d 6d 61 6e  he sqlite comman
14e60 64 2d 6c 69 6e 65 20 74 6f 6f 6c 2e 0a 20 20 2a  d-line tool..  *
14e70 2f 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 64  /.  if( access(d
14e80 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  ata.zDbFilename,
14e90 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   0)==0 ){.    op
14ea0 65 6e 5f 64 62 28 26 64 61 74 61 29 3b 0a 20 20  en_db(&data);.  
14eb0 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
14ec0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
14ed0 6f 6e 20 66 69 6c 65 20 69 66 20 74 68 65 72 65  on file if there
14ee0 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 6e 6f 20   is one.  If no 
14ef0 2d 69 6e 69 74 20 6f 70 74 69 6f 6e 0a 20 20 2a  -init option.  *
14f00 2a 20 69 73 20 67 69 76 65 6e 20 6f 6e 20 74 68  * is given on th
14f10 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20  e command line, 
14f20 6c 6f 6f 6b 20 66 6f 72 20 61 20 66 69 6c 65 20  look for a file 
14f30 6e 61 6d 65 64 20 7e 2f 2e 73 71 6c 69 74 65 72  named ~/.sqliter
14f40 63 20 61 6e 64 0a 20 20 2a 2a 20 74 72 79 20 74  c and.  ** try t
14f50 6f 20 70 72 6f 63 65 73 73 20 69 74 2e 0a 20 20  o process it..  
14f60 2a 2f 0a 20 20 72 63 20 3d 20 70 72 6f 63 65 73  */.  rc = proces
14f70 73 5f 73 71 6c 69 74 65 72 63 28 26 64 61 74 61  s_sqliterc(&data
14f80 2c 7a 49 6e 69 74 46 69 6c 65 29 3b 0a 20 20 69  ,zInitFile);.  i
14f90 66 28 20 72 63 3e 30 20 29 7b 0a 20 20 20 20 72  f( rc>0 ){.    r
14fa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
14fb0 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e   /* Make a secon
14fc0 64 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74  d pass through t
14fd0 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  he command-line 
14fe0 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 65 74  argument and set
14ff0 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20 20  .  ** options.  
15000 54 68 69 73 20 73 65 63 6f 6e 64 20 70 61 73 73  This second pass
15010 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
15020 6c 20 61 66 74 65 72 20 74 68 65 20 69 6e 69 74  l after the init
15030 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
15040 66 69 6c 65 20 69 73 20 70 72 6f 63 65 73 73 65  file is processe
15050 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  d so that the co
15060 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d  mmand-line argum
15070 65 6e 74 73 20 77 69 6c 6c 20 6f 76 65 72 72 69  ents will overri
15080 64 65 0a 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  de.  ** settings
15090 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
150a0 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 0a 20 20 2a  zation file..  *
150b0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61  /.  for(i=1; i<a
150c0 72 67 63 20 26 26 20 61 72 67 76 5b 69 5d 5b 30  rgc && argv[i][0
150d0 5d 3d 3d 27 2d 27 3b 20 69 2b 2b 29 7b 0a 20 20  ]=='-'; i++){.  
150e0 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76    char *z = argv
150f0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 31  [i];.    if( z[1
15100 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 7d  ]=='-' ){ z++; }
15110 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
15120 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b  z,"-init")==0 ){
15130 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
15140 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
15150 28 7a 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29  (z,"-html")==0 )
15160 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64  {.      data.mod
15170 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20  e = MODE_Html;. 
15180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
15190 63 6d 70 28 7a 2c 22 2d 6c 69 73 74 22 29 3d 3d  cmp(z,"-list")==
151a0 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
151b0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
151c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
151d0 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22  strcmp(z,"-line"
151e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
151f0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  ta.mode = MODE_L
15200 69 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ine;.    }else i
15210 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f  f( strcmp(z,"-co
15220 6c 75 6d 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lumn")==0 ){.   
15230 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
15240 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
15250 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
15260 28 7a 2c 22 2d 63 73 76 22 29 3d 3d 30 20 29 7b  (z,"-csv")==0 ){
15270 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
15280 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20   = MODE_Csv;.   
15290 20 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2e 73     memcpy(data.s
152a0 65 70 61 72 61 74 6f 72 2c 22 2c 22 2c 32 29 3b  eparator,",",2);
152b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
152c0 74 72 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61  trcmp(z,"-separa
152d0 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tor")==0 ){.    
152e0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    i++;.      if(
152f0 69 3e 3d 61 72 67 63 29 7b 0a 20 20 20 20 20 20  i>=argc){.      
15300 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
15310 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 6d 69 73  ,"%s: Error: mis
15320 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 66 6f  sing argument fo
15330 72 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c  r option: %s\n",
15340 20 41 72 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20   Argv0, z);.    
15350 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
15360 72 72 2c 22 55 73 65 20 2d 68 65 6c 70 20 66 6f  rr,"Use -help fo
15370 72 20 61 20 6c 69 73 74 20 6f 66 20 6f 70 74 69  r a list of opti
15380 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ons.\n");.      
15390 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
153a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
153b0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
153c0 66 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72  f(data.separator
153d0 29 2c 20 64 61 74 61 2e 73 65 70 61 72 61 74 6f  ), data.separato
153e0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
153f0 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22            "%.*s"
15400 2c 28 69 6e 74 29 73 69 7a 65 6f 66 28 64 61 74  ,(int)sizeof(dat
15410 61 2e 73 65 70 61 72 61 74 6f 72 29 2d 31 2c 61  a.separator)-1,a
15420 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c  rgv[i]);.    }el
15430 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
15440 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d 30  "-nullvalue")==0
15450 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
15460 20 20 20 20 20 69 66 28 69 3e 3d 61 72 67 63 29       if(i>=argc)
15470 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15480 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 45 72  f(stderr,"%s: Er
15490 72 6f 72 3a 20 6d 69 73 73 69 6e 67 20 61 72 67  ror: missing arg
154a0 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e  ument for option
154b0 3a 20 25 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20  : %s\n", Argv0, 
154c0 7a 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  z);.        fpri
154d0 6e 74 66 28 73 74 64 65 72 72 2c 22 55 73 65 20  ntf(stderr,"Use 
154e0 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c 69 73 74  -help for a list
154f0 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29   of options.\n")
15500 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
15510 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
15520 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
15530 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 6e  tf(sizeof(data.n
15540 75 6c 6c 76 61 6c 75 65 29 2c 20 64 61 74 61 2e  ullvalue), data.
15550 6e 75 6c 6c 76 61 6c 75 65 2c 0a 20 20 20 20 20  nullvalue,.     
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 22 25 2e 2a 73 22 2c 28 69 6e 74 29 73 69    "%.*s",(int)si
15580 7a 65 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61  zeof(data.nullva
15590 6c 75 65 29 2d 31 2c 61 72 67 76 5b 69 5d 29 3b  lue)-1,argv[i]);
155a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
155b0 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61 64 65 72  trcmp(z,"-header
155c0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
155d0 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d  ata.showHeader =
155e0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
155f0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 6f 68  ( strcmp(z,"-noh
15600 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  eader")==0 ){.  
15610 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
15620 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  der = 0;.    }el
15630 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
15640 22 2d 65 63 68 6f 22 29 3d 3d 30 20 29 7b 0a 20  "-echo")==0 ){. 
15650 20 20 20 20 20 64 61 74 61 2e 65 63 68 6f 4f 6e       data.echoOn
15660 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
15670 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73  if( strcmp(z,"-s
15680 74 61 74 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tats")==0 ){.   
15690 20 20 20 64 61 74 61 2e 73 74 61 74 73 4f 6e 20     data.statsOn 
156a0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
156b0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61  f( strcmp(z,"-ba
156c0 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  il")==0 ){.     
156d0 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d   bail_on_error =
156e0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
156f0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 65 72  ( strcmp(z,"-ver
15700 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sion")==0 ){.   
15710 20 20 20 70 72 69 6e 74 66 28 22 25 73 20 25 73     printf("%s %s
15720 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62  \n", sqlite3_lib
15730 76 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c 69 74  version(), sqlit
15740 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
15750 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
15760 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
15770 72 63 6d 70 28 7a 2c 22 2d 69 6e 74 65 72 61 63  rcmp(z,"-interac
15780 74 69 76 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tive")==0 ){.   
15790 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65     stdin_is_inte
157a0 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 20 20 20  ractive = 1;.   
157b0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
157c0 70 28 7a 2c 22 2d 62 61 74 63 68 22 29 3d 3d 30  p(z,"-batch")==0
157d0 20 29 7b 0a 20 20 20 20 20 20 73 74 64 69 6e 5f   ){.      stdin_
157e0 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
157f0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
15800 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61  ( strcmp(z,"-hea
15810 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
15820 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i++;.    }else i
15830 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66  f( strcmp(z,"-vf
15840 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
15850 69 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  i++;.#ifdef SQLI
15860 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52 41  TE_ENABLE_VFSTRA
15870 43 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  CE.    }else if(
15880 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 74   strcmp(z,"-vfst
15890 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
158a0 20 20 20 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 23     i++;.#endif.#
158b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
158c0 42 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20  BLE_MULTIPLEX.  
158d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
158e0 6d 70 28 7a 2c 22 2d 6d 75 6c 74 69 70 6c 65 78  mp(z,"-multiplex
158f0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
15900 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ++;.#endif.    }
15910 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
15920 7a 2c 22 2d 68 65 6c 70 22 29 3d 3d 30 20 7c 7c  z,"-help")==0 ||
15930 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 2d 68 65   strcmp(z, "--he
15940 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
15950 20 75 73 61 67 65 28 31 29 3b 0a 20 20 20 20 7d   usage(1);.    }
15960 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
15970 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
15980 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 6f  Error: unknown o
15990 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 41 72  ption: %s\n", Ar
159a0 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20 20 20 66  gv0, z);.      f
159b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
159c0 73 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c  se -help for a l
159d0 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c  ist of options.\
159e0 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
159f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
15a00 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64 20    if( zFirstCmd 
15a10 29 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20 6a 75  ){.    /* Run ju
15a20 73 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74  st the command t
15a30 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
15a40 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 20 20  database name.  
15a50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 46 69    */.    if( zFi
15a60 72 73 74 43 6d 64 5b 30 5d 3d 3d 27 2e 27 20 29  rstCmd[0]=='.' )
15a70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 6f 5f  {.      rc = do_
15a80 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 46 69  meta_command(zFi
15a90 72 73 74 43 6d 64 2c 20 26 64 61 74 61 29 3b 0a  rstCmd, &data);.
15aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ab0 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61 29 3b   open_db(&data);
15ac0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c  .      rc = shel
15ad0 6c 5f 65 78 65 63 28 64 61 74 61 2e 64 62 2c 20  l_exec(data.db, 
15ae0 7a 46 69 72 73 74 43 6d 64 2c 20 73 68 65 6c 6c  zFirstCmd, shell
15af0 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61  _callback, &data
15b00 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
15b10 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 21 3d     if( zErrMsg!=
15b20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
15b30 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
15b40 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
15b50 73 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  sg);.        ret
15b60 75 72 6e 20 72 63 21 3d 30 20 3f 20 72 63 20 3a  urn rc!=0 ? rc :
15b70 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
15b80 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
15b90 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
15ba0 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62  err,"Error: unab
15bb0 6c 65 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51  le to process SQ
15bc0 4c 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  L \"%s\"\n", zFi
15bd0 72 73 74 43 6d 64 29 3b 0a 20 20 20 20 20 20 20  rstCmd);.       
15be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15bf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
15c00 65 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20 63 6f  e{.    /* Run co
15c10 6d 6d 61 6e 64 73 20 72 65 63 65 69 76 65 64 20  mmands received 
15c20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e  from standard in
15c30 70 75 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  put.    */.    i
15c40 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  f( stdin_is_inte
15c50 72 61 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  ractive ){.     
15c60 20 63 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20   char *zHome;.  
15c70 20 20 20 20 63 68 61 72 20 2a 7a 48 69 73 74 6f      char *zHisto
15c80 72 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ry = 0;.      in
15c90 74 20 6e 48 69 73 74 6f 72 79 3b 0a 20 20 20 20  t nHistory;.    
15ca0 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20    printf(.      
15cb0 20 20 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f    "SQLite versio
15cc0 6e 20 25 73 20 25 2e 31 39 73 5c 6e 22 0a 20 20  n %s %.19s\n".  
15cd0 20 20 20 20 20 20 22 45 6e 74 65 72 20 5c 22 2e        "Enter \".
15ce0 68 65 6c 70 5c 22 20 66 6f 72 20 69 6e 73 74 72  help\" for instr
15cf0 75 63 74 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20  uctions\n".     
15d00 20 20 20 22 45 6e 74 65 72 20 53 51 4c 20 73 74     "Enter SQL st
15d10 61 74 65 6d 65 6e 74 73 20 74 65 72 6d 69 6e 61  atements termina
15d20 74 65 64 20 77 69 74 68 20 61 20 5c 22 3b 5c 22  ted with a \";\"
15d30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  \n",.        sql
15d40 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
15d50 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  ), sqlite3_sourc
15d60 65 69 64 28 29 0a 20 20 20 20 20 20 29 3b 0a 20  eid().      );. 
15d70 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66 69 6e       zHome = fin
15d80 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a 20 20  d_home_dir();.  
15d90 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 20 29 7b      if( zHome ){
15da0 0a 20 20 20 20 20 20 20 20 6e 48 69 73 74 6f 72  .        nHistor
15db0 79 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 48 6f  y = strlen30(zHo
15dc0 6d 65 29 20 2b 20 32 30 3b 0a 20 20 20 20 20 20  me) + 20;.      
15dd0 20 20 69 66 28 20 28 7a 48 69 73 74 6f 72 79 20    if( (zHistory 
15de0 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69 73 74 6f 72  = malloc(nHistor
15df0 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  y))!=0 ){.      
15e00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
15e10 69 6e 74 66 28 6e 48 69 73 74 6f 72 79 2c 20 7a  intf(nHistory, z
15e20 48 69 73 74 6f 72 79 2c 22 25 73 2f 2e 73 71 6c  History,"%s/.sql
15e30 69 74 65 5f 68 69 73 74 6f 72 79 22 2c 20 7a 48  ite_history", zH
15e40 6f 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ome);.        }.
15e50 20 20 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69        }.#if defi
15e60 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
15e70 45 29 20 26 26 20 48 41 56 45 5f 52 45 41 44 4c  E) && HAVE_READL
15e80 49 4e 45 3d 3d 31 0a 20 20 20 20 20 20 69 66 28  INE==1.      if(
15e90 20 7a 48 69 73 74 6f 72 79 20 29 20 72 65 61 64   zHistory ) read
15ea0 5f 68 69 73 74 6f 72 79 28 7a 48 69 73 74 6f 72  _history(zHistor
15eb0 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  y);.#endif.     
15ec0 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e   rc = process_in
15ed0 70 75 74 28 26 64 61 74 61 2c 20 30 29 3b 0a 20  put(&data, 0);. 
15ee0 20 20 20 20 20 69 66 28 20 7a 48 69 73 74 6f 72       if( zHistor
15ef0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 69  y ){.        sti
15f00 66 6c 65 5f 68 69 73 74 6f 72 79 28 31 30 30 29  fle_history(100)
15f10 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 5f  ;.        write_
15f20 68 69 73 74 6f 72 79 28 7a 48 69 73 74 6f 72 79  history(zHistory
15f30 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  );.        free(
15f40 7a 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 20  zHistory);.     
15f50 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 7a 48   }.      free(zH
15f60 6f 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ome);.    }else{
15f70 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63  .      rc = proc
15f80 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61 2c  ess_input(&data,
15f90 20 73 74 64 69 6e 29 3b 0a 20 20 20 20 7d 0a 20   stdin);.    }. 
15fa0 20 7d 0a 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e   }.  set_table_n
15fb0 61 6d 65 28 26 64 61 74 61 2c 20 30 29 3b 0a 20  ame(&data, 0);. 
15fc0 20 69 66 28 20 64 61 74 61 2e 64 62 20 29 7b 0a   if( data.db ){.
15fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
15fe0 65 28 64 61 74 61 2e 64 62 29 3b 0a 20 20 7d 0a  e(data.db);.  }.
15ff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.