/ Hex Artifact Content
Login

Artifact 24722d24d4ea8ca93db35e44db7308de786767ca:


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 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 45 6e 61 62 6c 65 20 6c 61 72 67 65 2d 66 69   Enable large-fi
02b0: 6c 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66  le support for f
02c0: 6f 70 65 6e 28 29 20 61 6e 64 20 66 72 69 65 6e  open() and frien
02d0: 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2f 0a 23  ds on unix..*/.#
02e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
02f0: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69  SABLE_LFS.# defi
0300: 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20  ne _LARGE_FILE  
0310: 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66 20       1.# ifndef 
0320: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0330: 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46 49  S.#   define _FI
0340: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20 36  LE_OFFSET_BITS 6
0350: 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  4.# endif.# defi
0360: 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f  ne _LARGEFILE_SO
0370: 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a 23  URCE 1.#endif..#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
03a0: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
03b0: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
03c0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
03d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
03e0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79  h".#include <cty
03f0: 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  pe.h>.#include <
0400: 73 74 64 61 72 67 2e 68 3e 0a 0a 23 69 66 20 21  stdarg.h>..#if !
0410: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
0420: 26 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e 33  && !defined(WIN3
0430: 32 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 69  2).# include <si
0440: 67 6e 61 6c 2e 68 3e 0a 23 20 69 66 20 21 64 65  gnal.h>.# if !de
0450: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26  fined(__RTP__) &
0460: 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f  & !defined(_WRS_
0470: 4b 45 52 4e 45 4c 29 0a 23 20 20 69 6e 63 6c 75  KERNEL).#  inclu
0480: 64 65 20 3c 70 77 64 2e 68 3e 0a 23 20 65 6e 64  de <pwd.h>.# end
0490: 69 66 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e  if.# include <un
04a0: 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  istd.h>.# includ
04b0: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
04c0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48  #endif..#ifdef H
04d0: 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 23 20 69  AVE_EDITLINE.# i
04e0: 6e 63 6c 75 64 65 20 3c 65 64 69 74 6c 69 6e 65  nclude <editline
04f0: 2f 65 64 69 74 6c 69 6e 65 2e 68 3e 0a 23 65 6e  /editline.h>.#en
0500: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
0510: 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 20 26  HAVE_READLINE) &
0520: 26 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 3d  & HAVE_READLINE=
0530: 3d 31 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65  =1.# include <re
0540: 61 64 6c 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e  adline/readline.
0550: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65  h>.# include <re
0560: 61 64 6c 69 6e 65 2f 68 69 73 74 6f 72 79 2e 68  adline/history.h
0570: 3e 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  >.#endif.#if !de
0580: 66 69 6e 65 64 28 48 41 56 45 5f 45 44 49 54 4c  fined(HAVE_EDITL
0590: 49 4e 45 29 20 26 26 20 28 21 64 65 66 69 6e 65  INE) && (!define
05a0: 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 29  d(HAVE_READLINE)
05b0: 20 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e   || HAVE_READLIN
05c0: 45 21 3d 31 29 0a 23 20 64 65 66 69 6e 65 20 61  E!=1).# define a
05d0: 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  dd_history(X).# 
05e0: 64 65 66 69 6e 65 20 72 65 61 64 5f 68 69 73 74  define read_hist
05f0: 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20  ory(X).# define 
0600: 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29  write_history(X)
0610: 0a 23 20 64 65 66 69 6e 65 20 73 74 69 66 6c 65  .# define stifle
0620: 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 65 6e 64  _history(X).#end
0630: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
0640: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
0650: 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c  ed(WIN32).# incl
0660: 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 64 65 66 69  ude <io.h>.#defi
0670: 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f 69 73  ne isatty(h) _is
0680: 61 74 74 79 28 68 29 0a 23 64 65 66 69 6e 65 20  atty(h).#define 
0690: 61 63 63 65 73 73 28 66 2c 6d 29 20 5f 61 63 63  access(f,m) _acc
06a0: 65 73 73 28 28 66 29 2c 28 6d 29 29 0a 23 75 6e  ess((f),(m)).#un
06b0: 64 65 66 20 70 6f 70 65 6e 0a 23 64 65 66 69 6e  def popen.#defin
06c0: 65 20 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23  e popen _popen.#
06d0: 75 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 64 65  undef pclose.#de
06e0: 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63 6c  fine pclose _pcl
06f0: 6f 73 65 0a 23 65 6c 73 65 0a 2f 2a 20 4d 61 6b  ose.#else./* Mak
0700: 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29 20  e sure isatty() 
0710: 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65 2e  has a prototype.
0720: 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 69  .*/.extern int i
0730: 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a 2f 2a 20  satty(int);../* 
0740: 70 6f 70 65 6e 20 61 6e 64 20 70 63 6c 6f 73 65  popen and pclose
0750: 20 61 72 65 20 6e 6f 74 20 43 38 39 20 66 75 6e   are not C89 fun
0760: 63 74 69 6f 6e 73 20 61 6e 64 20 73 6f 20 61 72  ctions and so ar
0770: 65 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69 74  e sometimes omit
0780: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
0790: 3c 73 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72  <stdio.h> header
07a0: 20 2a 2f 0a 65 78 74 65 72 6e 20 46 49 4c 45 20   */.extern FILE 
07b0: 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  *popen(const cha
07c0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  r*,const char*);
07d0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 70 63 6c 6f  .extern int pclo
07e0: 73 65 28 46 49 4c 45 2a 29 3b 0a 23 65 6e 64 69  se(FILE*);.#endi
07f0: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
0800: 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57 69  WIN32_WCE)./* Wi
0810: 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77 69  ndows CE (arm-wi
0820: 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63  nce-mingw32ce-gc
0830: 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76  c) does not prov
0840: 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a 20  ide isatty(). * 
0850: 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20 61  thus we always a
0860: 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68 61  ssume that we ha
0870: 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54 68  ve a console. Th
0880: 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76 65  at can be. * ove
0890: 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68 65  rridden with the
08a0: 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64 20   -batch command 
08b0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a 2f  line option.. */
08c0: 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79 28  .#define isatty(
08d0: 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  x) 1.#endif../* 
08e0: 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68 61  ctype macros tha
08f0: 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67 6e  t work with sign
0900: 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ed characters */
0910: 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63 65  .#define IsSpace
0920: 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75 6e  (X)  isspace((un
0930: 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23  signed char)X).#
0940: 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28 58  define IsDigit(X
0950: 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  )  isdigit((unsi
0960: 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64 65  gned char)X).#de
0970: 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29 20  fine ToLower(X) 
0980: 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28 28   (char)tolower((
0990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29  unsigned char)X)
09a0: 0a 0a 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68  .../* True if th
09b0: 65 20 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c  e timer is enabl
09c0: 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ed */.static int
09d0: 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30   enableTimer = 0
09e0: 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  ;../* Return the
09f0: 20 63 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c   current wall-cl
0a00: 6f 63 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74  ock time */.stat
0a10: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
0a20: 20 74 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29   timeOfDay(void)
0a30: 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  {.  static sqlit
0a40: 65 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73  e3_vfs *clockVfs
0a50: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
0a60: 69 6e 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63  int64 t;.  if( c
0a70: 6c 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f  lockVfs==0 ) clo
0a80: 63 6b 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  ckVfs = sqlite3_
0a90: 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
0aa0: 66 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65  f( clockVfs->iVe
0ab0: 72 73 69 6f 6e 3e 3d 31 20 26 26 20 63 6c 6f 63  rsion>=1 && cloc
0ac0: 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  kVfs->xCurrentTi
0ad0: 6d 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20  meInt64!=0 ){.  
0ae0: 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72    clockVfs->xCur
0af0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c  rentTimeInt64(cl
0b00: 6f 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d  ockVfs, &t);.  }
0b10: 65 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65  else{.    double
0b20: 20 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   r;.    clockVfs
0b30: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63  ->xCurrentTime(c
0b40: 6c 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20  lockVfs, &r);.  
0b50: 20 20 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69    t = (sqlite3_i
0b60: 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30  nt64)(r*86400000
0b70: 2e 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  .0);.  }.  retur
0b80: 6e 20 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  n t;.}..#if !def
0b90: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20  ined(_WIN32) && 
0ba0: 21 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20  !defined(WIN32) 
0bb0: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53  && !defined(_WRS
0bc0: 5f 4b 45 52 4e 45 4c 29 20 5c 0a 20 26 26 20 21  _KERNEL) \. && !
0bd0: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e 75 78 29  defined(__minux)
0be0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0bf0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0c00: 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e  <sys/resource.h>
0c10: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
0c20: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
0c30: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
0c40: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
0c50: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
0c60: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
0c70: 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61  ;  /* CPU time a
0c80: 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69  t start */.stati
0c90: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
0ca0: 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c  iBegin;  /* Wall
0cb0: 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73  -clock time at s
0cc0: 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  tart */../*.** B
0cd0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
0ce0: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
0cf0: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
0d00: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
0d10: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
0d20: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
0d30: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
0d40: 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d  n);.    iBegin =
0d50: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
0d60: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
0d70: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
0d80: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
0d90: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
0da0: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
0db0: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
0dc0: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
0dd0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
0de0: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
0df0: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
0e00: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
0e10: 2a 30 2e 30 30 30 30 30 31 20 2b 20 0a 20 20 20  *0.000001 + .   
0e20: 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70        (double)(p
0e30: 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53  End->tv_sec - pS
0e40: 74 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d  tart->tv_sec);.}
0e50: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
0e60: 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73  e timing results
0e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0e80: 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b   endTimer(void){
0e90: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d  .  if( enableTim
0ea0: 65 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  er ){.    struct
0eb0: 20 72 75 73 61 67 65 20 73 45 6e 64 3b 0a 20 20   rusage sEnd;.  
0ec0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0ed0: 69 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79  iEnd = timeOfDay
0ee0: 28 29 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67  ();.    getrusag
0ef0: 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26  e(RUSAGE_SELF, &
0f00: 73 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74  sEnd);.    print
0f10: 66 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61  f("Run Time: rea
0f20: 6c 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73  l %.3f user %f s
0f30: 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20  ys %f\n",.      
0f40: 20 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29   (iEnd - iBegin)
0f50: 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74  *0.001,.       t
0f60: 69 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e  imeDiff(&sBegin.
0f70: 72 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e  ru_utime, &sEnd.
0f80: 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20  ru_utime),.     
0f90: 20 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67    timeDiff(&sBeg
0fa0: 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45  in.ru_stime, &sE
0fb0: 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20  nd.ru_stime));. 
0fc0: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45   }.}..#define BE
0fd0: 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54  GIN_TIMER beginT
0fe0: 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45  imer().#define E
0ff0: 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65  ND_TIMER endTime
1000: 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f  r().#define HAS_
1010: 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28  TIMER 1..#elif (
1020: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
1030: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
1040: 29 29 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69  ))..#include <wi
1050: 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a 20 53 61 76  ndows.h>../* Sav
1060: 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f  ed resource info
1070: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1080: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20  beginning of an 
1090: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  operation */.sta
10a0: 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72 6f 63  tic HANDLE hProc
10b0: 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  ess;.static FILE
10c0: 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42 65 67  TIME ftKernelBeg
10d0: 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 54  in;.static FILET
10e0: 49 4d 45 20 66 74 55 73 65 72 42 65 67 69 6e 3b  IME ftUserBegin;
10f0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
1100: 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65 67 69  int64 ftWallBegi
1110: 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c 20  n;.typedef BOOL 
1120: 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f 43  (WINAPI *GETPROC
1130: 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20 4c  TIMES)(HANDLE, L
1140: 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c  PFILETIME, LPFIL
1150: 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ETIME, LPFILETIM
1160: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a  E, LPFILETIME);.
1170: 73 74 61 74 69 63 20 47 45 54 50 52 4f 43 54 49  static GETPROCTI
1180: 4d 45 53 20 67 65 74 50 72 6f 63 65 73 73 54 69  MES getProcessTi
1190: 6d 65 73 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a  mesAddr = NULL;.
11a0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
11b0: 73 65 65 20 69 66 20 77 65 20 68 61 76 65 20 74  see if we have t
11c0: 69 6d 65 72 20 73 75 70 70 6f 72 74 2e 20 20 52  imer support.  R
11d0: 65 74 75 72 6e 20 31 20 69 66 20 6e 65 63 65 73  eturn 1 if neces
11e0: 73 61 72 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20  sary.** support 
11f0: 66 6f 75 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20  found (or found 
1200: 70 72 65 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a  previously)..*/.
1210: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 54 69  static int hasTi
1220: 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  mer(void){.  if(
1230: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1240: 41 64 64 72 20 29 7b 0a 20 20 20 20 72 65 74 75  Addr ){.    retu
1250: 72 6e 20 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn 1;.  } else {
1260: 0a 20 20 20 20 2f 2a 20 47 65 74 50 72 6f 63 65  .    /* GetProce
1270: 73 73 54 69 6d 65 73 28 29 20 69 73 6e 27 74 20  ssTimes() isn't 
1280: 73 75 70 70 6f 72 74 65 64 20 69 6e 20 57 49 4e  supported in WIN
1290: 39 35 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65  95 and some othe
12a0: 72 20 57 69 6e 64 6f 77 73 20 76 65 72 73 69 6f  r Windows versio
12b0: 6e 73 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 69  ns..    ** See i
12c0: 66 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65  f the version we
12d0: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
12e0: 68 61 73 20 69 74 2c 20 61 6e 64 20 69 66 20 69  has it, and if i
12f0: 74 20 64 6f 65 73 2c 20 73 61 76 65 20 6f 66 66  t does, save off
1300: 0a 20 20 20 20 2a 2a 20 61 20 70 6f 69 6e 74 65  .    ** a pointe
1310: 72 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20  r to it and the 
1320: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
1330: 68 61 6e 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  handle..    */. 
1340: 20 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47 65     hProcess = Ge
1350: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28  tCurrentProcess(
1360: 29 3b 0a 20 20 20 20 69 66 28 20 68 50 72 6f 63  );.    if( hProc
1370: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 48 49 4e  ess ){.      HIN
1380: 53 54 41 4e 43 45 20 68 69 6e 73 74 4c 69 62 20  STANCE hinstLib 
1390: 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54 45  = LoadLibrary(TE
13a0: 58 54 28 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c  XT("Kernel32.dll
13b0: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e  "));.      if( N
13c0: 55 4c 4c 20 21 3d 20 68 69 6e 73 74 4c 69 62 20  ULL != hinstLib 
13d0: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 74 50 72  ){.        getPr
13e0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d  ocessTimesAddr =
13f0: 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29 20   (GETPROCTIMES) 
1400: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 68  GetProcAddress(h
1410: 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72 6f  instLib, "GetPro
1420: 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20 20  cessTimes");.   
1430: 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d       if( NULL !=
1440: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1450: 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Addr ){.        
1460: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1470: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46 72      }.        Fr
1480: 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74 4c  eeLibrary(hinstL
1490: 69 62 29 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  ib); .      }.  
14a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   0;.}../*.** Beg
14c0: 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65  in timing an ope
14d0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
14e0: 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72   void beginTimer
14f0: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
1500: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
1510: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1520: 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45   ){.    FILETIME
1530: 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45   ftCreation, ftE
1540: 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63  xit;.    getProc
1550: 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72  essTimesAddr(hPr
1560: 6f 63 65 73 73 2c 20 26 66 74 43 72 65 61 74 69  ocess, &ftCreati
1570: 6f 6e 2c 20 26 66 74 45 78 69 74 2c 20 26 66 74  on, &ftExit, &ft
1580: 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74  KernelBegin, &ft
1590: 55 73 65 72 42 65 67 69 6e 29 3b 0a 20 20 20 20  UserBegin);.    
15a0: 66 74 57 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69  ftWallBegin = ti
15b0: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d  meOfDay();.  }.}
15c0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
15d0: 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74 77  difference of tw
15e0: 6f 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  o FILETIME struc
15f0: 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f  ts in seconds */
1600: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74  .static double t
1610: 69 6d 65 44 69 66 66 28 46 49 4c 45 54 49 4d 45  imeDiff(FILETIME
1620: 20 2a 70 53 74 61 72 74 2c 20 46 49 4c 45 54 49   *pStart, FILETI
1630: 4d 45 20 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c  ME *pEnd){.  sql
1640: 69 74 65 5f 69 6e 74 36 34 20 69 36 34 53 74 61  ite_int64 i64Sta
1650: 72 74 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69  rt = *((sqlite_i
1660: 6e 74 36 34 20 2a 29 20 70 53 74 61 72 74 29 3b  nt64 *) pStart);
1670: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
1680: 69 36 34 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69  i64End = *((sqli
1690: 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 45 6e 64  te_int64 *) pEnd
16a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 6f 75  );.  return (dou
16b0: 62 6c 65 29 20 28 28 69 36 34 45 6e 64 20 2d 20  ble) ((i64End - 
16c0: 69 36 34 53 74 61 72 74 29 20 2f 20 31 30 30 30  i64Start) / 1000
16d0: 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  0000.0);.}../*.*
16e0: 2a 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69  * Print the timi
16f0: 6e 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73  ng results..*/.s
1700: 74 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69  tatic void endTi
1710: 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  mer(void){.  if(
1720: 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20   enableTimer && 
1730: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
1740: 64 64 72 29 7b 0a 20 20 20 20 46 49 4c 45 54 49  ddr){.    FILETI
1750: 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66  ME ftCreation, f
1760: 74 45 78 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45  tExit, ftKernelE
1770: 6e 64 2c 20 66 74 55 73 65 72 45 6e 64 3b 0a 20  nd, ftUserEnd;. 
1780: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1790: 20 66 74 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d   ftWallEnd = tim
17a0: 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 67 65  eOfDay();.    ge
17b0: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
17c0: 72 28 68 50 72 6f 63 65 73 73 2c 20 26 66 74 43  r(hProcess, &ftC
17d0: 72 65 61 74 69 6f 6e 2c 20 26 66 74 45 78 69 74  reation, &ftExit
17e0: 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 20  , &ftKernelEnd, 
17f0: 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20 20 20  &ftUserEnd);.   
1800: 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69 6d   printf("Run Tim
1810: 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73 65  e: real %.3f use
1820: 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a  r %f sys %f\n",.
1830: 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c 45 6e         (ftWallEn
1840: 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69 6e 29  d - ftWallBegin)
1850: 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74  *0.001,.       t
1860: 69 6d 65 44 69 66 66 28 26 66 74 55 73 65 72 42  imeDiff(&ftUserB
1870: 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45 6e 64  egin, &ftUserEnd
1880: 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  ),.       timeDi
1890: 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65 67 69  ff(&ftKernelBegi
18a0: 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64 29  n, &ftKernelEnd)
18b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e  );.  }.}..#defin
18c0: 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65  e BEGIN_TIMER be
18d0: 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69  ginTimer().#defi
18e0: 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64  ne END_TIMER end
18f0: 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20  Timer().#define 
1900: 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54 69 6d  HAS_TIMER hasTim
1910: 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64 65 66  er()..#else.#def
1920: 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20  ine BEGIN_TIMER 
1930: 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d  .#define END_TIM
1940: 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ER.#define HAS_T
1950: 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  IMER 0.#endif../
1960: 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72 65  *.** Used to pre
1970: 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61 62  vent warnings ab
1980: 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d  out unused param
1990: 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  eters.*/.#define
19a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19b0: 52 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a 0a  R(x) (void)(x)..
19c0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c  /*.** If the fol
19d0: 6c 6f 77 69 6e 67 20 66 6c 61 67 20 69 73 20 73  lowing flag is s
19e0: 65 74 2c 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64  et, then command
19f0: 20 65 78 65 63 75 74 69 6f 6e 20 73 74 6f 70 73   execution stops
1a00: 0a 2a 2a 20 61 74 20 61 6e 20 65 72 72 6f 72 20  .** at an error 
1a10: 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
1a20: 74 65 72 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74  teractive..*/.st
1a30: 61 74 69 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e  atic int bail_on
1a40: 5f 65 72 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a  _error = 0;../*.
1a50: 2a 2a 20 54 68 72 65 61 74 20 73 74 64 69 6e 20  ** Threat stdin 
1a60: 61 73 20 61 6e 20 69 6e 74 65 72 61 63 74 69 76  as an interactiv
1a70: 65 20 69 6e 70 75 74 20 69 66 20 74 68 65 20 66  e input if the f
1a80: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
1a90: 65 0a 2a 2a 20 69 73 20 74 72 75 65 2e 20 20 4f  e.** is true.  O
1aa0: 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65  therwise, assume
1ab0: 20 73 74 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63   stdin is connec
1ac0: 74 65 64 20 74 6f 20 61 20 66 69 6c 65 20 6f 72  ted to a file or
1ad0: 20 70 69 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   pipe..*/.static
1ae0: 20 69 6e 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e   int stdin_is_in
1af0: 74 65 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  teractive = 1;..
1b00: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1b10: 69 6e 67 20 69 73 20 74 68 65 20 6f 70 65 6e 20  ing is the open 
1b20: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
1b30: 20 20 57 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e    We make a poin
1b40: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64  ter.** to this d
1b50: 61 74 61 62 61 73 65 20 61 20 73 74 61 74 69 63  atabase a static
1b60: 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68 61   variable so tha
1b70: 74 20 69 74 20 63 61 6e 20 62 65 20 61 63 63 65  t it can be acce
1b80: 73 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 53  ssed.** by the S
1b90: 49 47 49 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f  IGINT handler to
1ba0: 20 69 6e 74 65 72 72 75 70 74 20 64 61 74 61 62   interrupt datab
1bb0: 61 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ase processing..
1bc0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
1bd0: 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  3 *db = 0;../*.*
1be0: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 69 6e 74  * True if an int
1bf0: 65 72 72 75 70 74 20 28 43 6f 6e 74 72 6f 6c 2d  errupt (Control-
1c00: 43 29 20 68 61 73 20 62 65 65 6e 20 72 65 63 65  C) has been rece
1c10: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
1c20: 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 73 65 65  volatile int see
1c30: 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a  nInterrupt = 0;.
1c40: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
1c50: 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75 72 20 70  he name of our p
1c60: 72 6f 67 72 61 6d 2e 20 49 74 20 69 73 20 73 65  rogram. It is se
1c70: 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20 75 73 65  t in main(), use
1c80: 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d 62 65 72  d.** in a number
1c90: 20 6f 66 20 6f 74 68 65 72 20 70 6c 61 63 65 73   of other places
1ca0: 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20 65 72 72  , mostly for err
1cb0: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
1cc0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 41 72 67  static char *Arg
1cd0: 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70  v0;../*.** Promp
1ce0: 74 20 73 74 72 69 6e 67 73 2e 20 49 6e 69 74 69  t strings. Initi
1cf0: 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69 6e 2e 20  alized in main. 
1d00: 53 65 74 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a  Settable with.**
1d10: 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61 69 6e 20     .prompt main 
1d20: 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73 74 61 74  continue.*/.stat
1d30: 69 63 20 63 68 61 72 20 6d 61 69 6e 50 72 6f 6d  ic char mainProm
1d40: 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f 2a 20 46  pt[20];     /* F
1d50: 69 72 73 74 20 6c 69 6e 65 20 70 72 6f 6d 70 74  irst line prompt
1d60: 2e 20 64 65 66 61 75 6c 74 3a 20 22 73 71 6c 69  . default: "sqli
1d70: 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69 63 20 63  te> "*/.static c
1d80: 68 61 72 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d  har continueProm
1d90: 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69  pt[20]; /* Conti
1da0: 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 20  nuation prompt. 
1db0: 64 65 66 61 75 6c 74 3a 20 22 20 20 20 2e 2e 2e  default: "   ...
1dc0: 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72  > " */../*.** Wr
1dd0: 69 74 65 20 49 2f 4f 20 74 72 61 63 65 73 20 74  ite I/O traces t
1de0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
1df0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
1e00: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1e10: 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20 46  IOTRACE.static F
1e20: 49 4c 45 20 2a 69 6f 74 72 61 63 65 20 3d 20 30  ILE *iotrace = 0
1e30: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1e40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
1e50: 6b 73 20 6c 69 6b 65 20 70 72 69 6e 74 66 20 69  ks like printf i
1e60: 6e 20 74 68 61 74 20 69 74 73 20 66 69 72 73 74  n that its first
1e70: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
1e80: 2a 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20  * format string 
1e90: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
1ea0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 76 61 6c  rguments are val
1eb0: 75 65 73 20 74 6f 20 62 65 20 73 75 62 73 74 69  ues to be substi
1ec0: 74 75 74 65 64 0a 2a 2a 20 69 6e 20 70 6c 61 63  tuted.** in plac
1ed0: 65 20 6f 66 20 25 20 66 69 65 6c 64 73 2e 20 20  e of % fields.  
1ee0: 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 66 6f  The result of fo
1ef0: 72 6d 61 74 74 69 6e 67 20 74 68 69 73 20 73 74  rmatting this st
1f00: 72 69 6e 67 0a 2a 2a 20 69 73 20 77 72 69 74 74  ring.** is writt
1f10: 65 6e 20 74 6f 20 69 6f 74 72 61 63 65 2e 0a 2a  en to iotrace..*
1f20: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1f30: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73  ENABLE_IOTRACE.s
1f40: 74 61 74 69 63 20 76 6f 69 64 20 69 6f 74 72 61  tatic void iotra
1f50: 63 65 50 72 69 6e 74 66 28 63 6f 6e 73 74 20 63  cePrintf(const c
1f60: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1f70: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1f80: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
1f90: 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20 29 20  f( iotrace==0 ) 
1fa0: 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74 61  return;.  va_sta
1fb0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1fc0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  z = sqlite3_v
1fd0: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
1fe0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1ff0: 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 69 6f  p);.  fprintf(io
2000: 74 72 61 63 65 2c 20 22 25 73 22 2c 20 7a 29 3b  trace, "%s", z);
2010: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2020: 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  z);.}.#endif.../
2030: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20  *.** Determines 
2040: 69 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61  if a string is a
2050: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a   number of not..
2060: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
2070: 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61  Number(const cha
2080: 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e  r *z, int *realn
2090: 75 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  um){.  if( *z=='
20a0: 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20  -' || *z=='+' ) 
20b0: 7a 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69  z++;.  if( !IsDi
20c0: 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72  git(*z) ){.    r
20d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
20e0: 2b 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75  ++;.  if( realnu
20f0: 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30  m ) *realnum = 0
2100: 3b 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67  ;.  while( IsDig
2110: 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d  it(*z) ){ z++; }
2120: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29  .  if( *z=='.' )
2130: 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69  {.    z++;.    i
2140: 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20  f( !IsDigit(*z) 
2150: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2160: 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a  while( IsDigit(*
2170: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  z) ){ z++; }.   
2180: 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a   if( realnum ) *
2190: 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d  realnum = 1;.  }
21a0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c  .  if( *z=='e' |
21b0: 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20  | *z=='E' ){.   
21c0: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a   z++;.    if( *z
21d0: 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27  =='+' || *z=='-'
21e0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
21f0: 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72  !IsDigit(*z) ) r
2200: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
2210: 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20  le( IsDigit(*z) 
2220: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ z++; }.    if
2230: 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61  ( realnum ) *rea
2240: 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lnum = 1;.  }.  
2250: 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a  return *z==0;.}.
2260: 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
2270: 63 68 61 72 2a 20 61 6e 64 20 61 6e 20 53 51 4c  char* and an SQL
2280: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 63   function to acc
2290: 65 73 73 20 69 74 73 20 63 75 72 72 65 6e 74 20  ess its current 
22a0: 76 61 6c 75 65 20 0a 2a 2a 20 66 72 6f 6d 20 77  value .** from w
22b0: 69 74 68 69 6e 20 61 6e 20 53 51 4c 20 73 74 61  ithin an SQL sta
22c0: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 70 72 6f  tement. This pro
22d0: 67 72 61 6d 20 75 73 65 64 20 74 6f 20 75 73 65  gram used to use
22e0: 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 5f   the .** sqlite_
22f0: 65 78 65 63 5f 70 72 69 6e 74 66 28 29 20 41 50  exec_printf() AP
2300: 49 20 74 6f 20 73 75 62 73 74 69 74 75 65 20 61  I to substitue a
2310: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 6e 20   string into an 
2320: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
2330: 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20 77 61  * The correct wa
2340: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 77 69 74  y to do this wit
2350: 68 20 73 71 6c 69 74 65 33 20 69 73 20 74 6f 20  h sqlite3 is to 
2360: 75 73 65 20 74 68 65 20 62 69 6e 64 20 41 50 49  use the bind API
2370: 2c 20 62 75 74 0a 2a 2a 20 73 69 6e 63 65 20 74  , but.** since t
2380: 68 65 20 73 68 65 6c 6c 20 69 73 20 62 75 69 6c  he shell is buil
2390: 74 20 61 72 6f 75 6e 64 20 74 68 65 20 63 61 6c  t around the cal
23a0: 6c 62 61 63 6b 20 70 61 72 61 64 69 67 6d 20 69  lback paradigm i
23b0: 74 20 77 6f 75 6c 64 20 62 65 20 61 20 6c 6f 74  t would be a lot
23c0: 0a 2a 2a 20 6f 66 20 77 6f 72 6b 2e 20 49 6e 73  .** of work. Ins
23d0: 74 65 61 64 20 6a 75 73 74 20 75 73 65 20 74 68  tead just use th
23e0: 69 73 20 68 61 63 6b 2c 20 77 68 69 63 68 20 69  is hack, which i
23f0: 73 20 71 75 69 74 65 20 68 61 72 6d 6c 65 73 73  s quite harmless
2400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2410: 74 20 63 68 61 72 20 2a 7a 53 68 65 6c 6c 53 74  t char *zShellSt
2420: 61 74 69 63 20 3d 20 30 3b 0a 73 74 61 74 69 63  atic = 0;.static
2430: 20 76 6f 69 64 20 73 68 65 6c 6c 73 74 61 74 69   void shellstati
2440: 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  cFunc(.  sqlite3
2450: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
2460: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
2470: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2480: 2a 61 72 67 76 0a 29 7b 0a 20 20 61 73 73 65 72  *argv.){.  asser
2490: 74 28 20 30 3d 3d 61 72 67 63 20 29 3b 0a 20 20  t( 0==argc );.  
24a0: 61 73 73 65 72 74 28 20 7a 53 68 65 6c 6c 53 74  assert( zShellSt
24b0: 61 74 69 63 20 29 3b 0a 20 20 55 4e 55 53 45 44  atic );.  UNUSED
24c0: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
24d0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
24e0: 45 54 45 52 28 61 72 67 76 29 3b 0a 20 20 73 71  ETER(argv);.  sq
24f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
2500: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 53 68 65 6c  t(context, zShel
2510: 6c 53 74 61 74 69 63 2c 20 2d 31 2c 20 53 51 4c  lStatic, -1, SQL
2520: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a  ITE_STATIC);.}..
2530: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2540: 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65  ine reads a line
2550: 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49   of text from FI
2560: 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a  LE in, stores.**
2570: 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d   the text in mem
2580: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
2590: 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72  m malloc() and r
25a0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
25b0: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e  .** to the text.
25c0: 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e    NULL is return
25d0: 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c  ed at end of fil
25e0: 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28  e, or if malloc(
25f0: 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  ).** fails..**.*
2600: 2a 20 49 66 20 7a 4c 69 6e 65 20 69 73 20 6e 6f  * If zLine is no
2610: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69  t NULL then it i
2620: 73 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  s a malloced buf
2630: 66 65 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f  fer returned fro
2640: 6d 0a 2a 2a 20 61 20 70 72 65 76 69 6f 75 73 20  m.** a previous 
2650: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
2660: 74 69 6e 65 20 74 68 61 74 20 6d 61 79 20 62 65  tine that may be
2670: 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   reused..*/.stat
2680: 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67  ic char *local_g
2690: 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 4c 69  etline(char *zLi
26a0: 6e 65 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20  ne, FILE *in){. 
26b0: 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 7a 4c 69   int nLine = zLi
26c0: 6e 65 3d 3d 30 20 3f 20 30 20 3a 20 31 30 30 3b  ne==0 ? 0 : 100;
26d0: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20  .  int n = 0;.. 
26e0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
26f0: 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65   if( n+100>nLine
2700: 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20   ){.      nLine 
2710: 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b  = nLine*2 + 100;
2720: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72  .      zLine = r
2730: 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c  ealloc(zLine, nL
2740: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
2750: 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72  zLine==0 ) retur
2760: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
2770: 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b  f( fgets(&zLine[
2780: 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69  n], nLine - n, i
2790: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  n)==0 ){.      i
27a0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
27b0: 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a     free(zLine);.
27c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
27d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27e0: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
27f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2800: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  .    while( zLin
2810: 65 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  e[n] ) n++;.    
2820: 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65  if( n>0 && zLine
2830: 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  [n-1]=='\n' ){. 
2840: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
2850: 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65  if( n>0 && zLine
2860: 5b 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 6e 2d  [n-1]=='\r' ) n-
2870: 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e  -;.      zLine[n
2880: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
2890: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
28a0: 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a  return zLine;.}.
28b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
28c0: 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  a single line of
28d0: 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a 2a 0a   input text..**.
28e0: 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68 65 6e  ** If in==0 then
28f0: 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e 64   read from stand
2900: 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20 70 72  ard input and pr
2910: 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61 63 68  ompt before each
2920: 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69 73 43   line..** If isC
2930: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 74  ontinuation is t
2940: 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f 6e 74  rue, then a cont
2950: 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74 20  inuation prompt 
2960: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
2970: 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75 61  ** If isContinua
2980: 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  tion is zero, th
2990: 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 6d  en the main prom
29a0: 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  pt should be use
29b0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50 72 69  d..**.** If zPri
29c0: 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  or is not NULL t
29d0: 68 65 6e 20 69 74 20 69 73 20 61 20 62 75 66 66  hen it is a buff
29e0: 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  er from a prior 
29f0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a 2a 20  call to this.** 
2a00: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63 61 6e  routine that can
2a10: 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a 0a 2a   be reused..**.*
2a20: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
2a30: 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20  stored in space 
2a40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
2a50: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
2a60: 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66 72 65  either.** be fre
2a70: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2a80: 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65 64 20   or else passed 
2a90: 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73 20 72  back into this r
2aa0: 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65 0a 2a  outine via the.*
2ab0: 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d 65 6e  * zPrior argumen
2ac0: 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  t for reuse..*/.
2ad0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e 65  static char *one
2ae0: 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49 4c 45  _input_line(FILE
2af0: 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50 72 69   *in, char *zPri
2b00: 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74 69 6e  or, int isContin
2b10: 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61 72 20  uation){.  char 
2b20: 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68 61 72  *zPrompt;.  char
2b30: 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69 66 28   *zResult;.  if(
2b40: 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 7a 52   in!=0 ){.    zR
2b50: 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67 65  esult = local_ge
2b60: 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 69 6e  tline(zPrior, in
2b70: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b80: 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f 6e 74  zPrompt = isCont
2b90: 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e 74 69  inuation ? conti
2ba0: 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61 69 6e  nuePrompt : main
2bb0: 50 72 6f 6d 70 74 3b 0a 23 69 66 20 64 65 66 69  Prompt;.#if defi
2bc0: 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
2bd0: 45 29 20 26 26 20 48 41 56 45 5f 52 45 41 44 4c  E) && HAVE_READL
2be0: 49 4e 45 3d 3d 31 0a 20 20 20 20 66 72 65 65 28  INE==1.    free(
2bf0: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
2c00: 73 75 6c 74 20 3d 20 72 65 61 64 6c 69 6e 65 28  sult = readline(
2c10: 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66  zPrompt);.    if
2c20: 28 20 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52  ( zResult && *zR
2c30: 65 73 75 6c 74 20 29 20 61 64 64 5f 68 69 73 74  esult ) add_hist
2c40: 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23 65  ory(zResult);.#e
2c50: 6c 73 65 0a 20 20 20 20 70 72 69 6e 74 66 28 22  lse.    printf("
2c60: 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b 0a 20  %s", zPrompt);. 
2c70: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
2c80: 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  );.    zResult =
2c90: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a   local_getline(z
2ca0: 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b 0a 23  Prior, stdin);.#
2cb0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
2cc0: 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 73  rn zResult;.}..s
2cd0: 74 72 75 63 74 20 70 72 65 76 69 6f 75 73 5f 6d  truct previous_m
2ce0: 6f 64 65 5f 64 61 74 61 20 7b 0a 20 20 69 6e 74  ode_data {.  int
2cf0: 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 2f   valid;        /
2d00: 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67 69 74  * Is there legit
2d10: 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f 20 2a   data in here? *
2d20: 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20  /.  int mode;.  
2d30: 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 0a  int showHeader;.
2d40: 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31    int colWidth[1
2d50: 30 30 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  00];.};../*.** A
2d60: 6e 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  n pointer to an 
2d70: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
2d80: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 70 61   structure is pa
2d90: 73 73 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ssed from.** the
2da0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 74 6f   main program to
2db0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
2dc0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
2dd0: 63 6f 6d 6d 75 6e 69 63 61 74 65 0a 2a 2a 20 73  communicate.** s
2de0: 74 61 74 65 20 61 6e 64 20 6d 6f 64 65 20 69 6e  tate and mode in
2df0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
2e00: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
2e10: 74 61 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ta {.  sqlite3 *
2e20: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
2e30: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
2e40: 0a 20 20 69 6e 74 20 65 63 68 6f 4f 6e 3b 20 20  .  int echoOn;  
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e60: 65 20 74 6f 20 65 63 68 6f 20 69 6e 70 75 74 20  e to echo input 
2e70: 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 20 20 69 6e  commands */.  in
2e80: 74 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20  t statsOn;      
2e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2ea0: 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  display memory s
2eb0: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
2ec0: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 69   finalize */.  i
2ed0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
2ee0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2ef0: 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c  of records displ
2f00: 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ayed so far */. 
2f10: 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20   FILE *out;     
2f20: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2f30: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
2f40: 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f 75  .  FILE *traceOu
2f50: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74  t;        /* Out
2f60: 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  put for sqlite3_
2f70: 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e 74  trace() */.  int
2f80: 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20 20   nErr;          
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a   errors seen */.
2fb0: 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20    int mode;     
2fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f           /* An o
2fd0: 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74 69  utput mode setti
2fe0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69 74  ng */.  int writ
2ff0: 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20 20 2f  ableSchema;    /
3000: 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41  * True if PRAGMA
3010: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
3020: 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f  =ON */.  int sho
3030: 77 48 65 61 64 65 72 3b 20 20 20 20 20 20 20 20  wHeader;        
3040: 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f 77 20  /* True to show 
3050: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20  column names in 
3060: 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e 20 6d  List or Column m
3070: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
3080: 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20  DestTable;      
3090: 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69  /* Name of desti
30a0: 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65  nation table whe
30b0: 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f  n MODE_Insert */
30c0: 0a 20 20 63 68 61 72 20 73 65 70 61 72 61 74 6f  .  char separato
30d0: 72 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 53 65 70  r[20];    /* Sep
30e0: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
30f0: 20 66 6f 72 20 4d 4f 44 45 5f 4c 69 73 74 20 2a   for MODE_List *
3100: 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68  /.  int colWidth
3110: 5b 31 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65  [100];     /* Re
3120: 71 75 65 73 74 65 64 20 77 69 64 74 68 20 6f 66  quested width of
3130: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65   each column whe
3140: 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65  n in column mode
3150: 2a 2f 0a 20 20 69 6e 74 20 61 63 74 75 61 6c 57  */.  int actualW
3160: 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41  idth[100];  /* A
3170: 63 74 75 61 6c 20 77 69 64 74 68 20 6f 66 20 65  ctual width of e
3180: 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ach column */.  
3190: 63 68 61 72 20 6e 75 6c 6c 76 61 6c 75 65 5b 32  char nullvalue[2
31a0: 30 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  0];    /* The te
31b0: 78 74 20 74 6f 20 70 72 69 6e 74 20 77 68 65 6e  xt to print when
31c0: 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61   a NULL comes ba
31d0: 63 6b 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  ck from.        
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
3200: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 72 65   */.  struct pre
3210: 76 69 6f 75 73 5f 6d 6f 64 65 5f 64 61 74 61 20  vious_mode_data 
3220: 65 78 70 6c 61 69 6e 50 72 65 76 3b 0a 20 20 20  explainPrev;.   
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 20 20 20 20 20 20 2f 2a 20 48 6f 6c 64 73 20 74        /* Holds t
3250: 68 65 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74  he mode informat
3260: 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 0a  ion just before.
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 20 20 20 20 20 20 2a 2a 20 2e 65 78 70           ** .exp
3290: 6c 61 69 6e 20 4f 4e 20 2a 2f 0a 20 20 63 68 61  lain ON */.  cha
32a0: 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41  r outfile[FILENA
32b0: 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65  ME_MAX]; /* File
32c0: 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f  name for *out */
32d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
32e0: 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f  DbFilename;    /
32f0: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
3300: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
3310: 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c   char *zFreeOnCl
3320: 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ose;         /* 
3330: 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65  Filename to free
3340: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
3350: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3360: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs;           /
3370: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
3380: 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65   use */.  sqlite
3390: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
33a0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
33b0: 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f  ement if any. */
33c0: 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20  .  FILE *pLog;  
33d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
33e0: 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65  te log output he
33f0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49  re */.  int *aiI
3400: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  ndent;         /
3410: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e  * Array of inden
3420: 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f  ts used in MODE_
3430: 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74  Explain */.  int
3440: 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   nIndent;       
3450: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
3460: 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20  rray aiIndent[] 
3470: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74  */.  int iIndent
3480: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
3490: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
34a0: 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d  op in aiIndent[]
34b0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
34c0: 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f  ese are the allo
34d0: 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64  wed modes..*/.#d
34e0: 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20  efine MODE_Line 
34f0: 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f      0  /* One co
3500: 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20  lumn per line.  
3510: 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65  Blank line betwe
3520: 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64  en records */.#d
3530: 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d  efine MODE_Colum
3540: 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65  n   1  /* One re
3550: 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e  cord per line in
3560: 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f   neat columns */
3570: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69  .#define MODE_Li
3580: 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65  st     2  /* One
3590: 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65   record per line
35a0: 20 77 69 74 68 20 61 20 73 65 70 61 72 61 74 6f   with a separato
35b0: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  r */.#define MOD
35c0: 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a  E_Semi     3  /*
35d0: 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69   Same as MODE_Li
35e0: 73 74 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b  st but append ";
35f0: 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a  " to each line *
3600: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48  /.#define MODE_H
3610: 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65  tml     4  /* Ge
3620: 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20  nerate an XHTML 
3630: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
3640: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35   MODE_Insert   5
3650: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51    /* Generate SQ
3660: 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61 74 65  L "insert" state
3670: 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ments */.#define
3680: 20 4d 4f 44 45 5f 54 63 6c 20 20 20 20 20 20 36   MODE_Tcl      6
3690: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 41 4e    /* Generate AN
36a0: 53 49 2d 43 20 6f 72 20 54 43 4c 20 71 75 6f 74  SI-C or TCL quot
36b0: 65 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23  ed elements */.#
36c0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 73 76 20  define MODE_Csv 
36d0: 20 20 20 20 20 37 20 20 2f 2a 20 51 75 6f 74 65       7  /* Quote
36e0: 20 73 74 72 69 6e 67 73 2c 20 6e 75 6d 62 65 72   strings, number
36f0: 73 20 61 72 65 20 70 6c 61 69 6e 20 2a 2f 0a 23  s are plain */.#
3700: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 45 78 70 6c  define MODE_Expl
3710: 61 69 6e 20 20 38 20 20 2f 2a 20 4c 69 6b 65 20  ain  8  /* Like 
3720: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74  MODE_Column, but
3730: 20 64 6f 20 6e 6f 74 20 74 72 75 6e 63 61 74 65   do not truncate
3740: 20 64 61 74 61 20 2a 2f 0a 0a 73 74 61 74 69 63   data */..static
3750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64   const char *mod
3760: 65 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22  eDescr[] = {.  "
3770: 6c 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e  line",.  "column
3780: 22 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22  ",.  "list",.  "
3790: 73 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c  semi",.  "html",
37a0: 0a 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22  .  "insert",.  "
37b0: 74 63 6c 22 2c 0a 20 20 22 63 73 76 22 2c 0a 20  tcl",.  "csv",. 
37c0: 20 22 65 78 70 6c 61 69 6e 22 2c 0a 7d 3b 0a 0a   "explain",.};..
37d0: 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20  /*.** Number of 
37e0: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61  elements in an a
37f0: 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  rray.*/.#define 
3800: 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28 69  ArraySize(X)  (i
3810: 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73 69  nt)(sizeof(X)/si
3820: 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a  zeof(X[0]))../*.
3830: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
3840: 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20  ing length that 
3850: 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68  is limited to wh
3860: 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  at can be stored
3870: 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20   in.** lower 30 
3880: 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74  bits of a 32-bit
3890: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
38a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
38b0: 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68  trlen30(const ch
38c0: 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20  ar *z){.  const 
38d0: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
38e0: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
38f0: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
3900: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
3910: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a  )(z2 - z);.}../*
3920: 0a 2a 2a 20 41 20 63 61 6c 6c 62 61 63 6b 20 66  .** A callback f
3930: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  or the sqlite3_l
3940: 6f 67 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  og() interface..
3950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3960: 68 65 6c 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41  hellLog(void *pA
3970: 72 67 2c 20 69 6e 74 20 69 45 72 72 43 6f 64 65  rg, int iErrCode
3980: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
3990: 73 67 29 7b 0a 20 20 73 74 72 75 63 74 20 63 61  sg){.  struct ca
39a0: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d  llback_data *p =
39b0: 20 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63   (struct callbac
39c0: 6b 5f 64 61 74 61 2a 29 70 41 72 67 3b 0a 20 20  k_data*)pArg;.  
39d0: 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20 29  if( p->pLog==0 )
39e0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 70 72 69 6e   return;.  fprin
39f0: 74 66 28 70 2d 3e 70 4c 6f 67 2c 20 22 28 25 64  tf(p->pLog, "(%d
3a00: 29 20 25 73 5c 6e 22 2c 20 69 45 72 72 43 6f 64  ) %s\n", iErrCod
3a10: 65 2c 20 7a 4d 73 67 29 3b 0a 20 20 66 66 6c 75  e, zMsg);.  fflu
3a20: 73 68 28 70 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a  sh(p->pLog);.}..
3a30: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
3a40: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
3a50: 20 61 20 68 65 78 2d 65 6e 63 6f 64 65 64 20 62   a hex-encoded b
3a60: 6c 6f 62 20 28 65 67 2e 20 58 27 31 32 33 34 27  lob (eg. X'1234'
3a70: 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   ).*/.static voi
3a80: 64 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f  d output_hex_blo
3a90: 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  b(FILE *out, con
3aa0: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 2c 20  st void *pBlob, 
3ab0: 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e  int nBlob){.  in
3ac0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6c  t i;.  char *zBl
3ad0: 6f 62 20 3d 20 28 63 68 61 72 20 2a 29 70 42 6c  ob = (char *)pBl
3ae0: 6f 62 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ob;.  fprintf(ou
3af0: 74 2c 22 58 27 22 29 3b 0a 20 20 66 6f 72 28 69  t,"X'");.  for(i
3b00: 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b  =0; i<nBlob; i++
3b10: 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
3b20: 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30  %02x",zBlob[i]&0
3b30: 78 66 66 29 3b 20 7d 0a 20 20 66 70 72 69 6e 74  xff); }.  fprint
3b40: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f  f(out,"'");.}../
3b50: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
3b60: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
3b70: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
3b80: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
3b90: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
3ba0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
3bb0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
3bc0: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
3bd0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
3be0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53 69  int i;.  int nSi
3bf0: 6e 67 6c 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ngle = 0;.  for(
3c00: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
3c10: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
3c20: 5c 27 27 20 29 20 6e 53 69 6e 67 6c 65 2b 2b 3b  \'' ) nSingle++;
3c30: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 53 69 6e 67  .  }.  if( nSing
3c40: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  le==0 ){.    fpr
3c50: 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c  intf(out,"'%s'",
3c60: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
3c70: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22   fprintf(out,"'"
3c80: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
3c90: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
3ca0: 30 3b 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21  0; z[i] && z[i]!
3cb0: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
3cc0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
3cd0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
3ce0: 6f 75 74 2c 22 27 27 22 29 3b 0a 20 20 20 20 20  out,"''");.     
3cf0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 65     z++;.      }e
3d00: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c  lse if( z[i]=='\
3d10: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  '' ){.        fp
3d20: 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 27  rintf(out,"%.*s'
3d30: 27 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 20 20 20  '",i,z);.       
3d40: 20 7a 20 2b 3d 20 69 2b 31 3b 0a 20 20 20 20 20   z += i+1;.     
3d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3d60: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22  fprintf(out,"%s"
3d70: 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ,z);.        bre
3d80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3d90: 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
3da0: 74 2c 22 27 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t,"'");.  }.}../
3db0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
3dc0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
3dd0: 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69  a quoted accordi
3de0: 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71  ng to C or TCL q
3df0: 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f  uoting rules..*/
3e00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
3e10: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c  put_c_string(FIL
3e20: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
3e30: 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e  ar *z){.  unsign
3e40: 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74  ed int c;.  fput
3e50: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77  c('"', out);.  w
3e60: 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b  hile( (c = *(z++
3e70: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
3e80: 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
3e90: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
3ea0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20  .      fputc(c, 
3eb0: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
3ec0: 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20  if( c=='"' ){.  
3ed0: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
3ee0: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
3ef0: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('"', out);.   
3f00: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
3f10: 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  t' ){.      fput
3f20: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
3f30: 20 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f      fputc('t', o
3f40: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
3f50: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  f( c=='\n' ){.  
3f60: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
3f70: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
3f80: 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('n', out);.   
3f90: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
3fa0: 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  r' ){.      fput
3fb0: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
3fc0: 20 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f      fputc('r', o
3fd0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
3fe0: 66 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78  f( !isprint(c&0x
3ff0: 66 66 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ff) ){.      fpr
4000: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33  intf(out, "\\%03
4010: 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20  o", c&0xff);.   
4020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
4030: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
4040: 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27   }.  }.  fputc('
4050: 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  "', out);.}../*.
4060: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
4070: 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20  ven string with 
4080: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
4090: 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a  are special to.*
40a0: 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a  * HTML escaped..
40b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
40c0: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
40d0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
40e0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
40f0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  nt i;.  if( z==0
4100: 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69   ) z = "";.  whi
4110: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f  le( *z ){.    fo
4120: 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 20 0a 20  r(i=0;   z[i] . 
4130: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
4140: 69 5d 21 3d 27 3c 27 20 0a 20 20 20 20 20 20 20  i]!='<' .       
4150: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26       && z[i]!='&
4160: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ' .            &
4170: 26 20 7a 5b 69 5d 21 3d 27 3e 27 20 0a 20 20 20  & z[i]!='>' .   
4180: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
4190: 21 3d 27 5c 22 27 20 0a 20 20 20 20 20 20 20 20  !='\"' .        
41a0: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27      && z[i]!='\'
41b0: 27 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b  ';.        i++){
41c0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b  }.    if( i>0 ){
41d0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
41e0: 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a  ut,"%.*s",i,z);.
41f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b      }.    if( z[
4200: 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20  i]=='<' ){.     
4210: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c   fprintf(out,"&l
4220: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
4230: 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b  if( z[i]=='&' ){
4240: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
4250: 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20  ut,"&amp;");.   
4260: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
4270: 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 66 70  ='>' ){.      fp
4280: 72 69 6e 74 66 28 6f 75 74 2c 22 26 67 74 3b 22  rintf(out,"&gt;"
4290: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
42a0: 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20   z[i]=='\"' ){. 
42b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
42c0: 2c 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20  ,"&quot;");.    
42d0: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
42e0: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\'' ){.      fp
42f0: 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b  rintf(out,"&#39;
4300: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
4310: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4320: 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31  }.    z += i + 1
4330: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
4340: 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69  f a field contai
4350: 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ns any character
4360: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
4370: 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   1 in the follow
4380: 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68  ing.** array, th
4390: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75  en the string mu
43a0: 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72  st be quoted for
43b0: 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   CSV..*/.static 
43c0: 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43  const char needC
43d0: 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20  svQuote[] = {.  
43e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
43f0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
4400: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4410: 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20  ,   .  1, 1, 1, 
4420: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
4430: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4440: 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c  1, 1, 1,   .  1,
4450: 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 1, 0, 0, 0, 
4460: 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 1,   0, 0, 0,
4470: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4480: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
4490: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20  , 0, 0, 0,   0, 
44a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
44b0: 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c  , 0, .  0, 0, 0,
44c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
44d0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
44e0: 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20   0, 0, 0, .  0, 
44f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4500: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
4510: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  0, 0, 0, 0, 0, .
4520: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
4530: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
4540: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4550: 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20   0, .  0, 0, 0, 
4560: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
4570: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4580: 30 2c 20 30 2c 20 31 2c 20 0a 20 20 31 2c 20 31  0, 0, 1, .  1, 1
4590: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
45a0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
45b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
45c0: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
45d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
45e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
45f0: 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20  , 1,   .  1, 1, 
4600: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4610: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
4620: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20  1, 1, 1, 1,   . 
4630: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4640: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
4650: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4660: 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c  1,   .  1, 1, 1,
4670: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4680: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
4690: 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31   1, 1, 1,   .  1
46a0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
46b0: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
46c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
46d0: 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31     .  1, 1, 1, 1
46e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
46f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4700: 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20  , 1, 1,   .  1, 
4710: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4720: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
4730: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
4740: 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70   .};../*.** Outp
4750: 75 74 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  ut a single term
4760: 20 6f 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c   of CSV.  Actual
4770: 6c 79 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  ly, p->separator
4780: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
4790: 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77  the separator, w
47a0: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
47b0: 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20  not be a comma. 
47c0: 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 20 69 73   p->nullvalue is
47d0: 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c  .** the null val
47e0: 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65  ue.  Strings are
47f0: 20 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73   quoted if neces
4800: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
4810: 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28  void output_csv(
4820: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
4830: 64 61 74 61 20 2a 70 2c 20 63 6f 6e 73 74 20 63  data *p, const c
4840: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70  har *z, int bSep
4850: 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  ){.  FILE *out =
4860: 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a   p->out;.  if( z
4870: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
4880: 74 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e  tf(out,"%s",p->n
4890: 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 7d 65 6c  ullvalue);.  }el
48a0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  se{.    int i;. 
48b0: 20 20 20 69 6e 74 20 6e 53 65 70 20 3d 20 73 74     int nSep = st
48c0: 72 6c 65 6e 33 30 28 70 2d 3e 73 65 70 61 72 61  rlen30(p->separa
48d0: 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tor);.    for(i=
48e0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
48f0: 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73 76       if( needCsv
4900: 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64  Quote[((unsigned
4910: 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 20 0a 20   char*)z)[i]] . 
4920: 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d          || (z[i]
4930: 3d 3d 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30  ==p->separator[0
4940: 5d 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  ] && .          
4950: 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d     (nSep==1 || m
4960: 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 73 65 70 61  emcmp(z, p->sepa
4970: 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29  rator, nSep)==0)
4980: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  ) ){.        i =
4990: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
49a0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
49b0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
49c0: 0a 20 20 20 20 20 20 70 75 74 63 28 27 22 27 2c  .      putc('"',
49d0: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 6f 72   out);.      for
49e0: 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
49f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
4a00: 69 5d 3d 3d 27 22 27 20 29 20 70 75 74 63 28 27  i]=='"' ) putc('
4a10: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  "', out);.      
4a20: 20 20 70 75 74 63 28 7a 5b 69 5d 2c 20 6f 75 74    putc(z[i], out
4a30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4a40: 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b   putc('"', out);
4a50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4a60: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
4a70: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  %s", z);.    }. 
4a80: 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b   }.  if( bSep ){
4a90: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
4aa0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65  out, "%s", p->se
4ab0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a  parator);.  }.}.
4ac0: 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a 2f  .#ifdef SIGINT./
4ad0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4ae0: 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20  e runs when the 
4af0: 75 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72  user presses Ctr
4b00: 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  l-C.*/.static vo
4b10: 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e  id interrupt_han
4b20: 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64  dler(int NotUsed
4b30: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
4b40: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
4b50: 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
4b60: 3d 20 31 3b 0a 20 20 69 66 28 20 64 62 20 29 20  = 1;.  if( db ) 
4b70: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
4b80: 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  t(db);.}.#endif.
4b90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
4ba0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
4bb0: 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 68 65  ine that the she
4bc0: 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f  ll.** invokes fo
4bd0: 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20  r each row of a 
4be0: 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f  query result..*/
4bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
4c00: 6c 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  l_callback(void 
4c10: 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c  *pArg, int nArg,
4c20: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63   char **azArg, c
4c30: 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 69 6e 74  har **azCol, int
4c40: 20 2a 61 69 54 79 70 65 29 7b 0a 20 20 69 6e 74   *aiType){.  int
4c50: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c   i;.  struct cal
4c60: 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 20 3d 20  lback_data *p = 
4c70: 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  (struct callback
4c80: 5f 64 61 74 61 2a 29 70 41 72 67 3b 0a 0a 20 20  _data*)pArg;..  
4c90: 73 77 69 74 63 68 28 20 70 2d 3e 6d 6f 64 65 20  switch( p->mode 
4ca0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  ){.    case MODE
4cb0: 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  _Line: {.      i
4cc0: 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20  nt w = 5;.      
4cd0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
4ce0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
4cf0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
4d00: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
4d10: 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a  en = strlen30(az
4d20: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
4d30: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
4d40: 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d   if( len>w ) w =
4d50: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   len;.      }.  
4d60: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
4d70: 3e 30 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e  >0 ) fprintf(p->
4d80: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
4d90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
4da0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4db0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
4dc0: 25 2a 73 20 3d 20 25 73 5c 6e 22 2c 20 77 2c 20  %*s = %s\n", w, 
4dd0: 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20  azCol[i],.      
4de0: 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
4df0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
4e00: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
4e10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4e20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4e30: 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a  se MODE_Explain:
4e40: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43  .    case MODE_C
4e50: 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 69  olumn: {.      i
4e60: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
4e70: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
4e80: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
4e90: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
4ea0: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
4eb0: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
4ec0: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70             w = p
4ee0: 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ->colWidth[i];. 
4ef0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
4f10: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
4f20: 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3d 3d           if( w==
4f30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
4f40: 20 77 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   w = strlen30(az
4f50: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
4f60: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
4f70: 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20       if( w<10 ) 
4f80: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
4f90: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
4fa0: 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b  (azArg && azArg[
4fb0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
4fc0: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
4fd0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
4fe0: 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20  <n ) w = n;.    
4ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5000: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
5010: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
5020: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
5030: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
5040: 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20  i] = w;.        
5050: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
5060: 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  ( p->showHeader 
5070: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
5080: 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( w<0 ){.      
5090: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
50a0: 70 2d 3e 6f 75 74 2c 22 25 2a 2e 2a 73 25 73 22  p->out,"%*.*s%s"
50b0: 2c 2d 77 2c 2d 77 2c 61 7a 43 6f 6c 5b 69 5d 2c  ,-w,-w,azCol[i],
50c0: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e   i==nArg-1 ? "\n
50d0: 22 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20  ": "  ");.      
50e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
50f0: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
5100: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a  tf(p->out,"%-*.*
5110: 73 25 73 22 2c 77 2c 77 2c 61 7a 43 6f 6c 5b 69  s%s",w,w,azCol[i
5120: 5d 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22  ], i==nArg-1 ? "
5130: 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  \n": "  ");.    
5140: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5150: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
5160: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
5170: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
5180: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
5190: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
51a0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b            int w;
51b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
51c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
51d0: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
51f0: 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74   = p->actualWidt
5200: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  h[i];.          
5210: 20 20 20 20 20 69 66 28 20 77 3c 30 20 29 20 77       if( w<0 ) w
5220: 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20 20   = -w;.         
5230: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5240: 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b           w = 10;
5250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
5260: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
5270: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a  tf(p->out,"%-*.*
5280: 73 25 73 22 2c 77 2c 77 2c 22 2d 2d 2d 2d 2d 2d  s%s",w,w,"------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20  -------------". 
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a  -------------",.
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20      i==nArg-1 ? 
5320: 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20 20 20  "\n": "  ");.   
5330: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5340: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5350: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
5360: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
5370: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
5380: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
5390: 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  w;.        if( i
53a0: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
53b0: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
53c0: 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e           w = p->
53d0: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a  actualWidth[i];.
53e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
53f0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
5400: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5410: 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d      if( p->mode=
5420: 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26  =MODE_Explain &&
5430: 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72   azArg[i] && str
5440: 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3e  len30(azArg[i])>
5450: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  w ){.          w
5460: 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
5470: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
5480: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
5490: 31 20 26 26 20 70 2d 3e 61 69 49 6e 64 65 6e 74  1 && p->aiIndent
54a0: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
54b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
54c0: 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64  >iIndent<p->nInd
54d0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
54e0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
54f0: 74 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69  t, "%*.s", p->ai
5500: 49 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e  Indent[p->iInden
5510: 74 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20  t], "");.       
5520: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
5530: 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20  ->iIndent++;.   
5540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5550: 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( w<0 ){.      
5560: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
5570: 75 74 2c 22 25 2a 2e 2a 73 25 73 22 2c 2d 77 2c  ut,"%*.*s%s",-w,
5580: 2d 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -w,.            
5590: 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41    azArg[i] ? azA
55a0: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76  rg[i] : p->nullv
55b0: 61 6c 75 65 2c 20 69 3d 3d 6e 41 72 67 2d 31 20  alue, i==nArg-1 
55c0: 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20  ? "\n": "  ");. 
55d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
55e0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
55f0: 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73  p->out,"%-*.*s%s
5600: 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20 20 20  ",w,w,.         
5610: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
5620: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
5630: 6c 6c 76 61 6c 75 65 2c 20 69 3d 3d 6e 41 72 67  llvalue, i==nArg
5640: 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29  -1 ? "\n": "  ")
5650: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5660: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5670: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5680: 4d 4f 44 45 5f 53 65 6d 69 3a 0a 20 20 20 20 63  MODE_Semi:.    c
5690: 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b  ase MODE_List: {
56a0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
56b0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
56c0: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
56d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
56e0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
56f0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
5700: 75 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b  ut,"%s%s",azCol[
5710: 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20  i], i==nArg-1 ? 
5720: 22 5c 6e 22 20 3a 20 70 2d 3e 73 65 70 61 72 61  "\n" : p->separa
5730: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
5740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5750: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
5760: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
5770: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
5780: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5790: 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
57a0: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20       if( z==0 ) 
57b0: 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  z = p->nullvalue
57c0: 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
57d0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
57e0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
57f0: 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20  i<nArg-1 ){.    
5800: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
5810: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73  >out, "%s", p->s
5820: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
5830: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
5840: 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 53 65 6d 69 20  mode==MODE_Semi 
5850: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
5860: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c  intf(p->out, ";\
5870: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  n");.        }el
5880: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  se{.          fp
5890: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
58a0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
58b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
58c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
58d0: 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a  se MODE_Html: {.
58e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
58f0: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
5900: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
5910: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5920: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
5930: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
5940: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
5950: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5960: 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20 20 20 20  t,"<TH>");.     
5970: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
5980: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
5990: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
59a0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
59b0: 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a  out,"</TH>\n");.
59c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
59d0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
59e0: 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TR>\n");.   
59f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
5a00: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
5a10: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70  .      fprintf(p
5a20: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
5a30: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5a40: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5a50: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
5a60: 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20  ut,"<TD>");.    
5a70: 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f      output_html_
5a80: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
5a90: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
5aa0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75  i] : p->nullvalu
5ab0: 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  e);.        fpri
5ac0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44  ntf(p->out,"</TD
5ad0: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >\n");.      }. 
5ae0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5af0: 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a  out,"</TR>\n");.
5b00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b10: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
5b20: 5f 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Tcl: {.      if
5b30: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
5b40: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
5b50: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
5b60: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
5b70: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
5b80: 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  t_c_string(p->ou
5b90: 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43  t,azCol[i] ? azC
5ba0: 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20  ol[i] : "");.   
5bb0: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
5bc0: 2d 31 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f  -1) fprintf(p->o
5bd0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65 70  ut, "%s", p->sep
5be0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
5bf0: 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   }.        fprin
5c00: 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b  tf(p->out,"\n");
5c10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5c20: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
5c30: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
5c40: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
5c50: 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  {.        output
5c60: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
5c70: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
5c80: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76  rg[i] : p->nullv
5c90: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 69  alue);.        i
5ca0: 66 28 69 3c 6e 41 72 67 2d 31 29 20 66 70 72 69  f(i<nArg-1) fpri
5cb0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
5cc0: 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  , p->separator);
5cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
5ce0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c  printf(p->out,"\
5cf0: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
5d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
5d10: 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20   MODE_Csv: {.   
5d20: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
5d30: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
5d40: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
5d50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
5d60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
5d70: 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a  output_csv(p, az
5d80: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
5d90: 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31  ] : "", i<nArg-1
5da0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5db0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5dc0: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
5dd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
5de0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
5df0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5e00: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5e10: 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70      output_csv(p
5e20: 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41  , azArg[i], i<nA
5e30: 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rg-1);.      }. 
5e40: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5e50: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
5e60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5e70: 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65    case MODE_Inse
5e80: 72 74 3a 20 7b 0a 20 20 20 20 20 20 70 2d 3e 63  rt: {.      p->c
5e90: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
5ea0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
5eb0: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
5ec0: 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54 20 49  p->out,"INSERT I
5ed0: 4e 54 4f 20 25 73 20 56 41 4c 55 45 53 28 22 2c  NTO %s VALUES(",
5ee0: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a  p->zDestTable);.
5ef0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5f00: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
5f10: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 20       char *zSep 
5f20: 3d 20 69 3e 30 20 3f 20 22 2c 22 3a 20 22 22 3b  = i>0 ? ",": "";
5f30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
5f40: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
5f50: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
5f60: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
5f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
5f80: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
5f90: 4e 55 4c 4c 22 2c 7a 53 65 70 29 3b 0a 20 20 20  NULL",zSep);.   
5fa0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
5fb0: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
5fc0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  i]==SQLITE_TEXT 
5fd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
5fe0: 20 7a 53 65 70 5b 30 5d 20 29 20 66 70 72 69 6e   zSep[0] ) fprin
5ff0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 7a  tf(p->out,"%s",z
6000: 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sep);.          
6010: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
6020: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
6030: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
6040: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
6050: 20 26 26 20 28 61 69 54 79 70 65 5b 69 5d 3d 3d   && (aiType[i]==
6060: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c  SQLITE_INTEGER |
6070: 7c 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  | aiType[i]==SQL
6080: 49 54 45 5f 46 4c 4f 41 54 29 20 29 7b 0a 20 20  ITE_FLOAT) ){.  
6090: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
60a0: 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 7a 53  p->out,"%s%s",zS
60b0: 65 70 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ep, azArg[i]);. 
60c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
60d0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
60e0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
60f0: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
6100: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
6110: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
6120: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
6130: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
6140: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
6150: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
6160: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
6170: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
6180: 20 20 20 20 69 66 28 20 7a 53 65 70 5b 30 5d 20      if( zSep[0] 
6190: 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  ) fprintf(p->out
61a0: 2c 22 25 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20  ,"%s",zSep);.   
61b0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65         output_he
61c0: 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70  x_blob(p->out, p
61d0: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20  Blob, nBlob);.  
61e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
61f0: 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69  isNumber(azArg[i
6200: 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 0) ){.       
6210: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
6220: 74 2c 22 25 73 25 73 22 2c 7a 53 65 70 2c 20 61  t,"%s%s",zSep, a
6230: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
6240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6250: 20 20 20 69 66 28 20 7a 53 65 70 5b 30 5d 20 29     if( zSep[0] )
6260: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
6270: 22 25 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20  "%s",zSep);.    
6280: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
6290: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
62a0: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
62b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
62c0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
62d0: 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20  >out,");\n");.  
62e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
62f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
6310: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
6320: 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20  outine that the 
6330: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a  SQLite library.*
6340: 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61  * invokes for ea
6350: 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72  ch row of a quer
6360: 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  y result..*/.sta
6370: 74 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b  tic int callback
6380: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
6390: 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
63a0: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f  Arg, char **azCo
63b0: 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77  l){.  /* since w
63c0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70  e don't have typ
63d0: 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65  e info, call the
63e0: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20   shell_callback 
63f0: 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
6400: 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68  e */.  return sh
6410: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72  ell_callback(pAr
6420: 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20  g, nArg, azArg, 
6430: 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a  azCol, NULL);.}.
6440: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  ./*.** Set the d
6450: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
6460: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 61   field of the ca
6470: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 73 74 72 75  llback_data stru
6480: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20  cture to.** the 
6490: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
64a0: 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65  e given.  Escape
64b0: 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61   any quote chara
64c0: 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cters in the.** 
64d0: 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  table name..*/.s
64e0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74  tatic void set_t
64f0: 61 62 6c 65 5f 6e 61 6d 65 28 73 74 72 75 63 74  able_name(struct
6500: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a   callback_data *
6510: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
6520: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Name){.  int i, 
6530: 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f  n;.  int needQuo
6540: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  te;.  char *z;..
6550: 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61    if( p->zDestTa
6560: 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ble ){.    free(
6570: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a  p->zDestTable);.
6580: 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
6590: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
65a0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
65b0: 72 6e 3b 0a 20 20 6e 65 65 64 51 75 6f 74 65 20  rn;.  needQuote 
65c0: 3d 20 21 69 73 61 6c 70 68 61 28 28 75 6e 73 69  = !isalpha((unsi
65d0: 67 6e 65 64 20 63 68 61 72 29 2a 7a 4e 61 6d 65  gned char)*zName
65e0: 29 20 26 26 20 2a 7a 4e 61 6d 65 21 3d 27 5f 27  ) && *zName!='_'
65f0: 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a  ;.  for(i=n=0; z
6600: 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 2c 20 6e 2b  Name[i]; i++, n+
6610: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
6620: 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63  lnum((unsigned c
6630: 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26 26  har)zName[i]) &&
6640: 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
6650: 7b 0a 20 20 20 20 20 20 6e 65 65 64 51 75 6f 74  {.      needQuot
6660: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  e = 1;.      if(
6670: 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20   zName[i]=='\'' 
6680: 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) n++;.    }.  }
6690: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
66a0: 20 29 20 6e 20 2b 3d 20 32 3b 0a 20 20 7a 20 3d   ) n += 2;.  z =
66b0: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
66c0: 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a   malloc( n+1 );.
66d0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
66e0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
66f0: 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20  ,"Error: out of 
6700: 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
6710: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e  exit(1);.  }.  n
6720: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 65 65 64   = 0;.  if( need
6730: 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
6740: 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 69 3d 30   '\'';.  for(i=0
6750: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
6760: 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a  {.    z[n++] = z
6770: 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Name[i];.    if(
6780: 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c 27 27 20   zName[i]=='\'' 
6790: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[n++] = '\'';
67a0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
67b0: 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
67c0: 27 5c 27 27 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30  '\'';.  z[n] = 0
67d0: 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65  ;.}../* zIn is e
67e0: 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20  ither a pointer 
67f0: 74 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e  to a NULL-termin
6800: 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d  ated string in m
6810: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a  emory obtained.*
6820: 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c  * from malloc(),
6830: 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   or a NULL point
6840: 65 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70  er. The string p
6850: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70  ointed to by zAp
6860: 70 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64  pend is.** added
6870: 20 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65   to zIn, and the
6880: 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64   result returned
6890: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
68a0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
68b0: 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74  )..** zIn, if it
68c0: 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69   was not NULL, i
68d0: 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  s freed..**.** I
68e0: 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
68f0: 6d 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20  ment, quote, is 
6900: 6e 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69  not '\0', then i
6910: 74 20 69 73 20 75 73 65 64 20 61 73 20 61 20 0a  t is used as a .
6920: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
6930: 65 72 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a  er for zAppend..
6940: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
6950: 61 70 70 65 6e 64 54 65 78 74 28 63 68 61 72 20  appendText(char 
6960: 2a 7a 49 6e 2c 20 63 68 61 72 20 63 6f 6e 73 74  *zIn, char const
6970: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
6980: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
6990: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
69a0: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
69b0: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 20  en30(zAppend);. 
69c0: 20 69 6e 74 20 6e 49 6e 20 3d 20 28 7a 49 6e 3f   int nIn = (zIn?
69d0: 73 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3a 30 29  strlen30(zIn):0)
69e0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65  ;..  len = nAppe
69f0: 6e 64 2b 6e 49 6e 2b 31 3b 0a 20 20 69 66 28 20  nd+nIn+1;.  if( 
6a00: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e  quote ){.    len
6a10: 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69   += 2;.    for(i
6a20: 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69  =0; i<nAppend; i
6a30: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
6a40: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
6a50: 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a   ) len++;.    }.
6a60: 20 20 7d 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 68    }..  zIn = (ch
6a70: 61 72 20 2a 29 72 65 61 6c 6c 6f 63 28 7a 49 6e  ar *)realloc(zIn
6a80: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a  , len);.  if( !z
6a90: 49 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  In ){.    return
6aa0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 71   0;.  }..  if( q
6ab0: 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68 61 72  uote ){.    char
6ac0: 20 2a 7a 43 73 72 20 3d 20 26 7a 49 6e 5b 6e 49   *zCsr = &zIn[nI
6ad0: 6e 5d 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20  n];.    *zCsr++ 
6ae0: 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66 6f 72  = quote;.    for
6af0: 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b  (i=0; i<nAppend;
6b00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 7a 43   i++){.      *zC
6b10: 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64 5b 69  sr++ = zAppend[i
6b20: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ];.      if( zAp
6b30: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
6b40: 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65   *zCsr++ = quote
6b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73  ;.    }.    *zCs
6b60: 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  r++ = quote;.   
6b70: 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 5c 30 27 3b   *zCsr++ = '\0';
6b80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 7a 43  .    assert( (zC
6b90: 73 72 2d 7a 49 6e 29 3d 3d 6c 65 6e 20 29 3b 0a  sr-zIn)==len );.
6ba0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
6bb0: 63 70 79 28 26 7a 49 6e 5b 6e 49 6e 5d 2c 20 7a  cpy(&zIn[nIn], z
6bc0: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
6bd0: 3b 0a 20 20 20 20 7a 49 6e 5b 6c 65 6e 2d 31 5d  ;.    zIn[len-1]
6be0: 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20   = '\0';.  }..  
6bf0: 72 65 74 75 72 6e 20 7a 49 6e 3b 0a 7d 0a 0a 0a  return zIn;.}...
6c00: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
6c10: 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20  query statement 
6c20: 74 68 61 74 20 77 69 6c 6c 20 67 65 6e 65 72 61  that will genera
6c30: 74 65 20 53 51 4c 20 6f 75 74 70 75 74 2e 20 20  te SQL output.  
6c40: 50 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73  Print.** the res
6c50: 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d  ult columns, com
6c60: 6d 61 2d 73 65 70 61 72 61 74 65 64 2c 20 6f 6e  ma-separated, on
6c70: 20 61 20 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e   a line and then
6c80: 20 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f   add a.** semico
6c90: 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 20 74  lon terminator t
6ca0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  o the end of tha
6cb0: 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  t line..**.** If
6cc0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
6cd0: 6f 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e 64 20  olumns is 1 and 
6ce0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  that column cont
6cf0: 61 69 6e 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a  ains text "--".*
6d00: 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
6d10: 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20   semicolon on a 
6d20: 73 65 70 61 72 61 74 65 20 6c 69 6e 65 2e 20 20  separate line.  
6d30: 54 68 61 74 20 77 61 79 2c 20 69 66 20 61 20 0a  That way, if a .
6d40: 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20  ** "--" comment 
6d50: 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 65 6e  occurs at the en
6d60: 64 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  d of the stateme
6d70: 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  nt, the comment.
6d80: 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73 75 6d 65  ** won't consume
6d90: 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 74   the semicolon t
6da0: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74  erminator..*/.st
6db0: 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74 61 62  atic int run_tab
6dc0: 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  le_dump_query(. 
6dd0: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
6de0: 5f 64 61 74 61 20 2a 70 2c 20 2f 2a 20 51 75 65  _data *p, /* Que
6df0: 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ry context */.  
6e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c  const char *zSel
6e10: 65 63 74 2c 20 20 20 20 20 2f 2a 20 53 45 4c 45  ect,     /* SELE
6e20: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
6e30: 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20  extract content 
6e40: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6e50: 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 20 2f 2a  *zFirstRow    /*
6e60: 20 50 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69   Print before fi
6e70: 72 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20  rst row, if not 
6e80: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
6e90: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
6ea0: 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ct;.  int rc;.  
6eb0: 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69  int nResult;.  i
6ec0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
6ed0: 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d 20 73 71  ar *z;.  rc = sq
6ee0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d  lite3_prepare(p-
6ef0: 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31  >db, zSelect, -1
6f00: 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  , &pSelect, 0);.
6f10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6f20: 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  _OK || !pSelect 
6f30: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  ){.    fprintf(p
6f40: 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52  ->out, "/**** ER
6f50: 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a  ROR: (%d) %s ***
6f60: 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 20 73 71 6c 69  **/\n", rc, sqli
6f70: 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
6f80: 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  ));.    if( (rc&
6f90: 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f  0xff)!=SQLITE_CO
6fa0: 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b  RRUPT ) p->nErr+
6fb0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  +;.    return rc
6fc0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
6fd0: 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
6fe0: 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20  t);.  nResult = 
6ff0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
7000: 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  ount(pSelect);. 
7010: 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
7020: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66  TE_ROW ){.    if
7030: 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20  ( zFirstRow ){. 
7040: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
7050: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73  out, "%s", zFirs
7060: 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69  tRow);.      zFi
7070: 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  rstRow = 0;.    
7080: 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74  }.    z = (const
7090: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
70a0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
70b0: 63 74 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69  ct, 0);.    fpri
70c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
70d0: 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , z);.    for(i=
70e0: 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b  1; i<nResult; i+
70f0: 2b 29 7b 20 0a 20 20 20 20 20 20 66 70 72 69 6e  +){ .      fprin
7100: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22  tf(p->out, ",%s"
7110: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
7120: 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69  _text(pSelect, i
7130: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
7140: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b  ( z==0 ) z = "";
7150: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d  .    while( z[0]
7160: 20 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c   && (z[0]!='-' |
7170: 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a  | z[1]!='-') ) z
7180: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  ++;.    if( z[0]
7190: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
71a0: 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e  f(p->out, "\n;\n
71b0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
71c0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
71d0: 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20  out, ";\n");.   
71e0: 20 7d 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20   }    .    rc = 
71f0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
7200: 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  lect);.  }.  rc 
7210: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
7220: 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  ze(pSelect);.  i
7230: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7240: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
7250: 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
7260: 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
7270: 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 20 73 71 6c  ***/\n", rc, sql
7280: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
7290: 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
72a0: 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
72b0: 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
72c0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
72d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
72e0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e 64  locate space and
72f0: 20 73 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e   save off curren
7300: 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a  t error string..
7310: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
7320: 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20  save_err_msg(.  
7330: 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20  sqlite3 *db     
7340: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7350: 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29  se to query */.)
7360: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20  {.  int nErrMsg 
7370: 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c  = 1+strlen30(sql
7380: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
7390: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
73a0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  g = sqlite3_mall
73b0: 6f 63 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69  oc(nErrMsg);.  i
73c0: 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
73d0: 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67    memcpy(zErrMsg
73e0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
73f0: 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a  (db), nErrMsg);.
7400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72    }.  return zEr
7410: 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rMsg;.}../*.** D
7420: 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74  isplay memory st
7430: 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ats..*/.static i
7440: 6e 74 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73  nt display_stats
7450: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71  /* Database to q
7480: 75 65 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  uery */.  struct
7490: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a   callback_data *
74a0: 70 41 72 67 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  pArg, /* Pointer
74b0: 20 74 6f 20 73 74 72 75 63 74 20 63 61 6c 6c 62   to struct callb
74c0: 61 63 6b 5f 64 61 74 61 20 2a 2f 0a 20 20 69 6e  ack_data */.  in
74d0: 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20  t bReset        
74e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
74f0: 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  e to reset the s
7500: 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tats */.){.  int
7510: 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69   iCur;.  int iHi
7520: 77 74 72 3b 0a 0a 20 20 69 66 28 20 70 41 72 67  wtr;..  if( pArg
7530: 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20 29 7b   && pArg->out ){
7540: 0a 20 20 20 20 0a 20 20 20 20 69 48 69 77 74 72  .    .    iHiwtr
7550: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
7560: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
7570: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
7580: 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 69 43 75  EMORY_USED, &iCu
7590: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
75a0: 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  et);.    fprintf
75b0: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4d 65 6d  (pArg->out, "Mem
75c0: 6f 72 79 20 55 73 65 64 3a 20 20 20 20 20 20 20  ory Used:       
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 25 64 20 28 6d 61 78 20 25 64 29 20 62 79    %d (max %d) by
75f0: 74 65 73 5c 6e 22 2c 20 69 43 75 72 2c 20 69 48  tes\n", iCur, iH
7600: 69 77 74 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iwtr);.    iHiwt
7610: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
7620: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75     sqlite3_statu
7630: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
7640: 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 26 69  MALLOC_COUNT, &i
7650: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
7660: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
7670: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e  tf(pArg->out, "N
7680: 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e  umber of Outstan
7690: 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73  ding Allocations
76a0: 3a 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c  :   %d (max %d)\
76b0: 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  n", iCur, iHiwtr
76c0: 29 3b 0a 2f 2a 0a 2a 2a 20 4e 6f 74 20 63 75 72  );./*.** Not cur
76d0: 72 65 6e 74 6c 79 20 75 73 65 64 20 62 79 20 74  rently used by t
76e0: 68 65 20 43 4c 49 2e 0a 2a 2a 20 20 20 20 69 48  he CLI..**    iH
76f0: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
7700: 3b 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.**    sqlite3_
7710: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
7720: 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55  ATUS_PAGECACHE_U
7730: 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
7740: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 2a 2a  wtr, bReset);.**
7750: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
7760: 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f  ->out, "Number o
7770: 66 20 50 63 61 63 68 65 20 50 61 67 65 73 20 55  f Pcache Pages U
7780: 73 65 64 3a 20 20 20 20 20 20 20 20 20 25 64 20  sed:         %d 
7790: 28 6d 61 78 20 25 64 29 20 70 61 67 65 73 5c 6e  (max %d) pages\n
77a0: 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29  ", iCur, iHiwtr)
77b0: 3b 0a 2a 2f 0a 20 20 20 20 69 48 69 77 74 72 20  ;.*/.    iHiwtr 
77c0: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
77d0: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28   sqlite3_status(
77e0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
77f0: 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57  GECACHE_OVERFLOW
7800: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
7810: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66  , bReset);.    f
7820: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
7830: 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61  , "Number of Pca
7840: 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74  che Overflow Byt
7850: 65 73 3a 20 20 20 20 20 25 64 20 28 6d 61 78 20  es:     %d (max 
7860: 25 64 29 20 62 79 74 65 73 5c 6e 22 2c 20 69 43  %d) bytes\n", iC
7870: 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 2f 2a 0a  ur, iHiwtr);./*.
7880: 2a 2a 20 4e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ** Not currently
7890: 20 75 73 65 64 20 62 79 20 74 68 65 20 43 4c 49   used by the CLI
78a0: 2e 0a 2a 2a 20 20 20 20 69 48 69 77 74 72 20 3d  ..**    iHiwtr =
78b0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 2a 2a 20 20   iCur = -1;.**  
78c0: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
78d0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53  (SQLITE_STATUS_S
78e0: 43 52 41 54 43 48 5f 55 53 45 44 2c 20 26 69 43  CRATCH_USED, &iC
78f0: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
7900: 73 65 74 29 3b 0a 2a 2a 20 20 20 20 66 70 72 69  set);.**    fpri
7910: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
7920: 4e 75 6d 62 65 72 20 6f 66 20 53 63 72 61 74 63  Number of Scratc
7930: 68 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 20 55 73  h Allocations Us
7940: 65 64 3a 20 20 25 64 20 28 6d 61 78 20 25 64 29  ed:  %d (max %d)
7950: 5c 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74  \n", iCur, iHiwt
7960: 72 29 3b 0a 2a 2f 0a 20 20 20 20 69 48 69 77 74  r);.*/.    iHiwt
7970: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
7980: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75     sqlite3_statu
7990: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
79a0: 53 43 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57  SCRATCH_OVERFLOW
79b0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
79c0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66  , bReset);.    f
79d0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
79e0: 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 53 63 72  , "Number of Scr
79f0: 61 74 63 68 20 4f 76 65 72 66 6c 6f 77 20 42 79  atch Overflow By
7a00: 74 65 73 3a 20 20 20 20 25 64 20 28 6d 61 78 20  tes:    %d (max 
7a10: 25 64 29 20 62 79 74 65 73 5c 6e 22 2c 20 69 43  %d) bytes\n", iC
7a20: 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  ur, iHiwtr);.   
7a30: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
7a40: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
7a50: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
7a60: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a  TATUS_MALLOC_SIZ
7a70: 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  E, &iCur, &iHiwt
7a80: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
7a90: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
7aa0: 74 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f  t, "Largest Allo
7ab0: 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20 20  cation:         
7ac0: 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65           %d byte
7ad0: 73 5c 6e 22 2c 20 69 48 69 77 74 72 29 3b 0a 20  s\n", iHiwtr);. 
7ae0: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
7af0: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
7b00: 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45  e3_status(SQLITE
7b10: 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
7b20: 45 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20 26  E_SIZE, &iCur, &
7b30: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
7b40: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
7b50: 67 2d 3e 6f 75 74 2c 20 22 4c 61 72 67 65 73 74  g->out, "Largest
7b60: 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69   Pcache Allocati
7b70: 6f 6e 3a 20 20 20 20 20 20 20 20 20 20 20 25 64  on:           %d
7b80: 20 62 79 74 65 73 5c 6e 22 2c 20 69 48 69 77 74   bytes\n", iHiwt
7b90: 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
7ba0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
7bb0: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53  sqlite3_status(S
7bc0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52  QLITE_STATUS_SCR
7bd0: 41 54 43 48 5f 53 49 5a 45 2c 20 26 69 43 75 72  ATCH_SIZE, &iCur
7be0: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
7bf0: 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  t);.    fprintf(
7c00: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 61 72 67  pArg->out, "Larg
7c10: 65 73 74 20 53 63 72 61 74 63 68 20 41 6c 6c 6f  est Scratch Allo
7c20: 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20 20  cation:         
7c30: 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 48   %d bytes\n", iH
7c40: 69 77 74 72 29 3b 0a 23 69 66 64 65 66 20 59 59  iwtr);.#ifdef YY
7c50: 54 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50  TRACKMAXSTACKDEP
7c60: 54 48 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  TH.    iHiwtr = 
7c70: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
7c80: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51  qlite3_status(SQ
7c90: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53  LITE_STATUS_PARS
7ca0: 45 52 5f 53 54 41 43 4b 2c 20 26 69 43 75 72 2c  ER_STACK, &iCur,
7cb0: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
7cc0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
7cd0: 41 72 67 2d 3e 6f 75 74 2c 20 22 44 65 65 70 65  Arg->out, "Deepe
7ce0: 73 74 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a  st Parser Stack:
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 20  %d (max %d)\n", 
7d10: 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 23  iCur, iHiwtr);.#
7d20: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
7d30: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f   pArg && pArg->o
7d40: 75 74 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20  ut && db ){.    
7d50: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
7d60: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
7d70: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
7d80: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
7d90: 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 20 26 69  OKASIDE_USED, &i
7da0: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
7db0: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
7dc0: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
7dd0: 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55  ookaside Slots U
7de0: 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  sed:            
7df0: 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c      %d (max %d)\
7e00: 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  n", iCur, iHiwtr
7e10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  );.    sqlite3_d
7e20: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
7e30: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
7e40: 4b 41 53 49 44 45 5f 48 49 54 2c 20 26 69 43 75  KASIDE_HIT, &iCu
7e50: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
7e60: 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  et);.    fprintf
7e70: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63  (pArg->out, "Suc
7e80: 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64  cessful lookasid
7e90: 65 20 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20  e attempts:     
7ea0: 20 20 25 64 5c 6e 22 2c 20 69 48 69 77 74 72 29    %d\n", iHiwtr)
7eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
7ec0: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
7ed0: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
7ee0: 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c  ASIDE_MISS_SIZE,
7ef0: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
7f00: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70   bReset);.    fp
7f10: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
7f20: 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c   "Lookaside fail
7f30: 75 72 65 73 20 64 75 65 20 74 6f 20 73 69 7a 65  ures due to size
7f40: 3a 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 48  :      %d\n", iH
7f50: 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iwtr);.    sqlit
7f60: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
7f70: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
7f80: 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f  _LOOKASIDE_MISS_
7f90: 46 55 4c 4c 2c 20 26 69 43 75 72 2c 20 26 69 48  FULL, &iCur, &iH
7fa0: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
7fb0: 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d     fprintf(pArg-
7fc0: 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65  >out, "Lookaside
7fd0: 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f   failures due to
7fe0: 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e   OOM:       %d\n
7ff0: 22 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20  ", iHiwtr);.    
8000: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
8010: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
8020: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
8030: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
8040: 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  CHE_USED, &iCur,
8050: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
8060: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
8070: 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72  Arg->out, "Pager
8080: 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20   Heap Usage:    
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75  %d bytes\n", iCu
80b0: 72 29 3b 20 20 20 20 69 48 69 77 74 72 20 3d 20  r);    iHiwtr = 
80c0: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
80d0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
80e0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
80f0: 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20  ATUS_CACHE_HIT, 
8100: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
8110: 31 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  1);.    fprintf(
8120: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
8130: 20 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20   cache hits:    
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
8160: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
8170: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
8180: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
8190: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
81a0: 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43  _CACHE_MISS, &iC
81b0: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
81c0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
81d0: 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
81e0: 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20  che misses:     
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
8200: 5c 6e 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 20  \n", iCur); .   
8210: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
8220: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
8230: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
8240: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
8250: 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75  ACHE_WRITE, &iCu
8260: 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
8270: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
8280: 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
8290: 68 65 20 77 72 69 74 65 73 3a 20 20 20 20 20 20  he writes:      
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
82b0: 6e 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 20 20  n", iCur); .    
82c0: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
82d0: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
82e0: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
82f0: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43  LITE_DBSTATUS_SC
8300: 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72  HEMA_USED, &iCur
8310: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
8320: 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  t);.    fprintf(
8330: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65  pArg->out, "Sche
8340: 6d 61 20 48 65 61 70 20 55 73 61 67 65 3a 20 20  ma Heap Usage:  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 43   %d bytes\n", iC
8370: 75 72 29 3b 20 0a 20 20 20 20 69 48 69 77 74 72  ur); .    iHiwtr
8380: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
8390: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
83a0: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
83b0: 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45  BSTATUS_STMT_USE
83c0: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
83d0: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
83e0: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
83f0: 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65  t, "Statement He
8400: 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61  ap/Lookaside Usa
8410: 67 65 3a 20 20 20 20 20 20 25 64 20 62 79 74 65  ge:      %d byte
8420: 73 5c 6e 22 2c 20 69 43 75 72 29 3b 20 0a 20 20  s\n", iCur); .  
8430: 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26 26  }..  if( pArg &&
8440: 20 70 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62   pArg->out && db
8450: 20 26 26 20 70 41 72 67 2d 3e 70 53 74 6d 74 20   && pArg->pStmt 
8460: 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  ){.    iCur = sq
8470: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
8480: 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
8490: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
84a0: 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 20  _FULLSCAN_STEP, 
84b0: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
84c0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
84d0: 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a  "Fullscan Steps:
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
8500: 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
8510: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
8520: 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
8530: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
8540: 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b  S_SORT, bReset);
8550: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
8560: 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70  g->out, "Sort Op
8570: 65 72 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20  erations:       
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
8590: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
85a0: 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
85b0: 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
85c0: 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
85d0: 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
85e0: 44 45 58 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  DEX, bReset);.  
85f0: 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e    fprintf(pArg->
8600: 6f 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20  out, "Autoindex 
8610: 49 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20 20  Inserts:        
8620: 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
8630: 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
8640: 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
8650: 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
8660: 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
8670: 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20  STATUS_VM_STEP, 
8680: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
8690: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
86a0: 22 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65  "Virtual Machine
86b0: 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
86c0: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
86d0: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
86e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  n 0;.}../*.** Pa
86f0: 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20  rameter azArray 
8700: 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f  points to a zero
8710: 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61  -terminated arra
8720: 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53  y of strings. zS
8730: 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  tr.** points to 
8740: 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72  a single nul-ter
8750: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20  minated string. 
8760: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
8770: 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71  if zStr.** is eq
8780: 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ual, according t
8790: 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61  o strcmp(), to a
87a0: 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ny of the string
87b0: 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a  s in the array..
87c0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
87d0: 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  turn zero..*/.st
87e0: 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f  atic int str_in_
87f0: 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72  array(const char
8800: 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68   *zStr, const ch
8810: 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20  ar **azArray){. 
8820: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
8830: 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69  0; azArray[i]; i
8840: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d  ++){.    if( 0==
8850: 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41  strcmp(zStr, azA
8860: 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72  rray[i]) ) retur
8870: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
8880: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
8890: 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d   compiled statem
88a0: 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73  ent pSql appears
88b0: 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49   to be an EXPLAI
88c0: 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c  N statement, all
88d0: 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70  ocate.** and pop
88e0: 75 6c 61 74 65 20 74 68 65 20 63 61 6c 6c 62 61  ulate the callba
88f0: 63 6b 5f 64 61 74 61 2e 61 69 49 6e 64 65 6e 74  ck_data.aiIndent
8900: 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74 68  [] array with th
8910: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73  e number of.** s
8920: 70 61 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64  paces each opcod
8930: 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65  e should be inde
8940: 6e 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 69  nted before it i
8950: 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2a 0a 2a 2a  s output. .**.**
8960: 20 54 68 65 20 69 6e 64 65 6e 74 69 6e 67 20 72   The indenting r
8970: 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ules are:.**.** 
8980: 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22      * For each "
8990: 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22  Next", "Prev", "
89a0: 56 4e 65 78 74 22 20 6f 72 20 22 56 50 72 65 76  VNext" or "VPrev
89b0: 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69  " instruction, i
89c0: 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61  ndent.**       a
89d0: 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20  ll opcodes that 
89e0: 6f 63 63 75 72 20 62 65 74 77 65 65 6e 20 74 68  occur between th
89f0: 65 20 70 32 20 6a 75 6d 70 20 64 65 73 74 69 6e  e p2 jump destin
8a00: 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70  ation and the op
8a10: 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20 20 69 74  code.**       it
8a20: 73 65 6c 66 20 62 79 20 32 20 73 70 61 63 65 73  self by 2 spaces
8a30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f  ..**.**     * Fo
8a40: 72 20 65 61 63 68 20 22 47 6f 74 6f 22 2c 20 69  r each "Goto", i
8a50: 66 20 74 68 65 20 6a 75 6d 70 20 64 65 73 74 69  f the jump desti
8a60: 6e 61 74 69 6f 6e 20 69 73 20 65 61 72 6c 69 65  nation is earlie
8a70: 72 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  r in the program
8a80: 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 65 6e  .**       and en
8a90: 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  ds on one of:.**
8aa0: 20 20 20 20 20 20 20 20 20 20 59 69 65 6c 64 20            Yield 
8ab0: 20 53 65 65 6b 47 74 20 20 53 65 65 6b 4c 74 20   SeekGt  SeekLt 
8ac0: 20 52 6f 77 53 65 74 52 65 61 64 20 20 52 65 77   RowSetRead  Rew
8ad0: 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20 74 68 65  ind.**       the
8ae0: 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63  n indent all opc
8af0: 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  odes between the
8b00: 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63   earlier instruc
8b10: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e  tion.**       an
8b20: 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70  d "Goto" by 2 sp
8b30: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
8b40: 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74  void explain_dat
8b50: 61 5f 70 72 65 70 61 72 65 28 73 74 72 75 63 74  a_prepare(struct
8b60: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a   callback_data *
8b70: 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  p, sqlite3_stmt 
8b80: 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74 20  *pSql){.  const 
8b90: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
8ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8bb0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
8bc0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
8bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20 20  const char *z;  
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63 6b  /* Used to check
8c00: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   if this is an E
8c10: 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74 20  XPLAIN */.  int 
8c20: 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20 20  *abYield = 0;   
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8c40: 72 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e 20  rue if op is an 
8c50: 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  OP_Yield */.  in
8c60: 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20  t nAlloc = 0;   
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c80: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
8c90: 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d  of p->aiIndent[]
8ca0: 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20 69  , abYield */.  i
8cb0: 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20 20  nt iOp;         
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8cd0: 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72 61  * Index of opera
8ce0: 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e 64  tion in p->aiInd
8cf0: 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e 73  ent[] */..  cons
8d00: 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b 5d  t char *azNext[]
8d10: 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50 72   = { "Next", "Pr
8d20: 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22 56  ev", "VPrev", "V
8d30: 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e 65  Next", "SorterNe
8d40: 78 74 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73  xt", 0 };.  cons
8d50: 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b  t char *azYield[
8d60: 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20 22  ] = { "Yield", "
8d70: 53 65 65 6b 4c 74 22 2c 20 22 53 65 65 6b 47 74  SeekLt", "SeekGt
8d80: 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22 2c  ", "RowSetRead",
8d90: 20 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a   "Rewind", 0 };.
8da0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
8db0: 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f  Goto[] = { "Goto
8dc0: 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72  ", 0 };..  /* Tr
8dd0: 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  y to figure out 
8de0: 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c  if this is reall
8df0: 79 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61  y an EXPLAIN sta
8e00: 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a  tement. If this.
8e10: 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76    ** cannot be v
8e20: 65 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20  erified, return 
8e30: 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 7a 53 71  early.  */.  zSq
8e40: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
8e50: 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71  pSql);.  if( zSq
8e60: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  l==0 ) return;. 
8e70: 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d   for(z=zSql; *z=
8e80: 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27  =' ' || *z=='\t'
8e90: 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20   || *z=='\n' || 
8ea0: 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\f' || *z==
8eb0: 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66  '\r'; z++);.  if
8ec0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
8ed0: 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c  mp(z, "explain",
8ee0: 20 37 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   7) ) return;.. 
8ef0: 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49   for(iOp=0; SQLI
8f00: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
8f10: 73 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b  step(pSql); iOp+
8f20: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  +){.    int i;. 
8f30: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
8f40: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
8f50: 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  t(pSql, 0);.    
8f60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
8f70: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
8f80: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
8f90: 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20  xt(pSql, 1);..  
8fa0: 20 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74    /* Set p2 to t
8fb0: 68 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74  he P2 field of t
8fc0: 68 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64  he current opcod
8fd0: 65 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e  e. Then, assumin
8fe0: 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32  g that.    ** p2
8ff0: 20 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69   is an instructi
9000: 6f 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74 20  on address, set 
9010: 76 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f  variable p2op to
9020: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
9030: 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  at.    ** instru
9040: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49  ction in the aiI
9050: 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70  ndent[] array. p
9060: 32 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62  2 and p2op may b
9070: 65 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20  e different if. 
9080: 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
9090: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
90a0: 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70   part of a sub-p
90b0: 72 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64  rogram generated
90c0: 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51   by an.    ** SQ
90d0: 4c 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72  L trigger or for
90e0: 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20  eign key.  */.  
90f0: 20 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74    int p2 = sqlit
9100: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
9110: 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20  ql, 3);.    int 
9120: 70 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f  p2op = (p2 + (iO
9130: 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20  p-iAddr));..    
9140: 2f 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61  /* Grow the p->a
9150: 69 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73  iIndent array as
9160: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
9170: 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63   if( iOp>=nAlloc
9180: 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63   ){.      nAlloc
9190: 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70   += 100;.      p
91a0: 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e  ->aiIndent = (in
91b0: 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  t*)sqlite3_reall
91c0: 6f 63 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20  oc(p->aiIndent, 
91d0: 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e  nAlloc*sizeof(in
91e0: 74 29 29 3b 0a 20 20 20 20 20 20 61 62 59 69 65  t));.      abYie
91f0: 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ld = (int*)sqlit
9200: 65 33 5f 72 65 61 6c 6c 6f 63 28 61 62 59 69 65  e3_realloc(abYie
9210: 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ld, nAlloc*sizeo
9220: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 7d 0a 20  f(int));.    }. 
9230: 20 20 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20     abYield[iOp] 
9240: 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a  = str_in_array(z
9250: 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20  Op, azYield);.  
9260: 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f    p->aiIndent[iO
9270: 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  p] = 0;.    p->n
9280: 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a  Indent = iOp+1;.
9290: 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f  .    if( str_in_
92a0: 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78  array(zOp, azNex
92b0: 74 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  t) ){.      for(
92c0: 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69  i=p2op; i<iOp; i
92d0: 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b  ++) p->aiIndent[
92e0: 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  i] += 2;.    }. 
92f0: 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72     if( str_in_ar
9300: 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29  ray(zOp, azGoto)
9310: 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64   && p2op<p->nInd
9320: 65 6e 74 20 26 26 20 61 62 59 69 65 6c 64 5b 70  ent && abYield[p
9330: 32 6f 70 5d 20 29 7b 0a 20 20 20 20 20 20 66 6f  2op] ){.      fo
9340: 72 28 69 3d 70 32 6f 70 2b 31 3b 20 69 3c 69 4f  r(i=p2op+1; i<iO
9350: 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64  p; i++) p->aiInd
9360: 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20  ent[i] += 2;.   
9370: 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e   }.  }..  p->iIn
9380: 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  dent = 0;.  sqli
9390: 74 65 33 5f 66 72 65 65 28 61 62 59 69 65 6c 64  te3_free(abYield
93a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
93b0: 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  et(pSql);.}../*.
93c0: 2a 2a 20 46 72 65 65 20 74 68 65 20 61 72 72 61  ** Free the arra
93d0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 65  y allocated by e
93e0: 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70  xplain_data_prep
93f0: 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  are()..*/.static
9400: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61   void explain_da
9410: 74 61 5f 64 65 6c 65 74 65 28 73 74 72 75 63 74  ta_delete(struct
9420: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a   callback_data *
9430: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p){.  sqlite3_fr
9440: 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b  ee(p->aiIndent);
9450: 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d  .  p->aiIndent =
9460: 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74   0;.  p->nIndent
9470: 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65   = 0;.  p->iInde
9480: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
9490: 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65   Execute a state
94a0: 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73  ment or set of s
94b0: 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e  tatements.  Prin
94c0: 74 20 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74  t .** any result
94d0: 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65   rows/columns de
94e0: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63  pending on the c
94f0: 75 72 72 65 6e 74 20 6d 6f 64 65 20 0a 2a 2a 20  urrent mode .** 
9500: 73 65 74 20 76 69 61 20 74 68 65 20 73 75 70 70  set via the supp
9510: 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  lied callback..*
9520: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72  *.** This is ver
9530: 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  y similar to SQL
9540: 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73  ite's built-in s
9550: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 0a 2a  qlite3_exec() .*
9560: 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78 63 65 70  * function excep
9570: 74 20 69 74 20 74 61 6b 65 73 20 61 20 73 6c 69  t it takes a sli
9580: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20  ghtly different 
9590: 63 61 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 6e 64  callback .** and
95a0: 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61 20 61   callback data a
95b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
95c0: 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65 78 65  ic int shell_exe
95d0: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
95e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61   /* An open data
9610: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
9620: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20        /* SQL to 
9650: 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a  be evaluated */.
9660: 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
9670: 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
9680: 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29  r**,char**,int*)
9690: 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  ,   /* Callback 
96a0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f            /* (no
96e0: 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  t the same as sq
96f0: 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20  lite3_exec) */. 
9700: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
9710: 5f 64 61 74 61 20 2a 70 41 72 67 2c 20 20 20 20  _data *pArg,    
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9730: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63  Pointer to struc
9740: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
9750: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
9760: 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72   /* Error msg wr
9790: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
97a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
97b0: 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20  *pStmt = NULL;  
97c0: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
97d0: 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
97e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
97f0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
9800: 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
9810: 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  */.  int rc2;.  
9820: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66  const char *zLef
9830: 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20  tover;          
9840: 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f  /* Tail of unpro
9850: 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 0a 20  cessed SQL */.. 
9860: 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b   if( pzErrMsg ){
9870: 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
9880: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 77 68   NULL;.  }..  wh
9890: 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20  ile( zSql[0] && 
98a0: 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63  (SQLITE_OK == rc
98b0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
98c0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
98d0: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
98e0: 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65  pStmt, &zLeftove
98f0: 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  r);.    if( SQLI
9900: 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20  TE_OK != rc ){. 
9910: 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73       if( pzErrMs
9920: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
9930: 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
9940: 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
9950: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9960: 20 20 20 20 69 66 28 20 21 70 53 74 6d 74 20 29      if( !pStmt )
9970: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69  {.        /* thi
9980: 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20  s happens for a 
9990: 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65  comment or white
99a0: 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20  -space */.      
99b0: 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
99c0: 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
99d0: 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b  e( IsSpace(zSql[
99e0: 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
99f0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
9a00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
9a10: 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20 70  * save off the p
9a20: 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74  repared statment
9a30: 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65   handle and rese
9a40: 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
9a50: 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b       if( pArg ){
9a60: 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70  .        pArg->p
9a70: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
9a80: 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20        pArg->cnt 
9a90: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
9aa0: 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20      /* echo the 
9ab0: 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66  sql statement if
9ac0: 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20   echo on */.    
9ad0: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
9ae0: 72 67 2d 3e 65 63 68 6f 4f 6e 20 29 7b 0a 20 20  rg->echoOn ){.  
9af0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
9b00: 20 2a 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c   *zStmtSql = sql
9b10: 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
9b20: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
9b30: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c  (pArg->out, "%s\
9b40: 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a  n", zStmtSql ? z
9b50: 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b  StmtSql : zSql);
9b60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9b70: 2f 2a 20 4f 75 74 70 75 74 20 54 45 53 54 43 54  /* Output TESTCT
9b80: 52 4c 5f 45 58 50 4c 41 49 4e 20 74 65 78 74 20  RL_EXPLAIN text 
9b90: 6f 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  of requested */.
9ba0: 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
9bb0: 26 20 70 41 72 67 2d 3e 6d 6f 64 65 3d 3d 4d 4f  & pArg->mode==MO
9bc0: 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20  DE_Explain ){.  
9bd0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
9be0: 20 2a 7a 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a   *zExplain = 0;.
9bf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9c00: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
9c10: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50  ITE_TESTCTRL_EXP
9c20: 4c 41 49 4e 5f 53 54 4d 54 2c 20 70 53 74 6d 74  LAIN_STMT, pStmt
9c30: 2c 20 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  , &zExplain);.  
9c40: 20 20 20 20 20 20 69 66 28 20 7a 45 78 70 6c 61        if( zExpla
9c50: 69 6e 20 26 26 20 7a 45 78 70 6c 61 69 6e 5b 30  in && zExplain[0
9c60: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ] ){.          f
9c70: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
9c80: 2c 20 22 25 73 22 2c 20 7a 45 78 70 6c 61 69 6e  , "%s", zExplain
9c90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9ca0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
9cb0: 66 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20 63  f the shell is c
9cc0: 75 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78  urrently in ".ex
9cd0: 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74  plain" mode, gat
9ce0: 68 65 72 20 74 68 65 20 65 78 74 72 61 0a 20 20  her the extra.  
9cf0: 20 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75      ** data requ
9d00: 69 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65  ired to add inde
9d10: 6e 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75  nts to the outpu
9d20: 74 2e 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t.*/.      if( p
9d30: 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6d 6f 64  Arg && pArg->mod
9d40: 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
9d50: 29 7b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  ){.        expla
9d60: 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
9d70: 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
9d80: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
9d90: 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73  perform the firs
9da0: 74 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69  t step.  this wi
9db0: 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65  ll tell us if we
9dc0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 61  .      ** have a
9dd0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 72 20 6e   result set or n
9de0: 6f 74 20 61 6e 64 20 68 6f 77 20 77 69 64 65 20  ot and how wide 
9df0: 69 74 20 69 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  it is..      */.
9e00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9e10: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
9e20: 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68        /* if we h
9e30: 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74  ave a result set
9e40: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ... */.      if(
9e50: 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72   SQLITE_ROW == r
9e60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  c ){.        /* 
9e70: 69 66 20 77 65 20 68 61 76 65 20 61 20 63 61 6c  if we have a cal
9e80: 6c 62 61 63 6b 2e 2e 2e 20 2a 2f 0a 20 20 20 20  lback... */.    
9e90: 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63      if( xCallbac
9ea0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  k ){.          /
9eb0: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
9ec0: 20 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74   for col name pt
9ed0: 72 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e  r, value ptr, an
9ee0: 64 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20  d type */.      
9ef0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73      int nCol = s
9f00: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
9f10: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
9f20: 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
9f30: 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  a = sqlite3_mall
9f40: 6f 63 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66  oc(3*nCol*sizeof
9f50: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b 20  (const char*) + 
9f60: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
9f70: 28 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20  ( !pData ){.    
9f80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
9f90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
9fa0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9fb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
9fc0: 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a  zCols = (char **
9fd0: 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  )pData;      /* 
9fe0: 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c 74 20  Names of result 
9ff0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
a000: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a         char **az
a010: 56 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e  Vals = &azCols[n
a020: 43 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52  Col];       /* R
a030: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
a040: 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70        int *aiTyp
a050: 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56  es = (int *)&azV
a060: 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65  als[nCol]; /* Re
a070: 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20  sult types */.  
a080: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c            int i,
a090: 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   x;.            
a0a0: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 69 6e  assert(sizeof(in
a0b0: 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28 63 68 61  t) <= sizeof(cha
a0c0: 72 20 2a 29 29 3b 20 0a 20 20 20 20 20 20 20 20  r *)); .        
a0d0: 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20      /* save off 
a0e0: 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e  ptrs to column n
a0f0: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ames */.        
a100: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a110: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
a120: 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b           azCols[
a130: 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  i] = (char *)sql
a140: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
a150: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
a160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a170: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
a180: 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61          /* extra
a190: 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20  ct the data and 
a1a0: 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20  data types */.  
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
a1c0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
a1d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a1e0: 20 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d 20     aiTypes[i] = 
a1f0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
a200: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69  mn_type(pStmt, i
a210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a220: 20 20 20 69 66 28 20 78 3d 3d 53 51 4c 49 54 45     if( x==SQLITE
a230: 5f 42 4c 4f 42 20 26 26 20 70 41 72 67 20 26 26  _BLOB && pArg &&
a240: 20 70 41 72 67 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44   pArg->mode==MOD
a250: 45 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20  E_Insert ){.    
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
a270: 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20  Vals[i] = "";.  
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
a290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
a2a0: 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d         azVals[i]
a2b0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
a2c0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
a2d0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
a2e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a2f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
a300: 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
a310: 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
a320: 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
a330: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
a340: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20   break; /* from 
a370: 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  for */.         
a380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a390: 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
a3a0: 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  for */..        
a3b0: 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61 74 61        /* if data
a3c0: 20 61 6e 64 20 74 79 70 65 73 20 65 78 74 72 61   and types extra
a3d0: 63 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  cted successfull
a3e0: 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  y... */.        
a3f0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
a400: 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 20 0a 20  _ROW == rc ){ . 
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a420: 2a 20 63 61 6c 6c 20 74 68 65 20 73 75 70 70 6c  * call the suppl
a430: 69 65 64 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ied callback wit
a440: 68 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f 77  h the result row
a450: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20   data */.       
a460: 20 20 20 20 20 20 20 20 20 69 66 28 20 78 43 61           if( xCa
a470: 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f  llback(pArg, nCo
a480: 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c  l, azVals, azCol
a490: 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20  s, aiTypes) ){. 
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f   rc = SQLITE_ABO
a4c0: 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RT;.            
a4d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
a4f0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
a500: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
a510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a530: 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51       } while( SQ
a540: 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
a550: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
a560: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
a570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
a580: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a590: 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
a5a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
a5b0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
a5c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 77 68  ;.          } wh
a5d0: 69 6c 65 28 20 72 63 20 3d 3d 20 53 51 4c 49 54  ile( rc == SQLIT
a5e0: 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20 20 20  E_ROW );.       
a5f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
a600: 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64    explain_data_d
a610: 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 0a 20 20  elete(pArg);..  
a620: 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61      /* print usa
a630: 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74  ge stats if stat
a640: 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  s on */.      if
a650: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
a660: 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
a670: 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73     display_stats
a680: 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20  (db, pArg, 0);. 
a690: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
a6a0: 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74   Finalize the st
a6b0: 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78 65  atement just exe
a6c0: 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20 66  cuted. If this f
a6d0: 61 69 6c 73 2c 20 73 61 76 65 20 61 20 0a 20 20  ails, save a .  
a6e0: 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
a6f0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
a700: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
a710: 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74   zSql to point t
a720: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  o the.      ** n
a730: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ext statement to
a740: 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20   execute. */.   
a750: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
a760: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
a770: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
a780: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72  SQLITE_NOMEM ) r
a790: 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69  c = rc2;.      i
a7a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a7b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   ){.        zSql
a7c0: 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20   = zLeftover;.  
a7d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
a7e0: 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20  pace(zSql[0]) ) 
a7f0: 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  zSql++;.      }e
a800: 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67  lse if( pzErrMsg
a810: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
a820: 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72  rrMsg = save_err
a830: 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20  _msg(db);.      
a840: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61  }..      /* clea
a850: 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e  r saved stmt han
a860: 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dle */.      if(
a870: 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
a880: 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e   pArg->pStmt = N
a890: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
a8a0: 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68   }.  } /* end wh
a8b0: 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ile */..  return
a8c0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
a8d0: 68 69 73 20 69 73 20 61 20 64 69 66 66 65 72 65  his is a differe
a8e0: 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  nt callback rout
a8f0: 69 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d  ine used for dum
a900: 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
a910: 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72  e..** Each row r
a920: 65 63 65 69 76 65 64 20 62 79 20 74 68 69 73 20  eceived by this 
a930: 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  callback consist
a940: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  s of a table nam
a950: 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  e,.** the table 
a960: 74 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72  type ("index" or
a970: 20 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51   "table") and SQ
a980: 4c 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  L to create the 
a990: 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72  table..** This r
a9a0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72  outine should pr
a9b0: 69 6e 74 20 74 65 78 74 20 73 75 66 66 69 63 69  int text suffici
a9c0: 65 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ent to recreate 
a9d0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
a9e0: 61 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61  atic int dump_ca
a9f0: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72  llback(void *pAr
aa00: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  g, int nArg, cha
aa10: 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
aa20: 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  **azCol){.  int 
aa30: 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rc;.  const char
aa40: 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73   *zTable;.  cons
aa50: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
aa60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
aa70: 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
aa80: 2a 7a 50 72 65 70 53 74 6d 74 20 3d 20 30 3b 0a  *zPrepStmt = 0;.
aa90: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
aaa0: 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72  k_data *p = (str
aab0: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
aac0: 61 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55  a *)pArg;..  UNU
aad0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a  SED_PARAMETER(az
aae0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 6e 41 72 67  Col);.  if( nArg
aaf0: 21 3d 33 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  !=3 ) return 1;.
ab00: 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67    zTable = azArg
ab10: 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61  [0];.  zType = a
ab20: 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20  zArg[1];.  zSql 
ab30: 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 0a 20  = azArg[2];.  . 
ab40: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
ab50: 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  le, "sqlite_sequ
ab60: 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
ab70: 20 7a 50 72 65 70 53 74 6d 74 20 3d 20 22 44 45   zPrepStmt = "DE
ab80: 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65  LETE FROM sqlite
ab90: 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22 3b 0a 20  _sequence;\n";. 
aba0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
abb0: 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69  e3_strglob("sqli
abc0: 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c  te_stat?", zTabl
abd0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  e)==0 ){.    fpr
abe0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e  intf(p->out, "AN
abf0: 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
ac00: 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  ter;\n");.  }els
ac10: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54  e if( strncmp(zT
ac20: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  able, "sqlite_",
ac30: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   7)==0 ){.    re
ac40: 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20  turn 0;.  }else 
ac50: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 71 6c  if( strncmp(zSql
ac60: 2c 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  , "CREATE VIRTUA
ac70: 4c 20 54 41 42 4c 45 22 2c 20 32 30 29 3d 3d 30  L TABLE", 20)==0
ac80: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49   ){.    char *zI
ac90: 6e 73 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ns;.    if( !p->
aca0: 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29  writableSchema )
acb0: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
acc0: 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
acd0: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
ace0: 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70  ON;\n");.      p
acf0: 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
ad00: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
ad10: 7a 49 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zIns = sqlite3_m
ad20: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
ad30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69  INSERT INTO sqli
ad40: 74 65 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e  te_master(type,n
ad50: 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f  ame,tbl_name,roo
ad60: 74 70 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20  tpage,sql)".    
ad70: 20 20 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c     "VALUES('tabl
ad80: 65 27 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27  e','%q','%q',0,'
ad90: 25 71 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a  %q');",.       z
ada0: 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a  Table, zTable, z
adb0: 53 71 6c 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  Sql);.    fprint
adc0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
add0: 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c  , zIns);.    sql
ade0: 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b  ite3_free(zIns);
adf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ae00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
ae10: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b  ntf(p->out, "%s;
ae20: 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a  \n", zSql);.  }.
ae30: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
ae40: 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30  ype, "table")==0
ae50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ae60: 73 74 6d 74 20 2a 70 54 61 62 6c 65 49 6e 66 6f  stmt *pTableInfo
ae70: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
ae80: 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20  zSelect = 0;.   
ae90: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 49 6e 66   char *zTableInf
aea0: 6f 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  o = 0;.    char 
aeb0: 2a 7a 54 6d 70 20 3d 20 30 3b 0a 20 20 20 20 69  *zTmp = 0;.    i
aec0: 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20  nt nRow = 0;.   
aed0: 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20  .    zTableInfo 
aee0: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 54 61  = appendText(zTa
aef0: 62 6c 65 49 6e 66 6f 2c 20 22 50 52 41 47 4d 41  bleInfo, "PRAGMA
af00: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 22 2c 20 30   table_info(", 0
af10: 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66  );.    zTableInf
af20: 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  o = appendText(z
af30: 54 61 62 6c 65 49 6e 66 6f 2c 20 7a 54 61 62 6c  TableInfo, zTabl
af40: 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 7a 54 61  e, '"');.    zTa
af50: 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64  bleInfo = append
af60: 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c  Text(zTableInfo,
af70: 20 22 29 3b 22 2c 20 30 29 3b 0a 0a 20 20 20 20   ");", 0);..    
af80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
af90: 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a 54 61 62  pare(p->db, zTab
afa0: 6c 65 49 6e 66 6f 2c 20 2d 31 2c 20 26 70 54 61  leInfo, -1, &pTa
afb0: 62 6c 65 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  bleInfo, 0);.   
afc0: 20 66 72 65 65 28 7a 54 61 62 6c 65 49 6e 66 6f   free(zTableInfo
afd0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
afe0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 54 61  QLITE_OK || !pTa
aff0: 62 6c 65 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  bleInfo ){.     
b000: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
b010: 0a 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20  ..    zSelect = 
b020: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
b030: 63 74 2c 20 22 53 45 4c 45 43 54 20 27 49 4e 53  ct, "SELECT 'INS
b040: 45 52 54 20 49 4e 54 4f 20 27 20 7c 7c 20 22 2c  ERT INTO ' || ",
b050: 20 30 29 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61   0);.    /* Alwa
b060: 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62  ys quote the tab
b070: 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66  le name, even if
b080: 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62   it appears to b
b090: 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20  e pure ascii,.  
b0a0: 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20    ** in case it 
b0b0: 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78  is a keyword. Ex
b0c0: 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22  :  INSERT INTO "
b0d0: 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20  table" ... */.  
b0e0: 20 20 7a 54 6d 70 20 3d 20 61 70 70 65 6e 64 54    zTmp = appendT
b0f0: 65 78 74 28 7a 54 6d 70 2c 20 7a 54 61 62 6c 65  ext(zTmp, zTable
b100: 2c 20 27 22 27 29 3b 0a 20 20 20 20 69 66 28 20  , '"');.    if( 
b110: 7a 54 6d 70 20 29 7b 0a 20 20 20 20 20 20 7a 53  zTmp ){.      zS
b120: 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65  elect = appendTe
b130: 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54 6d 70  xt(zSelect, zTmp
b140: 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 66  , '\'');.      f
b150: 72 65 65 28 7a 54 6d 70 29 3b 0a 20 20 20 20 7d  ree(zTmp);.    }
b160: 0a 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61  .    zSelect = a
b170: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
b180: 74 2c 20 22 20 7c 7c 20 27 20 56 41 4c 55 45 53  t, " || ' VALUES
b190: 28 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20  (' || ", 0);.   
b1a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
b1b0: 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a  ep(pTableInfo);.
b1c0: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
b1d0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
b1e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
b1f0: 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  Text = (const ch
b200: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
b210: 75 6d 6e 5f 74 65 78 74 28 70 54 61 62 6c 65 49  umn_text(pTableI
b220: 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a  nfo, 1);.      z
b230: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
b240: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 71 75  ext(zSelect, "qu
b250: 6f 74 65 28 22 2c 20 30 29 3b 0a 20 20 20 20 20  ote(", 0);.     
b260: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
b270: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a  dText(zSelect, z
b280: 54 65 78 74 2c 20 27 22 27 29 3b 0a 20 20 20 20  Text, '"');.    
b290: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
b2a0: 74 65 70 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b  tep(pTableInfo);
b2b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b2c0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
b2d0: 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61       zSelect = a
b2e0: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
b2f0: 74 2c 20 22 29 2c 20 22 2c 20 30 29 3b 0a 20 20  t, "), ", 0);.  
b300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b310: 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70     zSelect = app
b320: 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c  endText(zSelect,
b330: 20 22 29 20 22 2c 20 30 29 3b 0a 20 20 20 20 20   ") ", 0);.     
b340: 20 7d 0a 20 20 20 20 20 20 6e 52 6f 77 2b 2b 3b   }.      nRow++;
b350: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
b360: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
b370: 28 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20  (pTableInfo);.  
b380: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b390: 5f 4f 4b 20 7c 7c 20 6e 52 6f 77 3d 3d 30 20 29  _OK || nRow==0 )
b3a0: 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 53 65  {.      free(zSe
b3b0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 72 65 74  lect);.      ret
b3c0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
b3d0: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
b3e0: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
b3f0: 7c 7c 20 27 29 27 20 46 52 4f 4d 20 20 22 2c 20  || ')' FROM  ", 
b400: 30 29 3b 0a 20 20 20 20 7a 53 65 6c 65 63 74 20  0);.    zSelect 
b410: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65  = appendText(zSe
b420: 6c 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20 27 22  lect, zTable, '"
b430: 27 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 72 75  ');..    rc = ru
b440: 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
b450: 72 79 28 70 2c 20 7a 53 65 6c 65 63 74 2c 20 7a  ry(p, zSelect, z
b460: 50 72 65 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  PrepStmt);.    i
b470: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
b480: 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 7a  RRUPT ){.      z
b490: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
b4a0: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 20 4f  ext(zSelect, " O
b4b0: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
b4c0: 53 43 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  SC", 0);.      r
b4d0: 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
b4e0: 65 72 79 28 70 2c 20 7a 53 65 6c 65 63 74 2c 20  ery(p, zSelect, 
b4f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  0);.    }.    fr
b500: 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a 20 20 7d  ee(zSelect);.  }
b510: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b520: 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79  /*.** Run zQuery
b530: 2e 20 20 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c  .  Use dump_call
b540: 62 61 63 6b 28 29 20 61 73 20 74 68 65 20 63 61  back() as the ca
b550: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 73  llback routine s
b560: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f  o that.** the co
b570: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 71 75  ntents of the qu
b580: 65 72 79 20 61 72 65 20 6f 75 74 70 75 74 20 61  ery are output a
b590: 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  s SQL statements
b5a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65  ..**.** If we ge
b5b0: 74 20 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  t a SQLITE_CORRU
b5c0: 50 54 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20  PT error, rerun 
b5d0: 74 68 65 20 71 75 65 72 79 20 61 66 74 65 72 20  the query after 
b5e0: 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52  appending.** "OR
b5f0: 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
b600: 43 22 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a  C" to the end..*
b610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
b620: 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
b630: 72 79 28 0a 20 20 73 74 72 75 63 74 20 63 61 6c  ry(.  struct cal
b640: 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 0a  lback_data *p, .
b650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51    const char *zQ
b660: 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63  uery.){.  int rc
b670: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
b680: 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
b690: 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
b6a0: 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c  Query, dump_call
b6b0: 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
b6c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b6d0: 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
b6e0: 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
b6f0: 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
b700: 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
b710: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
b720: 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54  "/****** CORRUPT
b730: 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a  ION ERROR ******
b740: 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  */\n");.    if( 
b750: 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70  zErr ){.      fp
b760: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
b770: 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a  ****** %s ******
b780: 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
b790: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
b7a0: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a 45 72  zErr);.      zEr
b7b0: 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  r = 0;.    }.   
b7c0: 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c   zQ2 = malloc( l
b7d0: 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20 69 66  en+100 );.    if
b7e0: 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74 75 72  ( zQ2==0 ) retur
b7f0: 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  n rc;.    sqlite
b800: 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e 2b 31  3_snprintf(len+1
b810: 30 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52 44  00, zQ2, "%s ORD
b820: 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
b830: 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  ", zQuery);.    
b840: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
b850: 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75  c(p->db, zQ2, du
b860: 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  mp_callback, p, 
b870: 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
b880: 72 63 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  rc ){.      fpri
b890: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
b8a0: 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a  **** ERROR: %s *
b8b0: 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29  *****/\n", zErr)
b8c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b8d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
b8e0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
b8f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
b900: 45 72 72 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  Err);.    free(z
b910: 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Q2);.  }.  retur
b920: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
b930: 65 78 74 20 6f 66 20 61 20 68 65 6c 70 20 6d 65  ext of a help me
b940: 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20  ssage.*/.static 
b950: 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 20  char zHelp[] =. 
b960: 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 46   ".backup ?DB? F
b970: 49 4c 45 20 20 20 20 20 20 42 61 63 6b 75 70 20  ILE      Backup 
b980: 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61  DB (default \"ma
b990: 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45 5c 6e 22  in\") to FILE\n"
b9a0: 0a 20 20 22 2e 62 61 69 6c 20 4f 4e 7c 4f 46 46  .  ".bail ON|OFF
b9b0: 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 70 20             Stop 
b9c0: 61 66 74 65 72 20 68 69 74 74 69 6e 67 20 61 6e  after hitting an
b9d0: 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c 74   error.  Default
b9e0: 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 64 61 74 61   OFF\n".  ".data
b9f0: 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20  bases           
ba00: 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64    List names and
ba10: 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68   files of attach
ba20: 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a  ed databases\n".
ba30: 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f    ".dump ?TABLE?
ba40: 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d 70 20 74   ...      Dump t
ba50: 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 61  he database in a
ba60: 6e 20 53 51 4c 20 74 65 78 74 20 66 6f 72 6d 61  n SQL text forma
ba70: 74 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  t\n".  "        
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66   If TABLE specif
baa0: 69 65 64 2c 20 6f 6e 6c 79 20 64 75 6d 70 20 74  ied, only dump t
bab0: 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e  ables matching\n
bac0: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49                LI
bae0: 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
baf0: 2e 5c 6e 22 0a 20 20 22 2e 65 63 68 6f 20 4f 4e  .\n".  ".echo ON
bb00: 7c 4f 46 46 20 20 20 20 20 20 20 20 20 20 20 54  |OFF           T
bb10: 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f  urn command echo
bb20: 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
bb30: 22 2e 65 78 69 74 20 20 20 20 20 20 20 20 20 20  ".exit          
bb40: 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69          Exit thi
bb50: 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22  s program\n".  "
bb60: 2e 65 78 70 6c 61 69 6e 20 3f 4f 4e 7c 4f 46 46  .explain ?ON|OFF
bb70: 3f 20 20 20 20 20 20 54 75 72 6e 20 6f 75 74 70  ?      Turn outp
bb80: 75 74 20 6d 6f 64 65 20 73 75 69 74 61 62 6c 65  ut mode suitable
bb90: 20 66 6f 72 20 45 58 50 4c 41 49 4e 20 6f 6e 20   for EXPLAIN on 
bba0: 6f 72 20 6f 66 66 2e 5c 6e 22 0a 20 20 22 20 20  or off.\n".  "  
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 20 20 20 57 69 74 68 20 6e 6f 20 61         With no a
bbd0: 72 67 73 2c 20 69 74 20 74 75 72 6e 73 20 45 58  rgs, it turns EX
bbe0: 50 4c 41 49 4e 20 6f 6e 2e 5c 6e 22 0a 20 20 22  PLAIN on.\n".  "
bbf0: 2e 68 65 61 64 65 72 28 73 29 20 4f 4e 7c 4f 46  .header(s) ON|OF
bc00: 46 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70  F      Turn disp
bc10: 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f  lay of headers o
bc20: 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
bc30: 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20 20  help            
bc40: 20 20 20 20 20 20 53 68 6f 77 20 74 68 69 73 20        Show this 
bc50: 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e 69  message\n".  ".i
bc60: 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45  mport FILE TABLE
bc70: 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61       Import data
bc80: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20   from FILE into 
bc90: 54 41 42 4c 45 5c 6e 22 0a 20 20 22 2e 69 6e 64  TABLE\n".  ".ind
bca0: 69 63 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20  ices ?TABLE?    
bcb0: 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66     Show names of
bcc0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 5c 6e 22 0a   all indices\n".
bcd0: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
bcf0: 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20  ABLE specified, 
bd00: 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 69 63 65  only show indice
bd10: 73 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22 0a  s for tables\n".
bd20: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63              matc
bd40: 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72  hing LIKE patter
bd50: 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66 64  n TABLE.\n".#ifd
bd60: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
bd70: 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74  _IOTRACE.  ".iot
bd80: 72 61 63 65 20 46 49 4c 45 20 20 20 20 20 20 20  race FILE       
bd90: 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69     Enable I/O di
bda0: 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67  agnostic logging
bdb0: 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e 64   to FILE\n".#end
bdc0: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
bdd0: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
bde0: 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46  NSION.  ".load F
bdf0: 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20  ILE ?ENTRY?     
be00: 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e 73 69 6f  Load an extensio
be10: 6e 20 6c 69 62 72 61 72 79 5c 6e 22 0a 23 65 6e  n library\n".#en
be20: 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45  dif.  ".log FILE
be30: 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 54 75  |off          Tu
be40: 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72  rn logging on or
be50: 20 6f 66 66 2e 20 20 46 49 4c 45 20 63 61 6e 20   off.  FILE can 
be60: 62 65 20 73 74 64 65 72 72 2f 73 74 64 6f 75 74  be stderr/stdout
be70: 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44  \n".  ".mode MOD
be80: 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 53 65  E ?TABLE?     Se
be90: 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 77 68  t output mode wh
bea0: 65 72 65 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20  ere MODE is one 
beb0: 6f 66 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  of:\n".  "      
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d     csv      Comm
bee0: 61 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75  a-separated valu
bef0: 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d    column   Left-
bf20: 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e  aligned columns.
bf30: 20 20 28 53 65 65 20 2e 77 69 64 74 68 29 5c 6e    (See .width)\n
bf40: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 74                ht
bf60: 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74 61 62  ml     HTML <tab
bf70: 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a 20 20 22 20  le> code\n".  " 
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 20 20 20 69 6e 73 65 72 74 20 20          insert  
bfa0: 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74   SQL insert stat
bfb0: 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45  ements for TABLE
bfc0: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20 76 61 6c  line     One val
bff0: 75 65 20 70 65 72 20 6c 69 6e 65 5c 6e 22 0a 20  ue per line\n". 
c000: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
c010: 20 20 20 20 20 20 20 20 20 20 20 6c 69 73 74 20             list 
c020: 20 20 20 20 56 61 6c 75 65 73 20 64 65 6c 69 6d      Values delim
c030: 69 74 65 64 20 62 79 20 2e 73 65 70 61 72 61 74  ited by .separat
c040: 6f 72 20 73 74 72 69 6e 67 5c 6e 22 0a 20 20 22  or string\n".  "
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 20 20 20 74 61 62 73 20 20 20           tabs   
c070: 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64 20    Tab-separated 
c080: 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20  values\n".  "   
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54        tcl      T
c0b0: 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  CL list elements
c0c0: 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75  \n".  ".nullvalu
c0d0: 65 20 53 54 52 49 4e 47 20 20 20 20 20 20 55 73  e STRING      Us
c0e0: 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63  e STRING in plac
c0f0: 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e of NULL values
c100: 5c 6e 22 0a 20 20 22 2e 6f 70 65 6e 20 3f 46 49  \n".  ".open ?FI
c110: 4c 45 4e 41 4d 45 3f 20 20 20 20 20 20 20 43 6c  LENAME?       Cl
c120: 6f 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  ose existing dat
c130: 61 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e  abase and reopen
c140: 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22   FILENAME\n".  "
c150: 2e 6f 75 74 70 75 74 20 46 49 4c 45 4e 41 4d 45  .output FILENAME
c160: 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70         Send outp
c170: 75 74 20 74 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e  ut to FILENAME\n
c180: 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 73 74 64  ".  ".output std
c190: 6f 75 74 20 20 20 20 20 20 20 20 20 53 65 6e 64  out         Send
c1a0: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 73   output to the s
c1b0: 63 72 65 65 6e 5c 6e 22 0a 20 20 22 2e 70 72 69  creen\n".  ".pri
c1c0: 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20  nt STRING...    
c1d0: 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72 61 6c     Print literal
c1e0: 20 53 54 52 49 4e 47 5c 6e 22 0a 20 20 22 2e 70   STRING\n".  ".p
c1f0: 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49  rompt MAIN CONTI
c200: 4e 55 45 20 20 52 65 70 6c 61 63 65 20 74 68 65  NUE  Replace the
c210: 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74   standard prompt
c220: 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20 20 20  s\n".  ".quit   
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
c240: 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
c250: 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20 46 49 4c  \n".  ".read FIL
c260: 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20 45 78  ENAME         Ex
c270: 65 63 75 74 65 20 53 51 4c 20 69 6e 20 46 49 4c  ecute SQL in FIL
c280: 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 72 65 73  ENAME\n".  ".res
c290: 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20  tore ?DB? FILE  
c2a0: 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65     Restore conte
c2b0: 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c  nt of DB (defaul
c2c0: 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d  t \"main\") from
c2d0: 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 63 68   FILE\n".  ".sch
c2e0: 65 6d 61 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  ema ?TABLE?     
c2f0: 20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41     Show the CREA
c300: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 5c 6e 22  TE statements\n"
c310: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
c330: 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c  TABLE specified,
c340: 20 6f 6e 6c 79 20 73 68 6f 77 20 74 61 62 6c 65   only show table
c350: 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20  s matching\n".  
c360: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
c370: 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70            LIKE p
c380: 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22  attern TABLE.\n"
c390: 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 53  .  ".separator S
c3a0: 54 52 49 4e 47 20 20 20 20 20 20 43 68 61 6e 67  TRING      Chang
c3b0: 65 20 73 65 70 61 72 61 74 6f 72 20 75 73 65 64  e separator used
c3c0: 20 62 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20   by output mode 
c3d0: 61 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 20  and .import\n". 
c3e0: 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20   ".show         
c3f0: 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
c400: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
c410: 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74   for various set
c420: 74 69 6e 67 73 5c 6e 22 0a 20 20 22 2e 73 74 61  tings\n".  ".sta
c430: 74 73 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20  ts ON|OFF       
c440: 20 20 20 54 75 72 6e 20 73 74 61 74 73 20 6f 6e     Turn stats on
c450: 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 74   or off\n".  ".t
c460: 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  ables ?TABLE?   
c470: 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
c480: 6f 66 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22  of tables\n".  "
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42 4c           If TABL
c4b0: 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c  E specified, onl
c4c0: 79 20 6c 69 73 74 20 74 61 62 6c 65 73 20 6d 61  y list tables ma
c4d0: 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20  tching\n".  "   
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65        LIKE patte
c500: 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22  rn TABLE.\n".  "
c510: 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20  .timeout MS     
c520: 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69         Try openi
c530: 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73  ng locked tables
c540: 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63   for MS millisec
c550: 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 74 72 61 63  onds\n".  ".trac
c560: 65 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  e FILE|off      
c570: 20 20 4f 75 74 70 75 74 20 65 61 63 68 20 53 51    Output each SQ
c580: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69  L statement as i
c590: 74 20 69 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e  t is run\n".  ".
c5a0: 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20  vfsname ?AUX?   
c5b0: 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65 20        Print the 
c5c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
c5d0: 73 74 61 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64  stack\n".  ".wid
c5e0: 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e  th NUM1 NUM2 ...
c5f0: 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69     Set column wi
c600: 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d  dths for \"colum
c610: 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 3b 0a 0a 73  n\" mode\n".;..s
c620: 74 61 74 69 63 20 63 68 61 72 20 7a 54 69 6d 65  tatic char zTime
c630: 72 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 74 69  rHelp[] =.  ".ti
c640: 6d 65 72 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  mer ON|OFF      
c650: 20 20 20 20 54 75 72 6e 20 74 68 65 20 43 50 55      Turn the CPU
c660: 20 74 69 6d 65 72 20 6d 65 61 73 75 72 65 6d 65   timer measureme
c670: 6e 74 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  nt on or off\n".
c680: 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  ;../* Forward re
c690: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
c6a0: 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e  c int process_in
c6b0: 70 75 74 28 73 74 72 75 63 74 20 63 61 6c 6c 62  put(struct callb
c6c0: 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 46 49 4c  ack_data *p, FIL
c6d0: 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  E *in);../*.** M
c6e0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
c6f0: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20 20  abase is open.  
c700: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
c710: 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a  en open it.  If.
c720: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
c730: 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70  fails to open, p
c740: 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65  rint an error me
c750: 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a  ssage and exit..
c760: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
c770: 70 65 6e 5f 64 62 28 73 74 72 75 63 74 20 63 61  pen_db(struct ca
c780: 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20  llback_data *p, 
c790: 69 6e 74 20 6b 65 65 70 41 6c 69 76 65 29 7b 0a  int keepAlive){.
c7a0: 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
c7b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
c7c0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
c7d0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e  sqlite3_open(p->
c7e0: 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d  zDbFilename, &p-
c7f0: 3e 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 70  >db);.    db = p
c800: 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62  ->db;.    if( db
c810: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63   && sqlite3_errc
c820: 6f 64 65 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f  ode(db)==SQLITE_
c830: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
c840: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c850: 69 6f 6e 28 64 62 2c 20 22 73 68 65 6c 6c 73 74  ion(db, "shellst
c860: 61 74 69 63 22 2c 20 30 2c 20 53 51 4c 49 54 45  atic", 0, SQLITE
c870: 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
c880: 20 20 20 20 73 68 65 6c 6c 73 74 61 74 69 63 46      shellstaticF
c890: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
c8a0: 7d 0a 20 20 20 20 69 66 28 20 64 62 3d 3d 30 20  }.    if( db==0 
c8b0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  || SQLITE_OK!=sq
c8c0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
c8d0: 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
c8e0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
c8f0: 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  : unable to open
c900: 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
c910: 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20  : %s\n", .      
c920: 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
c930: 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  me, sqlite3_errm
c940: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 69  sg(db));.      i
c950: 66 28 20 6b 65 65 70 41 6c 69 76 65 20 29 20 72  f( keepAlive ) r
c960: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 65 78 69  eturn;.      exi
c970: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  t(1);.    }.#ifn
c980: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c990: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
c9a0: 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
c9b0: 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
c9c0: 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64  (p->db, 1);.#end
c9d0: 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
c9e0: 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74  Do C-language st
c9f0: 79 6c 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a  yle dequoting..*
ca00: 2a 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e  *.**    \t    ->
ca10: 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20   tab.**    \n   
ca20: 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20   -> newline.**  
ca30: 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
ca40: 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
ca50: 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20   \"    -> ".**  
ca60: 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69    \NNN  -> ascii
ca70: 20 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69   character NNN i
ca80: 6e 20 6f 63 74 61 6c 0a 2a 2a 20 20 20 20 5c 5c  n octal.**    \\
ca90: 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68      -> backslash
caa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cab0: 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
cac0: 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  hes(char *z){.  
cad0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
cae0: 20 63 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b   c;.  for(i=j=0;
caf0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20   (c = z[i])!=0; 
cb00: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  i++, j++){.    i
cb10: 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
cb20: 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a      c = z[++i];.
cb30: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6e 27        if( c=='n'
cb40: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
cb50: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\n';.      }els
cb60: 65 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a  e if( c=='t' ){.
cb70: 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27          c = '\t'
cb80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
cb90: 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20  ( c=='r' ){.    
cba0: 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20      c = '\r';.  
cbb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
cbc0: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
cbd0: 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20   c = '\\';.     
cbe0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30   }else if( c>='0
cbf0: 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20  ' && c<='7' ){. 
cc00: 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b         c -= '0';
cc10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
cc20: 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
cc30: 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
cc40: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
cc50: 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b      c = (c<<3) +
cc60: 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20   z[i] - '0';.   
cc70: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31         if( z[i+1
cc80: 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d  ]>='0' && z[i+1]
cc90: 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
cca0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
ccb0: 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
ccc0: 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
ccd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
cce0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ccf0: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b   }.    z[j] = c;
cd00: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
cd10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cd20: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
cd30: 68 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69  hexadecimal digi
cd40: 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  t.  Return -1 if
cd50: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73   the input.** is
cd60: 20 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69 74   not a hex digit
cd70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cd80: 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 63 68  hexDigitValue(ch
cd90: 61 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e 3d  ar c){.  if( c>=
cda0: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20  '0' && c<='9' ) 
cdb0: 72 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b 0a  return c - '0';.
cdc0: 20 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20    if( c>='a' && 
cdd0: 63 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e 20  c<='f' ) return 
cde0: 63 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20  c - 'a' + 10;.  
cdf0: 69 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c  if( c>='A' && c<
ce00: 3d 27 46 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='F' ) return c 
ce10: 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72 65  - 'A' + 10;.  re
ce20: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
ce30: 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67  * Interpret zArg
ce40: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76   as an integer v
ce50: 61 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20 77  alue, possibly w
ce60: 69 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a 2f  ith suffixes..*/
ce70: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
ce80: 69 6e 74 36 34 20 69 6e 74 65 67 65 72 56 61 6c  int64 integerVal
ce90: 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ue(const char *z
cea0: 41 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Arg){.  sqlite3_
ceb0: 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73  int64 v = 0;.  s
cec0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
ced0: 63 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66  ct { char *zSuff
cee0: 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d  ix; int iMult; }
cef0: 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20   aMult[] = {.   
cf00: 20 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d   { "KiB", 1024 }
cf10: 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31  ,.    { "MiB", 1
cf20: 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20  024*1024 },.    
cf30: 7b 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30  { "GiB", 1024*10
cf40: 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  24*1024 },.    {
cf50: 20 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a   "KB",  1000 },.
cf60: 20 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30      { "MB",  100
cf70: 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47  0000 },.    { "G
cf80: 42 22 2c 20 20 31 30 30 30 30 30 30 30 30 30 20  B",  1000000000 
cf90: 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20  },.    { "K",   
cfa0: 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d  1000 },.    { "M
cfb0: 22 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a  ",   1000000 },.
cfc0: 20 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30      { "G",   100
cfd0: 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a  0000000 },.  };.
cfe0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
cff0: 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  sNeg = 0;.  if( 
d000: 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  zArg[0]=='-' ){.
d010: 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20      isNeg = 1;. 
d020: 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c     zArg++;.  }el
d030: 73 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  se if( zArg[0]==
d040: 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b  '+' ){.    zArg+
d050: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72  +;.  }.  if( zAr
d060: 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72  g[0]=='0' && zAr
d070: 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  g[1]=='x' ){.   
d080: 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67   int x;.    zArg
d090: 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65   += 2;.    while
d0a0: 28 20 28 78 20 3d 20 68 65 78 44 69 67 69 74 56  ( (x = hexDigitV
d0b0: 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d  alue(zArg[0]))>=
d0c0: 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28  0 ){.      v = (
d0d0: 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20  v<<4) + x;.     
d0e0: 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20   zArg++;.    }. 
d0f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
d100: 65 28 20 49 73 44 69 67 69 74 28 7a 41 72 67 5b  e( IsDigit(zArg[
d110: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  0]) ){.      v =
d120: 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20   v*10 + zArg[0] 
d130: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72  - '0';.      zAr
d140: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  g++;.    }.  }. 
d150: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
d160: 79 53 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69 2b  ySize(aMult); i+
d170: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
d180: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c  te3_stricmp(aMul
d190: 74 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41  t[i].zSuffix, zA
d1a0: 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rg)==0 ){.      
d1b0: 76 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d  v *= aMult[i].iM
d1c0: 75 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ult;.      break
d1d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
d1e0: 74 75 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a  turn isNeg? -v :
d1f0: 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74   v;.}../*.** Int
d200: 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 65  erpret zArg as e
d210: 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
d220: 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   or a boolean va
d230: 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f  lue.  Return 1 o
d240: 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20  r 0.** for TRUE 
d250: 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75  and FALSE.  Retu
d260: 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  rn the integer v
d270: 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72 69  alue if appropri
d280: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
d290: 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  nt booleanValue(
d2a0: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69  char *zArg){.  i
d2b0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72 67  nt i;.  if( zArg
d2c0: 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67  [0]=='0' && zArg
d2d0: 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20  [1]=='x' ){.    
d2e0: 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67 69  for(i=2; hexDigi
d2f0: 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e  tValue(zArg[i])>
d300: 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c  =0; i++){}.  }el
d310: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
d320: 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26   zArg[i]>='0' &&
d330: 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69   zArg[i]<='9'; i
d340: 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20  ++){}.  }.  if( 
d350: 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d  i>0 && zArg[i]==
d360: 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74 29  0 ) return (int)
d370: 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a 41  (integerValue(zA
d380: 72 67 29 20 26 20 30 78 66 66 66 66 66 66 66 66  rg) & 0xffffffff
d390: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
d3a0: 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22  _stricmp(zArg, "
d3b0: 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  on")==0 || sqlit
d3c0: 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
d3d0: 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "yes")==0 ){.   
d3e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
d3f0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
d400: 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66 22  icmp(zArg, "off"
d410: 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  )==0 || sqlite3_
d420: 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f  stricmp(zArg,"no
d430: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
d440: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 70 72  urn 0;.  }.  fpr
d450: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
d460: 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c 65  ROR: Not a boole
d470: 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c 22  an value: \"%s\"
d480: 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c  . Assuming \"no\
d490: 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ".\n",.         
d4a0: 20 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e   zArg);.  return
d4b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
d4c0: 73 65 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c  se an output fil
d4d0: 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69  e, assuming it i
d4e0: 73 20 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20  s not stderr or 
d4f0: 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63  stdout.*/.static
d500: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c   void output_fil
d510: 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29  e_close(FILE *f)
d520: 7b 0a 20 20 69 66 28 20 66 20 26 26 20 66 21 3d  {.  if( f && f!=
d530: 73 74 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64  stdout && f!=std
d540: 65 72 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b  err ) fclose(f);
d550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
d560: 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20   open an output 
d570: 66 69 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65  file.   The name
d580: 73 20 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22  s "stdout" and "
d590: 73 74 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72  stderr" are.** r
d5a0: 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f  ecognized and do
d5b0: 20 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67   the right thing
d5c0: 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  .  NULL is retur
d5d0: 6e 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ned if the outpu
d5e0: 74 20 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69  t .** filename i
d5f0: 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74  s "off"..*/.stat
d600: 69 63 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f  ic FILE *output_
d610: 66 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  file_open(const 
d620: 63 68 61 72 20 2a 7a 46 69 6c 65 29 7b 0a 20 20  char *zFile){.  
d630: 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73  FILE *f;.  if( s
d640: 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64  trcmp(zFile,"std
d650: 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  out")==0 ){.    
d660: 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65  f = stdout;.  }e
d670: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
d680: 46 69 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d  File, "stderr")=
d690: 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74  =0 ){.    f = st
d6a0: 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  derr;.  }else if
d6b0: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
d6c0: 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "off")==0 ){.   
d6d0: 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b   f = 0;.  }else{
d6e0: 0a 20 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a  .    f = fopen(z
d6f0: 46 69 6c 65 2c 20 22 77 62 22 29 3b 0a 20 20 20  File, "wb");.   
d700: 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
d710: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
d720: 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
d730: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
d740: 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  , zFile);.    }.
d750: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a    }.  return f;.
d760: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69  }../*.** A routi
d770: 6e 65 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20  ne for handling 
d780: 6f 75 74 70 75 74 20 66 72 6f 6d 20 73 71 6c 69  output from sqli
d790: 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a  te3_trace()..*/.
d7a0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 5f  static void sql_
d7b0: 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28 76  trace_callback(v
d7c0: 6f 69 64 20 2a 70 41 72 67 2c 20 63 6f 6e 73 74  oid *pArg, const
d7d0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 46 49 4c   char *z){.  FIL
d7e0: 45 20 2a 66 20 3d 20 28 46 49 4c 45 2a 29 70 41  E *f = (FILE*)pA
d7f0: 72 67 3b 0a 20 20 69 66 28 20 66 20 29 20 66 70  rg;.  if( f ) fp
d800: 72 69 6e 74 66 28 66 2c 20 22 25 73 5c 6e 22 2c  rintf(f, "%s\n",
d810: 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   z);.}../*.** A 
d820: 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68  no-op routine th
d830: 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68 65  at runs with the
d840: 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64   ".breakpoint" d
d850: 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69  oc-command.  Thi
d860: 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c  s is.** a useful
d870: 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64   spot to set a d
d880: 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69  ebugger breakpoi
d890: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
d8a0: 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  id test_breakpoi
d8b0: 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
d8c0: 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30  ic int nCall = 0
d8d0: 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a  ;.  nCall++;.}..
d8e0: 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
d8f0: 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 43  used to read a C
d900: 53 56 20 66 69 6c 65 0a 2a 2f 0a 74 79 70 65 64  SV file.*/.typed
d910: 65 66 20 73 74 72 75 63 74 20 43 53 56 52 65 61  ef struct CSVRea
d920: 64 65 72 20 43 53 56 52 65 61 64 65 72 3b 0a 73  der CSVReader;.s
d930: 74 72 75 63 74 20 43 53 56 52 65 61 64 65 72 20  truct CSVReader 
d940: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
d950: 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  zFile;  /* Name 
d960: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
d970: 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  e */.  FILE *in;
d980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d990: 61 64 20 74 68 65 20 43 53 56 20 74 65 78 74 20  ad the CSV text 
d9a0: 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20  from this input 
d9b0: 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63 68 61 72  stream */.  char
d9c0: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
d9d0: 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20 74  /* Accumulated t
d9e0: 65 78 74 20 66 6f 72 20 61 20 66 69 65 6c 64 20  ext for a field 
d9f0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
da00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
da10: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
da20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
da30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
da40: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
da50: 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c   z[] */.  int nL
da60: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ine;          /*
da70: 20 43 75 72 72 65 6e 74 20 6c 69 6e 65 20 6e 75   Current line nu
da80: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 54  mber */.  int cT
da90: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  erm;          /*
daa0: 20 43 68 61 72 61 63 74 65 72 20 74 68 61 74 20   Character that 
dab0: 74 65 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d  terminated the m
dac0: 6f 73 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64  ost recent field
dad0: 20 2a 2f 0a 20 20 69 6e 74 20 63 53 65 70 61 72   */.  int cSepar
dae0: 61 74 6f 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  ator;     /* The
daf0: 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
db00: 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20  cter.  (Usually 
db10: 22 2c 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41  ",") */.};../* A
db20: 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62  ppend a single b
db30: 79 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74  yte to z[] */.st
db40: 61 74 69 63 20 76 6f 69 64 20 63 73 76 5f 61 70  atic void csv_ap
db50: 70 65 6e 64 5f 63 68 61 72 28 43 53 56 52 65 61  pend_char(CSVRea
db60: 64 65 72 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a  der *p, int c){.
db70: 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d    if( p->n+1>=p-
db80: 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70  >nAlloc ){.    p
db90: 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e  ->nAlloc += p->n
dba0: 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20  Alloc + 100;.   
dbb0: 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f   p->z = sqlite3_
dbc0: 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d  realloc(p->z, p-
dbd0: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
dbe0: 28 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ( p->z==0 ){.   
dbf0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
dc00: 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
dc10: 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  y\n");.      exi
dc20: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(1);.    }.  }.
dc30: 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d    p->z[p->n++] =
dc40: 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20   (char)c;.}../* 
dc50: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69  Read a single fi
dc60: 65 6c 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e  eld of CSV text.
dc70: 20 20 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74    Compatible wit
dc80: 68 20 72 66 63 34 31 38 30 20 61 6e 64 20 65 78  h rfc4180 and ex
dc90: 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74  tended.** with t
dca0: 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76  he option of hav
dcb0: 69 6e 67 20 61 20 73 65 70 61 72 61 74 6f 72 20  ing a separator 
dcc0: 6f 74 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a  other than ","..
dcd0: 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74  **.**   +  Input
dce0: 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69   comes from p->i
dcf0: 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  n..**   +  Store
dd00: 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a   results in p->z
dd10: 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e   of length p->n.
dd20: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
dd30: 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20  p->z comes.**   
dd40: 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f     from sqlite3_
dd50: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 20 20 2b  malloc()..**   +
dd60: 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73    Use p->cSep as
dd70: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 20   the separator. 
dd80: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
dd90: 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  ","..**   +  Kee
dda0: 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c  p track of the l
ddb0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d  ine number in p-
ddc0: 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20  >nLine..**   +  
ddd0: 53 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63  Store the charac
dde0: 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
ddf0: 74 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e  tes the field in
de00: 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72   p->cTerm.  Stor
de10: 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e  e.**      EOF on
de20: 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a   end-of-file..**
de30: 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e     +  Report syn
de40: 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74  tax errors on st
de50: 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  derr.*/.static c
de60: 68 61 72 20 2a 63 73 76 5f 72 65 61 64 5f 6f 6e  har *csv_read_on
de70: 65 5f 66 69 65 6c 64 28 43 53 56 52 65 61 64 65  e_field(CSVReade
de80: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 2c 20  r *p){.  int c, 
de90: 70 63 2c 20 70 70 63 3b 0a 20 20 69 6e 74 20 63  pc, ppc;.  int c
dea0: 53 65 70 20 3d 20 70 2d 3e 63 53 65 70 61 72 61  Sep = p->cSepara
deb0: 74 6f 72 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b  tor;.  p->n = 0;
dec0: 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e  .  c = fgetc(p->
ded0: 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f  in);.  if( c==EO
dee0: 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75  F || seenInterru
def0: 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65  pt ){.    p->cTe
df00: 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65  rm = EOF;.    re
df10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
df20: 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
df30: 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20  int startLine = 
df40: 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e  p->nLine;.    in
df50: 74 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20  t cQuote = c;.  
df60: 20 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a    pc = ppc = 0;.
df70: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
df80: 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
df90: 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66  p->in);.      if
dfa0: 28 20 63 3d 3d 27 5c 6e 27 20 29 20 70 2d 3e 6e  ( c=='\n' ) p->n
dfb0: 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Line++;.      if
dfc0: 28 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20  ( c==cQuote ){. 
dfd0: 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63         if( pc==c
dfe0: 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Quote ){.       
dff0: 20 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20     pc = 0;.     
e000: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
e010: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e020: 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63  .      if( (c==c
e030: 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  Sep && pc==cQuot
e040: 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
e050: 3d 27 5c 6e 27 20 26 26 20 70 63 3d 3d 63 51 75  ='\n' && pc==cQu
e060: 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ote).       || (
e070: 63 3d 3d 27 5c 6e 27 20 26 26 20 70 63 3d 3d 27  c=='\n' && pc=='
e080: 5c 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f  \r' && ppc==cQuo
e090: 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
e0a0: 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75  ==EOF && pc==cQu
e0b0: 6f 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ote).      ){.  
e0c0: 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d        do{ p->n--
e0d0: 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70  ; }while( p->z[p
e0e0: 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a  ->n]!=cQuote );.
e0f0: 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d          p->cTerm
e100: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72   = c;.        br
e110: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
e120: 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74     if( pc==cQuot
e130: 65 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a  e && c!='\r' ){.
e140: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
e150: 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
e160: 75 6e 65 73 63 61 70 65 64 20 25 63 20 63 68 61  unescaped %c cha
e170: 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20  racter\n",.     
e180: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46             p->zF
e190: 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63  ile, p->nLine, c
e1a0: 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Quote);.      }.
e1b0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46        if( c==EOF
e1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
e1d0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
e1e0: 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64  %d: unterminated
e1f0: 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64   %c-quoted field
e200: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
e210: 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73       p->zFile, s
e220: 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65  tartLine, cQuote
e230: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54  );.        p->cT
e240: 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 20  erm = EOF;.     
e250: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e260: 7d 0a 20 20 20 20 20 20 63 73 76 5f 61 70 70 65  }.      csv_appe
e270: 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
e280: 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20       ppc = pc;. 
e290: 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20       pc = c;.   
e2a0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
e2b0: 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26  while( c!=EOF &&
e2c0: 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 27   c!=cSep && c!='
e2d0: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 63 73 76  \n' ){.      csv
e2e0: 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
e2f0: 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
e300: 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
e310: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e  }.    if( c=='\n
e320: 27 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  ' ){.      p->nL
e330: 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
e340: 20 70 2d 3e 6e 3e 31 20 26 26 20 70 2d 3e 7a 5b   p->n>1 && p->z[
e350: 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20  p->n-1]=='\r' ) 
e360: 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  p->n--;.    }.  
e370: 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
e380: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29    }.  if( p->z )
e390: 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b   p->z[p->n] = 0;
e3a0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
e3b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  }../*.** If an i
e3c0: 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73  nput line begins
e3d0: 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69   with "." then i
e3e0: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
e3f0: 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73  ne to.** process
e400: 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a   that line..**.*
e410: 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72  * Return 1 on er
e420: 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20  ror, 2 to exit, 
e430: 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e  and 0 otherwise.
e440: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
e450: 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63  o_meta_command(c
e460: 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 73 74 72 75  har *zLine, stru
e470: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
e480: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20   *p){.  int i = 
e490: 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  1;.  int nArg = 
e4a0: 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20  0;.  int n, c;. 
e4b0: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
e4c0: 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a  har *azArg[50];.
e4d0: 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
e4e0: 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20  input line into 
e4f0: 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77  tokens..  */.  w
e500: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20 26  hile( zLine[i] &
e510: 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65  & nArg<ArraySize
e520: 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77  (azArg) ){.    w
e530: 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c  hile( IsSpace(zL
e540: 69 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  ine[i]) ){ i++; 
e550: 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b  }.    if( zLine[
e560: 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i]==0 ) break;. 
e570: 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d     if( zLine[i]=
e580: 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 69  ='\'' || zLine[i
e590: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  ]=='"' ){.      
e5a0: 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e  int delim = zLin
e5b0: 65 5b 69 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a  e[i++];.      az
e5c0: 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
e5d0: 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 77  Line[i];.      w
e5e0: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20 26  hile( zLine[i] &
e5f0: 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 64 65 6c 69  & zLine[i]!=deli
e600: 6d 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 66  m ){ .        if
e610: 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 5c 27  ( zLine[i]=='\\'
e620: 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26   && delim=='"' &
e630: 26 20 7a 4c 69 6e 65 5b 69 2b 31 5d 21 3d 30 20  & zLine[i+1]!=0 
e640: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  ) i++;.        i
e650: 2b 2b 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++; .      }.   
e660: 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d     if( zLine[i]=
e670: 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
e680: 20 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30    zLine[i++] = 0
e690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e6a0: 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29  if( delim=='"' )
e6b0: 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
e6c0: 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
e6d0: 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
e6e0: 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
e6f0: 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b  ++] = &zLine[i];
e700: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
e710: 69 6e 65 5b 69 5d 20 26 26 20 21 49 73 53 70 61  ine[i] && !IsSpa
e720: 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20  ce(zLine[i]) ){ 
e730: 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  i++; }.      if(
e740: 20 7a 4c 69 6e 65 5b 69 5d 20 29 20 7a 4c 69 6e   zLine[i] ) zLin
e750: 65 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  e[i++] = 0;.    
e760: 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c    resolve_backsl
e770: 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
e780: 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  -1]);.    }.  }.
e790: 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
e7a0: 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20  e input line..  
e7b0: 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  */.  if( nArg==0
e7c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
e7d0: 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72  no tokens, no er
e7e0: 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72  ror */.  n = str
e7f0: 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b  len30(azArg[0]);
e800: 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b  .  c = azArg[0][
e810: 30 5d 3b 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  0];.  if( c=='b'
e820: 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
e830: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
e840: 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 20 29 7b  ackup", n)==0 ){
e850: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e860: 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a  *zDestFile = 0;.
e870: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e880: 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  zDb = 0;.    sql
e890: 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20  ite3 *pDest;.   
e8a0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
e8b0: 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e  *pBackup;.    in
e8c0: 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  t j;.    for(j=1
e8d0: 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a  ; j<nArg; j++){.
e8e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e8f0: 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a   *z = azArg[j];.
e900: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
e910: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '-' ){.        w
e920: 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20  hile( z[0]=='-' 
e930: 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f  ) z++;.        /
e940: 2a 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20  * No options to 
e950: 70 72 6f 63 65 73 73 20 61 74 20 74 68 69 73 20  process at this 
e960: 74 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  time */.        
e970: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
e980: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
e990: 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
e9a0: 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20  n", azArg[j]);. 
e9b0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e9c0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
e9d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65     }else if( zDe
e9e0: 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  stFile==0 ){.   
e9f0: 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
ea00: 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20   azArg[j];.     
ea10: 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d   }else if( zDb==
ea20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62  0 ){.        zDb
ea30: 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20   = zDestFile;.  
ea40: 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
ea50: 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20  = azArg[j];.    
ea60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ea70: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
ea80: 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d   "too many argum
ea90: 65 6e 74 73 20 74 6f 20 2e 62 61 63 6b 75 70 5c  ents to .backup\
eaa0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
eab0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
eac0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65     }.    if( zDe
ead0: 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  stFile==0 ){.   
eae0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
eaf0: 72 2c 20 22 6d 69 73 73 69 6e 67 20 46 49 4c 45  r, "missing FILE
eb00: 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e  NAME argument on
eb10: 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20   .backup\n");.  
eb20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
eb30: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62 3d    }.    if( zDb=
eb40: 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e  =0 ) zDb = "main
eb50: 22 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ";.    rc = sqli
eb60: 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69  te3_open(zDestFi
eb70: 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20 20  le, &pDest);.   
eb80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
eb90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  OK ){.      fpri
eba0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
ebb0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
ebc0: 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74  \"%s\"\n", zDest
ebd0: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  File);.      sql
ebe0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
ebf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ec00: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  1;.    }.    ope
ec10: 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
ec20: 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
ec30: 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44  3_backup_init(pD
ec40: 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e  est, "main", p->
ec50: 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  db, zDb);.    if
ec60: 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
ec70: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
ec80: 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
ec90: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
eca0: 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
ecb0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
ecc0: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
ecd0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
ece0: 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d     while(  (rc =
ecf0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
ed00: 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
ed10: 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
ed20: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
ed30: 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
ed40: 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
ed50: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
ed60: 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
ed70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ed80: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
ed90: 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
eda0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
edb0: 65 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20  est));.      rc 
edc0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 1;.    }.    s
edd0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
ede0: 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  st);.  }else..  
edf0: 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
ee00: 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
ee10: 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20  Arg[0], "bail", 
ee20: 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20  n)==0 && nArg>1 
ee30: 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20  && nArg<3 ){.   
ee40: 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d   bail_on_error =
ee50: 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
ee60: 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65  Arg[1]);.  }else
ee70: 0a 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63  ..  /* The undoc
ee80: 75 6d 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70  umented ".breakp
ee90: 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61  oint" command ca
eea0: 75 73 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74  uses a call to t
eeb0: 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f  he no-op.  ** ro
eec0: 75 74 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74  utine named test
eed0: 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20  _breakpoint().. 
eee0: 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27   */.  if( c=='b'
eef0: 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
ef00: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
ef10: 72 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d  reakpoint", n)==
ef20: 30 20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72  0 ){.    test_br
ef30: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65  eakpoint();.  }e
ef40: 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
ef50: 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e  ' && n>1 && strn
ef60: 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
ef70: 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30  atabases", n)==0
ef80: 20 26 26 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20   && nArg==1 ){. 
ef90: 20 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61     struct callba
efa0: 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20  ck_data data;.  
efb0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
efc0: 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
efd0: 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63  (p, 0);.    memc
efe0: 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
eff0: 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
f000: 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
f010: 3d 20 31 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f  = 1;.    data.mo
f020: 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  de = MODE_Column
f030: 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c 57 69  ;.    data.colWi
f040: 64 74 68 5b 30 5d 20 3d 20 33 3b 0a 20 20 20 20  dth[0] = 3;.    
f050: 64 61 74 61 2e 63 6f 6c 57 69 64 74 68 5b 31 5d  data.colWidth[1]
f060: 20 3d 20 31 35 3b 0a 20 20 20 20 64 61 74 61 2e   = 15;.    data.
f070: 63 6f 6c 57 69 64 74 68 5b 32 5d 20 3d 20 35 38  colWidth[2] = 58
f080: 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d  ;.    data.cnt =
f090: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
f0a0: 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41  exec(p->db, "PRA
f0b0: 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73  GMA database_lis
f0c0: 74 3b 20 22 2c 20 63 61 6c 6c 62 61 63 6b 2c 20  t; ", callback, 
f0d0: 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
f0e0: 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  ;.    if( zErrMs
f0f0: 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  g ){.      fprin
f100: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
f110: 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
f120: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f130: 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
f140: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
f150: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
f160: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
f170: 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
f180: 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 26 26 20  dump", n)==0 && 
f190: 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 6f 70  nArg<3 ){.    op
f1a0: 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
f1b0: 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
f1c0: 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20   back a "dump", 
f1d0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68  the content migh
f1e0: 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f  t appear in an o
f1f0: 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63  rder.    ** whic
f200: 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61  h causes immedia
f210: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
f220: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65  onstraints to be
f230: 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a   violated..    *
f240: 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72  * So disable for
f250: 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61  eign-key constra
f260: 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  int enforcement 
f270: 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c  to prevent probl
f280: 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 70 72 69  ems. */.    fpri
f290: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41  ntf(p->out, "PRA
f2a0: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
f2b0: 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 66  =OFF;\n");.    f
f2c0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
f2d0: 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f  BEGIN TRANSACTIO
f2e0: 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 77  N;\n");.    p->w
f2f0: 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
f300: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  0;.    sqlite3_e
f310: 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45  xec(p->db, "SAVE
f320: 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41 47  POINT dump; PRAG
f330: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
f340: 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29  ma=ON", 0, 0, 0)
f350: 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20  ;.    p->nErr = 
f360: 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  0;.    if( nArg=
f370: 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f  =1 ){.      run_
f380: 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
f390: 79 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22 53  y(p, .        "S
f3a0: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
f3b0: 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
f3c0: 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
f3d0: 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
f3e0: 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d  T NULL AND type=
f3f0: 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d  ='table' AND nam
f400: 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65  e!='sqlite_seque
f410: 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20  nce'".      );. 
f420: 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
f430: 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 0a 20  dump_query(p, . 
f440: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
f450: 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
f460: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
f470: 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
f480: 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65  RE name=='sqlite
f490: 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
f4a0: 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74    );.      run_t
f4b0: 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
f4c0: 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  p,.        "SELE
f4d0: 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
f4e0: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
f4f0: 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
f500: 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
f510: 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
f520: 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c  igger','view')",
f530: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
f540: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
f550: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
f560: 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
f570: 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c 53  .        zShellS
f580: 74 61 74 69 63 20 3d 20 61 7a 41 72 67 5b 69 5d  tatic = azArg[i]
f590: 3b 0a 20 20 20 20 20 20 20 20 72 75 6e 5f 73 63  ;.        run_sc
f5a0: 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
f5b0: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  p,.          "SE
f5c0: 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c  LECT name, type,
f5d0: 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
f5e0: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
f5f0: 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e      "WHERE tbl_n
f600: 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74  ame LIKE shellst
f610: 61 74 69 63 28 29 20 41 4e 44 20 74 79 70 65 3d  atic() AND type=
f620: 3d 27 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20  ='table'".      
f630: 20 20 20 20 22 20 20 41 4e 44 20 73 71 6c 20 4e      "  AND sql N
f640: 4f 54 20 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  OT NULL");.     
f650: 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d     run_table_dum
f660: 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20  p_query(p,.     
f670: 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
f680: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
f690: 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20  ter ".          
f6a0: 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e  "WHERE sql NOT N
f6b0: 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20 22  ULL".          "
f6c0: 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27    AND type IN ('
f6d0: 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27  index','trigger'
f6e0: 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20  ,'view')".      
f6f0: 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e      "  AND tbl_n
f700: 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74  ame LIKE shellst
f710: 61 74 69 63 28 29 22 2c 20 30 0a 20 20 20 20 20  atic()", 0.     
f720: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 53     );.        zS
f730: 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a  hellStatic = 0;.
f740: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f750: 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c    if( p->writabl
f760: 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
f770: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
f780: 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
f790: 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22  e_schema=OFF;\n"
f7a0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
f7b0: 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a  ableSchema = 0;.
f7c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f7d0: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
f7e0: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
f7f0: 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20  chema=OFF;", 0, 
f800: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
f810: 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
f820: 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c 20  RELEASE dump;", 
f830: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66 70  0, 0, 0);.    fp
f840: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d  rintf(p->out, p-
f850: 3e 6e 45 72 72 20 3f 20 22 52 4f 4c 4c 42 41 43  >nErr ? "ROLLBAC
f860: 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20 65 72 72  K; -- due to err
f870: 6f 72 73 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49 54  ors\n" : "COMMIT
f880: 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  ;\n");.  }else..
f890: 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
f8a0: 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
f8b0: 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20  , "echo", n)==0 
f8c0: 26 26 20 6e 41 72 67 3e 31 20 26 26 20 6e 41 72  && nArg>1 && nAr
f8d0: 67 3c 33 20 29 7b 0a 20 20 20 20 70 2d 3e 65 63  g<3 ){.    p->ec
f8e0: 68 6f 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  hoOn = booleanVa
f8f0: 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
f900: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
f910: 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
f920: 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74 22  azArg[0], "exit"
f930: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
f940: 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72 63  f( nArg>1 && (rc
f950: 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56   = (int)integerV
f960: 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29 21  alue(azArg[1]))!
f970: 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a 20  =0 ) exit(rc);. 
f980: 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c     rc = 2;.  }el
f990: 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27  se..  if( c=='e'
f9a0: 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
f9b0: 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c  g[0], "explain",
f9c0: 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33   n)==0 && nArg<3
f9d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20   ){.    int val 
f9e0: 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 62 6f 6f 6c  = nArg>=2 ? bool
f9f0: 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
fa00: 5d 29 20 3a 20 31 3b 0a 20 20 20 20 69 66 28 76  ]) : 1;.    if(v
fa10: 61 6c 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20  al == 1) {.     
fa20: 20 69 66 28 21 70 2d 3e 65 78 70 6c 61 69 6e 50   if(!p->explainP
fa30: 72 65 76 2e 76 61 6c 69 64 29 20 7b 0a 20 20 20  rev.valid) {.   
fa40: 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50       p->explainP
fa50: 72 65 76 2e 76 61 6c 69 64 20 3d 20 31 3b 0a 20  rev.valid = 1;. 
fa60: 20 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69         p->explai
fa70: 6e 50 72 65 76 2e 6d 6f 64 65 20 3d 20 70 2d 3e  nPrev.mode = p->
fa80: 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 70 2d  mode;.        p-
fa90: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f  >explainPrev.sho
faa0: 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f  wHeader = p->sho
fab0: 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20  wHeader;.       
fac0: 20 6d 65 6d 63 70 79 28 70 2d 3e 65 78 70 6c 61   memcpy(p->expla
fad0: 69 6e 50 72 65 76 2e 63 6f 6c 57 69 64 74 68 2c  inPrev.colWidth,
fae0: 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65  p->colWidth,size
faf0: 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29  of(p->colWidth))
fb00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fb10: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 70 75 74 20  /* We could put 
fb20: 74 68 69 73 20 63 6f 64 65 20 75 6e 64 65 72 20  this code under 
fb30: 74 68 65 20 21 70 2d 3e 65 78 70 6c 61 69 6e 56  the !p->explainV
fb40: 61 6c 69 64 0a 20 20 20 20 20 20 2a 2a 20 63 6f  alid.      ** co
fb50: 6e 64 69 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  ndition so that 
fb60: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 65 63  it does not exec
fb70: 75 74 65 20 69 66 20 77 65 20 61 72 65 20 61 6c  ute if we are al
fb80: 72 65 61 64 79 20 69 6e 0a 20 20 20 20 20 20 2a  ready in.      *
fb90: 2a 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 2e 20  * explain mode. 
fba0: 48 6f 77 65 76 65 72 2c 20 61 6c 77 61 79 73 20  However, always 
fbb0: 65 78 65 63 75 74 69 6e 67 20 69 74 20 61 6c 6c  executing it all
fbc0: 6f 77 73 20 75 73 20 61 6e 20 65 61 73 79 0a 20  ows us an easy. 
fbd0: 20 20 20 20 20 2a 2a 20 77 61 73 20 74 6f 20 72       ** was to r
fbe0: 65 73 65 74 20 74 6f 20 65 78 70 6c 61 69 6e 20  eset to explain 
fbf0: 6d 6f 64 65 20 69 6e 20 63 61 73 65 20 74 68 65  mode in case the
fc00: 20 75 73 65 72 20 70 72 65 76 69 6f 75 73 6c 79   user previously
fc10: 0a 20 20 20 20 20 20 2a 2a 20 64 69 64 20 61 6e  .      ** did an
fc20: 20 2e 65 78 70 6c 61 69 6e 20 66 6f 6c 6c 6f 77   .explain follow
fc30: 65 64 20 62 79 20 61 20 2e 77 69 64 74 68 2c 20  ed by a .width, 
fc40: 2e 6d 6f 64 65 20 6f 72 20 2e 68 65 61 64 65 72  .mode or .header
fc50: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  .      ** comman
fc60: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
fc70: 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
fc80: 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20  _Explain;.      
fc90: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
fca0: 31 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  1;.      memset(
fcb0: 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 30 2c 73 69  p->colWidth,0,si
fcc0: 7a 65 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68  zeof(p->colWidth
fcd0: 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c  ));.      p->col
fce0: 57 69 64 74 68 5b 30 5d 20 3d 20 34 3b 20 20 20  Width[0] = 4;   
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd00: 2a 20 61 64 64 72 20 2a 2f 0a 20 20 20 20 20 20  * addr */.      
fd10: 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d  p->colWidth[1] =
fd20: 20 31 33 3b 20 20 20 20 20 20 20 20 20 20 20 20   13;            
fd30: 20 20 20 20 20 2f 2a 20 6f 70 63 6f 64 65 20 2a       /* opcode *
fd40: 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69  /.      p->colWi
fd50: 64 74 68 5b 32 5d 20 3d 20 34 3b 20 20 20 20 20  dth[2] = 4;     
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd70: 50 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63  P1 */.      p->c
fd80: 6f 6c 57 69 64 74 68 5b 33 5d 20 3d 20 34 3b 20  olWidth[3] = 4; 
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20   /* P2 */.      
fdb0: 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 34 5d 20 3d  p->colWidth[4] =
fdc0: 20 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   4;             
fdd0: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
fde0: 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
fdf0: 35 5d 20 3d 20 31 33 3b 20 20 20 20 20 20 20 20  5] = 13;        
fe00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a           /* P4 *
fe10: 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69  /.      p->colWi
fe20: 64 74 68 5b 36 5d 20 3d 20 32 3b 20 20 20 20 20  dth[6] = 2;     
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe40: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63  P5 */.      p->c
fe50: 6f 6c 57 69 64 74 68 5b 37 5d 20 3d 20 31 33 3b  olWidth[7] = 13;
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
fe80: 20 20 20 20 7d 65 6c 73 65 20 69 66 20 28 70 2d      }else if (p-
fe90: 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c  >explainPrev.val
fea0: 69 64 29 20 7b 0a 20 20 20 20 20 20 70 2d 3e 65  id) {.      p->e
feb0: 78 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64  xplainPrev.valid
fec0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6d   = 0;.      p->m
fed0: 6f 64 65 20 3d 20 70 2d 3e 65 78 70 6c 61 69 6e  ode = p->explain
fee0: 50 72 65 76 2e 6d 6f 64 65 3b 0a 20 20 20 20 20  Prev.mode;.     
fef0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
ff00: 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e   p->explainPrev.
ff10: 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20  showHeader;.    
ff20: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 57    memcpy(p->colW
ff30: 69 64 74 68 2c 70 2d 3e 65 78 70 6c 61 69 6e 50  idth,p->explainP
ff40: 72 65 76 2e 63 6f 6c 57 69 64 74 68 2c 73 69 7a  rev.colWidth,siz
ff50: 65 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29  eof(p->colWidth)
ff60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
ff70: 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
ff80: 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  & (strncmp(azArg
ff90: 5b 30 5d 2c 20 22 68 65 61 64 65 72 22 2c 20 6e  [0], "header", n
ffa0: 29 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  )==0 ||.        
ffb0: 20 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70           strncmp
ffc0: 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64  (azArg[0], "head
ffd0: 65 72 73 22 2c 20 6e 29 3d 3d 30 29 20 26 26 20  ers", n)==0) && 
ffe0: 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c 33  nArg>1 && nArg<3
fff0: 20 29 7b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48   ){.    p->showH
10000 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  eader = booleanV
10010 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
10020 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
10030 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70  =='h' && strncmp
10040 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70  (azArg[0], "help
10050 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
10060 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
10070 25 73 22 2c 7a 48 65 6c 70 29 3b 0a 20 20 20 20  %s",zHelp);.    
10080 69 66 28 20 48 41 53 5f 54 49 4d 45 52 20 29 7b  if( HAS_TIMER ){
10090 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
100a0 74 64 65 72 72 2c 22 25 73 22 2c 7a 54 69 6d 65  tderr,"%s",zTime
100b0 72 48 65 6c 70 29 3b 0a 20 20 20 20 7d 0a 20 20  rHelp);.    }.  
100c0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
100d0 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
100e0 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74  zArg[0], "import
100f0 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
10100 3d 3d 33 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==3 ){.    char 
10110 2a 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b  *zTable = azArg[
10120 32 5d 3b 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  2];    /* Insert
10130 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20   data into this 
10140 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  table */.    cha
10150 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67  r *zFile = azArg
10160 5b 31 5d 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  [1];     /* Name
10170 20 6f 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72   of file to extr
10180 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a  a content from *
10190 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
101a0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c  mt *pStmt = NULL
101b0 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  ; /* A statement
101c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
101d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
101e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
101f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
10200 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
10210 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
10220 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10230 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
10240 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
10250 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
10280 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
10290 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20  Commit;         
102a0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43      /* True to C
102b0 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
102c0 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20  K at end */.    
102d0 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
102e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
102f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
10300 6e 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 5d  n p->separator[]
10310 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
10320 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
10330 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
10340 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 43  atement */.    C
10350 53 56 52 65 61 64 65 72 20 73 43 73 76 3b 20 20  SVReader sCsv;  
10360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10370 61 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ader context */.
10380 20 20 20 20 69 6e 74 20 28 2a 78 43 6c 6f 73 65      int (*xClose
10390 72 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20 20  r)(FILE*);      
103a0 2f 2a 20 50 72 6f 63 65 64 75 72 65 20 74 6f 20  /* Procedure to 
103b0 63 6c 6f 73 65 20 74 68 33 20 63 6f 6e 6e 65 63  close th3 connec
103c0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 73 65 65  tion */..    see
103d0 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a  nInterrupt = 0;.
103e0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 73 76      memset(&sCsv
103f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 73 76  , 0, sizeof(sCsv
10400 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  ));.    open_db(
10410 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20  p, 0);.    nSep 
10420 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 65  = strlen30(p->se
10430 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66  parator);.    if
10440 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( nSep==0 ){.   
10450 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
10460 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  r, "Error: non-n
10470 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65  ull separator re
10480 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72  quired for impor
10490 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  t\n");.      ret
104a0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
104b0 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20   if( nSep>1 ){. 
104c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
104d0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c  err, "Error: mul
104e0 74 69 2d 63 68 61 72 61 63 74 65 72 20 73 65 70  ti-character sep
104f0 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f  arators not allo
10500 77 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  wed".           
10510 20 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72             " for
10520 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
10530 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
10540 20 7d 0a 20 20 20 20 73 43 73 76 2e 7a 46 69 6c   }.    sCsv.zFil
10550 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73  e = zFile;.    s
10560 43 73 76 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20  Csv.nLine = 1;. 
10570 20 20 20 69 66 28 20 73 43 73 76 2e 7a 46 69 6c     if( sCsv.zFil
10580 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 20 20 20  e[0]=='|' ){.   
10590 20 20 20 73 43 73 76 2e 69 6e 20 3d 20 70 6f 70     sCsv.in = pop
105a0 65 6e 28 73 43 73 76 2e 7a 46 69 6c 65 2b 31 2c  en(sCsv.zFile+1,
105b0 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43 73   "r");.      sCs
105c0 76 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70 65  v.zFile = "<pipe
105d0 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  >";.      xClose
105e0 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 20 20 20 20  r = pclose;.    
105f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 73  }else{.      sCs
10600 76 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 73  v.in = fopen(sCs
10610 76 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a  v.zFile, "rb");.
10620 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20        xCloser = 
10630 66 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20  fclose;.    }.  
10640 20 20 69 66 28 20 73 43 73 76 2e 69 6e 3d 3d 30    if( sCsv.in==0
10650 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
10660 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
10670 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
10680 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b  %s\"\n", zFile);
10690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
106a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 73 76 2e  .    }.    sCsv.
106b0 63 53 65 70 61 72 61 74 6f 72 20 3d 20 70 2d 3e  cSeparator = p->
106c0 73 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20  separator[0];.  
106d0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
106e0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
106f0 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61   * FROM %s", zTa
10700 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
10710 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ql==0 ){.      f
10720 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
10730 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
10740 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
10750 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29  xCloser(sCsv.in)
10760 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
10770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
10780 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71  e = strlen30(zSq
10790 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  l);.    rc = sql
107a0 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e  ite3_prepare(p->
107b0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
107c0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
107d0 28 20 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f  ( rc && sqlite3_
107e0 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68  strglob("no such
107f0 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69   table: *", sqli
10800 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3d  te3_errmsg(db))=
10810 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
10820 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69   *zCreate = sqli
10830 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43 52 45  te3_mprintf("CRE
10840 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  ATE TABLE %s", z
10850 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 63 68  Table);.      ch
10860 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a 20  ar cSep = '(';. 
10870 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 76 5f       while( csv_
10880 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 26  read_one_field(&
10890 73 43 73 76 29 20 29 7b 0a 20 20 20 20 20 20 20  sCsv) ){.       
108a0 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74   zCreate = sqlit
108b0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 63  e3_mprintf("%z%c
108c0 5c 6e 20 20 5c 22 25 73 5c 22 20 54 45 58 54 22  \n  \"%s\" TEXT"
108d0 2c 20 7a 43 72 65 61 74 65 2c 20 63 53 65 70 2c  , zCreate, cSep,
108e0 20 73 43 73 76 2e 7a 29 3b 0a 20 20 20 20 20 20   sCsv.z);.      
108f0 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20    cSep = ',';.  
10900 20 20 20 20 20 20 69 66 28 20 73 43 73 76 2e 63        if( sCsv.c
10910 54 65 72 6d 21 3d 73 43 73 76 2e 63 53 65 70 61  Term!=sCsv.cSepa
10920 72 61 74 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  rator ) break;. 
10930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10940 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a 20 20   cSep=='(' ){.  
10950 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10960 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20  ee(zCreate);.   
10970 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
10980 65 28 73 43 73 76 2e 7a 29 3b 0a 20 20 20 20 20  e(sCsv.z);.     
10990 20 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76 2e     xCloser(sCsv.
109a0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  in);.        fpr
109b0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
109c0 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20   empty file\n", 
109d0 73 43 73 76 2e 7a 46 69 6c 65 29 3b 0a 20 20 20  sCsv.zFile);.   
109e0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
109f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 72       }.      zCr
10a00 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
10a10 70 72 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20  printf("%z\n)", 
10a20 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
10a30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
10a40 63 28 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65  c(p->db, zCreate
10a50 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
10a60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10a70 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 69  Create);.      i
10a80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
10a90 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
10aa0 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
10ab0 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25  s(...) failed: %
10ac0 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20  s\n", zTable,.  
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10ae0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
10af0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10b00 65 33 5f 66 72 65 65 28 73 43 73 76 2e 7a 29 3b  e3_free(sCsv.z);
10b10 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72  .        xCloser
10b20 28 73 43 73 76 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCsv.in);.     
10b30 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
10b40 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
10b50 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
10b60 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
10b70 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
10b80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
10b90 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
10ba0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
10bb0 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
10bc0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
10bd0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
10be0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
10bf0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
10c00 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
10c10 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69    xCloser(sCsv.i
10c20 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
10c30 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43   1;.    }.    nC
10c40 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
10c50 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
10c60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
10c70 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
10c80 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
10c90 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
10ca0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20  return 0; /* no 
10cb0 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f  columns, no erro
10cc0 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20  r */.    zSql = 
10cd0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
10ce0 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e  nByte*2 + 20 + n
10cf0 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
10d00 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
10d10 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
10d20 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
10d30 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
10d40 20 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76 2e     xCloser(sCsv.
10d50 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
10d60 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
10d70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
10d80 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20  nByte+20, zSql, 
10d90 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25  "INSERT INTO \"%
10da0 77 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a  w\" VALUES(?", z
10db0 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
10dc0 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
10dd0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
10de0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
10df0 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
10e00 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
10e10 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
10e20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
10e30 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
10e40 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
10e50 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d  lite3_prepare(p-
10e60 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
10e70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
10e80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
10e90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
10ea0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
10eb0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
10ec0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
10ed0 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
10ee0 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69   if (pStmt) sqli
10ef0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
10f00 6d 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  mt);.      xClos
10f10 65 72 28 73 43 73 76 2e 69 6e 29 3b 0a 20 20 20  er(sCsv.in);.   
10f20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
10f30 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69   }.    needCommi
10f40 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  t = sqlite3_get_
10f50 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 3b 0a  autocommit(db);.
10f60 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d      if( needComm
10f70 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65  it ) sqlite3_exe
10f80 63 28 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  c(db, "BEGIN", 0
10f90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b  , 0, 0);.    do{
10fa0 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
10fb0 4c 69 6e 65 20 3d 20 73 43 73 76 2e 6e 4c 69 6e  Line = sCsv.nLin
10fc0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
10fd0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
10fe0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
10ff0 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  = csv_read_one_f
11000 69 65 6c 64 28 26 73 43 73 76 29 3b 0a 20 20 20  ield(&sCsv);.   
11010 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 26 26       if( z==0 &&
11020 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   i==0 ) break;. 
11030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
11040 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
11050 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  i+1, z, -1, SQLI
11060 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
11070 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f         if( i<nCo
11080 6c 2d 31 20 26 26 20 73 43 73 76 2e 63 54 65 72  l-1 && sCsv.cTer
11090 6d 21 3d 73 43 73 76 2e 63 53 65 70 61 72 61 74  m!=sCsv.cSeparat
110a0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
110b0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
110c0 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
110d0 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
110e0 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67 20         "filling 
11110 74 68 65 20 72 65 73 74 20 77 69 74 68 20 4e 55  the rest with NU
11120 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  LL\n",.         
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 73 43 73 76 2e 7a 46 69 6c 65 2c 20 73 74 61   sCsv.zFile, sta
11150 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b  rtLine, nCol, i+
11160 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b  1);.          i+
11170 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  +;.          whi
11180 6c 65 28 20 69 3c 6e 43 6f 6c 20 29 7b 20 73 71  le( i<nCol ){ sq
11190 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
111a0 70 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20  pStmt, i); i++; 
111b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
111c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 43    }.      if( sC
111d0 73 76 2e 63 54 65 72 6d 3d 3d 73 43 73 76 2e 63  sv.cTerm==sCsv.c
111e0 53 65 70 61 72 61 74 6f 72 20 29 7b 0a 20 20 20  Separator ){.   
111f0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
11200 20 20 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f     csv_read_one_
11210 66 69 65 6c 64 28 26 73 43 73 76 29 3b 0a 20 20  field(&sCsv);.  
11220 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
11230 20 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 73       }while( sCs
11240 76 2e 63 54 65 72 6d 3d 3d 73 43 73 76 2e 63 53  v.cTerm==sCsv.cS
11250 65 70 61 72 61 74 6f 72 20 29 3b 0a 20 20 20 20  eparator );.    
11260 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
11270 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65  rr, "%s:%d: expe
11280 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
11290 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22  but found %d - "
112a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112b0 20 20 20 20 20 20 20 20 20 22 65 78 74 72 61 73           "extras
112c0 20 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20   ignored\n",.   
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 20 20 73 43 73 76 2e 7a 46 69 6c 65 2c       sCsv.zFile,
112f0 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c   startLine, nCol
11300 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
11310 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20      if( i>=nCol 
11320 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11330 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
11340 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11350 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
11360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11370 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11380 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
11390 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
113a0 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a  : INSERT failed:
113b0 20 25 73 5c 6e 22 2c 20 73 43 73 76 2e 7a 46 69   %s\n", sCsv.zFi
113c0 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 0a 20  le, startLine,. 
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
113f0 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
11400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
11410 6c 65 28 20 73 43 73 76 2e 63 54 65 72 6d 21 3d  le( sCsv.cTerm!=
11420 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c 6f  EOF );..    xClo
11430 73 65 72 28 73 43 73 76 2e 69 6e 29 3b 0a 20 20  ser(sCsv.in);.  
11440 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
11450 43 73 76 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69  Csv.z);.    sqli
11460 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
11470 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65  mt);.    if( nee
11480 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65  dCommit ) sqlite
11490 33 5f 65 78 65 63 28 64 62 2c 20 22 43 4f 4d 4d  3_exec(db, "COMM
114a0 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IT", 0, 0, 0);. 
114b0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
114c0 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
114d0 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63  azArg[0], "indic
114e0 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  es", n)==0 && nA
114f0 72 67 3c 33 20 29 7b 0a 20 20 20 20 73 74 72 75  rg<3 ){.    stru
11500 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
11510 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
11520 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
11530 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
11540 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
11550 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
11560 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
11570 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
11580 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f    data.mode = MO
11590 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  DE_List;.    if(
115a0 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nArg==1 ){.    
115b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
115c0 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
115d0 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
115e0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
115f0 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
11600 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
11610 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49   AND name NOT LI
11620 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a  KE 'sqlite_%' ".
11630 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41          "UNION A
11640 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45  LL ".        "SE
11650 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
11660 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
11670 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
11680 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
11690 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ".        "ORDER
116a0 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20   BY 1",.        
116b0 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
116c0 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20   &zErrMsg.      
116d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
116e0 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63      zShellStatic
116f0 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
11700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11710 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20  exec(p->db,.    
11720 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
11730 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
11740 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
11750 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
11760 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c  ' AND tbl_name L
11770 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28  IKE shellstatic(
11780 29 20 22 0a 20 20 20 20 20 20 20 20 22 55 4e 49  ) ".        "UNI
11790 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20  ON ALL ".       
117a0 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
117b0 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
117c0 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
117d0 22 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64  "WHERE type='ind
117e0 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65  ex' AND tbl_name
117f0 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69   LIKE shellstati
11800 63 28 29 20 22 0a 20 20 20 20 20 20 20 20 22 4f  c() ".        "O
11810 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20  RDER BY 1",.    
11820 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64      callback, &d
11830 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20  ata, &zErrMsg.  
11840 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 53 68      );.      zSh
11850 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20  ellStatic = 0;. 
11860 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72     }.    if( zEr
11870 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70  rMsg ){.      fp
11880 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
11890 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
118a0 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
118b0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
118c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
118d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
118e0 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  c != SQLITE_OK )
118f0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
11900 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 71  stderr,"Error: q
11910 75 65 72 79 69 6e 67 20 73 71 6c 69 74 65 5f 6d  uerying sqlite_m
11920 61 73 74 65 72 20 61 6e 64 20 73 71 6c 69 74 65  aster and sqlite
11930 5f 74 65 6d 70 5f 6d 61 73 74 65 72 5c 6e 22 29  _temp_master\n")
11940 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
11950 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
11960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11970 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 69 66  BLE_IOTRACE.  if
11980 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
11990 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
119a0 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  otrace", n)==0 )
119b0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
119c0 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61  d (*sqlite3IoTra
119d0 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ce)(const char*,
119e0 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69   ...);.    if( i
119f0 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72 61 63  otrace && iotrac
11a00 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f  e!=stdout ) fclo
11a10 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20  se(iotrace);.   
11a20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20   iotrace = 0;.  
11a30 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a    if( nArg<2 ){.
11a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
11a50 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  race = 0;.    }e
11a60 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
11a70 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30  zArg[1], "-")==0
11a80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11a90 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61  3IoTrace = iotra
11aa0 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20  cePrintf;.      
11ab0 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74  iotrace = stdout
11ac0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11ad0 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70     iotrace = fop
11ae0 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22  en(azArg[1], "w"
11af0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74  );.      if( iot
11b00 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  race==0 ){.     
11b10 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
11b20 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
11b30 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
11b40 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
11b50 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
11b60 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ace = 0;.       
11b70 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
11b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
11b90 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69  lite3IoTrace = i
11ba0 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20  otracePrintf;.  
11bb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
11bc0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  lse.#endif..#ifn
11bd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11be0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
11bf0 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73   if( c=='l' && s
11c00 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
11c10 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 26   "load", n)==0 &
11c20 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  & nArg>=2 ){.   
11c30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
11c40 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20  le, *zProc;.    
11c50 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
11c60 30 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61  0;.    zFile = a
11c70 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72  zArg[1];.    zPr
11c80 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61  oc = nArg>=3 ? a
11c90 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20  zArg[2] : 0;.   
11ca0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
11cb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11cc0 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
11cd0 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  p->db, zFile, zP
11ce0 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  roc, &zErrMsg);.
11cf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
11d10 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
11d20 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
11d30 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
11d40 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
11d50 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
11d60 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
11d70 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
11d80 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70  =='l' && strncmp
11d90 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22  (azArg[0], "log"
11da0 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e  , n)==0 && nArg>
11db0 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
11dc0 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a  char *zFile = az
11dd0 41 72 67 5b 31 5d 3b 0a 20 20 20 20 6f 75 74 70  Arg[1];.    outp
11de0 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
11df0 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 70 2d 3e 70  >pLog);.    p->p
11e00 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c  Log = output_fil
11e10 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20  e_open(zFile);. 
11e20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
11e30 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='m' && strncmp(
11e40 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22  azArg[0], "mode"
11e50 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
11e60 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 32  =2 ){.    int n2
11e70 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
11e80 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  g[1]);.    if( (
11e90 6e 32 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d 70  n2==4 && strncmp
11ea0 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 22  (azArg[1],"line"
11eb0 2c 6e 32 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  ,n2)==0).       
11ec0 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 6e 32 3d   ||.        (n2=
11ed0 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =5 && strncmp(az
11ee0 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e  Arg[1],"lines",n
11ef0 32 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  2)==0) ){.      
11f00 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
11f10 69 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ine;.    }else i
11f20 66 28 20 28 6e 32 3d 3d 36 20 26 26 20 73 74 72  f( (n2==6 && str
11f30 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
11f40 6f 6c 75 6d 6e 22 2c 6e 32 29 3d 3d 30 29 0a 20  olumn",n2)==0). 
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 0a               ||.
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
11f70 32 3d 3d 37 20 26 26 20 73 74 72 6e 63 6d 70 28  2==7 && strncmp(
11f80 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e  azArg[1],"column
11f90 73 22 2c 6e 32 29 3d 3d 30 29 20 29 7b 0a 20 20  s",n2)==0) ){.  
11fa0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
11fb0 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  DE_Column;.    }
11fc0 65 6c 73 65 20 69 66 28 20 6e 32 3d 3d 34 20 26  else if( n2==4 &
11fd0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
11fe0 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d 30  1],"list",n2)==0
11ff0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
12000 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20  e = MODE_List;. 
12010 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d     }else if( n2=
12020 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =4 && strncmp(az
12030 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32  Arg[1],"html",n2
12040 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
12050 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d  >mode = MODE_Htm
12060 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
12070 20 6e 32 3d 3d 33 20 26 26 20 73 74 72 6e 63 6d   n2==3 && strncm
12080 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22  p(azArg[1],"tcl"
12090 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
120a0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
120b0 54 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Tcl;.      sqlit
120c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
120d0 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  of(p->separator)
120e0 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20  , p->separator, 
120f0 22 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  " ");.    }else 
12100 69 66 28 20 6e 32 3d 3d 33 20 26 26 20 73 74 72  if( n2==3 && str
12110 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
12120 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  sv",n2)==0 ){.  
12130 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
12140 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71  DE_Csv;.      sq
12150 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
12160 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74  izeof(p->separat
12170 6f 72 29 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f  or), p->separato
12180 72 2c 20 22 2c 22 29 3b 0a 20 20 20 20 7d 65 6c  r, ",");.    }el
12190 73 65 20 69 66 28 20 6e 32 3d 3d 34 20 26 26 20  se if( n2==4 && 
121a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
121b0 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29  ,"tabs",n2)==0 )
121c0 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
121d0 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
121e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
121f0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65  ntf(sizeof(p->se
12200 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70  parator), p->sep
12210 61 72 61 74 6f 72 2c 20 22 5c 74 22 29 3b 0a 20  arator, "\t");. 
12220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d     }else if( n2=
12230 3d 36 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =6 && strncmp(az
12240 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c  Arg[1],"insert",
12250 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
12260 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  p->mode = MODE_I
12270 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74  nsert;.      set
12280 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 22  _table_name(p, "
12290 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c  table");.    }el
122a0 73 65 20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  se {.      fprin
122b0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
122c0 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62 65  : mode should be
122d0 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
122e0 20 20 20 20 22 63 6f 6c 75 6d 6e 20 63 73 76 20      "column csv 
122f0 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65  html insert line
12300 20 6c 69 73 74 20 74 61 62 73 20 74 63 6c 5c 6e   list tabs tcl\n
12310 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
12320 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
12330 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26  .  if( c=='m' &&
12340 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
12350 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30  ], "mode", n)==0
12360 20 26 26 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20   && nArg==3 ){. 
12370 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c     int n2 = strl
12380 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  en30(azArg[1]);.
12390 20 20 20 20 69 66 28 20 6e 32 3d 3d 36 20 26 26      if( n2==6 &&
123a0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
123b0 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d  ],"insert",n2)==
123c0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
123d0 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
123e0 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c  ;.      set_tabl
123f0 65 5f 6e 61 6d 65 28 70 2c 20 61 7a 41 72 67 5b  e_name(p, azArg[
12400 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b  2]);.    }else {
12410 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
12420 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 69  tderr, "Error: i
12430 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73  nvalid arguments
12440 3a 20 22 0a 20 20 20 20 20 20 20 20 22 20 5c 22  : ".        " \"
12450 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e 68  %s\". Enter \".h
12460 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e  elp\" for help\n
12470 22 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  ", azArg[2]);.  
12480 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
12490 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
124a0 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63   c=='n' && strnc
124b0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75  mp(azArg[0], "nu
124c0 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20  llvalue", n)==0 
124d0 26 26 20 6e 41 72 67 3d 3d 32 20 29 20 7b 0a 20  && nArg==2 ) {. 
124e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
124f0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75  ntf(sizeof(p->nu
12500 6c 6c 76 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c  llvalue), p->nul
12510 6c 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  lvalue,.        
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
12530 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
12540 69 7a 65 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65  ize(p->nullvalue
12550 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
12560 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
12570 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70  =='o' && strncmp
12580 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e  (azArg[0], "open
12590 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32  ", n)==0 && n>=2
125a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
125b0 2a 73 61 76 65 64 44 62 20 3d 20 70 2d 3e 64 62  *savedDb = p->db
125c0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
125d0 20 2a 7a 53 61 76 65 64 46 69 6c 65 6e 61 6d 65   *zSavedFilename
125e0 20 3d 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d   = p->zDbFilenam
125f0 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  e;.    char *zNe
12600 77 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  wFilename = 0;. 
12610 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
12620 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b    if( nArg>=2 ){
12630 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
12640 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65  ename = zNewFile
12650 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
12660 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41  printf("%s", azA
12670 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[1]);.    }.  
12680 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b    open_db(p, 1);
12690 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 21 3d  .    if( p->db!=
126a0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
126b0 65 33 5f 63 6c 6f 73 65 28 73 61 76 65 64 44 62  e3_close(savedDb
126c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
126d0 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e  _free(p->zFreeOn
126e0 43 6c 6f 73 65 29 3b 0a 20 20 20 20 20 20 70 2d  Close);.      p-
126f0 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20  >zFreeOnClose = 
12700 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  zNewFilename;.  
12710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
12720 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77  qlite3_free(zNew
12730 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
12740 20 70 2d 3e 64 62 20 3d 20 73 61 76 65 64 44 62   p->db = savedDb
12750 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69  ;.      p->zDbFi
12760 6c 65 6e 61 6d 65 20 3d 20 7a 53 61 76 65 64 46  lename = zSavedF
12770 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20  ilename;.    }. 
12780 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
12790 3d 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='o' && strncmp(
127a0 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75  azArg[0], "outpu
127b0 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  t", n)==0 && nAr
127c0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  g==2 ){.    if( 
127d0 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27  p->outfile[0]=='
127e0 7c 27 20 29 7b 0a 20 20 20 20 20 20 70 63 6c 6f  |' ){.      pclo
127f0 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  se(p->out);.    
12800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 75 74  }else{.      out
12810 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70  put_file_close(p
12820 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ->out);.    }.  
12830 20 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20    p->outfile[0] 
12840 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61 7a 41  = 0;.    if( azA
12850 72 67 5b 31 5d 5b 30 5d 3d 3d 27 7c 27 20 29 7b  rg[1][0]=='|' ){
12860 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
12870 70 6f 70 65 6e 28 26 61 7a 41 72 67 5b 31 5d 5b  popen(&azArg[1][
12880 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20  1], "w");.      
12890 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b  if( p->out==0 ){
128a0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
128b0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
128c0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65  cannot open pipe
128d0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 26 61 7a 41   \"%s\"\n", &azA
128e0 72 67 5b 31 5d 5b 31 5d 29 3b 0a 20 20 20 20 20  rg[1][1]);.     
128f0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f     p->out = stdo
12900 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ut;.        rc =
12910 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
12920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12930 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
12940 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d  (p->outfile), p-
12950 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20  >outfile, "%s", 
12960 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
12970 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
12980 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74      p->out = out
12990 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 61 7a  put_file_open(az
129a0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  Arg[1]);.      i
129b0 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
129c0 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
129d0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6f 66 66  mp(azArg[1],"off
129e0 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")!=0 ){.       
129f0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
12a00 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  r,"Error: cannot
12a10 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73 5c 22   write to \"%s\"
12a20 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
12a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12a40 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
12a50 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
12a60 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  1;.      } else 
12a70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12a80 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
12a90 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70  f(p->outfile), p
12aa0 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c  ->outfile, "%s",
12ab0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
12ac0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
12ad0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20  e..  if( c=='p' 
12ae0 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
12af0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72  mp(azArg[0], "pr
12b00 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
12b10 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
12b20 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
12b30 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
12b40 3e 31 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e  >1 ) fprintf(p->
12b50 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20  out, " ");.     
12b60 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
12b70 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29   "%s", azArg[i])
12b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
12b90 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
12ba0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
12bb0 28 20 63 3d 3d 27 70 27 20 26 26 20 73 74 72 6e  ( c=='p' && strn
12bc0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70  cmp(azArg[0], "p
12bd0 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 26 26  rompt", n)==0 &&
12be0 20 28 6e 41 72 67 3d 3d 32 20 7c 7c 20 6e 41 72   (nArg==2 || nAr
12bf0 67 3d 3d 33 29 29 7b 0a 20 20 20 20 69 66 28 20  g==3)){.    if( 
12c00 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20  nArg >= 2) {.   
12c10 20 20 20 73 74 72 6e 63 70 79 28 6d 61 69 6e 50     strncpy(mainP
12c20 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28  rompt,azArg[1],(
12c30 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 6d 61  int)ArraySize(ma
12c40 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20  inPrompt)-1);.  
12c50 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67    }.    if( nArg
12c60 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 73   >= 3) {.      s
12c70 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65 50  trncpy(continueP
12c80 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28  rompt,azArg[2],(
12c90 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 63 6f  int)ArraySize(co
12ca0 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29  ntinuePrompt)-1)
12cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
12cc0 0a 20 20 69 66 28 20 63 3d 3d 27 71 27 20 26 26  .  if( c=='q' &&
12cd0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
12ce0 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30  ], "quit", n)==0
12cf0 20 26 26 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20   && nArg==1 ){. 
12d00 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c     rc = 2;.  }el
12d10 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27  se..  if( c=='r'
12d20 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
12d30 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72  cmp(azArg[0], "r
12d40 65 61 64 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  ead", n)==0 && n
12d50 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 46 49  Arg==2 ){.    FI
12d60 4c 45 20 2a 61 6c 74 20 3d 20 66 6f 70 65 6e 28  LE *alt = fopen(
12d70 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b  azArg[1], "rb");
12d80 0a 20 20 20 20 69 66 28 20 61 6c 74 3d 3d 30 20  .    if( alt==0 
12d90 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
12da0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
12db0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
12dc0 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
12dd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
12de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12df0 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e   rc = process_in
12e00 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20 20  put(p, alt);.   
12e10 20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b 0a     fclose(alt);.
12e20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
12e30 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e   if( c=='r' && n
12e40 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
12e50 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f 72  zArg[0], "restor
12e60 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  e", n)==0 && nAr
12e70 67 3e 31 20 26 26 20 6e 41 72 67 3c 34 29 7b 0a  g>1 && nArg<4){.
12e80 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12e90 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f  zSrcFile;.    co
12ea0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
12eb0 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63     sqlite3 *pSrc
12ec0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  ;.    sqlite3_ba
12ed0 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20  ckup *pBackup;. 
12ee0 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20     int nTimeout 
12ef0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41  = 0;..    if( nA
12f00 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a  rg==2 ){.      z
12f10 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  SrcFile = azArg[
12f20 31 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20  1];.      zDb = 
12f30 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73  "main";.    }els
12f40 65 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  e{.      zSrcFil
12f50 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20  e = azArg[2];.  
12f60 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b      zDb = azArg[
12f70 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  1];.    }.    rc
12f80 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
12f90 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 29  zSrcFile, &pSrc)
12fa0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12fb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12fc0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12fd0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
12fe0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
12ff0 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20  zSrcFile);.     
13000 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
13010 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Src);.      retu
13020 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
13030 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
13040 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
13050 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
13060 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72  (p->db, zDb, pSr
13070 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20  c, "main");.    
13080 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
13090 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
130a0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
130b0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
130c0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
130d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
130e0 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
130f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
13100 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
13110 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
13120 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
13130 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
13140 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
13150 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20  QLITE_BUSY  ){. 
13160 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
13170 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
13180 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74      if( nTimeout
13190 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b  ++ >= 3 ) break;
131a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
131b0 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20  _sleep(100);.   
131c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
131d0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
131e0 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
131f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13200 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
13210 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
13220 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
13230 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
13240 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
13250 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
13260 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72  rr, "Error: sour
13270 63 65 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ce database is b
13280 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  usy\n");.      r
13290 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
132a0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
132b0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
132c0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
132d0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
132e0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
132f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63   }.    sqlite3_c
13300 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 7d 65  lose(pSrc);.  }e
13310 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
13320 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
13330 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c  rg[0], "schema",
13340 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33   n)==0 && nArg<3
13350 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63   ){.    struct c
13360 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 64 61 74  allback_data dat
13370 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
13380 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70  rMsg = 0;.    op
13390 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
133a0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
133b0 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
133c0 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
133d0 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
133e0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53  ta.mode = MODE_S
133f0 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  emi;.    if( nAr
13400 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>1 ){.      int
13410 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
13420 30 3b 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20  0; azArg[1][i]; 
13430 69 2b 2b 29 20 61 7a 41 72 67 5b 31 5d 5b 69 5d  i++) azArg[1][i]
13440 20 3d 20 54 6f 4c 6f 77 65 72 28 61 7a 41 72 67   = ToLower(azArg
13450 5b 31 5d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  [1][i]);.      i
13460 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
13470 31 5d 2c 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  1],"sqlite_maste
13480 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
13490 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76    char *new_argv
134a0 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32  [2], *new_colv[2
134b0 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61  ];.        new_a
134c0 72 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54 45  rgv[0] = "CREATE
134d0 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61   TABLE sqlite_ma
134e0 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20 20  ster (\n".      
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22  "  type text,\n"
13510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13520 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74         "  name t
13530 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
13550 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c   tbl_name text,\
13560 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
13570 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74           "  root
13580 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22  page integer,\n"
13590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
135a0 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74 65         "  sql te
135b0 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  xt\n".          
135c0 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22 3b              ")";
135d0 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67  .        new_arg
135e0 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
135f0 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20    new_colv[0] = 
13600 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e  "sql";.        n
13610 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a  ew_colv[1] = 0;.
13620 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
13630 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61  (&data, 1, new_a
13640 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a  rgv, new_colv);.
13650 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13660 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
13670 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
13680 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f  zArg[1],"sqlite_
13690 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3d 3d 30  temp_master")==0
136a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
136b0 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
136c0 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
136d0 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
136e0 20 3d 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   = "CREATE TEMP 
136f0 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 74 65 6d  TABLE sqlite_tem
13700 70 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20 20  p_master (\n".  
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78 74      "  type text
13730 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
13740 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e 61             "  na
13750 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13770 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65    "  tbl_name te
13780 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
137a0 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65 72  rootpage integer
137b0 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
137c0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73 71             "  sq
137d0 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20 20  l text\n".      
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  ")";.        new
13800 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20  _argv[1] = 0;.  
13810 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30        new_colv[0
13820 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20 20  ] = "sql";.     
13830 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d     new_colv[1] =
13840 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c 6c   0;.        call
13850 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e  back(&data, 1, n
13860 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c  ew_argv, new_col
13870 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  v);.        rc =
13880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
138a0 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20   zShellStatic = 
138b0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
138c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
138d0 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
138e0 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
138f0 20 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20 20   FROM ".        
13900 20 20 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c    "  (SELECT sql
13910 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c   sql, type type,
13920 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61   tbl_name tbl_na
13930 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72  me, name name, r
13940 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20 20 20  owid x".        
13950 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73 71 6c    "     FROM sql
13960 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e  ite_master UNION
13970 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20   ALL".          
13980 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20  "   SELECT sql, 
13990 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
139a0 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d  name, rowid FROM
139b0 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
139c0 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 20 20  ter) ".         
139d0 20 22 57 48 45 52 45 20 6c 6f 77 65 72 28 74 62   "WHERE lower(tb
139e0 6c 5f 6e 61 6d 65 29 20 4c 49 4b 45 20 73 68 65  l_name) LIKE she
139f0 6c 6c 73 74 61 74 69 63 28 29 22 0a 20 20 20 20  llstatic()".    
13a00 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 79 70        "  AND typ
13a10 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71  e!='meta' AND sq
13a20 6c 20 4e 4f 54 4e 55 4c 4c 20 22 0a 20 20 20 20  l NOTNULL ".    
13a30 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
13a40 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 20  rowid",.        
13a50 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
13a60 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
13a70 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
13a80 69 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ic = 0;.      }.
13a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
13ab0 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  ec(p->db,.      
13ac0 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
13ad0 52 4f 4d 20 22 0a 20 20 20 20 20 20 20 20 20 22  ROM ".         "
13ae0 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71    (SELECT sql sq
13af0 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74 62  l, type type, tb
13b00 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c  l_name tbl_name,
13b10 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69   name name, rowi
13b20 64 20 78 22 0a 20 20 20 20 20 20 20 20 20 22 20  d x".         " 
13b30 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f      FROM sqlite_
13b40 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c  master UNION ALL
13b50 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20 53  ".         "   S
13b60 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c  ELECT sql, type,
13b70 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c   tbl_name, name,
13b80 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69   rowid FROM sqli
13b90 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20  te_temp_master) 
13ba0 22 0a 20 20 20 20 20 20 20 20 20 22 57 48 45 52  ".         "WHER
13bb0 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41  E type!='meta' A
13bc0 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41  ND sql NOTNULL A
13bd0 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45  ND name NOT LIKE
13be0 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20   'sqlite_%'".   
13bf0 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
13c00 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 20  rowid",.        
13c10 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
13c20 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20  , &zErrMsg.     
13c30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
13c40 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
13c50 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
13c60 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
13c70 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
13c80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
13c90 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
13ca0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
13cb0 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54 45  if( rc != SQLITE
13cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72  _OK ){.      fpr
13cd0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
13ce0 6f 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68  or: querying sch
13cf0 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c  ema information\
13d00 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
13d10 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
13d20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
13d30 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 64 65  }.  }else..#ifde
13d40 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
13d50 20 2f 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64   /* Undocumented
13d60 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e   commands for in
13d70 74 65 72 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20  ternal testing. 
13d80 20 53 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e   Subject to chan
13d90 67 65 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  ge.  ** without 
13da0 6e 6f 74 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28  notice. */.  if(
13db0 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30   c=='s' && n>=10
13dc0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
13dd0 67 5b 30 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d  g[0], "selftest-
13de0 22 2c 20 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 9)==0 ){.    
13df0 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72  if( strncmp(azAr
13e00 67 5b 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e  g[0]+9, "boolean
13e10 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20  ", n-9)==0 ){.  
13e20 20 20 20 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20      int i, v;.  
13e30 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
13e40 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
13e50 20 20 20 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61     v = booleanVa
13e60 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  lue(azArg[i]);. 
13e70 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
13e80 2d 3e 6f 75 74 2c 20 22 25 73 3a 20 25 64 20 30  ->out, "%s: %d 0
13e90 78 25 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d  x%x\n", azArg[i]
13ea0 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d  , v, v);.      }
13eb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
13ec0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b  trncmp(azArg[0]+
13ed0 39 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d  9, "integer", n-
13ee0 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  9)==0 ){.      i
13ef0 6e 74 20 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e  nt i; sqlite3_in
13f00 74 36 34 20 76 3b 0a 20 20 20 20 20 20 66 6f 72  t64 v;.      for
13f10 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
13f20 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
13f30 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20   zBuf[200];.    
13f40 20 20 20 20 76 20 3d 20 69 6e 74 65 67 65 72 56      v = integerV
13f50 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  alue(azArg[i]);.
13f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13f70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
13f80 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 73  zBuf), zBuf, "%s
13f90 3a 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e 22  : %lld 0x%llx\n"
13fa0 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76 2c 20 76  , azArg[i], v, v
13fb0 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
13fc0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
13fd0 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a   zBuf);.      }.
13fe0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
13ff0 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
14000 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
14010 41 72 67 5b 30 5d 2c 20 22 73 65 70 61 72 61 74  Arg[0], "separat
14020 6f 72 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  or", n)==0 && nA
14030 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c  rg==2 ){.    sql
14040 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
14050 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f  zeof(p->separato
14060 72 29 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  r), p->separator
14070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14080 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28         "%.*s", (
14090 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 73 65  int)sizeof(p->se
140a0 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72  parator)-1, azAr
140b0 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  g[1]);.  }else..
140c0 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
140d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
140e0 2c 20 22 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20  , "show", n)==0 
140f0 26 26 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  && nArg==1 ){.  
14100 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 70 72    int i;.    fpr
14110 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e  intf(p->out,"%9.
14120 39 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22  9s: %s\n","echo"
14130 2c 20 70 2d 3e 65 63 68 6f 4f 6e 20 3f 20 22 6f  , p->echoOn ? "o
14140 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20  n" : "off");.   
14150 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
14160 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65  "%9.9s: %s\n","e
14170 78 70 6c 61 69 6e 22 2c 20 70 2d 3e 65 78 70 6c  xplain", p->expl
14180 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3f 20  ainPrev.valid ? 
14190 22 6f 6e 22 20 3a 22 6f 66 66 22 29 3b 0a 20 20  "on" :"off");.  
141a0 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
141b0 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22  ,"%9.9s: %s\n","
141c0 68 65 61 64 65 72 73 22 2c 20 70 2d 3e 73 68 6f  headers", p->sho
141d0 77 48 65 61 64 65 72 20 3f 20 22 6f 6e 22 20 3a  wHeader ? "on" :
141e0 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72   "off");.    fpr
141f0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e  intf(p->out,"%9.
14200 39 73 3a 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22  9s: %s\n","mode"
14210 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d  , modeDescr[p->m
14220 6f 64 65 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e  ode]);.    fprin
14230 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73  tf(p->out,"%9.9s
14240 3a 20 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22  : ", "nullvalue"
14250 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f  );.      output_
14260 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  c_string(p->out,
14270 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a   p->nullvalue);.
14280 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
14290 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  >out, "\n");.   
142a0 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
142b0 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6f  "%9.9s: %s\n","o
142c0 75 74 70 75 74 22 2c 0a 20 20 20 20 20 20 20 20  utput",.        
142d0 20 20 20 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e      strlen30(p->
142e0 6f 75 74 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75  outfile) ? p->ou
142f0 74 66 69 6c 65 20 3a 20 22 73 74 64 6f 75 74 22  tfile : "stdout"
14300 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
14310 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c  ->out,"%9.9s: ",
14320 20 22 73 65 70 61 72 61 74 6f 72 22 29 3b 0a 20   "separator");. 
14330 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
14340 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  ring(p->out, p->
14350 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
14360 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
14370 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72  , "\n");.    fpr
14380 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e  intf(p->out,"%9.
14390 39 73 3a 20 25 73 5c 6e 22 2c 22 73 74 61 74 73  9s: %s\n","stats
143a0 22 2c 20 70 2d 3e 73 74 61 74 73 4f 6e 20 3f 20  ", p->statsOn ? 
143b0 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20  "on" : "off");. 
143c0 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
143d0 74 2c 22 25 39 2e 39 73 3a 20 22 2c 22 77 69 64  t,"%9.9s: ","wid
143e0 74 68 22 29 3b 0a 20 20 20 20 66 6f 72 20 28 69  th");.    for (i
143f0 3d 30 3b 69 3c 28 69 6e 74 29 41 72 72 61 79 53  =0;i<(int)ArrayS
14400 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29  ize(p->colWidth)
14410 20 26 26 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b   && p->colWidth[
14420 69 5d 20 21 3d 20 30 3b 69 2b 2b 29 20 7b 0a 20  i] != 0;i++) {. 
14430 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
14440 6f 75 74 2c 22 25 64 20 22 2c 70 2d 3e 63 6f 6c  out,"%d ",p->col
14450 57 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d  Width[i]);.    }
14460 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
14470 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c  out,"\n");.  }el
14480 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
14490 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
144a0 67 5b 30 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e  g[0], "stats", n
144b0 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 26  )==0 && nArg>1 &
144c0 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20  & nArg<3 ){.    
144d0 70 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f  p->statsOn = boo
144e0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
144f0 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  1]);.  }else..  
14500 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e  if( c=='t' && n>
14510 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  1 && strncmp(azA
14520 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c  rg[0], "tables",
14530 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33   n)==0 && nArg<3
14540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14550 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
14560 20 63 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74   char **azResult
14570 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77 2c 20  ;.    int nRow, 
14580 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 63 68 61 72  nAlloc;.    char
14590 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20   *zSql = 0;.    
145a0 69 6e 74 20 69 69 3b 0a 20 20 20 20 6f 70 65 6e  int ii;.    open
145b0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
145c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
145d0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22 50  are_v2(p->db, "P
145e0 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c  RAGMA database_l
145f0 69 73 74 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  ist", -1, &pStmt
14600 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
14610 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14620 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
14630 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
14640 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46    "SELECT name F
14650 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
14660 72 22 0a 20 20 20 20 20 20 20 20 22 20 57 48 45  r".        " WHE
14670 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62  RE type IN ('tab
14680 6c 65 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  le','view')".   
14690 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d       "   AND nam
146a0 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
146b0 74 65 5f 25 25 27 22 0a 20 20 20 20 20 20 20 20  te_%%'".        
146c0 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b  "   AND name LIK
146d0 45 20 3f 31 22 29 3b 0a 20 20 20 20 77 68 69 6c  E ?1");.    whil
146e0 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
146f0 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
14700 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OW ){.      cons
14710 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
14720 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
14730 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
14740 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
14750 20 20 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d      if( zDbName=
14760 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 44 62  =0 || strcmp(zDb
14770 4e 61 6d 65 2c 22 6d 61 69 6e 22 29 3d 3d 30 20  Name,"main")==0 
14780 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14790 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62    if( strcmp(zDb
147a0 4e 61 6d 65 2c 22 74 65 6d 70 22 29 3d 3d 30 20  Name,"temp")==0 
147b0 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
147c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
147d0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
147e0 20 20 20 20 22 25 7a 20 55 4e 49 4f 4e 20 41 4c      "%z UNION AL
147f0 4c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  L ".            
14800 20 20 20 20 20 22 53 45 4c 45 43 54 20 27 74 65       "SELECT 'te
14810 6d 70 2e 27 20 7c 7c 20 6e 61 6d 65 20 46 52 4f  mp.' || name FRO
14820 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  M sqlite_temp_ma
14830 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
14840 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74         " WHERE t
14850 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
14860 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20  'view')".       
14870 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
14880 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20  D name NOT LIKE 
14890 27 73 71 6c 69 74 65 5f 25 25 27 22 0a 20 20 20  'sqlite_%%'".   
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
148b0 20 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20    AND name LIKE 
148c0 3f 31 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  ?1", zSql);.    
148d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
148e0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
148f0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
14900 20 20 20 20 20 20 20 20 20 20 22 25 7a 20 55 4e            "%z UN
14910 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20  ION ALL ".      
14920 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
14930 43 54 20 27 25 71 2e 27 20 7c 7c 20 6e 61 6d 65  CT '%q.' || name
14940 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 73 71 6c   FROM \"%w\".sql
14950 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
14970 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
14980 61 62 6c 65 27 2c 27 76 69 65 77 27 29 22 0a 20  able','view')". 
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  "   AND name NOT
149b0 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 25   LIKE 'sqlite_%%
149c0 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  '".             
149d0 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65      "   AND name
149e0 20 4c 49 4b 45 20 3f 31 22 2c 20 7a 53 71 6c 2c   LIKE ?1", zSql,
149f0 20 7a 44 62 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d   zDbName, zDbNam
14a00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
14a10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
14a20 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
14a30 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
14a40 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20 4f 52  3_mprintf("%z OR
14a50 44 45 52 20 42 59 20 31 22 2c 20 7a 53 71 6c 29  DER BY 1", zSql)
14a60 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14a70 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
14a80 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
14a90 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
14aa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
14ab0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
14ac0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e  return rc;.    n
14ad0 52 6f 77 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20 30  Row = nAlloc = 0
14ae0 3b 0a 20 20 20 20 61 7a 52 65 73 75 6c 74 20 3d  ;.    azResult =
14af0 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   0;.    if( nArg
14b00 3e 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >1 ){.      sqli
14b10 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
14b20 74 6d 74 2c 20 31 2c 20 61 7a 41 72 67 5b 31 5d  tmt, 1, azArg[1]
14b30 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
14b40 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
14b50 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14b60 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
14b70 74 2c 20 31 2c 20 22 25 22 2c 20 2d 31 2c 20 53  t, 1, "%", -1, S
14b80 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
14b90 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
14ba0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
14bb0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
14bc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 6f  ){.      if( nRo
14bd0 77 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  w>=nAlloc ){.   
14be0 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65       char **azNe
14bf0 77 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  w;.        int n
14c00 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30   = nAlloc*2 + 10
14c10 3b 0a 20 20 20 20 20 20 20 20 61 7a 4e 65 77 20  ;.        azNew 
14c20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
14c30 63 28 61 7a 52 65 73 75 6c 74 2c 20 73 69 7a 65  c(azResult, size
14c40 6f 66 28 61 7a 52 65 73 75 6c 74 5b 30 5d 29 2a  of(azResult[0])*
14c50 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
14c60 61 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20  azNew==0 ){.    
14c70 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
14c80 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75  derr, "Error: ou
14c90 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
14ca0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
14cb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14cc0 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a      nAlloc = n;.
14cd0 20 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74          azResult
14ce0 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20   = azNew;.      
14cf0 7d 0a 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74  }.      azResult
14d00 5b 6e 52 6f 77 5d 20 3d 20 73 71 6c 69 74 65 33  [nRow] = sqlite3
14d10 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
14d20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
14d30 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  xt(pStmt, 0));. 
14d40 20 20 20 20 20 69 66 28 20 61 7a 52 65 73 75 6c       if( azResul
14d50 74 5b 6e 52 6f 77 5d 20 29 20 6e 52 6f 77 2b 2b  t[nRow] ) nRow++
14d60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14d70 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
14d80 6d 74 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  mt);        .   
14d90 20 69 66 28 20 6e 52 6f 77 3e 30 20 29 7b 0a 20   if( nRow>0 ){. 
14da0 20 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61       int len, ma
14db0 78 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  xlen = 0;.      
14dc0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
14dd0 69 6e 74 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e  int nPrintCol, n
14de0 50 72 69 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20  PrintRow;.      
14df0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b  for(i=0; i<nRow;
14e00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6c   i++){.        l
14e10 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a  en = strlen30(az
14e20 52 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20  Result[i]);.    
14e30 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c      if( len>maxl
14e40 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65  en ) maxlen = le
14e50 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
14e60 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38 30 2f   nPrintCol = 80/
14e70 28 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20 20 20  (maxlen+2);.    
14e80 20 20 69 66 28 20 6e 50 72 69 6e 74 43 6f 6c 3c    if( nPrintCol<
14e90 31 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20  1 ) nPrintCol = 
14ea0 31 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 52  1;.      nPrintR
14eb0 6f 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e 50 72  ow = (nRow + nPr
14ec0 69 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50 72 69  intCol - 1)/nPri
14ed0 6e 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72  ntCol;.      for
14ee0 28 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74 52 6f  (i=0; i<nPrintRo
14ef0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
14f00 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6e 52 6f 77   for(j=i; j<nRow
14f10 3b 20 6a 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b  ; j+=nPrintRow){
14f20 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
14f30 2a 7a 53 70 20 3d 20 6a 3c 6e 50 72 69 6e 74 52  *zSp = j<nPrintR
14f40 6f 77 20 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a  ow ? "" : "  ";.
14f50 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
14f60 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25 2d 2a  f(p->out, "%s%-*
14f70 73 22 2c 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c  s", zSp, maxlen,
14f80 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61   azResult[j] ? a
14f90 7a 52 65 73 75 6c 74 5b 6a 5d 20 3a 20 22 22 29  zResult[j] : "")
14fa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14fb0 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
14fc0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
14fd0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
14fe0 28 69 69 3d 30 3b 20 69 69 3c 6e 52 6f 77 3b 20  (ii=0; ii<nRow; 
14ff0 69 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66 72  ii++) sqlite3_fr
15000 65 65 28 61 7a 52 65 73 75 6c 74 5b 69 69 5d 29  ee(azResult[ii])
15010 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
15020 65 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20 20  ee(azResult);.  
15030 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
15040 27 74 27 20 26 26 20 6e 3e 3d 38 20 26 26 20 73  't' && n>=8 && s
15050 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
15060 20 22 74 65 73 74 63 74 72 6c 22 2c 20 6e 29 3d   "testctrl", n)=
15070 3d 30 20 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b  =0 && nArg>=2 ){
15080 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
15090 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
150a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
150b0 74 72 6c 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61  trlName;   /* Na
150c0 6d 65 20 6f 66 20 61 20 74 65 73 74 2d 63 6f 6e  me of a test-con
150d0 74 72 6f 6c 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  trol option */. 
150e0 20 20 20 20 20 20 69 6e 74 20 63 74 72 6c 43 6f        int ctrlCo
150f0 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  de;            /
15100 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66  * Integer code f
15110 6f 72 20 74 68 61 74 20 6f 70 74 69 6f 6e 20 2a  or that option *
15120 2f 0a 20 20 20 20 7d 20 61 43 74 72 6c 5b 5d 20  /.    } aCtrl[] 
15130 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 70 72 6e  = {.      { "prn
15140 67 5f 73 61 76 65 22 2c 20 20 20 20 20 20 20 20  g_save",        
15150 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
15160 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 20 20  CTRL_PRNG_SAVE  
15170 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
15180 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72 65 73       { "prng_res
15190 74 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20 20  tore",          
151a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
151b0 50 52 4e 47 5f 52 45 53 54 4f 52 45 20 20 20 20  PRNG_RESTORE    
151c0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
151d0 7b 20 22 70 72 6e 67 5f 72 65 73 65 74 22 2c 20  { "prng_reset", 
151e0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
151f0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
15200 52 45 53 45 54 20 20 20 20 20 20 20 20 20 20 20  RESET           
15210 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 62 69    },.      { "bi
15220 74 76 65 63 5f 74 65 73 74 22 2c 20 20 20 20 20  tvec_test",     
15230 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
15240 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
15250 54 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  T            },.
15260 20 20 20 20 20 20 7b 20 22 66 61 75 6c 74 5f 69        { "fault_i
15270 6e 73 74 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  nstall",        
15280 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
15290 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 20 20  _FAULT_INSTALL  
152a0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
152b0 20 7b 20 22 62 65 6e 69 67 6e 5f 6d 61 6c 6c 6f   { "benign_mallo
152c0 63 5f 68 6f 6f 6b 73 22 2c 20 20 20 53 51 4c 49  c_hooks",   SQLI
152d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
152e0 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 20  GN_MALLOC_HOOKS 
152f0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70     },.      { "p
15300 65 6e 64 69 6e 67 5f 62 79 74 65 22 2c 20 20 20  ending_byte",   
15310 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
15320 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
15330 59 54 45 20 20 20 20 20 20 20 20 20 20 20 7d 2c  YTE           },
15340 0a 20 20 20 20 20 20 7b 20 22 61 73 73 65 72 74  .      { "assert
15350 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
15360 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
15370 4c 5f 41 53 53 45 52 54 20 20 20 20 20 20 20 20  L_ASSERT        
15380 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
15390 20 20 7b 20 22 61 6c 77 61 79 73 22 2c 20 20 20    { "always",   
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
153b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
153c0 41 59 53 20 20 20 20 20 20 20 20 20 20 20 20 20  AYS             
153d0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
153e0 72 65 73 65 72 76 65 22 2c 20 20 20 20 20 20 20  reserve",       
153f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
15400 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 20  ESTCTRL_RESERVE 
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
15420 2c 0a 20 20 20 20 20 20 7b 20 22 6f 70 74 69 6d  ,.      { "optim
15430 69 7a 61 74 69 6f 6e 73 22 2c 20 20 20 20 20 20  izations",      
15440 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
15450 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
15460 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
15470 20 20 20 7b 20 22 69 73 6b 65 79 77 6f 72 64 22     { "iskeyword"
15480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
15490 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
154a0 4b 45 59 57 4f 52 44 20 20 20 20 20 20 20 20 20  KEYWORD         
154b0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
154c0 22 73 63 72 61 74 63 68 6d 61 6c 6c 6f 63 22 2c  "scratchmalloc",
154d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
154e0 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
154f0 4d 41 4c 4c 4f 43 20 20 20 20 20 20 20 20 20 20  MALLOC          
15500 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
15510 74 20 74 65 73 74 63 74 72 6c 20 3d 20 2d 31 3b  t testctrl = -1;
15520 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  .    int rc = 0;
15530 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
15540 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
15550 3b 0a 0a 20 20 20 20 2f 2a 20 63 6f 6e 76 65 72  ;..    /* conver
15560 74 20 74 65 73 74 63 74 72 6c 20 74 65 78 74 20  t testctrl text 
15570 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75 65 2e  option to value.
15580 20 61 6c 6c 6f 77 20 61 6e 79 20 75 6e 69 71 75   allow any uniqu
15590 65 20 70 72 65 66 69 78 0a 20 20 20 20 2a 2a 20  e prefix.    ** 
155a0 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 6e 61  of the option na
155b0 6d 65 2c 20 6f 72 20 61 20 6e 75 6d 65 72 69 63  me, or a numeric
155c0 61 6c 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  al value. */.   
155d0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
155e0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72  Arg[1]);.    for
155f0 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28 73 69  (i=0; i<(int)(si
15600 7a 65 6f 66 28 61 43 74 72 6c 29 2f 73 69 7a 65  zeof(aCtrl)/size
15610 6f 66 28 61 43 74 72 6c 5b 30 5d 29 29 3b 20 69  of(aCtrl[0])); i
15620 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
15630 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
15640 20 61 43 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e   aCtrl[i].zCtrlN
15650 61 6d 65 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ame, n)==0 ){.  
15660 20 20 20 20 20 20 69 66 28 20 74 65 73 74 63 74        if( testct
15670 72 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rl<0 ){.        
15680 20 20 74 65 73 74 63 74 72 6c 20 3d 20 61 43 74    testctrl = aCt
15690 72 6c 5b 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a  rl[i].ctrlCode;.
156a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
156b0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
156c0 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69 67 75  (stderr, "ambigu
156d0 6f 75 73 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 3a  ous option name:
156e0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
156f0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[1]);.         
15700 20 74 65 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a   testctrl = -1;.
15710 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15730 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
15740 20 74 65 73 74 63 74 72 6c 3c 30 20 29 20 74 65   testctrl<0 ) te
15750 73 74 63 74 72 6c 20 3d 20 28 69 6e 74 29 69 6e  stctrl = (int)in
15760 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
15770 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 74  [1]);.    if( (t
15780 65 73 74 63 74 72 6c 3c 53 51 4c 49 54 45 5f 54  estctrl<SQLITE_T
15790 45 53 54 43 54 52 4c 5f 46 49 52 53 54 29 20 7c  ESTCTRL_FIRST) |
157a0 7c 20 28 74 65 73 74 63 74 72 6c 3e 53 51 4c 49  | (testctrl>SQLI
157b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 41 53 54  TE_TESTCTRL_LAST
157c0 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
157d0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
157e0 3a 20 69 6e 76 61 6c 69 64 20 74 65 73 74 63 74  : invalid testct
157f0 72 6c 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22  rl option: %s\n"
15800 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
15810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 77   }else{.      sw
15820 69 74 63 68 28 74 65 73 74 63 74 72 6c 29 7b 0a  itch(testctrl){.
15830 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
15840 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
15850 28 69 6e 74 2c 20 64 62 2c 20 69 6e 74 29 20 2a  (int, db, int) *
15860 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
15870 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
15880 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20 20  PTIMIZATIONS:.  
15890 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
158a0 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
158b0 56 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  VE:             
158c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
158d0 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
158e0 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20        int opt = 
158f0 28 69 6e 74 29 73 74 72 74 6f 6c 28 61 7a 41 72  (int)strtol(azAr
15900 67 5b 32 5d 2c 20 30 2c 20 30 29 3b 20 20 20 20  g[2], 0, 0);    
15910 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
15920 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65   rc = sqlite3_te
15930 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
15940 74 72 6c 2c 20 70 2d 3e 64 62 2c 20 6f 70 74 29  trl, p->db, opt)
15950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
15960 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
15970 64 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72  d (0x%08x)\n", r
15980 63 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  c, rc);.        
15990 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
159a0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
159b0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 74 65  tderr,"Error: te
159c0 73 74 63 74 72 6c 20 25 73 20 74 61 6b 65 73 20  stctrl %s takes 
159d0 61 20 73 69 6e 67 6c 65 20 69 6e 74 20 6f 70 74  a single int opt
159e0 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ion\n",.        
159f0 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
15a00 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[1]);.         
15a10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
15a20 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ak;..        /* 
15a30 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
15a40 74 72 6f 6c 28 69 6e 74 29 20 2a 2f 0a 20 20 20  trol(int) */.   
15a50 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
15a60 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
15a70 41 56 45 3a 20 20 20 20 20 20 20 20 20 20 20 0a  AVE:           .
15a80 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
15a90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
15aa0 47 5f 52 45 53 54 4f 52 45 3a 20 20 20 20 20 20  G_RESTORE:      
15ab0 20 20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20    .        case 
15ac0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15ad0 50 52 4e 47 5f 52 45 53 45 54 3a 0a 20 20 20 20  PRNG_RESET:.    
15ae0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
15af0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
15b00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65   rc = sqlite3_te
15b10 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
15b20 74 72 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  trl);.          
15b30 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
15b40 2c 20 22 25 64 20 28 30 78 25 30 38 78 29 5c 6e  , "%d (0x%08x)\n
15b50 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20 20 20 20  ", rc, rc);.    
15b60 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
15b70 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
15b80 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
15b90 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20 74 61  : testctrl %s ta
15ba0 6b 65 73 20 6e 6f 20 6f 70 74 69 6f 6e 73 5c 6e  kes no options\n
15bb0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
15bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15bd0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
15be0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
15bf0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c  est_control(int,
15c00 20 75 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20   uint) */.      
15c10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
15c20 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
15c30 59 54 45 3a 20 20 20 20 20 20 20 20 0a 20 20 20  YTE:        .   
15c40 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
15c50 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =3 ){.          
15c60 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f    unsigned int o
15c70 70 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69  pt = (unsigned i
15c80 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
15c90 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20  azArg[2]);.     
15ca0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15cb0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
15cc0 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b  (testctrl, opt);
15cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
15ce0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
15cf0 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63   (0x%08x)\n", rc
15d00 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
15d10 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
15d20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
15d30 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 74 65 73  derr,"Error: tes
15d40 74 63 74 72 6c 20 25 73 20 74 61 6b 65 73 20 61  tctrl %s takes a
15d50 20 73 69 6e 67 6c 65 20 75 6e 73 69 67 6e 65 64   single unsigned
15d60 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 69               " i
15d80 6e 74 20 6f 70 74 69 6f 6e 5c 6e 22 2c 20 61 7a  nt option\n", az
15d90 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
15da0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
15db0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
15dc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
15dd0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
15de0 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f 0a 20 20  (int, int) */.  
15df0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
15e00 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
15e10 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T:              
15e20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
15e30 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
15e40 57 41 59 53 3a 20 20 20 20 20 20 20 20 20 20 20  WAYS:           
15e50 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66     .          if
15e60 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20  ( nArg==3 ){.   
15e70 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 74           int opt
15e80 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
15e90 61 7a 41 72 67 5b 32 5d 29 3b 20 20 20 20 20 20  azArg[2]);      
15ea0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72    .            r
15eb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
15ec0 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72  _control(testctr
15ed0 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20  l, opt);.       
15ee0 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
15ef0 6f 75 74 2c 20 22 25 64 20 28 30 78 25 30 38 78  out, "%d (0x%08x
15f00 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20  )\n", rc, rc);. 
15f10 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
15f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
15f30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
15f40 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73  ror: testctrl %s
15f50 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20   takes a single 
15f60 69 6e 74 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20  int option\n",. 
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f80 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
15f90 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [1]);.          
15fa0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
15fb0 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  k;..        /* s
15fc0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
15fd0 72 6f 6c 28 69 6e 74 2c 20 63 68 61 72 20 2a 29  rol(int, char *)
15fe0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
15ff0 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20  E_N_KEYWORD.    
16000 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16010 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
16020 52 44 3a 20 20 20 20 20 20 20 20 20 20 20 0a 20  RD:           . 
16030 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72           if( nAr
16040 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g==3 ){.        
16050 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16060 6f 70 74 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 20  opt = azArg[2]; 
16070 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
16080 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16090 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65  _test_control(te
160a0 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20  stctrl, opt);.  
160b0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
160c0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30  f(p->out, "%d (0
160d0 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c 20 72  x%08x)\n", rc, r
160e0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  c);.          } 
160f0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
16100 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16110 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74  r,"Error: testct
16120 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73 69  rl %s takes a si
16130 6e 67 6c 65 20 63 68 61 72 20 2a 20 6f 70 74 69  ngle char * opti
16140 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  on\n",.         
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20     azArg[1]);.  
16170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16180 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69      break;.#endi
16190 66 0a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  f..        case 
161a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
161b0 42 49 54 56 45 43 5f 54 45 53 54 3a 20 20 20 20  BITVEC_TEST:    
161c0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 63 61       .        ca
161d0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
161e0 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  RL_FAULT_INSTALL
161f0 3a 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20  :       .       
16200 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
16210 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
16220 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 0a 20 20 20 20  LOC_HOOKS: .    
16230 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16240 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
16250 4d 41 4c 4c 4f 43 3a 20 20 20 20 20 20 20 0a 20  MALLOC:       . 
16260 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
16270 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
16280 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
16290 20 43 4c 49 20 73 75 70 70 6f 72 74 20 66 6f 72   CLI support for
162a0 20 74 65 73 74 63 74 72 6c 20 25 73 20 6e 6f 74   testctrl %s not
162b0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 5c 6e 22 2c   implemented\n",
162c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
162d0 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20     azArg[1]);.  
162e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
162f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16300 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
16310 74 27 20 26 26 20 6e 3e 34 20 26 26 20 73 74 72  t' && n>4 && str
16320 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
16330 74 69 6d 65 6f 75 74 22 2c 20 6e 29 3d 3d 30 20  timeout", n)==0 
16340 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  && nArg==2 ){.  
16350 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
16360 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
16370 79 5f 74 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c  y_timeout(p->db,
16380 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
16390 75 65 28 61 7a 41 72 67 5b 31 5d 29 29 3b 0a 20  ue(azArg[1]));. 
163a0 20 7d 65 6c 73 65 0a 20 20 20 20 0a 20 20 69 66   }else.    .  if
163b0 28 20 48 41 53 5f 54 49 4d 45 52 20 26 26 20 63  ( HAS_TIMER && c
163c0 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 35 20 26 26  =='t' && n>=5 &&
163d0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
163e0 5d 2c 20 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d  ], "timer", n)==
163f0 30 0a 20 20 20 26 26 20 6e 41 72 67 3d 3d 32 0a  0.   && nArg==2.
16400 20 20 29 7b 0a 20 20 20 20 65 6e 61 62 6c 65 54    ){.    enableT
16410 69 6d 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  imer = booleanVa
16420 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
16430 20 7d 65 6c 73 65 0a 20 20 0a 20 20 69 66 28 20   }else.  .  if( 
16440 63 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  c=='t' && strncm
16450 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 72 61  p(azArg[0], "tra
16460 63 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41  ce", n)==0 && nA
16470 72 67 3e 31 20 29 7b 0a 20 20 20 20 6f 70 65 6e  rg>1 ){.    open
16480 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6f  _db(p, 0);.    o
16490 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
164a0 28 70 2d 3e 74 72 61 63 65 4f 75 74 29 3b 0a 20  (p->traceOut);. 
164b0 20 20 20 70 2d 3e 74 72 61 63 65 4f 75 74 20 3d     p->traceOut =
164c0 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65   output_file_ope
164d0 6e 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66  n(azArg[1]);.#if
164e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
164f0 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
16500 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16510 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
16520 49 4e 54 29 0a 20 20 20 20 69 66 28 20 70 2d 3e  INT).    if( p->
16530 74 72 61 63 65 4f 75 74 3d 3d 30 20 29 7b 0a 20  traceOut==0 ){. 
16540 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
16550 63 65 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  ce(p->db, 0, 0);
16560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16570 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
16580 70 2d 3e 64 62 2c 20 73 71 6c 5f 74 72 61 63 65  p->db, sql_trace
16590 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 74 72  _callback, p->tr
165a0 61 63 65 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23  aceOut);.    }.#
165b0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 0a 0a 20  endif.  }else.. 
165c0 20 69 66 28 20 63 3d 3d 27 76 27 20 26 26 20 73   if( c=='v' && s
165d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
165e0 20 22 76 65 72 73 69 6f 6e 22 2c 20 6e 29 3d 3d   "version", n)==
165f0 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
16600 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 69 74 65  (p->out, "SQLite
16610 20 25 73 20 25 73 5c 6e 22 20 2f 2a 65 78 74 72   %s %s\n" /*extr
16620 61 2d 76 65 72 73 69 6f 6e 2d 69 6e 66 6f 2a 2f  a-version-info*/
16630 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
16640 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
16650 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
16660 28 29 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ());.  }else..  
16670 69 66 28 20 63 3d 3d 27 76 27 20 26 26 20 73 74  if( c=='v' && st
16680 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
16690 22 76 66 73 6e 61 6d 65 22 2c 20 6e 29 3d 3d 30  "vfsname", n)==0
166a0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
166b0 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41  ar *zDbName = nA
166c0 72 67 3d 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg==2 ? azArg[1]
166d0 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63   : "main";.    c
166e0 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20  har *zVfsName = 
166f0 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  0;.    if( p->db
16700 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16710 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
16720 2d 3e 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53  ->db, zDbName, S
16730 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
16740 41 4d 45 2c 20 26 7a 56 66 73 4e 61 6d 65 29 3b  AME, &zVfsName);
16750 0a 20 20 20 20 20 20 69 66 28 20 7a 56 66 73 4e  .      if( zVfsN
16760 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ame ){.        f
16770 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
16780 25 73 5c 6e 22 2c 20 7a 56 66 73 4e 61 6d 65 29  %s\n", zVfsName)
16790 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
167a0 33 5f 66 72 65 65 28 7a 56 66 73 4e 61 6d 65 29  3_free(zVfsName)
167b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
167c0 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65 66    }else..#if def
167d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
167e0 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
167f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
16800 45 54 52 41 43 45 29 0a 20 20 69 66 28 20 63 3d  ETRACE).  if( c=
16810 3d 27 77 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='w' && strncmp(
16820 61 7a 41 72 67 5b 30 5d 2c 20 22 77 68 65 72 65  azArg[0], "where
16830 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  trace", n)==0 ){
16840 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
16850 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
16860 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  e;.    sqlite3Wh
16870 65 72 65 54 72 61 63 65 20 3d 20 62 6f 6f 6c 65  ereTrace = boole
16880 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
16890 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
168a0 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 77 27 20  f..  if( c=='w' 
168b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
168c0 5b 30 5d 2c 20 22 77 69 64 74 68 22 2c 20 6e 29  [0], "width", n)
168d0 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 29 7b  ==0 && nArg>1 ){
168e0 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
168f0 61 73 73 65 72 74 28 20 6e 41 72 67 3c 3d 41 72  assert( nArg<=Ar
16900 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29  raySize(azArg) )
16910 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
16920 3c 6e 41 72 67 20 26 26 20 6a 3c 41 72 72 61 79  <nArg && j<Array
16930 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68  Size(p->colWidth
16940 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  ); j++){.      p
16950 2d 3e 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20  ->colWidth[j-1] 
16960 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
16970 6c 75 65 28 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20  lue(azArg[j]);. 
16980 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
16990 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
169a0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 75 6e  derr, "Error: un
169b0 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f 72  known command or
169c0 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65 6e   invalid argumen
169d0 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20 5c 22  ts: ".      " \"
169e0 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e 68  %s\". Enter \".h
169f0 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e  elp\" for help\n
16a00 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ", azArg[0]);.  
16a10 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20    rc = 1;.  }.. 
16a20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16a30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
16a40 20 69 66 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20   if a semicolon 
16a50 6f 63 63 75 72 73 20 61 6e 79 77 68 65 72 65 20  occurs anywhere 
16a60 69 6e 20 74 68 65 20 66 69 72 73 74 20 4e 20 63  in the first N c
16a70 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 6f 66 20  haracters.** of 
16a80 73 74 72 69 6e 67 20 7a 5b 5d 2e 0a 2a 2f 0a 73  string z[]..*/.s
16a90 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 65 5f 63  tatic int line_c
16aa0 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f  ontains_semicolo
16ab0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
16ac0 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69   int N){.  int i
16ad0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e  ;.  for(i=0; i<N
16ae0 3b 20 69 2b 2b 29 7b 20 20 69 66 28 20 7a 5b 69  ; i++){  if( z[i
16af0 5d 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20  ]==';' ) return 
16b00 31 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  1; }.  return 0;
16b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
16b20 6f 20 73 65 65 20 69 66 20 61 20 6c 69 6e 65 20  o see if a line 
16b30 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
16b40 79 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 2e  y of whitespace.
16b50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f  .*/.static int _
16b60 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 63  all_whitespace(c
16b70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
16b80 20 66 6f 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b   for(; *z; z++){
16b90 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65  .    if( IsSpace
16ba0 28 7a 5b 30 5d 29 20 29 20 63 6f 6e 74 69 6e 75  (z[0]) ) continu
16bb0 65 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  e;.    if( *z=='
16bc0 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20  /' && z[1]=='*' 
16bd0 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b  ){.      z += 2;
16be0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  .      while( *z
16bf0 20 26 26 20 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20   && (*z!='*' || 
16c00 7a 5b 31 5d 21 3d 27 2f 27 29 20 29 7b 20 7a 2b  z[1]!='/') ){ z+
16c10 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a  +; }.      if( *
16c20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  z==0 ) return 0;
16c30 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
16c40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
16c50 7d 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  }.    if( *z=='-
16c60 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29  ' && z[1]=='-' )
16c70 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a  {.      z += 2;.
16c80 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20        while( *z 
16c90 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a  && *z!='\n' ){ z
16ca0 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
16cb0 2a 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  *z==0 ) return 1
16cc0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
16cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
16ce0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
16cf0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
16d00 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
16d10 65 20 6c 69 6e 65 20 74 79 70 65 64 20 69 6e 20  e line typed in 
16d20 69 73 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e  is an SQL comman
16d30 64 20 74 65 72 6d 69 6e 61 74 6f 72 20 6f 74 68  d terminator oth
16d40 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 73 65 6d  er.** than a sem
16d50 69 2d 63 6f 6c 6f 6e 2e 20 20 54 68 65 20 53 51  i-colon.  The SQ
16d60 4c 20 53 65 72 76 65 72 20 73 74 79 6c 65 20 22  L Server style "
16d70 67 6f 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  go" command is u
16d80 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 61 73 20  nderstood.** as 
16d90 69 73 20 74 68 65 20 4f 72 61 63 6c 65 20 22 2f  is the Oracle "/
16da0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
16db0 20 6c 69 6e 65 5f 69 73 5f 63 6f 6d 6d 61 6e 64   line_is_command
16dc0 5f 74 65 72 6d 69 6e 61 74 6f 72 28 63 6f 6e 73  _terminator(cons
16dd0 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 29 7b 0a  t char *zLine){.
16de0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
16df0 28 7a 4c 69 6e 65 5b 30 5d 29 20 29 7b 20 7a 4c  (zLine[0]) ){ zL
16e00 69 6e 65 2b 2b 3b 20 7d 3b 0a 20 20 69 66 28 20  ine++; };.  if( 
16e10 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2f 27 20 26 26  zLine[0]=='/' &&
16e20 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65   _all_whitespace
16e30 28 26 7a 4c 69 6e 65 5b 31 5d 29 20 29 7b 0a 20  (&zLine[1]) ){. 
16e40 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a     return 1;  /*
16e50 20 4f 72 61 63 6c 65 20 2a 2f 0a 20 20 7d 0a 20   Oracle */.  }. 
16e60 20 69 66 28 20 54 6f 4c 6f 77 65 72 28 7a 4c 69   if( ToLower(zLi
16e70 6e 65 5b 30 5d 29 3d 3d 27 67 27 20 26 26 20 54  ne[0])=='g' && T
16e80 6f 4c 6f 77 65 72 28 7a 4c 69 6e 65 5b 31 5d 29  oLower(zLine[1])
16e90 3d 3d 27 6f 27 0a 20 20 20 20 20 20 20 20 20 26  =='o'.         &
16ea0 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63  & _all_whitespac
16eb0 65 28 26 7a 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a  e(&zLine[2]) ){.
16ec0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
16ed0 2a 20 53 51 4c 20 53 65 72 76 65 72 20 2a 2f 0a  * SQL Server */.
16ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
16f00 74 72 75 65 20 69 66 20 7a 53 71 6c 20 69 73 20  true if zSql is 
16f10 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  a complete SQL s
16f20 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
16f30 6e 20 66 61 6c 73 65 20 69 66 20 69 74 0a 2a 2a  n false if it.**
16f40 20 65 6e 64 73 20 69 6e 20 74 68 65 20 6d 69 64   ends in the mid
16f50 64 6c 65 20 6f 66 20 61 20 73 74 72 69 6e 67 20  dle of a string 
16f60 6c 69 74 65 72 61 6c 20 6f 72 20 43 2d 73 74 79  literal or C-sty
16f70 6c 65 20 63 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 73  le comment..*/.s
16f80 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 65 5f 69  tatic int line_i
16f90 73 5f 63 6f 6d 70 6c 65 74 65 28 63 68 61 72 20  s_complete(char 
16fa0 2a 7a 53 71 6c 2c 20 69 6e 74 20 6e 53 71 6c 29  *zSql, int nSql)
16fb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
16fc0 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75  ( zSql==0 ) retu
16fd0 72 6e 20 31 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71  rn 1;.  zSql[nSq
16fe0 6c 5d 20 3d 20 27 3b 27 3b 0a 20 20 7a 53 71 6c  l] = ';';.  zSql
16ff0 5b 6e 53 71 6c 2b 31 5d 20 3d 20 30 3b 0a 20 20  [nSql+1] = 0;.  
17000 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  rc = sqlite3_com
17010 70 6c 65 74 65 28 7a 53 71 6c 29 3b 0a 20 20 7a  plete(zSql);.  z
17020 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 30 3b 0a 20  Sql[nSql] = 0;. 
17030 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17040 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75 74 20  *.** Read input 
17050 66 72 6f 6d 20 2a 69 6e 20 61 6e 64 20 70 72 6f  from *in and pro
17060 63 65 73 73 20 69 74 2e 20 20 49 66 20 2a 69 6e  cess it.  If *in
17070 3d 3d 30 20 74 68 65 6e 20 69 6e 70 75 74 0a 2a  ==0 then input.*
17080 2a 20 69 73 20 69 6e 74 65 72 61 63 74 69 76 65  * is interactive
17090 20 2d 20 74 68 65 20 75 73 65 72 20 69 73 20 74   - the user is t
170a0 79 70 69 6e 67 20 69 74 20 69 74 2e 20 20 4f 74  yping it it.  Ot
170b0 68 65 72 77 69 73 65 2c 20 69 6e 70 75 74 0a 2a  herwise, input.*
170c0 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d  * is coming from
170d0 20 61 20 66 69 6c 65 20 6f 72 20 64 65 76 69 63   a file or devic
170e0 65 2e 20 20 41 20 70 72 6f 6d 70 74 20 69 73 20  e.  A prompt is 
170f0 69 73 73 75 65 64 20 61 6e 64 20 68 69 73 74 6f  issued and histo
17100 72 79 0a 2a 2a 20 69 73 20 73 61 76 65 64 20 6f  ry.** is saved o
17110 6e 6c 79 20 69 66 20 69 6e 70 75 74 20 69 73 20  nly if input is 
17120 69 6e 74 65 72 61 63 74 69 76 65 2e 20 20 41 6e  interactive.  An
17130 20 69 6e 74 65 72 72 75 70 74 20 73 69 67 6e 61   interrupt signa
17140 6c 20 77 69 6c 6c 0a 2a 2a 20 63 61 75 73 65 20  l will.** cause 
17150 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
17160 65 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  exit immediately
17170 2c 20 75 6e 6c 65 73 73 20 69 6e 70 75 74 20 69  , unless input i
17180 73 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a  s interactive..*
17190 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
171a0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
171b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
171c0 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73 74  process_input(st
171d0 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
171e0 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29  ta *p, FILE *in)
171f0 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 20  {.  char *zLine 
17200 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
17210 20 41 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20   A single input 
17220 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  line */.  char *
17230 7a 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  zSql = 0;       
17240 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74      /* Accumulat
17250 65 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20  ed SQL text */. 
17260 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20   int nLine;     
17270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
17280 6e 67 74 68 20 6f 66 20 63 75 72 72 65 6e 74 20  ngth of current 
17290 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  line */.  int nS
172a0 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ql = 0;         
172b0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
172c0 7a 53 71 6c 5b 5d 20 75 73 65 64 20 2a 2f 0a 20  zSql[] used */. 
172d0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
172e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
172f0 6c 6f 63 61 74 65 64 20 7a 53 71 6c 5b 5d 20 73  located zSql[] s
17300 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  pace */.  int nS
17310 71 6c 50 72 69 6f 72 20 3d 20 30 3b 20 20 20 20  qlPrior = 0;    
17320 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
17330 7a 53 71 6c 5b 5d 20 75 73 65 64 20 62 79 20 70  zSql[] used by p
17340 72 69 6f 72 20 6c 69 6e 65 20 2a 2f 0a 20 20 63  rior line */.  c
17350 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20  har *zErrMsg;   
17360 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
17370 72 20 6d 65 73 73 61 67 65 20 72 65 74 75 72 6e  r message return
17380 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ed */.  int rc; 
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
173b0 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6e 74 20  */.  int errCnt 
173c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
173d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
173e0 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  rs seen */.  int
173f0 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20   lineno = 0;    
17400 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
17410 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  t line number */
17420 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65  .  int startline
17430 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
17440 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
17450 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e 74  start of current
17460 20 69 6e 70 75 74 20 2a 2f 0a 0a 20 20 77 68 69   input */..  whi
17470 6c 65 28 20 65 72 72 43 6e 74 3d 3d 30 20 7c 7c  le( errCnt==0 ||
17480 20 21 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20   !bail_on_error 
17490 7c 7c 20 28 69 6e 3d 3d 30 20 26 26 20 73 74 64  || (in==0 && std
174a0 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
174b0 65 29 20 29 7b 0a 20 20 20 20 66 66 6c 75 73 68  e) ){.    fflush
174c0 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7a 4c  (p->out);.    zL
174d0 69 6e 65 20 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f  ine = one_input_
174e0 6c 69 6e 65 28 69 6e 2c 20 7a 4c 69 6e 65 2c 20  line(in, zLine, 
174f0 6e 53 71 6c 3e 30 29 3b 0a 20 20 20 20 69 66 28  nSql>0);.    if(
17500 20 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20   zLine==0 ){.   
17510 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70     /* End of inp
17520 75 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ut */.      if( 
17530 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
17540 74 69 76 65 20 29 20 70 72 69 6e 74 66 28 22 5c  tive ) printf("\
17550 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
17560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17570 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b  seenInterrupt ){
17580 0a 20 20 20 20 20 20 69 66 28 20 69 6e 21 3d 30  .      if( in!=0
17590 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
175a0 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
175b0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 69 6e  0;.    }.    lin
175c0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6e  eno++;.    if( n
175d0 53 71 6c 3d 3d 30 20 26 26 20 5f 61 6c 6c 5f 77  Sql==0 && _all_w
175e0 68 69 74 65 73 70 61 63 65 28 7a 4c 69 6e 65 29  hitespace(zLine)
175f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
17600 3e 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66  >echoOn ) printf
17610 28 22 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b  ("%s\n", zLine);
17620 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
17630 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
17640 4c 69 6e 65 20 26 26 20 7a 4c 69 6e 65 5b 30 5d  Line && zLine[0]
17650 3d 3d 27 2e 27 20 26 26 20 6e 53 71 6c 3d 3d 30  =='.' && nSql==0
17660 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
17670 3e 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66  >echoOn ) printf
17680 28 22 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b  ("%s\n", zLine);
17690 0a 20 20 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d  .      rc = do_m
176a0 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e  eta_command(zLin
176b0 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28  e, p);.      if(
176c0 20 72 63 3d 3d 32 20 29 7b 20 2f 2a 20 65 78 69   rc==2 ){ /* exi
176d0 74 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  t requested */. 
176e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
176f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
17700 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 43   ){.        errC
17710 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
17720 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
17730 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 69 6e 65    }.    if( line
17740 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d  _is_command_term
17750 69 6e 61 74 6f 72 28 7a 4c 69 6e 65 29 20 26 26  inator(zLine) &&
17760 20 6c 69 6e 65 5f 69 73 5f 63 6f 6d 70 6c 65 74   line_is_complet
17770 65 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 29 7b  e(zSql, nSql) ){
17780 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c  .      memcpy(zL
17790 69 6e 65 2c 22 3b 22 2c 32 29 3b 0a 20 20 20 20  ine,";",2);.    
177a0 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20 73 74  }.    nLine = st
177b0 72 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20  rlen30(zLine);. 
177c0 20 20 20 69 66 28 20 6e 53 71 6c 2b 6e 4c 69 6e     if( nSql+nLin
177d0 65 2b 32 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20  e+2>=nAlloc ){. 
177e0 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 53       nAlloc = nS
177f0 71 6c 2b 6e 4c 69 6e 65 2b 31 30 30 3b 0a 20 20  ql+nLine+100;.  
17800 20 20 20 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c      zSql = reall
17810 6f 63 28 7a 53 71 6c 2c 20 6e 41 6c 6c 6f 63 29  oc(zSql, nAlloc)
17820 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c  ;.      if( zSql
17830 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
17840 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
17850 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
17860 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
17870 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
17880 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 71   }.    }.    nSq
17890 6c 50 72 69 6f 72 20 3d 20 6e 53 71 6c 3b 0a 20  lPrior = nSql;. 
178a0 20 20 20 69 66 28 20 6e 53 71 6c 3d 3d 30 20 29     if( nSql==0 )
178b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
178c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4c       for(i=0; zL
178d0 69 6e 65 5b 69 5d 20 26 26 20 49 73 53 70 61 63  ine[i] && IsSpac
178e0 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b  e(zLine[i]); i++
178f0 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
17900 28 20 6e 41 6c 6c 6f 63 3e 30 20 26 26 20 7a 53  ( nAlloc>0 && zS
17910 71 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d  ql!=0 );.      m
17920 65 6d 63 70 79 28 7a 53 71 6c 2c 20 7a 4c 69 6e  emcpy(zSql, zLin
17930 65 2b 69 2c 20 6e 4c 69 6e 65 2b 31 2d 69 29 3b  e+i, nLine+1-i);
17940 0a 20 20 20 20 20 20 73 74 61 72 74 6c 69 6e 65  .      startline
17950 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20   = lineno;.     
17960 20 6e 53 71 6c 20 3d 20 6e 4c 69 6e 65 2d 69 3b   nSql = nLine-i;
17970 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17980 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b 2b 5d 20 3d    zSql[nSql++] =
17990 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 6d 65 6d   '\n';.      mem
179a0 63 70 79 28 7a 53 71 6c 2b 6e 53 71 6c 2c 20 7a  cpy(zSql+nSql, z
179b0 4c 69 6e 65 2c 20 6e 4c 69 6e 65 2b 31 29 3b 0a  Line, nLine+1);.
179c0 20 20 20 20 20 20 6e 53 71 6c 20 2b 3d 20 6e 4c        nSql += nL
179d0 69 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ine;.    }.    i
179e0 66 28 20 6e 53 71 6c 20 26 26 20 6c 69 6e 65 5f  f( nSql && line_
179f0 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c  contains_semicol
17a00 6f 6e 28 26 7a 53 71 6c 5b 6e 53 71 6c 50 72 69  on(&zSql[nSqlPri
17a10 6f 72 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50 72  or], nSql-nSqlPr
17a20 69 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  ior).           
17a30 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
17a40 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29 20 29  complete(zSql) )
17a50 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 20 3d  {.      p->cnt =
17a60 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64   0;.      open_d
17a70 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 42  b(p, 0);.      B
17a80 45 47 49 4e 5f 54 49 4d 45 52 3b 0a 20 20 20 20  EGIN_TIMER;.    
17a90 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65    rc = shell_exe
17aa0 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73  c(p->db, zSql, s
17ab0 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  hell_callback, p
17ac0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
17ad0 20 20 20 45 4e 44 5f 54 49 4d 45 52 3b 0a 20 20     END_TIMER;.  
17ae0 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45      if( rc || zE
17af0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
17b00 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b 31 30   char zPrefix[10
17b10 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
17b20 69 6e 21 3d 30 20 7c 7c 20 21 73 74 64 69 6e 5f  in!=0 || !stdin_
17b30 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29  is_interactive )
17b40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
17b50 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
17b60 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50  eof(zPrefix), zP
17b70 72 65 66 69 78 2c 20 0a 20 20 20 20 20 20 20 20  refix, .        
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b90 20 20 20 22 45 72 72 6f 72 3a 20 6e 65 61 72 20     "Error: near 
17ba0 6c 69 6e 65 20 25 64 3a 22 2c 20 73 74 61 72 74  line %d:", start
17bb0 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  line);.        }
17bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17bd0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
17be0 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29  (sizeof(zPrefix)
17bf0 2c 20 7a 50 72 65 66 69 78 2c 20 22 45 72 72 6f  , zPrefix, "Erro
17c00 72 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  r:");.        }.
17c10 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72          if( zErr
17c20 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Msg!=0 ){.      
17c30 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17c40 72 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a  rr, "%s %s\n", z
17c50 50 72 65 66 69 78 2c 20 7a 45 72 72 4d 73 67 29  Prefix, zErrMsg)
17c60 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17c70 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
17c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72  );.          zEr
17c90 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
17ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17cb0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
17cc0 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50  r, "%s %s\n", zP
17cd0 72 65 66 69 78 2c 20 73 71 6c 69 74 65 33 5f 65  refix, sqlite3_e
17ce0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
17cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17d00 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20 20 20 20   errCnt++;.     
17d10 20 7d 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20   }.      nSql = 
17d20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
17d30 20 6e 53 71 6c 20 26 26 20 5f 61 6c 6c 5f 77 68   nSql && _all_wh
17d40 69 74 65 73 70 61 63 65 28 7a 53 71 6c 29 20 29  itespace(zSql) )
17d50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
17d60 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22  choOn ) printf("
17d70 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
17d80 20 20 20 20 6e 53 71 6c 20 3d 20 30 3b 0a 20 20      nSql = 0;.  
17d90 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 53    }.  }.  if( nS
17da0 71 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 5f  ql ){.    if( !_
17db0 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a  all_whitespace(z
17dc0 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 66 70  Sql) ){.      fp
17dd0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
17de0 72 72 6f 72 3a 20 69 6e 63 6f 6d 70 6c 65 74 65  rror: incomplete
17df0 20 53 51 4c 3a 20 25 73 5c 6e 22 2c 20 7a 53 71   SQL: %s\n", zSq
17e00 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  l);.    }.    fr
17e10 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20  ee(zSql);.  }.  
17e20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 72  free(zLine);.  r
17e30 65 74 75 72 6e 20 65 72 72 43 6e 74 3e 30 3b 0a  eturn errCnt>0;.
17e40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17e50 61 20 70 61 74 68 6e 61 6d 65 20 77 68 69 63 68  a pathname which
17e60 20 69 73 20 74 68 65 20 75 73 65 72 27 73 20 68   is the user's h
17e70 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ome directory.  
17e80 41 0a 2a 2a 20 30 20 72 65 74 75 72 6e 20 69 6e  A.** 0 return in
17e90 64 69 63 61 74 65 73 20 61 6e 20 65 72 72 6f 72  dicates an error
17ea0 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 0a 2a   of some kind..*
17eb0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66  /.static char *f
17ec0 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 76 6f 69  ind_home_dir(voi
17ed0 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  d){.  static cha
17ee0 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55  r *home_dir = NU
17ef0 4c 4c 3b 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64  LL;.  if( home_d
17f00 69 72 20 29 20 72 65 74 75 72 6e 20 68 6f 6d 65  ir ) return home
17f10 5f 64 69 72 3b 0a 0a 23 69 66 20 21 64 65 66 69  _dir;..#if !defi
17f20 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
17f30 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26  defined(WIN32) &
17f40 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  & !defined(_WIN3
17f50 32 5f 57 43 45 29 20 26 26 20 21 64 65 66 69 6e  2_WCE) && !defin
17f60 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21  ed(__RTP__) && !
17f70 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52  defined(_WRS_KER
17f80 4e 45 4c 29 0a 20 20 7b 0a 20 20 20 20 73 74 72  NEL).  {.    str
17f90 75 63 74 20 70 61 73 73 77 64 20 2a 70 77 65 6e  uct passwd *pwen
17fa0 74 3b 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64  t;.    uid_t uid
17fb0 20 3d 20 67 65 74 75 69 64 28 29 3b 0a 20 20 20   = getuid();.   
17fc0 20 69 66 28 20 28 70 77 65 6e 74 3d 67 65 74 70   if( (pwent=getp
17fd0 77 75 69 64 28 75 69 64 29 29 20 21 3d 20 4e 55  wuid(uid)) != NU
17fe0 4c 4c 29 20 7b 0a 20 20 20 20 20 20 68 6f 6d 65  LL) {.      home
17ff0 5f 64 69 72 20 3d 20 70 77 65 6e 74 2d 3e 70 77  _dir = pwent->pw
18000 5f 64 69 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _dir;.    }.  }.
18010 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
18020 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
18030 20 20 2f 2a 20 57 69 6e 64 6f 77 73 20 43 45 20    /* Windows CE 
18040 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67 77  (arm-wince-mingw
18050 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73 20 6e  32ce-gcc) does n
18060 6f 74 20 70 72 6f 76 69 64 65 20 67 65 74 65 6e  ot provide geten
18070 76 28 29 0a 20 20 20 2a 2f 0a 20 20 68 6f 6d 65  v().   */.  home
18080 5f 64 69 72 20 3d 20 22 2f 22 3b 0a 23 65 6c 73  _dir = "/";.#els
18090 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  e..#if defined(_
180a0 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
180b0 64 28 57 49 4e 33 32 29 0a 20 20 69 66 20 28 21  d(WIN32).  if (!
180c0 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20  home_dir) {.    
180d0 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65 6e  home_dir = geten
180e0 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29  v("USERPROFILE")
180f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18100 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b  if (!home_dir) {
18110 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20  .    home_dir = 
18120 67 65 74 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a  getenv("HOME");.
18130 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
18140 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
18150 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 69 66 20  ned(WIN32).  if 
18160 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20  (!home_dir) {.  
18170 20 20 63 68 61 72 20 2a 7a 44 72 69 76 65 2c 20    char *zDrive, 
18180 2a 7a 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20  *zPath;.    int 
18190 6e 3b 0a 20 20 20 20 7a 44 72 69 76 65 20 3d 20  n;.    zDrive = 
181a0 67 65 74 65 6e 76 28 22 48 4f 4d 45 44 52 49 56  getenv("HOMEDRIV
181b0 45 22 29 3b 0a 20 20 20 20 7a 50 61 74 68 20 3d  E");.    zPath =
181c0 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 50 41 54   getenv("HOMEPAT
181d0 48 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 72  H");.    if( zDr
181e0 69 76 65 20 26 26 20 7a 50 61 74 68 20 29 7b 0a  ive && zPath ){.
181f0 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
18200 33 30 28 7a 44 72 69 76 65 29 20 2b 20 73 74 72  30(zDrive) + str
18210 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2b 20 31  len30(zPath) + 1
18220 3b 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64 69 72  ;.      home_dir
18230 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a   = malloc( n );.
18240 20 20 20 20 20 20 69 66 28 20 68 6f 6d 65 5f 64        if( home_d
18250 69 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ir==0 ) return 0
18260 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
18270 73 6e 70 72 69 6e 74 66 28 6e 2c 20 68 6f 6d 65  snprintf(n, home
18280 5f 64 69 72 2c 20 22 25 73 25 73 22 2c 20 7a 44  _dir, "%s%s", zD
18290 72 69 76 65 2c 20 7a 50 61 74 68 29 3b 0a 20 20  rive, zPath);.  
182a0 20 20 20 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f      return home_
182b0 64 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  dir;.    }.    h
182c0 6f 6d 65 5f 64 69 72 20 3d 20 22 63 3a 5c 5c 22  ome_dir = "c:\\"
182d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 65  ;.  }.#endif..#e
182e0 6e 64 69 66 20 2f 2a 20 21 5f 57 49 4e 33 32 5f  ndif /* !_WIN32_
182f0 57 43 45 20 2a 2f 0a 0a 20 20 69 66 28 20 68 6f  WCE */..  if( ho
18300 6d 65 5f 64 69 72 20 29 7b 0a 20 20 20 20 69 6e  me_dir ){.    in
18310 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 68  t n = strlen30(h
18320 6f 6d 65 5f 64 69 72 29 20 2b 20 31 3b 0a 20 20  ome_dir) + 1;.  
18330 20 20 63 68 61 72 20 2a 7a 20 3d 20 6d 61 6c 6c    char *z = mall
18340 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20 69 66 28  oc( n );.    if(
18350 20 7a 20 29 20 6d 65 6d 63 70 79 28 7a 2c 20 68   z ) memcpy(z, h
18360 6f 6d 65 5f 64 69 72 2c 20 6e 29 3b 0a 20 20 20  ome_dir, n);.   
18370 20 68 6f 6d 65 5f 64 69 72 20 3d 20 7a 3b 0a 20   home_dir = z;. 
18380 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 68 6f 6d   }..  return hom
18390 65 5f 64 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e_dir;.}../*.** 
183a0 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  Read input from 
183b0 74 68 65 20 66 69 6c 65 20 67 69 76 65 6e 20 62  the file given b
183c0 79 20 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72  y sqliterc_overr
183d0 69 64 65 2e 20 20 4f 72 20 69 66 20 74 68 61 74  ide.  Or if that
183e0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
183f0 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 69 6e 70 75   NULL, take inpu
18400 74 20 66 72 6f 6d 20 7e 2f 2e 73 71 6c 69 74 65  t from ~/.sqlite
18410 72 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  rc.**.** Returns
18420 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
18430 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrors..*/.static
18440 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 73 71 6c   int process_sql
18450 69 74 65 72 63 28 0a 20 20 73 74 72 75 63 74 20  iterc(.  struct 
18460 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70  callback_data *p
18470 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66  ,        /* Conf
18480 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61 20 2a  iguration data *
18490 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
184a0 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64  sqliterc_overrid
184b0 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  e   /* Name of c
184c0 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e 55 4c 4c  onfig file. NULL
184d0 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
184e0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 68 6f  */.){.  char *ho
184f0 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 20  me_dir = NULL;. 
18500 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
18510 69 74 65 72 63 20 3d 20 73 71 6c 69 74 65 72 63  iterc = sqliterc
18520 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20 63 68 61  _override;.  cha
18530 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 46  r *zBuf = 0;.  F
18540 49 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a  ILE *in = NULL;.
18550 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20    int rc = 0;.. 
18560 20 69 66 20 28 73 71 6c 69 74 65 72 63 20 3d 3d   if (sqliterc ==
18570 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d   NULL) {.    hom
18580 65 5f 64 69 72 20 3d 20 66 69 6e 64 5f 68 6f 6d  e_dir = find_hom
18590 65 5f 64 69 72 28 29 3b 0a 20 20 20 20 69 66 28  e_dir();.    if(
185a0 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 7b 0a   home_dir==0 ){.
185b0 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52  #if !defined(__R
185c0 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  TP__) && !define
185d0 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20  d(_WRS_KERNEL). 
185e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
185f0 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20  err,"%s: Error: 
18600 63 61 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 79 6f  cannot locate yo
18610 75 72 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72  ur home director
18620 79 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a 23 65  y\n", Argv0);.#e
18630 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
18640 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
18650 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
18660 65 28 29 3b 0a 20 20 20 20 7a 42 75 66 20 3d 20  e();.    zBuf = 
18670 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
18680 22 25 73 2f 2e 73 71 6c 69 74 65 72 63 22 2c 68  "%s/.sqliterc",h
18690 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20 20 73 71  ome_dir);.    sq
186a0 6c 69 74 65 72 63 20 3d 20 7a 42 75 66 3b 0a 20  literc = zBuf;. 
186b0 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28   }.  in = fopen(
186c0 73 71 6c 69 74 65 72 63 2c 22 72 62 22 29 3b 0a  sqliterc,"rb");.
186d0 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20    if( in ){.    
186e0 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
186f0 65 72 61 63 74 69 76 65 20 29 7b 0a 20 20 20 20  eractive ){.    
18700 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
18710 2c 22 2d 2d 20 4c 6f 61 64 69 6e 67 20 72 65 73  ,"-- Loading res
18720 6f 75 72 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e  ources from %s\n
18730 22 2c 73 71 6c 69 74 65 72 63 29 3b 0a 20 20 20  ",sqliterc);.   
18740 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 63   }.    rc = proc
18750 65 73 73 5f 69 6e 70 75 74 28 70 2c 69 6e 29 3b  ess_input(p,in);
18760 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
18770 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
18780 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 72 65 74  ree(zBuf);.  ret
18790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
187a0 20 53 68 6f 77 20 61 76 61 69 6c 61 62 6c 65 20   Show available 
187b0 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
187c0 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ions.*/.static c
187d0 6f 6e 73 74 20 63 68 61 72 20 7a 4f 70 74 69 6f  onst char zOptio
187e0 6e 73 5b 5d 20 3d 20 0a 20 20 22 20 20 20 2d 62  ns[] = .  "   -b
187f0 61 69 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ail             
18800 20 20 20 73 74 6f 70 20 61 66 74 65 72 20 68 69     stop after hi
18810 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e  tting an error\n
18820 22 0a 20 20 22 20 20 20 2d 62 61 74 63 68 20 20  ".  "   -batch  
18830 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
18840 63 65 20 62 61 74 63 68 20 49 2f 4f 5c 6e 22 0a  ce batch I/O\n".
18850 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e 20 20 20    "   -column   
18860 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
18870 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 63  utput mode to 'c
18880 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22 20 20 20  olumn'\n".  "   
18890 2d 63 6d 64 20 43 4f 4d 4d 41 4e 44 20 20 20 20  -cmd COMMAND    
188a0 20 20 20 20 20 72 75 6e 20 5c 22 43 4f 4d 4d 41       run \"COMMA
188b0 4e 44 5c 22 20 62 65 66 6f 72 65 20 72 65 61 64  ND\" before read
188c0 69 6e 67 20 73 74 64 69 6e 5c 6e 22 0a 20 20 22  ing stdin\n".  "
188d0 20 20 20 2d 63 73 76 20 20 20 20 20 20 20 20 20     -csv         
188e0 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70          set outp
188f0 75 74 20 6d 6f 64 65 20 74 6f 20 27 63 73 76 27  ut mode to 'csv'
18900 5c 6e 22 0a 20 20 22 20 20 20 2d 65 63 68 6f 20  \n".  "   -echo 
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18920 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65  rint commands be
18930 66 6f 72 65 20 65 78 65 63 75 74 69 6f 6e 5c 6e  fore execution\n
18940 22 0a 20 20 22 20 20 20 2d 69 6e 69 74 20 46 49  ".  "   -init FI
18950 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 72 65 61  LENAME       rea
18960 64 2f 70 72 6f 63 65 73 73 20 6e 61 6d 65 64 20  d/process named 
18970 66 69 6c 65 5c 6e 22 0a 20 20 22 20 20 20 2d 5b  file\n".  "   -[
18980 6e 6f 5d 68 65 61 64 65 72 20 20 20 20 20 20 20  no]header       
18990 20 20 20 74 75 72 6e 20 68 65 61 64 65 72 73 20     turn headers 
189a0 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 23 69 66  on or off\n".#if
189b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
189c0 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
189d0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
189e0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
189f0 29 0a 20 20 22 20 20 20 2d 68 65 61 70 20 53 49  ).  "   -heap SI
18a00 5a 45 20 20 20 20 20 20 20 20 20 20 20 53 69 7a  ZE           Siz
18a10 65 20 6f 66 20 68 65 61 70 20 66 6f 72 20 6d 65  e of heap for me
18a20 6d 73 79 73 33 20 6f 72 20 6d 65 6d 73 79 73 35  msys3 or memsys5
18a30 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 20 20  \n".#endif.  "  
18a40 20 2d 68 65 6c 70 20 20 20 20 20 20 20 20 20 20   -help          
18a50 20 20 20 20 20 20 73 68 6f 77 20 74 68 69 73 20        show this 
18a60 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 20 20  message\n".  "  
18a70 20 2d 68 74 6d 6c 20 20 20 20 20 20 20 20 20 20   -html          
18a80 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
18a90 20 6d 6f 64 65 20 74 6f 20 48 54 4d 4c 5c 6e 22   mode to HTML\n"
18aa0 0a 20 20 22 20 20 20 2d 69 6e 74 65 72 61 63 74  .  "   -interact
18ab0 69 76 65 20 20 20 20 20 20 20 20 20 66 6f 72 63  ive         forc
18ac0 65 20 69 6e 74 65 72 61 63 74 69 76 65 20 49 2f  e interactive I/
18ad0 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 6c 69 6e 65  O\n".  "   -line
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18af0 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  set output mode 
18b00 74 6f 20 27 6c 69 6e 65 27 5c 6e 22 0a 20 20 22  to 'line'\n".  "
18b10 20 20 20 2d 6c 69 73 74 20 20 20 20 20 20 20 20     -list        
18b20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70          set outp
18b30 75 74 20 6d 6f 64 65 20 74 6f 20 27 6c 69 73 74  ut mode to 'list
18b40 27 5c 6e 22 0a 20 20 22 20 20 20 2d 6d 6d 61 70  '\n".  "   -mmap
18b50 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   N              
18b60 64 65 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a  default mmap siz
18b70 65 20 73 65 74 20 74 6f 20 4e 5c 6e 22 0a 23 69  e set to N\n".#i
18b80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18b90 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 22  LE_MULTIPLEX.  "
18ba0 20 20 20 2d 6d 75 6c 74 69 70 6c 65 78 20 20 20     -multiplex   
18bb0 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 20 74          enable t
18bc0 68 65 20 6d 75 6c 74 69 70 6c 65 78 6f 72 20 56  he multiplexor V
18bd0 46 53 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22  FS\n".#endif.  "
18be0 20 20 20 2d 6e 75 6c 6c 76 61 6c 75 65 20 54 45     -nullvalue TE
18bf0 58 54 20 20 20 20 20 20 73 65 74 20 74 65 78 74  XT      set text
18c00 20 73 74 72 69 6e 67 20 66 6f 72 20 4e 55 4c 4c   string for NULL
18c10 20 76 61 6c 75 65 73 2e 20 44 65 66 61 75 6c 74   values. Default
18c20 20 27 27 5c 6e 22 0a 20 20 22 20 20 20 2d 73 65   ''\n".  "   -se
18c30 70 61 72 61 74 6f 72 20 53 45 50 20 20 20 20 20  parator SEP     
18c40 20 20 73 65 74 20 6f 75 74 70 75 74 20 66 69 65    set output fie
18c50 6c 64 20 73 65 70 61 72 61 74 6f 72 2e 20 44 65  ld separator. De
18c60 66 61 75 6c 74 3a 20 27 7c 27 5c 6e 22 0a 20 20  fault: '|'\n".  
18c70 22 20 20 20 2d 73 74 61 74 73 20 20 20 20 20 20  "   -stats      
18c80 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 20 6d           print m
18c90 65 6d 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f  emory stats befo
18ca0 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65  re each finalize
18cb0 5c 6e 22 0a 20 20 22 20 20 20 2d 76 65 72 73 69  \n".  "   -versi
18cc0 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 73  on             s
18cd0 68 6f 77 20 53 51 4c 69 74 65 20 76 65 72 73 69  how SQLite versi
18ce0 6f 6e 5c 6e 22 0a 20 20 22 20 20 20 2d 76 66 73  on\n".  "   -vfs
18cf0 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20   NAME           
18d00 20 75 73 65 20 4e 41 4d 45 20 61 73 20 74 68 65   use NAME as the
18d10 20 64 65 66 61 75 6c 74 20 56 46 53 5c 6e 22 0a   default VFS\n".
18d20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18d30 41 42 4c 45 5f 56 46 53 54 52 41 43 45 0a 20 20  ABLE_VFSTRACE.  
18d40 22 20 20 20 2d 76 66 73 74 72 61 63 65 20 20 20  "   -vfstrace   
18d50 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 20           enable 
18d60 74 72 61 63 69 6e 67 20 6f 66 20 61 6c 6c 20 56  tracing of all V
18d70 46 53 20 63 61 6c 6c 73 5c 6e 22 0a 23 65 6e 64  FS calls\n".#end
18d80 69 66 0a 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  if.;.static void
18d90 20 75 73 61 67 65 28 69 6e 74 20 73 68 6f 77 44   usage(int showD
18da0 65 74 61 69 6c 29 7b 0a 20 20 66 70 72 69 6e 74  etail){.  fprint
18db0 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
18dc0 22 55 73 61 67 65 3a 20 25 73 20 5b 4f 50 54 49  "Usage: %s [OPTI
18dd0 4f 4e 53 5d 20 46 49 4c 45 4e 41 4d 45 20 5b 53  ONS] FILENAME [S
18de0 51 4c 5d 5c 6e 22 20 20 0a 20 20 20 20 20 20 22  QL]\n"  .      "
18df0 46 49 4c 45 4e 41 4d 45 20 69 73 20 74 68 65 20  FILENAME is the 
18e00 6e 61 6d 65 20 6f 66 20 61 6e 20 53 51 4c 69 74  name of an SQLit
18e10 65 20 64 61 74 61 62 61 73 65 2e 20 41 20 6e 65  e database. A ne
18e20 77 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  w database is cr
18e30 65 61 74 65 64 5c 6e 22 0a 20 20 20 20 20 20 22  eated\n".      "
18e40 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
18e50 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   not previously 
18e60 65 78 69 73 74 2e 5c 6e 22 2c 20 41 72 67 76 30  exist.\n", Argv0
18e70 29 3b 0a 20 20 69 66 28 20 73 68 6f 77 44 65 74  );.  if( showDet
18e80 61 69 6c 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ail ){.    fprin
18e90 74 66 28 73 74 64 65 72 72 2c 20 22 4f 50 54 49  tf(stderr, "OPTI
18ea0 4f 4e 53 20 69 6e 63 6c 75 64 65 3a 5c 6e 25 73  ONS include:\n%s
18eb0 22 2c 20 7a 4f 70 74 69 6f 6e 73 29 3b 0a 20 20  ", zOptions);.  
18ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
18ed0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 20  tf(stderr, "Use 
18ee0 74 68 65 20 2d 68 65 6c 70 20 6f 70 74 69 6f 6e  the -help option
18ef0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
18f00 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b  information\n");
18f10 0a 20 20 7d 0a 20 20 65 78 69 74 28 31 29 3b 0a  .  }.  exit(1);.
18f20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
18f30 69 7a 65 20 74 68 65 20 73 74 61 74 65 20 69 6e  ize the state in
18f40 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 64 61 74  formation in dat
18f50 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  a.*/.static void
18f60 20 6d 61 69 6e 5f 69 6e 69 74 28 73 74 72 75 63   main_init(struc
18f70 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
18f80 2a 64 61 74 61 29 20 7b 0a 20 20 6d 65 6d 73 65  *data) {.  memse
18f90 74 28 64 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  t(data, 0, sizeo
18fa0 66 28 2a 64 61 74 61 29 29 3b 0a 20 20 64 61 74  f(*data));.  dat
18fb0 61 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  a->mode = MODE_L
18fc0 69 73 74 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61  ist;.  memcpy(da
18fd0 74 61 2d 3e 73 65 70 61 72 61 74 6f 72 2c 22 7c  ta->separator,"|
18fe0 22 2c 20 32 29 3b 0a 20 20 64 61 74 61 2d 3e 73  ", 2);.  data->s
18ff0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
19000 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
19010 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
19020 49 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  I, 1);.  sqlite3
19030 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
19040 4f 4e 46 49 47 5f 4c 4f 47 2c 20 73 68 65 6c 6c  ONFIG_LOG, shell
19050 4c 6f 67 2c 20 64 61 74 61 29 3b 0a 20 20 73 71  Log, data);.  sq
19060 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
19070 69 7a 65 6f 66 28 6d 61 69 6e 50 72 6f 6d 70 74  izeof(mainPrompt
19080 29 2c 20 6d 61 69 6e 50 72 6f 6d 70 74 2c 22 73  ), mainPrompt,"s
19090 71 6c 69 74 65 3e 20 22 29 3b 0a 20 20 73 71 6c  qlite> ");.  sql
190a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
190b0 7a 65 6f 66 28 63 6f 6e 74 69 6e 75 65 50 72 6f  zeof(continuePro
190c0 6d 70 74 29 2c 20 63 6f 6e 74 69 6e 75 65 50 72  mpt), continuePr
190d0 6f 6d 70 74 2c 22 20 20 20 2e 2e 2e 3e 20 22 29  ompt,"   ...> ")
190e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  ;.  sqlite3_conf
190f0 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
19100 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a  _SINGLETHREAD);.
19110 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65  }../*.** Get the
19120 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 20   argument to an 
19130 2d 2d 6f 70 74 69 6f 6e 2e 20 20 54 68 72 6f 77  --option.  Throw
19140 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 64 69   an error and di
19150 65 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74  e if no argument
19160 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
19170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
19180 20 2a 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e   *cmdline_option
19190 5f 76 61 6c 75 65 28 69 6e 74 20 61 72 67 63 2c  _value(int argc,
191a0 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 69 6e   char **argv, in
191b0 74 20 69 29 7b 0a 20 20 69 66 28 20 69 3d 3d 61  t i){.  if( i==a
191c0 72 67 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  rgc ){.    fprin
191d0 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20  tf(stderr, "%s: 
191e0 45 72 72 6f 72 3a 20 6d 69 73 73 69 6e 67 20 61  Error: missing a
191f0 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 5c 6e 22  rgument to %s\n"
19200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  ,.            ar
19210 67 76 5b 30 5d 2c 20 61 72 67 76 5b 61 72 67 63  gv[0], argv[argc
19220 2d 31 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31  -1]);.    exit(1
19230 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19240 61 72 67 76 5b 69 5d 3b 0a 7d 0a 0a 69 6e 74 20  argv[i];.}..int 
19250 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
19260 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  har **argv){.  c
19270 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
19280 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62  ;.  struct callb
19290 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20  ack_data data;. 
192a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
192b0 69 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 68  itFile = 0;.  ch
192c0 61 72 20 2a 7a 46 69 72 73 74 43 6d 64 20 3d 20  ar *zFirstCmd = 
192d0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
192e0 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 69 66 28  t rc = 0;..  if(
192f0 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f   strcmp(sqlite3_
19300 73 6f 75 72 63 65 69 64 28 29 2c 53 51 4c 49 54  sourceid(),SQLIT
19310 45 5f 53 4f 55 52 43 45 5f 49 44 29 21 3d 30 20  E_SOURCE_ID)!=0 
19320 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
19330 74 64 65 72 72 2c 20 22 53 51 4c 69 74 65 20 68  tderr, "SQLite h
19340 65 61 64 65 72 20 61 6e 64 20 73 6f 75 72 63 65  eader and source
19350 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63   version mismatc
19360 68 5c 6e 25 73 5c 6e 25 73 5c 6e 22 2c 0a 20 20  h\n%s\n%s\n",.  
19370 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19380 33 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 53 51  3_sourceid(), SQ
19390 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 29 3b  LITE_SOURCE_ID);
193a0 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
193b0 7d 0a 20 20 41 72 67 76 30 20 3d 20 61 72 67 76  }.  Argv0 = argv
193c0 5b 30 5d 3b 0a 20 20 6d 61 69 6e 5f 69 6e 69 74  [0];.  main_init
193d0 28 26 64 61 74 61 29 3b 0a 20 20 73 74 64 69 6e  (&data);.  stdin
193e0 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20  _is_interactive 
193f0 3d 20 69 73 61 74 74 79 28 30 29 3b 0a 0a 20 20  = isatty(0);..  
19400 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
19410 68 61 76 65 20 61 20 76 61 6c 69 64 20 73 69 67  have a valid sig
19420 6e 61 6c 20 68 61 6e 64 6c 65 72 20 65 61 72 6c  nal handler earl
19430 79 2c 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69  y, before anythi
19440 6e 67 0a 20 20 2a 2a 20 65 6c 73 65 20 69 73 20  ng.  ** else is 
19450 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  done..  */.#ifde
19460 66 20 53 49 47 49 4e 54 0a 20 20 73 69 67 6e 61  f SIGINT.  signa
19470 6c 28 53 49 47 49 4e 54 2c 20 69 6e 74 65 72 72  l(SIGINT, interr
19480 75 70 74 5f 68 61 6e 64 6c 65 72 29 3b 0a 23 65  upt_handler);.#e
19490 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e  ndif..  /* Do an
194a0 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20 74 68   initial pass th
194b0 72 6f 75 67 68 20 74 68 65 20 63 6f 6d 6d 61 6e  rough the comman
194c0 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20  d-line argument 
194d0 74 6f 20 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74  to locate.  ** t
194e0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
194f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
19500 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
19510 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c  itialization fil
19520 65 2c 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65  e,.  ** the size
19530 20 6f 66 20 74 68 65 20 61 6c 74 65 72 6e 61 74   of the alternat
19540 69 76 65 20 6d 61 6c 6c 6f 63 20 68 65 61 70 2c  ive malloc heap,
19550 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 66 69  .  ** and the fi
19560 72 73 74 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  rst command to e
19570 78 65 63 75 74 65 2e 0a 20 20 2a 2f 0a 20 20 66  xecute..  */.  f
19580 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20  or(i=1; i<argc; 
19590 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
195a0 7a 3b 0a 20 20 20 20 7a 20 3d 20 61 72 67 76 5b  z;.    z = argv[
195b0 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  i];.    if( z[0]
195c0 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69  !='-' ){.      i
195d0 66 28 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e  f( data.zDbFilen
195e0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
195f0 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61    data.zDbFilena
19600 6d 65 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20  me = z;.        
19610 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
19620 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 72  }.      if( zFir
19630 73 74 43 6d 64 3d 3d 30 20 29 7b 0a 20 20 20 20  stCmd==0 ){.    
19640 20 20 20 20 7a 46 69 72 73 74 43 6d 64 20 3d 20      zFirstCmd = 
19650 7a 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  z;.        conti
19660 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
19670 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
19680 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 74 6f  r,"%s: Error: to
19690 6f 20 6d 61 6e 79 20 6f 70 74 69 6f 6e 73 3a 20  o many options: 
196a0 5c 22 25 73 5c 22 5c 6e 22 2c 20 41 72 67 76 30  \"%s\"\n", Argv0
196b0 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
196c0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
196d0 2c 22 55 73 65 20 2d 68 65 6c 70 20 66 6f 72 20  ,"Use -help for 
196e0 61 20 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e  a list of option
196f0 73 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  s.\n");.      re
19700 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
19710 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20    if( z[1]=='-' 
19720 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73  ) z++;.    if( s
19730 74 72 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61  trcmp(z,"-separa
19740 74 6f 72 22 29 3d 3d 30 0a 20 20 20 20 20 7c 7c  tor")==0.     ||
19750 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 75 6c 6c   strcmp(z,"-null
19760 76 61 6c 75 65 22 29 3d 3d 30 0a 20 20 20 20 20  value")==0.     
19770 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6d  || strcmp(z,"-cm
19780 64 22 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  d")==0.    ){.  
19790 20 20 20 20 28 76 6f 69 64 29 63 6d 64 6c 69 6e      (void)cmdlin
197a0 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
197b0 72 67 63 2c 20 61 72 67 76 2c 20 2b 2b 69 29 3b  rgc, argv, ++i);
197c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
197d0 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29  trcmp(z,"-init")
197e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 49 6e  ==0 ){.      zIn
197f0 69 74 46 69 6c 65 20 3d 20 63 6d 64 6c 69 6e 65  itFile = cmdline
19800 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72  _option_value(ar
19810 67 63 2c 20 61 72 67 76 2c 20 2b 2b 69 29 3b 0a  gc, argv, ++i);.
19820 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
19830 72 63 6d 70 28 7a 2c 22 2d 62 61 74 63 68 22 29  rcmp(z,"-batch")
19840 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
19850 4e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  Need to check fo
19860 72 20 62 61 74 63 68 20 6d 6f 64 65 20 68 65 72  r batch mode her
19870 65 20 74 6f 20 73 6f 20 77 65 20 63 61 6e 20 61  e to so we can a
19880 76 6f 69 64 20 70 72 69 6e 74 69 6e 67 0a 20 20  void printing.  
19890 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
198a0 6f 6e 61 6c 20 6d 65 73 73 61 67 65 73 20 28 6c  onal messages (l
198b0 69 6b 65 20 66 72 6f 6d 20 70 72 6f 63 65 73 73  ike from process
198c0 5f 73 71 6c 69 74 65 72 63 29 20 62 65 66 6f 72  _sqliterc) befor
198d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 64  e .      ** we d
198e0 6f 20 74 68 65 20 61 63 74 75 61 6c 20 70 72 6f  o the actual pro
198f0 63 65 73 73 69 6e 67 20 6f 66 20 61 72 67 75 6d  cessing of argum
19900 65 6e 74 73 20 6c 61 74 65 72 20 69 6e 20 61 20  ents later in a 
19910 73 65 63 6f 6e 64 20 70 61 73 73 2e 0a 20 20 20  second pass..   
19920 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 64 69     */.      stdi
19930 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
19940 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
19950 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
19960 65 61 70 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20  eap")==0 ){.#if 
19970 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
19980 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c  NABLE_MEMSYS3) |
19990 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
199a0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29  _ENABLE_MEMSYS5)
199b0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
199c0 72 20 2a 7a 53 69 7a 65 3b 0a 20 20 20 20 20 20  r *zSize;.      
199d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
199e0 48 65 61 70 3b 0a 0a 20 20 20 20 20 20 7a 53 69  Heap;..      zSi
199f0 7a 65 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f 70 74  ze = cmdline_opt
19a00 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 20  ion_value(argc, 
19a10 61 72 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20 20  argv, ++i);.    
19a20 20 20 73 7a 48 65 61 70 20 3d 20 69 6e 74 65 67    szHeap = integ
19a30 65 72 56 61 6c 75 65 28 7a 53 69 7a 65 29 3b 0a  erValue(zSize);.
19a40 20 20 20 20 20 20 69 66 28 20 73 7a 48 65 61 70        if( szHeap
19a50 3e 30 78 37 66 66 66 30 30 30 30 20 29 20 73 7a  >0x7fff0000 ) sz
19a60 48 65 61 70 20 3d 20 30 78 37 66 66 66 30 30 30  Heap = 0x7fff000
19a70 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
19a80 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
19a90 4f 4e 46 49 47 5f 48 45 41 50 2c 20 6d 61 6c 6c  ONFIG_HEAP, mall
19aa0 6f 63 28 28 69 6e 74 29 73 7a 48 65 61 70 29 2c  oc((int)szHeap),
19ab0 20 28 69 6e 74 29 73 7a 48 65 61 70 2c 20 36 34   (int)szHeap, 64
19ac0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
19ad0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 56   SQLITE_ENABLE_V
19ae0 46 53 54 52 41 43 45 0a 20 20 20 20 7d 65 6c 73  FSTRACE.    }els
19af0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
19b00 2d 76 66 73 74 72 61 63 65 22 29 3d 3d 30 20 29  -vfstrace")==0 )
19b10 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 69  {.      extern i
19b20 6e 74 20 76 66 73 74 72 61 63 65 5f 72 65 67 69  nt vfstrace_regi
19b30 73 74 65 72 28 0a 20 20 20 20 20 20 20 20 20 63  ster(.         c
19b40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 72 61 63  onst char *zTrac
19b50 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  eName,.         
19b60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64  const char *zOld
19b70 56 66 73 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  VfsName,.       
19b80 20 20 69 6e 74 20 28 2a 78 4f 75 74 29 28 63 6f    int (*xOut)(co
19b90 6e 73 74 20 63 68 61 72 2a 2c 76 6f 69 64 2a 29  nst char*,void*)
19ba0 2c 0a 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  ,.         void 
19bb0 2a 70 4f 75 74 41 72 67 2c 0a 20 20 20 20 20 20  *pOutArg,.      
19bc0 20 20 20 69 6e 74 20 6d 61 6b 65 44 65 66 61 75     int makeDefau
19bd0 6c 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  lt.      );.    
19be0 20 20 76 66 73 74 72 61 63 65 5f 72 65 67 69 73    vfstrace_regis
19bf0 74 65 72 28 22 74 72 61 63 65 22 2c 30 2c 28 69  ter("trace",0,(i
19c00 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
19c10 2a 2c 76 6f 69 64 2a 29 29 66 70 75 74 73 2c 73  *,void*))fputs,s
19c20 74 64 65 72 72 2c 31 29 3b 0a 23 65 6e 64 69 66  tderr,1);.#endif
19c30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19c40 4e 41 42 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a  NABLE_MULTIPLEX.
19c50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
19c60 72 63 6d 70 28 7a 2c 22 2d 6d 75 6c 74 69 70 6c  rcmp(z,"-multipl
19c70 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
19c80 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
19c90 74 65 33 5f 6d 75 6c 74 69 70 6c 65 5f 69 6e 69  te3_multiple_ini
19ca0 74 69 61 6c 69 7a 65 28 63 6f 6e 73 74 20 63 68  tialize(const ch
19cb0 61 72 2a 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  ar*,int);.      
19cc0 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65  sqlite3_multiple
19cd0 78 5f 69 6e 69 74 69 61 6c 69 7a 65 28 30 2c 20  x_initialize(0, 
19ce0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  1);.#endif.    }
19cf0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
19d00 7a 2c 22 2d 6d 6d 61 70 22 29 3d 3d 30 20 29 7b  z,"-mmap")==0 ){
19d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
19d20 6e 74 36 34 20 73 7a 20 3d 20 69 6e 74 65 67 65  nt64 sz = intege
19d30 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65 5f 6f  rValue(cmdline_o
19d40 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63  ption_value(argc
19d50 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20  ,argv,++i));.   
19d60 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69     sqlite3_confi
19d70 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
19d80 4d 4d 41 50 5f 53 49 5a 45 2c 20 73 7a 2c 20 73  MMAP_SIZE, sz, s
19d90 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  z);.    }else if
19da0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73  ( strcmp(z,"-vfs
19db0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ")==0 ){.      s
19dc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
19dd0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
19de0 69 6e 64 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69  ind(cmdline_opti
19df0 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72  on_value(argc,ar
19e00 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20  gv,++i));.      
19e10 69 66 28 20 70 56 66 73 20 29 7b 0a 20 20 20 20  if( pVfs ){.    
19e20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
19e30 72 65 67 69 73 74 65 72 28 70 56 66 73 2c 20 31  register(pVfs, 1
19e40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19e50 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
19e60 73 74 64 65 72 72 2c 20 22 6e 6f 20 73 75 63 68  stderr, "no such
19e70 20 56 46 53 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c   VFS: \"%s\"\n",
19e80 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20   argv[i]);.     
19e90 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
19ea0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19eb0 69 66 28 20 64 61 74 61 2e 7a 44 62 46 69 6c 65  if( data.zDbFile
19ec0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  name==0 ){.#ifnd
19ed0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
19ee0 45 4d 4f 52 59 44 42 0a 20 20 20 20 64 61 74 61  EMORYDB.    data
19ef0 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 22  .zDbFilename = "
19f00 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 23 65 6c 73 65  :memory:";.#else
19f10 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
19f20 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20  err,"%s: Error: 
19f30 6e 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  no database file
19f40 6e 61 6d 65 20 73 70 65 63 69 66 69 65 64 5c 6e  name specified\n
19f50 22 2c 20 41 72 67 76 30 29 3b 0a 20 20 20 20 72  ", Argv0);.    r
19f60 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
19f70 20 20 7d 0a 20 20 64 61 74 61 2e 6f 75 74 20 3d    }.  data.out =
19f80 20 73 74 64 6f 75 74 3b 0a 0a 20 20 2f 2a 20 47   stdout;..  /* G
19f90 6f 20 61 68 65 61 64 20 61 6e 64 20 6f 70 65 6e  o ahead and open
19fa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19fb0 6c 65 20 69 66 20 69 74 20 61 6c 72 65 61 64 79  le if it already
19fc0 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65   exists.  If the
19fd0 0a 20 20 2a 2a 20 66 69 6c 65 20 64 6f 65 73 20  .  ** file does 
19fe0 6e 6f 74 20 65 78 69 73 74 2c 20 64 65 6c 61 79  not exist, delay
19ff0 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20 20 54 68   opening it.  Th
1a000 69 73 20 70 72 65 76 65 6e 74 73 20 65 6d 70 74  is prevents empt
1a010 79 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  y database.  ** 
1a020 66 69 6c 65 73 20 66 72 6f 6d 20 62 65 69 6e 67  files from being
1a030 20 63 72 65 61 74 65 64 20 69 66 20 61 20 75 73   created if a us
1a040 65 72 20 6d 69 73 74 79 70 65 73 20 74 68 65 20  er mistypes the 
1a050 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61 72  database name ar
1a060 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74  gument.  ** to t
1a070 68 65 20 73 71 6c 69 74 65 20 63 6f 6d 6d 61 6e  he sqlite comman
1a080 64 2d 6c 69 6e 65 20 74 6f 6f 6c 2e 0a 20 20 2a  d-line tool..  *
1a090 2f 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 64  /.  if( access(d
1a0a0 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  ata.zDbFilename,
1a0b0 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   0)==0 ){.    op
1a0c0 65 6e 5f 64 62 28 26 64 61 74 61 2c 20 30 29 3b  en_db(&data, 0);
1a0d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
1a0e0 73 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ss the initializ
1a0f0 61 74 69 6f 6e 20 66 69 6c 65 20 69 66 20 74 68  ation file if th
1a100 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
1a110 6e 6f 20 2d 69 6e 69 74 20 6f 70 74 69 6f 6e 0a  no -init option.
1a120 20 20 2a 2a 20 69 73 20 67 69 76 65 6e 20 6f 6e    ** is given on
1a130 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1a140 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 66 69  e, look for a fi
1a150 6c 65 20 6e 61 6d 65 64 20 7e 2f 2e 73 71 6c 69  le named ~/.sqli
1a160 74 65 72 63 20 61 6e 64 0a 20 20 2a 2a 20 74 72  terc and.  ** tr
1a170 79 20 74 6f 20 70 72 6f 63 65 73 73 20 69 74 2e  y to process it.
1a180 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 72 6f  .  */.  rc = pro
1a190 63 65 73 73 5f 73 71 6c 69 74 65 72 63 28 26 64  cess_sqliterc(&d
1a1a0 61 74 61 2c 7a 49 6e 69 74 46 69 6c 65 29 3b 0a  ata,zInitFile);.
1a1b0 20 20 69 66 28 20 72 63 3e 30 20 29 7b 0a 20 20    if( rc>0 ){.  
1a1c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1a1d0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65  ..  /* Make a se
1a1e0 63 6f 6e 64 20 70 61 73 73 20 74 68 72 6f 75 67  cond pass throug
1a1f0 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  h the command-li
1a200 6e 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ne argument and 
1a210 73 65 74 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 73  set.  ** options
1a220 2e 20 20 54 68 69 73 20 73 65 63 6f 6e 64 20 70  .  This second p
1a230 61 73 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  ass is delayed u
1a240 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 69  ntil after the i
1a250 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
1a260 2a 2a 20 66 69 6c 65 20 69 73 20 70 72 6f 63 65  ** file is proce
1a270 73 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ssed so that the
1a280 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
1a290 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 6f 76 65  guments will ove
1a2a0 72 72 69 64 65 0a 20 20 2a 2a 20 73 65 74 74 69  rride.  ** setti
1a2b0 6e 67 73 20 69 6e 20 74 68 65 20 69 6e 69 74 69  ngs in the initi
1a2c0 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 0a  alization file..
1a2d0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20    */.  for(i=1; 
1a2e0 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1a2f0 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76    char *z = argv
1a300 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [i];.    if( z[0
1a310 5d 21 3d 27 2d 27 20 29 20 63 6f 6e 74 69 6e 75  ]!='-' ) continu
1a320 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d  e;.    if( z[1]=
1a330 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  ='-' ){ z++; }. 
1a340 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
1a350 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20  "-init")==0 ){. 
1a360 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65       i++;.    }e
1a370 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1a380 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29 7b 0a  ,"-html")==0 ){.
1a390 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
1a3a0 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20  = MODE_Html;.   
1a3b0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1a3c0 70 28 7a 2c 22 2d 6c 69 73 74 22 29 3d 3d 30 20  p(z,"-list")==0 
1a3d0 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f  ){.      data.mo
1a3e0 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
1a3f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1a400 72 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22 29 3d  rcmp(z,"-line")=
1a410 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
1a420 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e  .mode = MODE_Lin
1a430 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  e;.    }else if(
1a440 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f 6c 75   strcmp(z,"-colu
1a450 6d 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mn")==0 ){.     
1a460 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
1a470 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65  E_Column;.    }e
1a480 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1a490 2c 22 2d 63 73 76 22 29 3d 3d 30 20 29 7b 0a 20  ,"-csv")==0 ){. 
1a4a0 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d       data.mode =
1a4b0 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20   MODE_Csv;.     
1a4c0 20 6d 65 6d 63 70 79 28 64 61 74 61 2e 73 65 70   memcpy(data.sep
1a4d0 61 72 61 74 6f 72 2c 22 2c 22 2c 32 29 3b 0a 20  arator,",",2);. 
1a4e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1a4f0 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61 74 6f  cmp(z,"-separato
1a500 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
1a510 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1a520 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 73 65 70  (sizeof(data.sep
1a530 61 72 61 74 6f 72 29 2c 20 64 61 74 61 2e 73 65  arator), data.se
1a540 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20  parator,.       
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 22 25 73 22 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74  "%s",cmdline_opt
1a570 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61  ion_value(argc,a
1a580 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 7d  rgv,++i));.    }
1a590 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1a5a0 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d  z,"-nullvalue")=
1a5b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1a5c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1a5d0 65 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c  eof(data.nullval
1a5e0 75 65 29 2c 20 64 61 74 61 2e 6e 75 6c 6c 76 61  ue), data.nullva
1a5f0 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lue,.           
1a600 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 22              "%s"
1a610 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f  ,cmdline_option_
1a620 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c  value(argc,argv,
1a630 2b 2b 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ++i));.    }else
1a640 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1a650 68 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20  header")==0 ){. 
1a660 20 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65       data.showHe
1a670 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65  ader = 1;.    }e
1a680 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1a690 2c 22 2d 6e 6f 68 65 61 64 65 72 22 29 3d 3d 30  ,"-noheader")==0
1a6a0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73   ){.      data.s
1a6b0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
1a6c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1a6d0 63 6d 70 28 7a 2c 22 2d 65 63 68 6f 22 29 3d 3d  cmp(z,"-echo")==
1a6e0 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
1a6f0 65 63 68 6f 4f 6e 20 3d 20 31 3b 0a 20 20 20 20  echoOn = 1;.    
1a700 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1a710 28 7a 2c 22 2d 73 74 61 74 73 22 29 3d 3d 30 20  (z,"-stats")==0 
1a720 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73 74  ){.      data.st
1a730 61 74 73 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  atsOn = 1;.    }
1a740 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1a750 7a 2c 22 2d 62 61 69 6c 22 29 3d 3d 30 20 29 7b  z,"-bail")==0 ){
1a760 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65  .      bail_on_e
1a770 72 72 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65  rror = 1;.    }e
1a780 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1a790 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20  ,"-version")==0 
1a7a0 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
1a7b0 22 25 73 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  "%s %s\n", sqlit
1a7c0 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c  e3_libversion(),
1a7d0 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69   sqlite3_sourcei
1a7e0 64 28 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  d());.      retu
1a7f0 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
1a800 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69  if( strcmp(z,"-i
1a810 6e 74 65 72 61 63 74 69 76 65 22 29 3d 3d 30 20  nteractive")==0 
1a820 29 7b 0a 20 20 20 20 20 20 73 74 64 69 6e 5f 69  ){.      stdin_i
1a830 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
1a840 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1a850 20 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61 74 63   strcmp(z,"-batc
1a860 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
1a870 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
1a880 74 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  tive = 0;.    }e
1a890 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1a8a0 2c 22 2d 68 65 61 70 22 29 3d 3d 30 20 29 7b 0a  ,"-heap")==0 ){.
1a8b0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
1a8c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1a8d0 7a 2c 22 2d 6d 6d 61 70 22 29 3d 3d 30 20 29 7b  z,"-mmap")==0 ){
1a8e0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
1a8f0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1a900 28 7a 2c 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b  (z,"-vfs")==0 ){
1a910 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 23 69 66 64  .      i++;.#ifd
1a920 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a930 5f 56 46 53 54 52 41 43 45 0a 20 20 20 20 7d 65  _VFSTRACE.    }e
1a940 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1a950 2c 22 2d 76 66 73 74 72 61 63 65 22 29 3d 3d 30  ,"-vfstrace")==0
1a960 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 23   ){.      i++;.#
1a970 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1a980 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49  ITE_ENABLE_MULTI
1a990 50 4c 45 58 0a 20 20 20 20 7d 65 6c 73 65 20 69  PLEX.    }else i
1a9a0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 75  f( strcmp(z,"-mu
1a9b0 6c 74 69 70 6c 65 78 22 29 3d 3d 30 20 29 7b 0a  ltiplex")==0 ){.
1a9c0 20 20 20 20 20 20 69 2b 2b 3b 0a 23 65 6e 64 69        i++;.#endi
1a9d0 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
1a9e0 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 6c 70 22  strcmp(z,"-help"
1a9f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73  )==0 ){.      us
1aa00 61 67 65 28 31 29 3b 0a 20 20 20 20 7d 65 6c 73  age(1);.    }els
1aa10 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
1aa20 2d 63 6d 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -cmd")==0 ){.   
1aa30 20 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31     if( i==argc-1
1aa40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1aa50 7a 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f 70 74 69  z = cmdline_opti
1aa60 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72  on_value(argc,ar
1aa70 67 76 2c 2b 2b 69 29 3b 0a 20 20 20 20 20 20 69  gv,++i);.      i
1aa80 66 28 20 7a 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( z[0]=='.' ){.
1aa90 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 6f 5f          rc = do_
1aaa0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 2c 20  meta_command(z, 
1aab0 26 64 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  &data);.        
1aac0 69 66 28 20 72 63 20 26 26 20 62 61 69 6c 5f 6f  if( rc && bail_o
1aad0 6e 5f 65 72 72 6f 72 20 29 20 72 65 74 75 72 6e  n_error ) return
1aae0 20 72 63 3d 3d 32 20 3f 20 30 20 3a 20 72 63 3b   rc==2 ? 0 : rc;
1aaf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ab00 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 26 64        open_db(&d
1ab10 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ata, 0);.       
1ab20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63   rc = shell_exec
1ab30 28 64 61 74 61 2e 64 62 2c 20 7a 2c 20 73 68 65  (data.db, z, she
1ab40 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61  ll_callback, &da
1ab50 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
1ab60 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d         if( zErrM
1ab70 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sg!=0 ){.       
1ab80 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1ab90 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
1aba0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
1abb0 20 20 20 20 20 69 66 28 20 62 61 69 6c 5f 6f 6e       if( bail_on
1abc0 5f 65 72 72 6f 72 20 29 20 72 65 74 75 72 6e 20  _error ) return 
1abd0 72 63 21 3d 30 20 3f 20 72 63 20 3a 20 31 3b 0a  rc!=0 ? rc : 1;.
1abe0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1abf0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1ac00 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1ac10 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62  err,"Error: unab
1ac20 6c 65 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51  le to process SQ
1ac30 4c 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 29 3b  L \"%s\"\n", z);
1ac40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
1ac50 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29 20 72  ail_on_error ) r
1ac60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ac70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ac80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
1ac90 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
1aca0 20 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20   Error: unknown 
1acb0 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 41  option: %s\n", A
1acc0 72 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20 20 20  rgv0, z);.      
1acd0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1ace0 55 73 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20  Use -help for a 
1acf0 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e  list of options.
1ad00 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
1ad10 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1ad20 0a 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64  .  if( zFirstCmd
1ad30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20 6a   ){.    /* Run j
1ad40 75 73 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  ust the command 
1ad50 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65  that follows the
1ad60 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 20   database name. 
1ad70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 46     */.    if( zF
1ad80 69 72 73 74 43 6d 64 5b 30 5d 3d 3d 27 2e 27 20  irstCmd[0]=='.' 
1ad90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 6f  ){.      rc = do
1ada0 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 46  _meta_command(zF
1adb0 69 72 73 74 43 6d 64 2c 20 26 64 61 74 61 29 3b  irstCmd, &data);
1adc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 32  .      if( rc==2
1add0 20 29 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d   ) rc = 0;.    }
1ade0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 70 65 6e  else{.      open
1adf0 5f 64 62 28 26 64 61 74 61 2c 20 30 29 3b 0a 20  _db(&data, 0);. 
1ae00 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f       rc = shell_
1ae10 65 78 65 63 28 64 61 74 61 2e 64 62 2c 20 7a 46  exec(data.db, zF
1ae20 69 72 73 74 43 6d 64 2c 20 73 68 65 6c 6c 5f 63  irstCmd, shell_c
1ae30 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
1ae40 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
1ae50 20 69 66 28 20 7a 45 72 72 4d 73 67 21 3d 30 20   if( zErrMsg!=0 
1ae60 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1ae70 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
1ae80 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
1ae90 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1aea0 6e 20 72 63 21 3d 30 20 3f 20 72 63 20 3a 20 31  n rc!=0 ? rc : 1
1aeb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1aec0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1aed0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1aee0 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65  r,"Error: unable
1aef0 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20   to process SQL 
1af00 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 72 73  \"%s\"\n", zFirs
1af10 74 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 72  tCmd);.        r
1af20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1af30 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
1af40 0a 20 20 20 20 2f 2a 20 52 75 6e 20 63 6f 6d 6d  .    /* Run comm
1af50 61 6e 64 73 20 72 65 63 65 69 76 65 64 20 66 72  ands received fr
1af60 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  om standard inpu
1af70 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  t.    */.    if(
1af80 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
1af90 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 63  ctive ){.      c
1afa0 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20 20  har *zHome;.    
1afb0 20 20 63 68 61 72 20 2a 7a 48 69 73 74 6f 72 79    char *zHistory
1afc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
1afd0 6e 48 69 73 74 6f 72 79 3b 0a 20 20 20 20 20 20  nHistory;.      
1afe0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1aff0 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20  "SQLite version 
1b000 25 73 20 25 2e 31 39 73 5c 6e 22 20 2f 2a 65 78  %s %.19s\n" /*ex
1b010 74 72 61 2d 76 65 72 73 69 6f 6e 2d 69 6e 66 6f  tra-version-info
1b020 2a 2f 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65  */.        "Ente
1b030 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20  r \".help\" for 
1b040 69 6e 73 74 72 75 63 74 69 6f 6e 73 5c 6e 22 0a  instructions\n".
1b050 20 20 20 20 20 20 20 20 22 45 6e 74 65 72 20 53          "Enter S
1b060 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74 65  QL statements te
1b070 72 6d 69 6e 61 74 65 64 20 77 69 74 68 20 61 20  rminated with a 
1b080 5c 22 3b 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  \";\"\n",.      
1b090 20 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72    sqlite3_libver
1b0a0 73 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f  sion(), sqlite3_
1b0b0 73 6f 75 72 63 65 69 64 28 29 0a 20 20 20 20 20  sourceid().     
1b0c0 20 29 3b 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20   );.      zHome 
1b0d0 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28  = find_home_dir(
1b0e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48 6f  );.      if( zHo
1b0f0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 48  me ){.        nH
1b100 69 73 74 6f 72 79 20 3d 20 73 74 72 6c 65 6e 33  istory = strlen3
1b110 30 28 7a 48 6f 6d 65 29 20 2b 20 32 30 3b 0a 20  0(zHome) + 20;. 
1b120 20 20 20 20 20 20 20 69 66 28 20 28 7a 48 69 73         if( (zHis
1b130 74 6f 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48  tory = malloc(nH
1b140 69 73 74 6f 72 79 29 29 21 3d 30 20 29 7b 0a 20  istory))!=0 ){. 
1b150 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b160 5f 73 6e 70 72 69 6e 74 66 28 6e 48 69 73 74 6f  _snprintf(nHisto
1b170 72 79 2c 20 7a 48 69 73 74 6f 72 79 2c 22 25 73  ry, zHistory,"%s
1b180 2f 2e 73 71 6c 69 74 65 5f 68 69 73 74 6f 72 79  /.sqlite_history
1b190 22 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20  ", zHome);.     
1b1a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
1b1b0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45   defined(HAVE_RE
1b1c0 41 44 4c 49 4e 45 29 20 26 26 20 48 41 56 45 5f  ADLINE) && HAVE_
1b1d0 52 45 41 44 4c 49 4e 45 3d 3d 31 0a 20 20 20 20  READLINE==1.    
1b1e0 20 20 69 66 28 20 7a 48 69 73 74 6f 72 79 20 29    if( zHistory )
1b1f0 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28 7a 48   read_history(zH
1b200 69 73 74 6f 72 79 29 3b 0a 23 65 6e 64 69 66 0a  istory);.#endif.
1b210 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65        rc = proce
1b220 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61 2c 20  ss_input(&data, 
1b230 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48  0);.      if( zH
1b240 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  istory ){.      
1b250 20 20 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79    stifle_history
1b260 28 31 30 30 29 3b 0a 20 20 20 20 20 20 20 20 77  (100);.        w
1b270 72 69 74 65 5f 68 69 73 74 6f 72 79 28 7a 48 69  rite_history(zHi
1b280 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 20 20  story);.        
1b290 66 72 65 65 28 7a 48 69 73 74 6f 72 79 29 3b 0a  free(zHistory);.
1b2a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1b2b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  e{.      rc = pr
1b2c0 6f 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74  ocess_input(&dat
1b2d0 61 2c 20 73 74 64 69 6e 29 3b 0a 20 20 20 20 7d  a, stdin);.    }
1b2e0 0a 20 20 7d 0a 20 20 73 65 74 5f 74 61 62 6c 65  .  }.  set_table
1b2f0 5f 6e 61 6d 65 28 26 64 61 74 61 2c 20 30 29 3b  _name(&data, 0);
1b300 0a 20 20 69 66 28 20 64 61 74 61 2e 64 62 20 29  .  if( data.db )
1b310 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  {.    sqlite3_cl
1b320 6f 73 65 28 64 61 74 61 2e 64 62 29 3b 0a 20 20  ose(data.db);.  
1b330 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1b340 28 64 61 74 61 2e 7a 46 72 65 65 4f 6e 43 6c 6f  (data.zFreeOnClo
1b350 73 65 29 3b 20 0a 20 20 72 65 74 75 72 6e 20 72  se); .  return r
1b360 63 3b 0a 7d 0a                                   c;.}.