/ Hex Artifact Content
Login

Artifact df7d96e50415a0aaf63a6cc96c15643229a603ac:


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 63 6c 6f 6e   OFF\n".  ".clon
b9f0: 65 20 4e 45 57 44 42 20 20 20 20 20 20 20 20 20  e NEWDB         
ba00: 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74    Clone data int
ba10: 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74 68 65  o NEWDB from the
ba20: 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
ba30: 73 65 5c 6e 22 0a 20 20 22 2e 64 61 74 61 62 61  se\n".  ".databa
ba40: 73 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ses             
ba50: 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66  List names and f
ba60: 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65 64  iles of attached
ba70: 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a 20 20   databases\n".  
ba80: 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e  ".dump ?TABLE? .
ba90: 2e 2e 20 20 20 20 20 20 44 75 6d 70 20 74 68 65  ..      Dump the
baa0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20   database in an 
bab0: 53 51 4c 20 74 65 78 74 20 66 6f 72 6d 61 74 5c  SQL text format\
bac0: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
bae0: 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
baf0: 64 2c 20 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62  d, only dump tab
bb00: 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a  les matching\n".
bb10: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45              LIKE
bb30: 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c   pattern TABLE.\
bb40: 6e 22 0a 20 20 22 2e 65 63 68 6f 20 4f 4e 7c 4f  n".  ".echo ON|O
bb50: 46 46 20 20 20 20 20 20 20 20 20 20 20 54 75 72  FF           Tur
bb60: 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f  n command echo o
bb70: 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
bb80: 65 78 69 74 20 20 20 20 20 20 20 20 20 20 20 20  exit            
bb90: 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
bba0: 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65  program\n".  ".e
bbb0: 78 70 6c 61 69 6e 20 3f 4f 4e 7c 4f 46 46 3f 20  xplain ?ON|OFF? 
bbc0: 20 20 20 20 20 54 75 72 6e 20 6f 75 74 70 75 74       Turn output
bbd0: 20 6d 6f 64 65 20 73 75 69 74 61 62 6c 65 20 66   mode suitable f
bbe0: 6f 72 20 45 58 50 4c 41 49 4e 20 6f 6e 20 6f 72  or EXPLAIN on or
bbf0: 20 6f 66 66 2e 5c 6e 22 0a 20 20 22 20 20 20 20   off.\n".  "    
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 20 20 57 69 74 68 20 6e 6f 20 61 72 67       With no arg
bc20: 73 2c 20 69 74 20 74 75 72 6e 73 20 45 58 50 4c  s, it turns EXPL
bc30: 41 49 4e 20 6f 6e 2e 5c 6e 22 0a 20 20 22 2e 68  AIN on.\n".  ".h
bc40: 65 61 64 65 72 28 73 29 20 4f 4e 7c 4f 46 46 20  eader(s) ON|OFF 
bc50: 20 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61       Turn displa
bc60: 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20  y of headers on 
bc70: 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 68 65  or off\n".  ".he
bc80: 6c 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lp              
bc90: 20 20 20 20 53 68 6f 77 20 74 68 69 73 20 6d 65      Show this me
bca0: 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e 69 6d 70  ssage\n".  ".imp
bcb0: 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20 20  ort FILE TABLE  
bcc0: 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61 20 66     Import data f
bcd0: 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20 54 41  rom FILE into TA
bce0: 42 4c 45 5c 6e 22 0a 20 20 22 2e 69 6e 64 69 63  BLE\n".  ".indic
bcf0: 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20  es ?TABLE?      
bd00: 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 61   Show names of a
bd10: 6c 6c 20 69 6e 64 69 63 65 73 5c 6e 22 0a 20 20  ll indices\n".  
bd20: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
bd30: 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42            If TAB
bd40: 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e  LE specified, on
bd50: 6c 79 20 73 68 6f 77 20 69 6e 64 69 63 65 73 20  ly show indices 
bd60: 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20  for tables\n".  
bd70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
bd80: 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 69            matchi
bd90: 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20  ng LIKE pattern 
bda0: 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66 64 65 66  TABLE.\n".#ifdef
bdb0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
bdc0: 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61  OTRACE.  ".iotra
bdd0: 63 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ce FILE         
bde0: 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61 67   Enable I/O diag
bdf0: 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67 20 74  nostic logging t
be00: 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e 64 69 66  o FILE\n".#endif
be10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
be20: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
be30: 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c  ION.  ".load FIL
be40: 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f  E ?ENTRY?     Lo
be50: 61 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20  ad an extension 
be60: 6c 69 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69  library\n".#endi
be70: 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f  f.  ".log FILE|o
be80: 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e  ff          Turn
be90: 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f   logging on or o
bea0: 66 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65  ff.  FILE can be
beb0: 20 73 74 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e   stderr/stdout\n
bec0: 22 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20  ".  ".mode MODE 
bed0: 3f 54 41 42 4c 45 3f 20 20 20 20 20 53 65 74 20  ?TABLE?     Set 
bee0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 77 68 65 72  output mode wher
bef0: 65 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66  e MODE is one of
bf00: 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  :\n".  "        
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d   csv      Comma-
bf30: 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
bf40: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c  column   Left-al
bf70: 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20  igned columns.  
bf80: 28 53 65 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a  (See .width)\n".
bf90: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c              html
bfb0: 20 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65       HTML <table
bfc0: 3e 20 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20  > code\n".  "   
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 20 20 69 6e 73 65 72 74 20 20 20 53        insert   S
bff0: 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d  QL insert statem
c000: 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e  ents for TABLE\n
c010: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
c030: 6e 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65  ne     One value
c040: 20 70 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22   per line\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 6c 69 73 74 20 20 20           list   
c070: 20 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74    Values delimit
c080: 65 64 20 62 79 20 2e 73 65 70 61 72 61 74 6f 72  ed by .separator
c090: 20 73 74 72 69 6e 67 5c 6e 22 0a 20 20 22 20 20   string\n".  "  
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 74 61 62 73 20 20 20 20 20         tabs     
c0c0: 54 61 62 2d 73 65 70 61 72 61 74 65 64 20 76 61  Tab-separated va
c0d0: 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20  lues\n".  "     
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c      tcl      TCL
c100: 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e   list elements\n
c110: 22 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20  ".  ".nullvalue 
c120: 53 54 52 49 4e 47 20 20 20 20 20 20 55 73 65 20  STRING      Use 
c130: 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20  STRING in place 
c140: 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e  of NULL values\n
c150: 22 0a 20 20 22 2e 6f 70 65 6e 20 3f 46 49 4c 45  ".  ".open ?FILE
c160: 4e 41 4d 45 3f 20 20 20 20 20 20 20 43 6c 6f 73  NAME?       Clos
c170: 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
c180: 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46  ase and reopen F
c190: 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 6f  ILENAME\n".  ".o
c1a0: 75 74 70 75 74 20 46 49 4c 45 4e 41 4d 45 20 20  utput FILENAME  
c1b0: 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74       Send output
c1c0: 20 74 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a   to FILENAME\n".
c1d0: 20 20 22 2e 6f 75 74 70 75 74 20 73 74 64 6f 75    ".output stdou
c1e0: 74 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f  t         Send o
c1f0: 75 74 70 75 74 20 74 6f 20 74 68 65 20 73 63 72  utput to the scr
c200: 65 65 6e 5c 6e 22 0a 20 20 22 2e 70 72 69 6e 74  een\n".  ".print
c210: 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20 20   STRING...      
c220: 20 50 72 69 6e 74 20 6c 69 74 65 72 61 6c 20 53   Print literal S
c230: 54 52 49 4e 47 5c 6e 22 0a 20 20 22 2e 70 72 6f  TRING\n".  ".pro
c240: 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55  mpt MAIN CONTINU
c250: 45 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 73  E  Replace the s
c260: 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 5c  tandard prompts\
c270: 6e 22 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20  n".  ".quit     
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69               Exi
c290: 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e  t this program\n
c2a0: 22 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45 4e  ".  ".read FILEN
c2b0: 41 4d 45 20 20 20 20 20 20 20 20 20 45 78 65 63  AME         Exec
c2c0: 75 74 65 20 53 51 4c 20 69 6e 20 46 49 4c 45 4e  ute SQL in FILEN
c2d0: 41 4d 45 5c 6e 22 0a 20 20 22 2e 72 65 73 74 6f  AME\n".  ".resto
c2e0: 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20  re ?DB? FILE    
c2f0: 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74   Restore content
c300: 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74 20   of DB (default 
c310: 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46  \"main\") from F
c320: 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 63 68 65 6d  ILE\n".  ".schem
c330: 61 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20  a ?TABLE?       
c340: 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54 45   Show the CREATE
c350: 20 73 74 61 74 65 6d 65 6e 74 73 5c 6e 22 0a 20   statements\n". 
c360: 20 22 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 20 49 66 20 54 41             If TA
c380: 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
c390: 6e 6c 79 20 73 68 6f 77 20 74 61 62 6c 65 73 20  nly show tables 
c3a0: 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20  matching\n".  " 
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74          LIKE pat
c3d0: 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20  tern TABLE.\n". 
c3e0: 20 22 2e 73 65 70 61 72 61 74 6f 72 20 53 54 52   ".separator STR
c3f0: 49 4e 47 20 20 20 20 20 20 43 68 61 6e 67 65 20  ING      Change 
c400: 73 65 70 61 72 61 74 6f 72 20 75 73 65 64 20 62  separator used b
c410: 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 61 6e  y output mode an
c420: 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 20 20 22  d .import\n".  "
c430: 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20 20 20  .show           
c440: 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
c450: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
c460: 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69  or various setti
c470: 6e 67 73 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73  ngs\n".  ".stats
c480: 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20 20   ON|OFF         
c490: 20 54 75 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f   Turn stats on o
c4a0: 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 74 61 62  r off\n".  ".tab
c4b0: 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  les ?TABLE?     
c4c0: 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66     List names of
c4d0: 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20   tables\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 20 49 66 20 54 41 42 4c 45 20         If TABLE 
c500: 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
c510: 6c 69 73 74 20 74 61 62 6c 65 73 20 6d 61 74 63  list tables matc
c520: 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20  hing\n".  "     
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e      LIKE pattern
c550: 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74   TABLE.\n".  ".t
c560: 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20  imeout MS       
c570: 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69 6e 67       Try opening
c580: 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73 20 66   locked tables f
c590: 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e  or MS millisecon
c5a0: 64 73 5c 6e 22 0a 20 20 22 2e 74 72 61 63 65 20  ds\n".  ".trace 
c5b0: 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20  FILE|off        
c5c0: 4f 75 74 70 75 74 20 65 61 63 68 20 53 51 4c 20  Output each SQL 
c5d0: 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20  statement as it 
c5e0: 69 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e 76 66  is run\n".  ".vf
c5f0: 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20 20  sname ?AUX?     
c600: 20 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61      Print the na
c610: 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 73 74  me of the VFS st
c620: 61 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64 74 68  ack\n".  ".width
c630: 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20   NUM1 NUM2 ...  
c640: 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74   Set column widt
c650: 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c  hs for \"column\
c660: 22 20 6d 6f 64 65 5c 6e 22 0a 3b 0a 0a 73 74 61  " mode\n".;..sta
c670: 74 69 63 20 63 68 61 72 20 7a 54 69 6d 65 72 48  tic char zTimerH
c680: 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 74 69 6d 65  elp[] =.  ".time
c690: 72 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20  r ON|OFF        
c6a0: 20 20 54 75 72 6e 20 74 68 65 20 43 50 55 20 74    Turn the CPU t
c6b0: 69 6d 65 72 20 6d 65 61 73 75 72 65 6d 65 6e 74  imer measurement
c6c0: 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 3b 0a   on or off\n".;.
c6d0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
c6e0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
c6f0: 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75  int process_inpu
c700: 74 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63  t(struct callbac
c710: 6b 5f 64 61 74 61 20 2a 70 2c 20 46 49 4c 45 20  k_data *p, FILE 
c720: 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  *in);../*.** Mak
c730: 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
c740: 61 73 65 20 69 73 20 6f 70 65 6e 2e 20 20 49 66  ase is open.  If
c750: 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
c760: 20 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a   open it.  If.**
c770: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 61   the database fa
c780: 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69  ils to open, pri
c790: 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nt an error mess
c7a0: 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f  age and exit..*/
c7b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65  .static void ope
c7c0: 6e 5f 64 62 28 73 74 72 75 63 74 20 63 61 6c 6c  n_db(struct call
c7d0: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 69 6e  back_data *p, in
c7e0: 74 20 6b 65 65 70 41 6c 69 76 65 29 7b 0a 20 20  t keepAlive){.  
c7f0: 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
c800: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74      sqlite3_init
c810: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 73 71  ialize();.    sq
c820: 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44  lite3_open(p->zD
c830: 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
c840: 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 70 2d 3e  b);.    db = p->
c850: 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 20 26  db;.    if( db &
c860: 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
c870: 65 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e(db)==SQLITE_OK
c880: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c890: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c8a0: 6e 28 64 62 2c 20 22 73 68 65 6c 6c 73 74 61 74  n(db, "shellstat
c8b0: 69 63 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55  ic", 0, SQLITE_U
c8c0: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
c8d0: 20 20 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e    shellstaticFun
c8e0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  c, 0, 0);.    }.
c8f0: 20 20 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c      if( db==0 ||
c900: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
c910: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 20  te3_errcode(db) 
c920: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
c930: 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
c940: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
c950: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
c960: 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
c970: 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
c980: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
c990: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28  (db));.      if(
c9a0: 20 6b 65 65 70 41 6c 69 76 65 20 29 20 72 65 74   keepAlive ) ret
c9b0: 75 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28  urn;.      exit(
c9c0: 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  1);.    }.#ifnde
c9d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
c9e0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
c9f0: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
ca00: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
ca10: 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66  ->db, 1);.#endif
ca20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  .  }.}../*.** Do
ca30: 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c   C-language styl
ca40: 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a  e dequoting..**.
ca50: 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e 20 74  **    \t    -> t
ca60: 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d  ab.**    \n    -
ca70: 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20  > newline.**    
ca80: 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67  \r    -> carriag
ca90: 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c  e return.**    \
caa0: 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20  "    -> ".**    
cab0: 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63  \NNN  -> ascii c
cac0: 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20  haracter NNN in 
cad0: 6f 63 74 61 6c 0a 2a 2a 20 20 20 20 5c 5c 20 20  octal.**    \\  
cae0: 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68 0a 2a    -> backslash.*
caf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
cb00: 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
cb10: 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  s(char *z){.  in
cb20: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
cb30: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28  ;.  for(i=j=0; (
cb40: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b  c = z[i])!=0; i+
cb50: 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, j++){.    if(
cb60: 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
cb70: 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20    c = z[++i];.  
cb80: 20 20 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 29      if( c=='n' )
cb90: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
cba0: 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n';.      }else 
cbb0: 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20  if( c=='t' ){.  
cbc0: 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
cbd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
cbe0: 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20  c=='r' ){.      
cbf0: 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20    c = '\r';.    
cc00: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
cc10: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  \\' ){.        c
cc20: 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 7d   = '\\';.      }
cc30: 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30 27 20  else if( c>='0' 
cc40: 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20  && c<='7' ){.   
cc50: 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20       c -= '0';. 
cc60: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31         if( z[i+1
cc70: 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d  ]>='0' && z[i+1]
cc80: 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
cc90: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
cca0: 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a    c = (c<<3) + z
ccb0: 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  [i] - '0';.     
ccc0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e       if( z[i+1]>
ccd0: 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d  ='0' && z[i+1]<=
cce0: 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '7' ){.         
ccf0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
cd00: 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b      c = (c<<3) +
cd10: 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20   z[i] - '0';.   
cd20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cd30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
cd40: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20  .    z[j] = c;. 
cd50: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d   }.  z[j] = 0;.}
cd60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cd70: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 68 65  he value of a he
cd80: 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69 74 2e  xadecimal digit.
cd90: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
cda0: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e  he input.** is n
cdb0: 6f 74 20 61 20 68 65 78 20 64 69 67 69 74 2e 0a  ot a hex digit..
cdc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 65  */.static int he
cdd0: 78 44 69 67 69 74 56 61 6c 75 65 28 63 68 61 72  xDigitValue(char
cde0: 20 63 29 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30   c){.  if( c>='0
cdf0: 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20 72 65  ' && c<='9' ) re
ce00: 74 75 72 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20  turn c - '0';.  
ce10: 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20 63 3c  if( c>='a' && c<
ce20: 3d 27 66 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='f' ) return c 
ce30: 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20 69 66  - 'a' + 10;.  if
ce40: 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27  ( c>='A' && c<='
ce50: 46 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20  F' ) return c - 
ce60: 27 41 27 20 2b 20 31 30 3b 0a 20 20 72 65 74 75  'A' + 10;.  retu
ce70: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
ce80: 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20 61  Interpret zArg a
ce90: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  s an integer val
cea0: 75 65 2c 20 70 6f 73 73 69 62 6c 79 20 77 69 74  ue, possibly wit
ceb0: 68 20 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73  h suffixes..*/.s
cec0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
ced0: 74 36 34 20 69 6e 74 65 67 65 72 56 61 6c 75 65  t64 integerValue
cee0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72  (const char *zAr
cef0: 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  g){.  sqlite3_in
cf00: 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73 74 61  t64 v = 0;.  sta
cf10: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
cf20: 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78   { char *zSuffix
cf30: 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61  ; int iMult; } a
cf40: 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  Mult[] = {.    {
cf50: 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a   "KiB", 1024 },.
cf60: 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31 30 32      { "MiB", 102
cf70: 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20  4*1024 },.    { 
cf80: 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34  "GiB", 1024*1024
cf90: 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22  *1024 },.    { "
cfa0: 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20  KB",  1000 },.  
cfb0: 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30 30 30    { "MB",  10000
cfc0: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22  00 },.    { "GB"
cfd0: 2c 20 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c  ,  1000000000 },
cfe0: 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20 31 30  .    { "K",   10
cff0: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c  00 },.    { "M",
d000: 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20     1000000 },.  
d010: 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30 30 30    { "G",   10000
d020: 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20  00000 },.  };.  
d030: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e  int i;.  int isN
d040: 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41  eg = 0;.  if( zA
d050: 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  rg[0]=='-' ){.  
d060: 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20    isNeg = 1;.   
d070: 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65   zArg++;.  }else
d080: 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b   if( zArg[0]=='+
d090: 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b  ' ){.    zArg++;
d0a0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b  .  }.  if( zArg[
d0b0: 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  0]=='0' && zArg[
d0c0: 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 69  1]=='x' ){.    i
d0d0: 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b  nt x;.    zArg +
d0e0: 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 2;.    while( 
d0f0: 28 78 20 3d 20 68 65 78 44 69 67 69 74 56 61 6c  (x = hexDigitVal
d100: 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20  ue(zArg[0]))>=0 
d110: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 76 3c  ){.      v = (v<
d120: 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a  <4) + x;.      z
d130: 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Arg++;.    }.  }
d140: 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
d150: 20 49 73 44 69 67 69 74 28 7a 41 72 67 5b 30 5d   IsDigit(zArg[0]
d160: 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76  ) ){.      v = v
d170: 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20  *10 + zArg[0] - 
d180: 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b  '0';.      zArg+
d190: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
d1a0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
d1b0: 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69 2b 2b 29  ize(aMult); i++)
d1c0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
d1d0: 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b  3_stricmp(aMult[
d1e0: 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72 67  i].zSuffix, zArg
d1f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )==0 ){.      v 
d200: 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c  *= aMult[i].iMul
d210: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
d220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d230: 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76  rn isNeg? -v : v
d240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
d250: 70 72 65 74 20 7a 41 72 67 20 61 73 20 65 69 74  pret zArg as eit
d260: 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  her an integer o
d270: 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  r a boolean valu
d280: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20  e.  Return 1 or 
d290: 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e  0.** for TRUE an
d2a0: 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e  d FALSE.  Return
d2b0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
d2c0: 75 65 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  ue if appropriat
d2d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d2e0: 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 68   booleanValue(ch
d2f0: 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74  ar *zArg){.  int
d300: 20 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30   i;.  if( zArg[0
d310: 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31  ]=='0' && zArg[1
d320: 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66 6f  ]=='x' ){.    fo
d330: 72 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74 56  r(i=2; hexDigitV
d340: 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d 30  alue(zArg[i])>=0
d350: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65  ; i++){}.  }else
d360: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  {.    for(i=0; z
d370: 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a  Arg[i]>='0' && z
d380: 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b  Arg[i]<='9'; i++
d390: 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e  ){}.  }.  if( i>
d3a0: 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20  0 && zArg[i]==0 
d3b0: 29 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69  ) return (int)(i
d3c0: 6e 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72 67  ntegerValue(zArg
d3d0: 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  ) & 0xffffffff);
d3e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
d3f0: 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e  tricmp(zArg, "on
d400: 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ")==0 || sqlite3
d410: 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 79  _stricmp(zArg,"y
d420: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  es")==0 ){.    r
d430: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
d440: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
d450: 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d  mp(zArg, "off")=
d460: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
d470: 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29  ricmp(zArg,"no")
d480: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d490: 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  n 0;.  }.  fprin
d4a0: 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
d4b0: 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e  R: Not a boolean
d4c0: 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20   value: \"%s\". 
d4d0: 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e  Assuming \"no\".
d4e0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  \n",.          z
d4f0: 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
d500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
d510: 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c   an output file,
d520: 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20   assuming it is 
d530: 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73 74  not stderr or st
d540: 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
d550: 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  oid output_file_
d560: 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a  close(FILE *f){.
d570: 20 20 69 66 28 20 66 20 26 26 20 66 21 3d 73 74    if( f && f!=st
d580: 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65 72  dout && f!=stder
d590: 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d  r ) fclose(f);.}
d5a0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
d5b0: 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69  pen an output fi
d5c0: 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20  le.   The names 
d5d0: 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74  "stdout" and "st
d5e0: 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63  derr" are.** rec
d5f0: 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74  ognized and do t
d600: 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20  he right thing. 
d610: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
d620: 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
d630: 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  .** filename is 
d640: 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  "off"..*/.static
d650: 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69   FILE *output_fi
d660: 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  le_open(const ch
d670: 61 72 20 2a 7a 46 69 6c 65 29 7b 0a 20 20 46 49  ar *zFile){.  FI
d680: 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72  LE *f;.  if( str
d690: 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75  cmp(zFile,"stdou
d6a0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  t")==0 ){.    f 
d6b0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73  = stdout;.  }els
d6c0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
d6d0: 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30  le, "stderr")==0
d6e0: 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65   ){.    f = stde
d6f0: 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rr;.  }else if( 
d700: 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f  strcmp(zFile, "o
d710: 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ff")==0 ){.    f
d720: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
d730: 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69     f = fopen(zFi
d740: 6c 65 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 69  le, "wb");.    i
d750: 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( f==0 ){.     
d760: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d770: 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
d780: 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
d790: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zFile);.    }.  
d7a0: 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a  }.  return f;.}.
d7b0: 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65  ./*.** A routine
d7c0: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75   for handling ou
d7d0: 74 70 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65  tput from sqlite
d7e0: 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74  3_trace()..*/.st
d7f0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 5f 74 72  atic void sql_tr
d800: 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69  ace_callback(voi
d810: 64 20 2a 70 41 72 67 2c 20 63 6f 6e 73 74 20 63  d *pArg, const c
d820: 68 61 72 20 2a 7a 29 7b 0a 20 20 46 49 4c 45 20  har *z){.  FILE 
d830: 2a 66 20 3d 20 28 46 49 4c 45 2a 29 70 41 72 67  *f = (FILE*)pArg
d840: 3b 0a 20 20 69 66 28 20 66 20 29 20 66 70 72 69  ;.  if( f ) fpri
d850: 6e 74 66 28 66 2c 20 22 25 73 5c 6e 22 2c 20 7a  ntf(f, "%s\n", z
d860: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f  );.}../*.** A no
d870: 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74  -op routine that
d880: 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20 22   runs with the "
d890: 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63  .breakpoint" doc
d8a0: 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20  -command.  This 
d8b0: 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73  is.** a useful s
d8c0: 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65 62  pot to set a deb
d8d0: 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74  ugger breakpoint
d8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d8f0: 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
d900: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
d910: 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a   int nCall = 0;.
d920: 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a    nCall++;.}../*
d930: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73  .** An object us
d940: 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53 56  ed to read a CSV
d950: 20 66 69 6c 65 0a 2a 2f 0a 74 79 70 65 64 65 66   file.*/.typedef
d960: 20 73 74 72 75 63 74 20 43 53 56 52 65 61 64 65   struct CSVReade
d970: 72 20 43 53 56 52 65 61 64 65 72 3b 0a 73 74 72  r CSVReader;.str
d980: 75 63 74 20 43 53 56 52 65 61 64 65 72 20 7b 0a  uct CSVReader {.
d990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
d9a0: 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ile;  /* Name of
d9b0: 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
d9c0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  */.  FILE *in;  
d9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
d9e0: 20 74 68 65 20 43 53 56 20 74 65 78 74 20 66 72   the CSV text fr
d9f0: 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 74  om this input st
da00: 72 65 61 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ream */.  char *
da10: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  z;            /*
da20: 20 41 63 63 75 6d 75 6c 61 74 65 64 20 74 65 78   Accumulated tex
da30: 74 20 66 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f  t for a field */
da40: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
da50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
da60: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 20 2a   of bytes in z *
da70: 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
da80: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
da90: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a   allocated for z
daa0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e  [] */.  int nLin
dab0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  e;          /* C
dac0: 75 72 72 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62  urrent line numb
dad0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  er */.  int cTer
dae0: 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
daf0: 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
db00: 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
db10: 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
db20: 2f 0a 20 20 69 6e 74 20 63 53 65 70 61 72 61 74  /.  int cSeparat
db30: 6f 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73  or;     /* The s
db40: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
db50: 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c  er.  (Usually ",
db60: 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
db70: 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
db80: 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
db90: 69 63 20 76 6f 69 64 20 63 73 76 5f 61 70 70 65  ic void csv_appe
dba0: 6e 64 5f 63 68 61 72 28 43 53 56 52 65 61 64 65  nd_char(CSVReade
dbb0: 72 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20  r *p, int c){.  
dbc0: 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e  if( p->n+1>=p->n
dbd0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
dbe0: 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c  nAlloc += p->nAl
dbf0: 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70  loc + 100;.    p
dc00: 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  ->z = sqlite3_re
dc10: 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e  alloc(p->z, p->n
dc20: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  Alloc);.    if( 
dc30: 70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  p->z==0 ){.     
dc40: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
dc50: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
dc60: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
dc70: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
dc80: 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28  p->z[p->n++] = (
dc90: 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65  char)c;.}../* Re
dca0: 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c  ad a single fiel
dcb0: 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20  d of CSV text.  
dcc0: 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  Compatible with 
dcd0: 72 66 63 34 31 38 30 20 61 6e 64 20 65 78 74 65  rfc4180 and exte
dce0: 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  nded.** with the
dcf0: 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e   option of havin
dd00: 67 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74  g a separator ot
dd10: 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a  her than ","..**
dd20: 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63  .**   +  Input c
dd30: 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e  omes from p->in.
dd40: 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72  .**   +  Store r
dd50: 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f  esults in p->z o
dd60: 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20  f length p->n.  
dd70: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d  Space to hold p-
dd80: 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20  >z comes.**     
dd90: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
dda0: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 20 20 2b 20 20  lloc()..**   +  
ddb0: 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74  Use p->cSep as t
ddc0: 68 65 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  he separator.  T
ddd0: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c  he default is ",
dde0: 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20  "..**   +  Keep 
ddf0: 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e  track of the lin
de00: 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e  e number in p->n
de10: 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74  Line..**   +  St
de20: 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65  ore the characte
de30: 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  r that terminate
de40: 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70  s the field in p
de50: 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a  ->cTerm.  Store.
de60: 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65  **      EOF on e
de70: 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20  nd-of-file..**  
de80: 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61   +  Report synta
de90: 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65  x errors on stde
dea0: 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  rr.*/.static cha
deb0: 72 20 2a 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f  r *csv_read_one_
dec0: 66 69 65 6c 64 28 43 53 56 52 65 61 64 65 72 20  field(CSVReader 
ded0: 2a 70 29 7b 0a 20 20 69 6e 74 20 63 2c 20 70 63  *p){.  int c, pc
dee0: 2c 20 70 70 63 3b 0a 20 20 69 6e 74 20 63 53 65  , ppc;.  int cSe
def0: 70 20 3d 20 70 2d 3e 63 53 65 70 61 72 61 74 6f  p = p->cSeparato
df00: 72 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  r;.  p->n = 0;. 
df10: 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
df20: 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
df30: 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
df40: 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
df50: 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
df60: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
df70: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e  c=='"' ){.    in
df80: 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d  t startLine = p-
df90: 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20  >nLine;.    int 
dfa0: 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20  cQuote = c;.    
dfb0: 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20  pc = ppc = 0;.  
dfc0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
dfd0: 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
dfe0: 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >in);.      if( 
dff0: 63 3d 3d 27 5c 6e 27 20 29 20 70 2d 3e 6e 4c 69  c=='\n' ) p->nLi
e000: 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
e010: 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
e020: 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75       if( pc==cQu
e030: 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ote ){.         
e040: 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
e050: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
e060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e070: 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65       if( (c==cSe
e080: 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  p && pc==cQuote)
e090: 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 27  .       || (c=='
e0a0: 5c 6e 27 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  \n' && pc==cQuot
e0b0: 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
e0c0: 3d 27 5c 6e 27 20 26 26 20 70 63 3d 3d 27 5c 72  ='\n' && pc=='\r
e0d0: 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65  ' && ppc==cQuote
e0e0: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
e0f0: 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  EOF && pc==cQuot
e100: 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
e110: 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20      do{ p->n--; 
e120: 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e  }while( p->z[p->
e130: 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20  n]!=cQuote );.  
e140: 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
e150: 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
e160: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
e170: 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
e180: 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20  && c!='\r' ){.  
e190: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
e1a0: 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e  derr, "%s:%d: un
e1b0: 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72 61  escaped %c chara
e1c0: 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  cter\n",.       
e1d0: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c           p->zFil
e1e0: 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75  e, p->nLine, cQu
e1f0: 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ote);.      }.  
e200: 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29      if( c==EOF )
e210: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
e220: 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
e230: 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25  : unterminated %
e240: 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e  c-quoted field\n
e250: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
e260: 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61     p->zFile, sta
e270: 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b  rtLine, cQuote);
e280: 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72  .        p->cTer
e290: 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 20 20 20  m = EOF;.       
e2a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e2b0: 20 20 20 20 20 20 63 73 76 5f 61 70 70 65 6e 64        csv_append
e2c0: 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
e2d0: 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20     ppc = pc;.   
e2e0: 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d     pc = c;.    }
e2f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
e300: 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63  ile( c!=EOF && c
e310: 21 3d 63 53 65 70 20 26 26 20 63 21 3d 27 5c 6e  !=cSep && c!='\n
e320: 27 20 29 7b 0a 20 20 20 20 20 20 63 73 76 5f 61  ' ){.      csv_a
e330: 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
e340: 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74  ;.      c = fget
e350: 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a  c(p->in);.    }.
e360: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
e370: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e  ){.      p->nLin
e380: 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
e390: 2d 3e 6e 3e 31 20 26 26 20 70 2d 3e 7a 5b 70 2d  ->n>1 && p->z[p-
e3a0: 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d  >n-1]=='\r' ) p-
e3b0: 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >n--;.    }.    
e3c0: 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
e3d0: 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70  }.  if( p->z ) p
e3e0: 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  ->z[p->n] = 0;. 
e3f0: 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a   return p->z;.}.
e400: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72  ./*.** Try to tr
e410: 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20  ansfer data for 
e420: 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49  table zTable.  I
e430: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
e440: 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69  en while.** movi
e450: 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20  ng forward, try 
e460: 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e  to go backwards.
e470: 20 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20    The backwards 
e480: 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a  movement won't.*
e490: 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f  * work for WITHO
e4a0: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e  UT ROWID tables.
e4b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e4c0: 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a  tryToCloneData(.
e4d0: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
e4e0: 6b 5f 64 61 74 61 20 2a 70 2c 0a 20 20 73 71 6c  k_data *p,.  sql
e4f0: 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63  ite3 *newDb,.  c
e500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
e510: 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  e.){.  sqlite3_s
e520: 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
e530: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
e540: 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *pInsert = 0;. 
e550: 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20   char *zQuery = 
e560: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65  0;.  char *zInse
e570: 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  rt = 0;.  int rc
e580: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
e590: 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20  .  int nTable = 
e5a0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 62  (int)strlen(zTab
e5b0: 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30  le);.  int k = 0
e5c0: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
e5d0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69  .  const int spi
e5e0: 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a  nRate = 10000;..
e5f0: 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
e600: 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
e610: 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
e620: 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63  ", zTable);.  rc
e630: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
e640: 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
e650: 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
e660: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
e670: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
e680: 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a  derr, "Error %d:
e690: 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a   %s on [%s]\n",.
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e6b0: 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
e6c0: 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c  code(p->db), sql
e6d0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
e6e0: 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
e6f0: 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74  zQuery);.    got
e700: 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b  o end_data_xfer;
e710: 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74  .  }.  n = sqlit
e720: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
e730: 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65  pQuery);.  zInse
e740: 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  rt = sqlite3_mal
e750: 6c 6f 63 28 32 30 30 20 2b 20 6e 54 61 62 6c 65  loc(200 + nTable
e760: 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a   + n*3);.  if( z
e770: 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Insert==0 ){.   
e780: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
e790: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
e7a0: 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  n");.    goto en
e7b0: 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
e7c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
e7d0: 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a  ntf(200+nTable,z
e7e0: 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20  Insert,.        
e7f0: 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
e800: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
e810: 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28  O \"%s\" VALUES(
e820: 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69  ?", zTable);.  i
e830: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
e840: 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a  Insert);.  for(j
e850: 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<n; j++){. 
e860: 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72     memcpy(zInser
e870: 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20  t+i, ",?", 2);. 
e880: 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     i += 2;.  }. 
e890: 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
e8a0: 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72  i, ");", 3);.  r
e8b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
e8c0: 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49  are_v2(newDb, zI
e8d0: 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73  nsert, -1, &pIns
e8e0: 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ert, 0);.  if( r
e8f0: 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  c ){.    fprintf
e900: 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20  (stderr, "Error 
e910: 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e  %d: %s on [%s]\n
e920: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ",.            s
e930: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
e940: 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 20  errcode(newDb), 
e950: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e  sqlite3_errmsg(n
e960: 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ewDb),.         
e970: 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20     zQuery);.    
e980: 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66  goto end_data_xf
e990: 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6b 3d  er;.  }.  for(k=
e9a0: 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20 20  0; k<2; k++){.  
e9b0: 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
e9c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65  qlite3_step(pQue
e9d0: 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ry))==SQLITE_ROW
e9e0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
e9f0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
ea00: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71        switch( sq
ea10: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
ea20: 65 28 70 51 75 65 72 79 2c 20 69 29 20 29 7b 0a  e(pQuery, i) ){.
ea30: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
ea40: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
ea50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ea60: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e 73  3_bind_null(pIns
ea70: 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  ert, i+1);.     
ea80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ea90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eaa0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
eab0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
eac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
ead0: 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73 65 72  ind_int64(pInser
eae0: 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f  t, i+1, sqlite3_
eaf0: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 51 75  column_int64(pQu
eb00: 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  ery,i));.       
eb10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
eb20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eb30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
eb40: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  OAT: {.         
eb50: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
eb60: 64 6f 75 62 6c 65 28 70 49 6e 73 65 72 74 2c 20  double(pInsert, 
eb70: 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
eb80: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75 65 72  umn_double(pQuer
eb90: 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20  y,i));.         
eba0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ebb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ebc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
ebd0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
ebe0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
ebf0: 74 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 0a  t(pInsert, i+1,.
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
ec20: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
ec30: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
ec40: 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,i),.       
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec60: 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
ec70: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
ec80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ec90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
eca0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
ecb0: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  LOB: {.         
ecc0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ecd0: 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20 69 2b  blob(pInsert, i+
ece0: 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  1, sqlite3_colum
ecf0: 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c 69 29  n_blob(pQuery,i)
ed00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
ed30: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
ed40: 65 73 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20  es(pQuery,i),.  
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ed80: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
ed90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eda0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
edb0: 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e   }.      } /* En
edc0: 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  d for */.      r
edd0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
ede0: 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20  (pInsert);.     
edf0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ee00: 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
ee10: 5f 52 4f 57 20 26 26 20 72 63 21 3d 53 51 4c 49  _ROW && rc!=SQLI
ee20: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
ee30: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
ee40: 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
ee50: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74  \n", sqlite3_ext
ee60: 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65  ended_errcode(ne
ee70: 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  wDb),.          
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
ee90: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77  lite3_errmsg(new
eea0: 44 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Db));.      }.  
eeb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
eec0: 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  t(pInsert);.    
eed0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
eee0: 66 28 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65  f( (cnt%spinRate
eef0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ef00: 70 72 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22  printf("%c\b", "
ef10: 7c 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e  |/-\\"[(cnt/spin
ef20: 52 61 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20  Rate)%4]);.     
ef30: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
ef40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ef50: 20 2f 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f   /* End while */
ef60: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ef70: 49 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b  ITE_DONE ) break
ef80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
ef90: 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a  nalize(pQuery);.
efa0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
efb0: 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51  (zQuery);.    zQ
efc0: 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uery = sqlite3_m
efd0: 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
efe0: 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44   FROM \"%w\" ORD
eff0: 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
f000: 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;",.            
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63   zTable);.    rc
f030: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
f040: 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
f050: 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
f060: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
f070: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
f080: 66 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69  f(stderr, "Warni
f090: 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70 20  ng: cannot step 
f0a0: 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72 64 73  \"%s\" backwards
f0b0: 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
f0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f0d0: 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d   } /* End for(k=
f0e0: 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61  0...) */..end_da
f0f0: 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74  ta_xfer:.  sqlit
f100: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
f110: 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ry);.  sqlite3_f
f120: 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29  inalize(pInsert)
f130: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
f140: 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69  (zQuery);.  sqli
f150: 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65 72 74  te3_free(zInsert
f160: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  );.}.../*.** Try
f170: 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61 6c 6c   to transfer all
f180: 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73 63 68   rows of the sch
f190: 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68 20 7a  ema that match z
f1a0: 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65  Where.  For.** e
f1b0: 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20  ach row, invoke 
f1c0: 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20 74 68  xForEach() on th
f1d0: 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65 64  e object defined
f1e0: 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a   by that row..**
f1f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
f200: 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
f210: 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64  e moving forward
f220: 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20   through the.** 
f230: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f240: 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e 20 6d  ble, try again m
f250: 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64 73 2e  oving backwards.
f260: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f270: 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61  tryToCloneSchema
f280: 28 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62  (.  struct callb
f290: 61 63 6b 5f 64 61 74 61 20 2a 70 2c 0a 20 20 73  ack_data *p,.  s
f2a0: 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20  qlite3 *newDb,. 
f2b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68   const char *zWh
f2c0: 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  ere,.  void (*xF
f2d0: 6f 72 45 61 63 68 29 28 73 74 72 75 63 74 20 63  orEach)(struct c
f2e0: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 2a 2c 73 71  allback_data*,sq
f2f0: 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61  lite3*,const cha
f300: 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  r*).){.  sqlite3
f310: 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20  _stmt *pQuery = 
f320: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
f330: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
f340: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
f350: 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  d char *zName;. 
f360: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
f370: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
f380: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
f390: 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c  ..  zQuery = sql
f3a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
f3b0: 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46  LECT name, sql F
f3c0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
f3d0: 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
f3f0: 57 48 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72  WHERE %s", zWher
f400: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
f410: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
f420: 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
f430: 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
f440: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70  if( rc ){.    fp
f450: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
f460: 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e  rror: (%d) %s on
f470: 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f490: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
f4a0: 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
f4b0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
f4c0: 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
f4d0: 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
f4e0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
f4f0: 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d  schema_xfer;.  }
f500: 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20  .  while( (rc = 
f510: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75  sqlite3_step(pQu
f520: 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ery))==SQLITE_RO
f530: 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  W ){.    zName =
f540: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f550: 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b  text(pQuery, 0);
f560: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
f570: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
f580: 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20  pQuery, 1);.    
f590: 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c  printf("%s... ",
f5a0: 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28   zName); fflush(
f5b0: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c  stdout);.    sql
f5c0: 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
f5d0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53   (const char*)zS
f5e0: 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d  ql, 0, 0, &zErrM
f5f0: 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  sg);.    if( zEr
f600: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70  rMsg ){.      fp
f610: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
f620: 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
f630: 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
f640: 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
f650: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
f660: 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
f670: 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
f680: 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
f690: 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
f6a0: 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
f6b0: 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
f6c0: 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
f6d0: 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
f6e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f6f0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
f700: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
f710: 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
f720: 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
f730: 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
f740: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
f750: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
f760: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
f770: 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
f7a0: 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
f7b0: 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
f7c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
f7d0: 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
f7e0: 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
f7f0: 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
f800: 63 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  c ){.      fprin
f810: 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
f820: 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25  r: (%d) %s on [%
f830: 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f850: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
f860: 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
f870: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
f880: 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
f890: 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
f8a0: 79 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  y);.      goto e
f8b0: 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a  nd_schema_xfer;.
f8c0: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
f8d0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73   (rc = sqlite3_s
f8e0: 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51  tep(pQuery))==SQ
f8f0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
f900: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
f910: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
f920: 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  uery, 0);.      
f930: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  zSql = sqlite3_c
f940: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
f950: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 72 69  y, 1);.      pri
f960: 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e  ntf("%s... ", zN
f970: 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64  ame); fflush(std
f980: 6f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  out);.      sqli
f990: 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
f9a0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71  (const char*)zSq
f9b0: 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73  l, 0, 0, &zErrMs
f9c0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45  g);.      if( zE
f9d0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
f9e0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
f9f0: 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c   "Error: %s\nSQL
fa00: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d  : [%s]\n", zErrM
fa10: 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  sg, zSql);.     
fa20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
fa30: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
fa40: 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
fa50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fa60: 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20   xForEach ){.   
fa70: 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c       xForEach(p,
fa80: 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63   newDb, (const c
fa90: 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20  har*)zName);.   
faa0: 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
fab0: 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20  f("done\n");.   
fac0: 20 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d   }.  }.end_schem
fad0: 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65  a_xfer:.  sqlite
fae0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
faf0: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  y);.  sqlite3_fr
fb00: 65 65 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f  ee(zQuery);.}../
fb10: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
fb20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
fb30: 6d 65 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54  med "zNewDb".  T
fb40: 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73  ry to recover as
fb50: 20 6d 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f   much informatio
fb60: 6e 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65  n.** as possible
fb70: 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
fb80: 20 64 61 74 61 62 61 73 65 20 28 77 68 69 63 68   database (which
fb90: 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70   might be corrup
fba0: 74 29 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a  t) and write it.
fbb0: 2a 2a 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a  ** into zNewDb..
fbc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
fbd0: 72 79 54 6f 43 6c 6f 6e 65 28 73 74 72 75 63 74  ryToClone(struct
fbe0: 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a   callback_data *
fbf0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
fc00: 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63  NewDb){.  int rc
fc10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77  ;.  sqlite3 *new
fc20: 44 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63  Db = 0;.  if( ac
fc30: 63 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d  cess(zNewDb,0)==
fc40: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
fc50: 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20 5c  (stderr, "File \
fc60: 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78  "%s\" already ex
fc70: 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62  ists.\n", zNewDb
fc80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
fc90: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
fca0: 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26  3_open(zNewDb, &
fcb0: 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72 63  newDb);.  if( rc
fcc0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
fcd0: 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20  stderr, "Cannot 
fce0: 63 72 65 61 74 65 20 6f 75 74 70 75 74 20 64 61  create output da
fcf0: 74 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 0a 20  tabase: %s\n",. 
fd00: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
fd10: 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29  e3_errmsg(newDb)
fd20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fd30: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
fd40: 44 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c 55  Db, "BEGIN EXCLU
fd50: 53 49 56 45 3b 22 2c 20 30 2c 20 30 2c 20 30 29  SIVE;", 0, 0, 0)
fd60: 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65  ;.    tryToClone
fd70: 53 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c  Schema(p, newDb,
fd80: 20 22 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c   "type='table'",
fd90: 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 29   tryToCloneData)
fda0: 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65  ;.    tryToClone
fdb0: 53 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c  Schema(p, newDb,
fdc0: 20 22 74 79 70 65 21 3d 27 74 61 62 6c 65 27 22   "type!='table'"
fdd0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fde0: 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 43  3_exec(newDb, "C
fdf0: 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20 30 2c 20 30  OMMIT;", 0, 0, 0
fe00: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
fe10: 5f 63 6c 6f 73 65 28 6e 65 77 44 62 29 3b 0a 7d  _close(newDb);.}
fe20: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ../*.** If an in
fe30: 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20  put line begins 
fe40: 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e  with "." then in
fe50: 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
fe60: 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20  e to.** process 
fe70: 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  that line..**.**
fe80: 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72   Return 1 on err
fe90: 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61  or, 2 to exit, a
fea0: 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 0 otherwise..
feb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
fec0: 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68  _meta_command(ch
fed0: 61 72 20 2a 7a 4c 69 6e 65 2c 20 73 74 72 75 63  ar *zLine, struc
fee0: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
fef0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 31  *p){.  int i = 1
ff00: 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  ;.  int nArg = 0
ff10: 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20  ;.  int n, c;.  
ff20: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68  int rc = 0;.  ch
ff30: 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a  ar *azArg[50];..
ff40: 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69    /* Parse the i
ff50: 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74  nput line into t
ff60: 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  okens..  */.  wh
ff70: 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20 26 26  ile( zLine[i] &&
ff80: 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65 28   nArg<ArraySize(
ff90: 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77 68  azArg) ){.    wh
ffa0: 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69  ile( IsSpace(zLi
ffb0: 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  ne[i]) ){ i++; }
ffc0: 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69  .    if( zLine[i
ffd0: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
ffe0: 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d    if( zLine[i]==
fff0: 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d  '\'' || zLine[i]
10000 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69  =='"' ){.      i
10010 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65  nt delim = zLine
10020 5b 69 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41  [i++];.      azA
10030 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
10040 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20 77 68  ine[i];.      wh
10050 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20 26 26  ile( zLine[i] &&
10060 20 7a 4c 69 6e 65 5b 69 5d 21 3d 64 65 6c 69 6d   zLine[i]!=delim
10070 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 66 28   ){ .        if(
10080 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 5c 27 20   zLine[i]=='\\' 
10090 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26  && delim=='"' &&
100a0 20 7a 4c 69 6e 65 5b 69 2b 31 5d 21 3d 30 20 29   zLine[i+1]!=0 )
100b0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b   i++;.        i+
100c0 2b 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +; .      }.    
100d0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d    if( zLine[i]==
100e0 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20  delim ){.       
100f0 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20 3d 20 30 3b   zLine[i++] = 0;
10100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10110 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20  f( delim=='"' ) 
10120 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
10130 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31  hes(azArg[nArg-1
10140 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
10150 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
10160 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d 3b 0a  +] = &zLine[i];.
10170 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
10180 6e 65 5b 69 5d 20 26 26 20 21 49 73 53 70 61 63  ne[i] && !IsSpac
10190 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69  e(zLine[i]) ){ i
101a0 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
101b0 7a 4c 69 6e 65 5b 69 5d 20 29 20 7a 4c 69 6e 65  zLine[i] ) zLine
101c0 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [i++] = 0;.     
101d0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
101e0 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
101f0 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  1]);.    }.  }..
10200 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
10210 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a   input line..  *
10220 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  /.  if( nArg==0 
10230 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
10240 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72  o tokens, no err
10250 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c  or */.  n = strl
10260 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  en30(azArg[0]);.
10270 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30    c = azArg[0][0
10280 5d 3b 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  ];.  if( c=='b' 
10290 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
102a0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
102b0 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ckup", n)==0 ){.
102c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
102d0 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20  zDestFile = 0;. 
102e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
102f0 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  Db = 0;.    sqli
10300 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20  te3 *pDest;.    
10310 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
10320 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74  pBackup;.    int
10330 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b   j;.    for(j=1;
10340 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20   j<nArg; j++){. 
10350 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10360 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  *z = azArg[j];. 
10370 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
10380 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  -' ){.        wh
10390 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29  ile( z[0]=='-' )
103a0 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f 2a   z++;.        /*
103b0 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20 70   No options to p
103c0 72 6f 63 65 73 73 20 61 74 20 74 68 69 73 20 74  rocess at this t
103d0 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  ime */.        {
103e0 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
103f0 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
10400 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e  own option: %s\n
10410 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20  ", azArg[j]);.  
10420 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
10430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10440 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73    }else if( zDes
10450 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tFile==0 ){.    
10460 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
10470 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
10480 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30  }else if( zDb==0
10490 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20   ){.        zDb 
104a0 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20  = zDestFile;.   
104b0 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
104c0 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20   azArg[j];.     
104d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
104e0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
104f0 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65  "too many argume
10500 6e 74 73 20 74 6f 20 2e 62 61 63 6b 75 70 5c 6e  nts to .backup\n
10510 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
10520 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
10530 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 73    }.    if( zDes
10540 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tFile==0 ){.    
10550 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
10560 2c 20 22 6d 69 73 73 69 6e 67 20 46 49 4c 45 4e  , "missing FILEN
10570 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  AME argument on 
10580 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20  .backup\n");.   
10590 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
105a0 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d   }.    if( zDb==
105b0 30 20 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22  0 ) zDb = "main"
105c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
105d0 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c  e3_open(zDestFil
105e0 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20 20 20  e, &pDest);.    
105f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10600 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  K ){.      fprin
10610 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
10620 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
10630 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46  "%s\"\n", zDestF
10640 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
10650 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
10660 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
10670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
10680 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70  _db(p, 0);.    p
10690 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33  Backup = sqlite3
106a0 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65  _backup_init(pDe
106b0 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64  st, "main", p->d
106c0 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
106d0 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20   pBackup==0 ){. 
106e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
106f0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
10700 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
10710 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
10720 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
10730 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pDest);.      re
10740 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
10750 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20    while(  (rc = 
10760 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
10770 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
10780 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d  )==SQLITE_OK ){}
10790 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
107a0 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
107b0 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
107c0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
107d0 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
107e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
107f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
10800 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
10810 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
10820 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  st));.      rc =
10830 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
10840 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
10850 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  t);.  }else..  i
10860 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
10870 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
10880 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e  rg[0], "bail", n
10890 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 26  )==0 && nArg>1 &
108a0 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20  & nArg<3 ){.    
108b0 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20  bail_on_error = 
108c0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
108d0 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a  rg[1]);.  }else.
108e0 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75  .  /* The undocu
108f0 6d 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f  mented ".breakpo
10900 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75  int" command cau
10910 73 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ses a call to th
10920 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75  e no-op.  ** rou
10930 74 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f  tine named test_
10940 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20  breakpoint()..  
10950 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  */.  if( c=='b' 
10960 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
10970 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72  mp(azArg[0], "br
10980 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30  eakpoint", n)==0
10990 20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65   ){.    test_bre
109a0 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c  akpoint();.  }el
109b0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
109c0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
109d0 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e  g[0], "clone", n
109e0 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31 20 26  )==0 && nArg>1 &
109f0 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20  & nArg<3 ){.    
10a00 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a  tryToClone(p, az
10a10 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65  Arg[1]);.  }else
10a20 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26  ..  if( c=='d' &
10a30 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70  & n>1 && strncmp
10a40 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74 61  (azArg[0], "data
10a50 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20 26 26  bases", n)==0 &&
10a60 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nArg==1 ){.    
10a70 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
10a80 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63  data data;.    c
10a90 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
10aa0 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
10ab0 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   0);.    memcpy(
10ac0 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66  &data, p, sizeof
10ad0 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74  (data));.    dat
10ae0 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31  a.showHeader = 1
10af0 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20  ;.    data.mode 
10b00 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20  = MODE_Column;. 
10b10 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68     data.colWidth
10b20 5b 30 5d 20 3d 20 33 3b 0a 20 20 20 20 64 61 74  [0] = 3;.    dat
10b30 61 2e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20  a.colWidth[1] = 
10b40 31 35 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c  15;.    data.col
10b50 57 69 64 74 68 5b 32 5d 20 3d 20 35 38 3b 0a 20  Width[2] = 58;. 
10b60 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b     data.cnt = 0;
10b70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
10b80 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  c(p->db, "PRAGMA
10b90 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74 3b 20   database_list; 
10ba0 22 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61  ", callback, &da
10bb0 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
10bc0 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
10bd0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
10be0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
10bf0 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
10c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10c10 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
10c20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
10c30 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
10c40 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d  c=='d' && strncm
10c50 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d  p(azArg[0], "dum
10c60 70 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  p", n)==0 && nAr
10c70 67 3c 33 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  g<3 ){.    open_
10c80 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f 2a  db(p, 0);.    /*
10c90 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61   When playing ba
10ca0 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65  ck a "dump", the
10cb0 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61   content might a
10cc0 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65  ppear in an orde
10cd0 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63  r.    ** which c
10ce0 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20  auses immediate 
10cf0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
10d00 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69  traints to be vi
10d10 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53  olated..    ** S
10d20 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67  o disable foreig
10d30 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n-key constraint
10d40 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20   enforcement to 
10d50 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73  prevent problems
10d60 2e 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66  . */.    fprintf
10d70 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41  (p->out, "PRAGMA
10d80 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46   foreign_keys=OF
10d90 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69  F;\n");.    fpri
10da0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47  ntf(p->out, "BEG
10db0 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c  IN TRANSACTION;\
10dc0 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74  n");.    p->writ
10dd0 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a  ableSchema = 0;.
10de0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
10df0 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50 4f 49  (p->db, "SAVEPOI
10e00 4e 54 20 64 75 6d 70 3b 20 50 52 41 47 4d 41 20  NT dump; PRAGMA 
10e10 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
10e20 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ON", 0, 0, 0);. 
10e30 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a     p->nErr = 0;.
10e40 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20      if( nArg==1 
10e50 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  ){.      run_sch
10e60 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
10e70 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  , .        "SELE
10e80 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73  CT name, type, s
10e90 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
10ea0 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
10eb0 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e  "WHERE sql NOT N
10ec0 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74  ULL AND type=='t
10ed0 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d  able' AND name!=
10ee0 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  'sqlite_sequence
10ef0 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  '".      );.    
10f00 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d    run_schema_dum
10f10 70 5f 71 75 65 72 79 28 70 2c 20 0a 20 20 20 20  p_query(p, .    
10f20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
10f30 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
10f40 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
10f50 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
10f60 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73 65  name=='sqlite_se
10f70 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29  quence'".      )
10f80 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c  ;.      run_tabl
10f90 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a  e_dump_query(p,.
10fa0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
10fb0 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
10fc0 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
10fd0 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20   "WHERE sql NOT 
10fe0 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e  NULL AND type IN
10ff0 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
11000 65 72 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a  er','view')", 0.
11010 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
11020 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
11030 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
11040 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
11050 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
11060 69 63 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ic = azArg[i];. 
11070 20 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d         run_schem
11080 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a  a_dump_query(p,.
11090 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
110a0 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
110b0 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
110c0 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20  ster ".         
110d0 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65   "WHERE tbl_name
110e0 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69   LIKE shellstati
110f0 63 28 29 20 41 4e 44 20 74 79 70 65 3d 3d 27 74  c() AND type=='t
11100 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 20  able'".         
11110 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20   "  AND sql NOT 
11120 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
11130 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
11140 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
11150 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
11160 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
11170 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48   ".          "WH
11180 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  ERE sql NOT NULL
11190 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41  ".          "  A
111a0 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64  ND type IN ('ind
111b0 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76  ex','trigger','v
111c0 69 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20  iew')".         
111d0 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65   "  AND tbl_name
111e0 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69   LIKE shellstati
111f0 63 28 29 22 2c 20 30 0a 20 20 20 20 20 20 20 20  c()", 0.        
11200 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c  );.        zShel
11210 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20  lStatic = 0;.   
11220 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
11230 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63  f( p->writableSc
11240 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 70  hema ){.      fp
11250 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
11260 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
11270 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a  chema=OFF;\n");.
11280 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c        p->writabl
11290 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  eSchema = 0;.   
112a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
112b0 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  xec(p->db, "PRAG
112c0 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
112d0 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20  ma=OFF;", 0, 0, 
112e0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
112f0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
11300 45 41 53 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20  EASE dump;", 0, 
11310 30 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e  0, 0);.    fprin
11320 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45  tf(p->out, p->nE
11330 72 72 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20  rr ? "ROLLBACK; 
11340 2d 2d 20 64 75 65 20 74 6f 20 65 72 72 6f 72 73  -- due to errors
11350 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e  \n" : "COMMIT;\n
11360 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ");.  }else..  i
11370 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
11380 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
11390 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 26 26 20  echo", n)==0 && 
113a0 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c 33  nArg>1 && nArg<3
113b0 20 29 7b 0a 20 20 20 20 70 2d 3e 65 63 68 6f 4f   ){.    p->echoO
113c0 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  n = booleanValue
113d0 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65  (azArg[1]);.  }e
113e0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
113f0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
11400 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e  rg[0], "exit", n
11410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
11420 6e 41 72 67 3e 31 20 26 26 20 28 72 63 20 3d 20  nArg>1 && (rc = 
11430 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
11440 65 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20  e(azArg[1]))!=0 
11450 29 20 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20  ) exit(rc);.    
11460 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a  rc = 2;.  }else.
11470 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
11480 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
11490 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29  ], "explain", n)
114a0 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b  ==0 && nArg<3 ){
114b0 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 6e  .    int val = n
114c0 41 72 67 3e 3d 32 20 3f 20 62 6f 6f 6c 65 61 6e  Arg>=2 ? boolean
114d0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
114e0 3a 20 31 3b 0a 20 20 20 20 69 66 28 76 61 6c 20  : 1;.    if(val 
114f0 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 69 66  == 1) {.      if
11500 28 21 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76  (!p->explainPrev
11510 2e 76 61 6c 69 64 29 20 7b 0a 20 20 20 20 20 20  .valid) {.      
11520 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76    p->explainPrev
11530 2e 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  .valid = 1;.    
11540 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72      p->explainPr
11550 65 76 2e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ev.mode = p->mod
11560 65 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78  e;.        p->ex
11570 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77 48 65  plainPrev.showHe
11580 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  ader = p->showHe
11590 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65  ader;.        me
115a0 6d 63 70 79 28 70 2d 3e 65 78 70 6c 61 69 6e 50  mcpy(p->explainP
115b0 72 65 76 2e 63 6f 6c 57 69 64 74 68 2c 70 2d 3e  rev.colWidth,p->
115c0 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66 28  colWidth,sizeof(
115d0 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20  p->colWidth));. 
115e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
115f0 57 65 20 63 6f 75 6c 64 20 70 75 74 20 74 68 69  We could put thi
11600 73 20 63 6f 64 65 20 75 6e 64 65 72 20 74 68 65  s code under the
11610 20 21 70 2d 3e 65 78 70 6c 61 69 6e 56 61 6c 69   !p->explainVali
11620 64 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 64 69  d.      ** condi
11630 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74 20  tion so that it 
11640 64 6f 65 73 20 6e 6f 74 20 65 78 65 63 75 74 65  does not execute
11650 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
11660 64 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 65  dy in.      ** e
11670 78 70 6c 61 69 6e 20 6d 6f 64 65 2e 20 48 6f 77  xplain mode. How
11680 65 76 65 72 2c 20 61 6c 77 61 79 73 20 65 78 65  ever, always exe
11690 63 75 74 69 6e 67 20 69 74 20 61 6c 6c 6f 77 73  cuting it allows
116a0 20 75 73 20 61 6e 20 65 61 73 79 0a 20 20 20 20   us an easy.    
116b0 20 20 2a 2a 20 77 61 73 20 74 6f 20 72 65 73 65    ** was to rese
116c0 74 20 74 6f 20 65 78 70 6c 61 69 6e 20 6d 6f 64  t to explain mod
116d0 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 75 73  e in case the us
116e0 65 72 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  er previously.  
116f0 20 20 20 20 2a 2a 20 64 69 64 20 61 6e 20 2e 65      ** did an .e
11700 78 70 6c 61 69 6e 20 66 6f 6c 6c 6f 77 65 64 20  xplain followed 
11710 62 79 20 61 20 2e 77 69 64 74 68 2c 20 2e 6d 6f  by a .width, .mo
11720 64 65 20 6f 72 20 2e 68 65 61 64 65 72 0a 20 20  de or .header.  
11730 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a      ** command..
11740 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
11750 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78  ->mode = MODE_Ex
11760 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e  plain;.      p->
11770 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b 0a  showHeader = 1;.
11780 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e        memset(p->
11790 63 6f 6c 57 69 64 74 68 2c 30 2c 73 69 7a 65 6f  colWidth,0,sizeo
117a0 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b  f(p->colWidth));
117b0 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
117c0 74 68 5b 30 5d 20 3d 20 34 3b 20 20 20 20 20 20  th[0] = 4;      
117d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
117e0 64 64 72 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  ddr */.      p->
117f0 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20 31 33  colWidth[1] = 13
11800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11810 20 20 2f 2a 20 6f 70 63 6f 64 65 20 2a 2f 0a 20    /* opcode */. 
11820 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
11830 5b 32 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20  [2] = 4;        
11840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
11850 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  */.      p->colW
11860 69 64 74 68 5b 33 5d 20 3d 20 34 3b 20 20 20 20  idth[3] = 4;    
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11880 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e   P2 */.      p->
11890 63 6f 6c 57 69 64 74 68 5b 34 5d 20 3d 20 34 3b  colWidth[4] = 4;
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
118c0 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 35 5d 20   p->colWidth[5] 
118d0 3d 20 31 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 13;           
118e0 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20        /* P4 */. 
118f0 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68       p->colWidth
11900 5b 36 5d 20 3d 20 32 3b 20 20 20 20 20 20 20 20  [6] = 2;        
11910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
11920 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  */.      p->colW
11930 69 64 74 68 5b 37 5d 20 3d 20 31 33 3b 20 20 20  idth[7] = 13;   
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11950 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20  * Comment */.   
11960 20 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e 65 78   }else if (p->ex
11970 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 29  plainPrev.valid)
11980 20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 70 6c   {.      p->expl
11990 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20 3d 20  ainPrev.valid = 
119a0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  0;.      p->mode
119b0 20 3d 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65   = p->explainPre
119c0 76 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  v.mode;.      p-
119d0 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d  >showHeader = p-
119e0 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f  >explainPrev.sho
119f0 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 6d  wHeader;.      m
11a00 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 57 69 64 74  emcpy(p->colWidt
11a10 68 2c 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76  h,p->explainPrev
11a20 2e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66  .colWidth,sizeof
11a30 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a  (p->colWidth));.
11a40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
11a50 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 28   if( c=='h' && (
11a60 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
11a70 2c 20 22 68 65 61 64 65 72 22 2c 20 6e 29 3d 3d  , "header", n)==
11a80 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  0 ||.           
11a90 20 20 20 20 20 20 73 74 72 6e 63 6d 70 28 61 7a        strncmp(az
11aa0 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73  Arg[0], "headers
11ab0 22 2c 20 6e 29 3d 3d 30 29 20 26 26 20 6e 41 72  ", n)==0) && nAr
11ac0 67 3e 31 20 26 26 20 6e 41 72 67 3c 33 20 29 7b  g>1 && nArg<3 ){
11ad0 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64  .    p->showHead
11ae0 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  er = booleanValu
11af0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
11b00 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
11b10 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  h' && strncmp(az
11b20 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c 20  Arg[0], "help", 
11b30 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  n)==0 ){.    fpr
11b40 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 22  intf(stderr,"%s"
11b50 2c 7a 48 65 6c 70 29 3b 0a 20 20 20 20 69 66 28  ,zHelp);.    if(
11b60 20 48 41 53 5f 54 49 4d 45 52 20 29 7b 0a 20 20   HAS_TIMER ){.  
11b70 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
11b80 72 72 2c 22 25 73 22 2c 7a 54 69 6d 65 72 48 65  rr,"%s",zTimerHe
11b90 6c 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  lp);.    }.  }el
11ba0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69 27  se..  if( c=='i'
11bb0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
11bc0 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c 20  g[0], "import", 
11bd0 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 33  n)==0 && nArg==3
11be0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   ){.    char *zT
11bf0 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  able = azArg[2];
11c00 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
11c10 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
11c20 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
11c30 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zFile = azArg[1]
11c40 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
11c50 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63   file to extra c
11c60 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20  ontent from */. 
11c70 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
11c80 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f  *pStmt = NULL; /
11c90 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
11ca0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
11cd0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
11ce0 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
11cf0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
11d00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11d10 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
11d20 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
11d30 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
11d60 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d  .    int needCom
11d70 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
11d80 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d   /* True to COMM
11d90 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61  IT or ROLLBACK a
11da0 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  t end */.    int
11db0 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20   nSep;          
11dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11dd0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70  er of bytes in p
11de0 2d 3e 73 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f  ->separator[] */
11df0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65   /* An SQL state
11e20 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 43 53 56 52  ment */.    CSVR
11e30 65 61 64 65 72 20 73 43 73 76 3b 20 20 20 20 20  eader sCsv;     
11e40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65          /* Reade
11e50 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  r context */.   
11e60 20 69 6e 74 20 28 2a 78 43 6c 6f 73 65 72 29 28   int (*xCloser)(
11e70 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20  FILE*);      /* 
11e80 50 72 6f 63 65 64 75 72 65 20 74 6f 20 63 6c 6f  Procedure to clo
11e90 73 65 20 74 68 33 20 63 6f 6e 6e 65 63 74 69 6f  se th3 connectio
11ea0 6e 20 2a 2f 0a 0a 20 20 20 20 73 65 65 6e 49 6e  n */..    seenIn
11eb0 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20  terrupt = 0;.   
11ec0 20 6d 65 6d 73 65 74 28 26 73 43 73 76 2c 20 30   memset(&sCsv, 0
11ed0 2c 20 73 69 7a 65 6f 66 28 73 43 73 76 29 29 3b  , sizeof(sCsv));
11ee0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
11ef0 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73  0);.    nSep = s
11f00 74 72 6c 65 6e 33 30 28 70 2d 3e 73 65 70 61 72  trlen30(p->separ
11f10 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ator);.    if( n
11f20 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
11f30 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
11f40 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
11f50 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
11f60 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e  red for import\n
11f70 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
11f80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
11f90 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20  ( nSep>1 ){.    
11fa0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
11fb0 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d  , "Error: multi-
11fc0 63 68 61 72 61 63 74 65 72 20 73 65 70 61 72 61  character separa
11fd0 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  tors not allowed
11fe0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
11ff0 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d          " for im
12000 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
12010 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
12020 20 20 20 20 73 43 73 76 2e 7a 46 69 6c 65 20 3d      sCsv.zFile =
12030 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43 73 76   zFile;.    sCsv
12040 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  .nLine = 1;.    
12050 69 66 28 20 73 43 73 76 2e 7a 46 69 6c 65 5b 30  if( sCsv.zFile[0
12060 5d 3d 3d 27 7c 27 20 29 7b 0a 20 20 20 20 20 20  ]=='|' ){.      
12070 73 43 73 76 2e 69 6e 20 3d 20 70 6f 70 65 6e 28  sCsv.in = popen(
12080 73 43 73 76 2e 7a 46 69 6c 65 2b 31 2c 20 22 72  sCsv.zFile+1, "r
12090 22 29 3b 0a 20 20 20 20 20 20 73 43 73 76 2e 7a  ");.      sCsv.z
120a0 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b  File = "<pipe>";
120b0 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d  .      xCloser =
120c0 20 70 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 65 6c   pclose;.    }el
120d0 73 65 7b 0a 20 20 20 20 20 20 73 43 73 76 2e 69  se{.      sCsv.i
120e0 6e 20 3d 20 66 6f 70 65 6e 28 73 43 73 76 2e 7a  n = fopen(sCsv.z
120f0 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
12100 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c     xCloser = fcl
12110 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ose;.    }.    i
12120 66 28 20 73 43 73 76 2e 69 6e 3d 3d 30 20 29 7b  f( sCsv.in==0 ){
12130 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
12140 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
12150 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
12160 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
12170 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12180 20 20 7d 0a 20 20 20 20 73 43 73 76 2e 63 53 65    }.    sCsv.cSe
12190 70 61 72 61 74 6f 72 20 3d 20 70 2d 3e 73 65 70  parator = p->sep
121a0 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a  arator[0];.    z
121b0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
121c0 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
121d0 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65  FROM %s", zTable
121e0 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
121f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
12200 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
12210 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
12220 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78 43 6c  y\n");.      xCl
12230 6f 73 65 72 28 73 43 73 76 2e 69 6e 29 3b 0a 20  oser(sCsv.in);. 
12240 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
12250 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
12260 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
12270 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12280 33 5f 70 72 65 70 61 72 65 28 70 2d 3e 64 62 2c  3_prepare(p->db,
12290 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
122a0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
122b0 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  c && sqlite3_str
122c0 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20 74 61  glob("no such ta
122d0 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74 65 33  ble: *", sqlite3
122e0 5f 65 72 72 6d 73 67 28 64 62 29 29 3d 3d 30 20  _errmsg(db))==0 
122f0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
12300 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Create = sqlite3
12310 5f 6d 70 72 69 6e 74 66 28 22 43 52 45 41 54 45  _mprintf("CREATE
12320 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62   TABLE %s", zTab
12330 6c 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  le);.      char 
12340 63 53 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20  cSep = '(';.    
12350 20 20 77 68 69 6c 65 28 20 63 73 76 5f 72 65 61    while( csv_rea
12360 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 26 73 43 73  d_one_field(&sCs
12370 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  v) ){.        zC
12380 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  reate = sqlite3_
12390 6d 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20  mprintf("%z%c\n 
123a0 20 5c 22 25 73 5c 22 20 54 45 58 54 22 2c 20 7a   \"%s\" TEXT", z
123b0 43 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43  Create, cSep, sC
123c0 73 76 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63  sv.z);.        c
123d0 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  Sep = ',';.     
123e0 20 20 20 69 66 28 20 73 43 73 76 2e 63 54 65 72     if( sCsv.cTer
123f0 6d 21 3d 73 43 73 76 2e 63 53 65 70 61 72 61 74  m!=sCsv.cSeparat
12400 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
12410 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53    }.      if( cS
12420 65 70 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  ep=='(' ){.     
12430 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12440 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
12450 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
12460 43 73 76 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Csv.z);.        
12470 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29  xCloser(sCsv.in)
12480 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
12490 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d  f(stderr,"%s: em
124a0 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 73  pty file\n", sCs
124b0 76 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  v.zFile);.      
124c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
124d0 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74    }.      zCreat
124e0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
124f0 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72  ntf("%z\n)", zCr
12500 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20  eate);.      rc 
12510 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
12520 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30  ->db, zCreate, 0
12530 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
12540 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65  qlite3_free(zCre
12550 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
12560 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  rc ){.        fp
12570 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
12580 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e  REATE TABLE %s(.
12590 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ..) failed: %s\n
125a0 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20  ", zTable,.     
125b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
125c0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
125d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
125e0 66 72 65 65 28 73 43 73 76 2e 7a 29 3b 0a 20 20  free(sCsv.z);.  
125f0 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
12600 73 76 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  sv.in);.        
12610 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
12620 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
12630 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e  ite3_prepare(p->
12640 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
12650 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
12660 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12670 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
12680 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 20 28  rc ){.      if (
12690 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66  pStmt) sqlite3_f
126a0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
126b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
126c0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
126d0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
126e0 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 78  sg(db));.      x
126f0 43 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29 3b  Closer(sCsv.in);
12700 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
12710 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
12720 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
12730 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
12740 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
12750 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
12760 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
12770 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( nCol==0 ) ret
12780 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c  urn 0; /* no col
12790 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a  umns, no error *
127a0 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  /.    zSql = sql
127b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
127c0 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c  te*2 + 20 + nCol
127d0 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
127e0 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ql==0 ){.      f
127f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
12800 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
12810 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
12820 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29  xCloser(sCsv.in)
12830 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
12840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12850 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79  te3_snprintf(nBy
12860 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e  te+20, zSql, "IN
12870 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22  SERT INTO \"%w\"
12880 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62   VALUES(?", zTab
12890 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72  le);.    j = str
128a0 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
128b0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c   for(i=1; i<nCol
128c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53  ; i++){.      zS
128d0 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  ql[j++] = ',';. 
128e0 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
128f0 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   '?';.    }.    
12900 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b  zSql[j++] = ')';
12910 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30  .    zSql[j] = 0
12920 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12930 65 33 5f 70 72 65 70 61 72 65 28 70 2d 3e 64 62  e3_prepare(p->db
12940 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
12950 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
12960 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
12970 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12980 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
12990 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
129a0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
129b0 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66  g(db));.      if
129c0 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33   (pStmt) sqlite3
129d0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
129e0 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
129f0 73 43 73 76 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCsv.in);.      
12a00 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
12a10 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69 74 20 3d      needCommit =
12a20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
12a30 6f 63 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  ocommit(db);.   
12a40 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20   if( needCommit 
12a50 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  ) sqlite3_exec(d
12a60 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  b, "BEGIN", 0, 0
12a70 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  , 0);.    do{.  
12a80 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e      int startLin
12a90 65 20 3d 20 73 43 73 76 2e 6e 4c 69 6e 65 3b 0a  e = sCsv.nLine;.
12aa0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12ab0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
12ac0 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 63       char *z = c
12ad0 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
12ae0 64 28 26 73 43 73 76 29 3b 0a 20 20 20 20 20 20  d(&sCsv);.      
12af0 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d    if( z==0 && i=
12b00 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12b10 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
12b20 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31  _text(pStmt, i+1
12b30 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
12b40 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
12b50 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 2d 31      if( i<nCol-1
12b60 20 26 26 20 73 43 73 76 2e 63 54 65 72 6d 21 3d   && sCsv.cTerm!=
12b70 73 43 73 76 2e 63 53 65 70 61 72 61 74 6f 72 20  sCsv.cSeparator 
12b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
12b90 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
12ba0 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64  :%d: expected %d
12bb0 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75   columns but fou
12bc0 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20  nd %d - ".      
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 20 20 22 66 69 6c 6c 69 6e 67 20 74 68 65      "filling the
12bf0 20 72 65 73 74 20 77 69 74 68 20 4e 55 4c 4c 5c   rest with NULL\
12c00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43                sC
12c20 73 76 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c  sv.zFile, startL
12c30 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b  ine, nCol, i+1);
12c40 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
12c50 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
12c60 20 69 3c 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74   i<nCol ){ sqlit
12c70 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
12c80 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20  mt, i); i++; }. 
12c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12ca0 0a 20 20 20 20 20 20 69 66 28 20 73 43 73 76 2e  .      if( sCsv.
12cb0 63 54 65 72 6d 3d 3d 73 43 73 76 2e 63 53 65 70  cTerm==sCsv.cSep
12cc0 61 72 61 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  arator ){.      
12cd0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
12ce0 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  csv_read_one_fie
12cf0 6c 64 28 26 73 43 73 76 29 3b 0a 20 20 20 20 20  ld(&sCsv);.     
12d00 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
12d10 20 20 7d 77 68 69 6c 65 28 20 73 43 73 76 2e 63    }while( sCsv.c
12d20 54 65 72 6d 3d 3d 73 43 73 76 2e 63 53 65 70 61  Term==sCsv.cSepa
12d30 72 61 74 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  rator );.       
12d40 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12d50 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65   "%s:%d: expecte
12d60 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74  d %d columns but
12d70 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20   found %d - ".  
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 20 20 20 20 20 22 65 78 74 72 61 73 20 69 67        "extras ig
12da0 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nored\n",.      
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 73 43 73 76 2e 7a 46 69 6c 65 2c 20 73 74    sCsv.zFile, st
12dd0 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69  artLine, nCol, i
12de0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12df0 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a   if( i>=nCol ){.
12e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12e10 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
12e20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12e30 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
12e40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
12e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12e60 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
12e70 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 49  tderr, "%s:%d: I
12e80 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20 25 73  NSERT failed: %s
12e90 5c 6e 22 2c 20 73 43 73 76 2e 7a 46 69 6c 65 2c  \n", sCsv.zFile,
12ea0 20 73 74 61 72 74 4c 69 6e 65 2c 0a 20 20 20 20   startLine,.    
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
12ec0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
12ed0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12ee0 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
12ef0 20 73 43 73 76 2e 63 54 65 72 6d 21 3d 45 4f 46   sCsv.cTerm!=EOF
12f00 20 29 3b 0a 0a 20 20 20 20 78 43 6c 6f 73 65 72   );..    xCloser
12f10 28 73 43 73 76 2e 69 6e 29 3b 0a 20 20 20 20 73  (sCsv.in);.    s
12f20 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 73 76  qlite3_free(sCsv
12f30 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  .z);.    sqlite3
12f40 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
12f50 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f  ;.    if( needCo
12f60 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65  mmit ) sqlite3_e
12f70 78 65 63 28 64 62 2c 20 22 43 4f 4d 4d 49 54 22  xec(db, "COMMIT"
12f80 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  , 0, 0, 0);.  }e
12f90 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69  lse..  if( c=='i
12fa0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
12fb0 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63 65 73 22  rg[0], "indices"
12fc0 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3c  , n)==0 && nArg<
12fd0 33 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  3 ){.    struct 
12fe0 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 64 61  callback_data da
12ff0 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
13000 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f  rrMsg = 0;.    o
13010 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
13020 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
13030 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
13040 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
13050 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
13060 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
13070 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 6e 41  List;.    if( nA
13080 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg==1 ){.      r
13090 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
130a0 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
130b0 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
130c0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
130d0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
130e0 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e   type='index' AN
130f0 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20  D name NOT LIKE 
13100 27 73 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20  'sqlite_%' ".   
13110 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20       "UNION ALL 
13120 22 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ".        "SELEC
13130 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
13140 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22  te_temp_master "
13150 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
13160 74 79 70 65 3d 27 69 6e 64 65 78 27 20 22 0a 20  type='index' ". 
13170 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
13180 20 31 22 2c 0a 20 20 20 20 20 20 20 20 63 61 6c   1",.        cal
13190 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
131a0 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a  ErrMsg.      );.
131b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
131c0 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20   zShellStatic = 
131d0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
131e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
131f0 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  c(p->db,.       
13200 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
13210 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
13220 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
13230 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41  E type='index' A
13240 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45  ND tbl_name LIKE
13250 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22   shellstatic() "
13260 0a 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20  .        "UNION 
13270 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53  ALL ".        "S
13280 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
13290 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
132a0 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
132b0 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
132c0 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49   AND tbl_name LI
132d0 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29  KE shellstatic()
132e0 20 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45   ".        "ORDE
132f0 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20  R BY 1",.       
13300 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
13310 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20  , &zErrMsg.     
13320 20 29 3b 0a 20 20 20 20 20 20 7a 53 68 65 6c 6c   );.      zShell
13330 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20  Static = 0;.    
13340 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
13350 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  g ){.      fprin
13360 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
13370 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
13380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13390 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
133a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
133b0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21    }else if( rc !
133c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
133d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
133e0 65 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72  err,"Error: quer
133f0 79 69 6e 67 20 73 71 6c 69 74 65 5f 6d 61 73 74  ying sqlite_mast
13400 65 72 20 61 6e 64 20 73 71 6c 69 74 65 5f 74 65  er and sqlite_te
13410 6d 70 5f 6d 61 73 74 65 72 5c 6e 22 29 3b 0a 20  mp_master\n");. 
13420 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
13430 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 64   }.  }else..#ifd
13440 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
13450 5f 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63  _IOTRACE.  if( c
13460 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
13470 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72  (azArg[0], "iotr
13480 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ace", n)==0 ){. 
13490 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28     extern void (
134a0 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29  *sqlite3IoTrace)
134b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e  (const char*, ..
134c0 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72  .);.    if( iotr
134d0 61 63 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d  ace && iotrace!=
134e0 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28  stdout ) fclose(
134f0 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f  iotrace);.    io
13500 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69  trace = 0;.    i
13510 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
13520 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
13530 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
13540 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
13550 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b  g[1], "-")==0 ){
13560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f  .      sqlite3Io
13570 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50  Trace = iotraceP
13580 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74  rintf;.      iot
13590 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20  race = stdout;. 
135a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
135b0 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28  iotrace = fopen(
135c0 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a  azArg[1], "w");.
135d0 20 20 20 20 20 20 69 66 28 20 69 6f 74 72 61 63        if( iotrac
135e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
135f0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
13600 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
13610 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
13620 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
13630 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
13640 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
13650 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
13660 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
13670 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72  e3IoTrace = iotr
13680 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20  acePrintf;.     
13690 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
136a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
136b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
136c0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66  D_EXTENSION.  if
136d0 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e  ( c=='l' && strn
136e0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
136f0 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  oad", n)==0 && n
13700 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f  Arg>=2 ){.    co
13710 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
13720 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61   *zProc;.    cha
13730 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
13740 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72      zFile = azAr
13750 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20  g[1];.    zProc 
13760 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72  = nArg>=3 ? azAr
13770 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70  g[2] : 0;.    op
13780 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
13790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f   rc = sqlite3_lo
137a0 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
137b0 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
137c0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
137d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
137e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  OK ){.      fpri
137f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
13800 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
13810 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
13820 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
13830 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
13840 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
13850 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
13860 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  l' && strncmp(az
13870 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e  Arg[0], "log", n
13880 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d 32 20  )==0 && nArg>=2 
13890 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
138a0 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67  r *zFile = azArg
138b0 5b 31 5d 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f  [1];.    output_
138c0 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c  file_close(p->pL
138d0 6f 67 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 6f 67  og);.    p->pLog
138e0 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f   = output_file_o
138f0 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 7d 65  pen(zFile);.  }e
13900 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d  lse..  if( c=='m
13910 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
13920 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e  rg[0], "mode", n
13930 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20  )==0 && nArg==2 
13940 29 7b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20  ){.    int n2 = 
13950 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31  strlen30(azArg[1
13960 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 6e 32 3d  ]);.    if( (n2=
13970 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =4 && strncmp(az
13980 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 22 2c 6e 32  Arg[1],"line",n2
13990 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 7c 7c  )==0).        ||
139a0 0a 20 20 20 20 20 20 20 20 28 6e 32 3d 3d 35 20  .        (n2==5 
139b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
139c0 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d  [1],"lines",n2)=
139d0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  =0) ){.      p->
139e0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65  mode = MODE_Line
139f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13a00 28 6e 32 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d  (n2==6 && strncm
13a10 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75  p(azArg[1],"colu
13a20 6d 6e 22 2c 6e 32 29 3d 3d 30 29 0a 20 20 20 20  mn",n2)==0).    
13a30 20 20 20 20 20 20 20 20 20 20 7c 7c 0a 20 20 20            ||.   
13a40 20 20 20 20 20 20 20 20 20 20 20 28 6e 32 3d 3d             (n2==
13a50 37 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  7 && strncmp(azA
13a60 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c  rg[1],"columns",
13a70 6e 32 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  n2)==0) ){.     
13a80 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
13a90 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73  Column;.    }els
13aa0 65 20 69 66 28 20 6e 32 3d 3d 34 20 26 26 20 73  e if( n2==4 && s
13ab0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
13ac0 22 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b  "list",n2)==0 ){
13ad0 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
13ae0 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
13af0 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d 3d 34 20  }else if( n2==4 
13b00 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
13b10 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d  [1],"html",n2)==
13b20 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
13b30 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a  de = MODE_Html;.
13b40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32      }else if( n2
13b50 3d 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  ==3 && strncmp(a
13b60 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32  zArg[1],"tcl",n2
13b70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
13b80 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c  >mode = MODE_Tcl
13b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13ba0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
13bb0 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2c 20 70  p->separator), p
13bc0 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22 20 22  ->separator, " "
13bd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
13be0 20 6e 32 3d 3d 33 20 26 26 20 73 74 72 6e 63 6d   n2==3 && strncm
13bf0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22  p(azArg[1],"csv"
13c00 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
13c10 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
13c20 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Csv;.      sqlit
13c30 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
13c40 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  of(p->separator)
13c50 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20  , p->separator, 
13c60 22 2c 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ",");.    }else 
13c70 69 66 28 20 6e 32 3d 3d 34 20 26 26 20 73 74 72  if( n2==4 && str
13c80 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74  ncmp(azArg[1],"t
13c90 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  abs",n2)==0 ){. 
13ca0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
13cb0 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20  ODE_List;.      
13cc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
13cd0 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72  (sizeof(p->separ
13ce0 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70 61 72 61  ator), p->separa
13cf0 74 6f 72 2c 20 22 5c 74 22 29 3b 0a 20 20 20 20  tor, "\t");.    
13d00 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d 3d 36 20  }else if( n2==6 
13d10 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
13d20 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29  [1],"insert",n2)
13d30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
13d40 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65  mode = MODE_Inse
13d50 72 74 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61  rt;.      set_ta
13d60 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 22 74 61 62  ble_name(p, "tab
13d70 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  le");.    }else 
13d80 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
13d90 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 6d  stderr,"Error: m
13da0 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ode should be on
13db0 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20  e of: ".        
13dc0 20 22 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d   "column csv htm
13dd0 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69  l insert line li
13de0 73 74 20 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b  st tabs tcl\n");
13df0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
13e00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
13e10 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74  if( c=='m' && st
13e20 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
13e30 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 26 26  "mode", n)==0 &&
13e40 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20   nArg==3 ){.    
13e50 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33  int n2 = strlen3
13e60 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  0(azArg[1]);.   
13e70 20 69 66 28 20 6e 32 3d 3d 36 20 26 26 20 73 74   if( n2==6 && st
13e80 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
13e90 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29  insert",n2)==0 )
13ea0 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
13eb0 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20  = MODE_Insert;. 
13ec0 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e       set_table_n
13ed0 61 6d 65 28 70 2c 20 61 7a 41 72 67 5b 32 5d 29  ame(p, azArg[2])
13ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20  ;.    }else {.  
13ef0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
13f00 72 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e 76 61  rr, "Error: inva
13f10 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 3a 20 22  lid arguments: "
13f20 0a 20 20 20 20 20 20 20 20 22 20 5c 22 25 73 5c  .        " \"%s\
13f30 22 2e 20 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70  ". Enter \".help
13f40 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20  \" for help\n", 
13f50 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20  azArg[2]);.     
13f60 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
13f70 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
13f80 3d 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='n' && strncmp(
13f90 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76  azArg[0], "nullv
13fa0 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 26 26 20  alue", n)==0 && 
13fb0 6e 41 72 67 3d 3d 32 20 29 20 7b 0a 20 20 20 20  nArg==2 ) {.    
13fc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
13fd0 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 76  (sizeof(p->nullv
13fe0 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 76 61  alue), p->nullva
13ff0 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lue,.           
14000 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22            "%.*s"
14010 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  , (int)ArraySize
14020 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 2d 31  (p->nullvalue)-1
14030 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  , azArg[1]);.  }
14040 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
14050 6f 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  o' && strncmp(az
14060 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c 20  Arg[0], "open", 
14070 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29 7b  n)==0 && n>=2 ){
14080 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 61  .    sqlite3 *sa
14090 76 65 64 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  vedDb = p->db;. 
140a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
140b0 53 61 76 65 64 46 69 6c 65 6e 61 6d 65 20 3d 20  SavedFilename = 
140c0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 0a  p->zDbFilename;.
140d0 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46 69      char *zNewFi
140e0 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
140f0 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 69  p->db = 0;.    i
14100 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  f( nArg>=2 ){.  
14110 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
14120 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  me = zNewFilenam
14130 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
14140 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b  ntf("%s", azArg[
14150 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  1]);.    }.    o
14160 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b 0a 20 20  pen_db(p, 1);.  
14170 20 20 69 66 28 20 70 2d 3e 64 62 21 3d 30 20 29    if( p->db!=0 )
14180 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14190 63 6c 6f 73 65 28 73 61 76 65 64 44 62 29 3b 0a  close(savedDb);.
141a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
141b0 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f  ee(p->zFreeOnClo
141c0 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 46  se);.      p->zF
141d0 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65  reeOnClose = zNe
141e0 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7d  wFilename;.    }
141f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
14200 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c  te3_free(zNewFil
14210 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  ename);.      p-
14220 3e 64 62 20 3d 20 73 61 76 65 64 44 62 3b 0a 20  >db = savedDb;. 
14230 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
14240 61 6d 65 20 3d 20 7a 53 61 76 65 64 46 69 6c 65  ame = zSavedFile
14250 6e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  name;.    }.  }e
14260 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f  lse..  if( c=='o
14270 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
14280 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c  rg[0], "output",
14290 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d   n)==0 && nArg==
142a0 32 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  2 ){.    if( p->
142b0 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20  outfile[0]=='|' 
142c0 29 7b 0a 20 20 20 20 20 20 70 63 6c 6f 73 65 28  ){.      pclose(
142d0 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  p->out);.    }el
142e0 73 65 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  se{.      output
142f0 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f  _file_close(p->o
14300 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ut);.    }.    p
14310 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30  ->outfile[0] = 0
14320 3b 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b  ;.    if( azArg[
14330 31 5d 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 20 20  1][0]=='|' ){.  
14340 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70      p->out = pop
14350 65 6e 28 26 61 7a 41 72 67 5b 31 5d 5b 31 5d 2c  en(&azArg[1][1],
14360 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28   "w");.      if(
14370 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20   p->out==0 ){.  
14380 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
14390 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e  derr,"Error: can
143a0 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65 20 5c 22  not open pipe \"
143b0 25 73 5c 22 5c 6e 22 2c 20 26 61 7a 41 72 67 5b  %s\"\n", &azArg[
143c0 31 5d 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1][1]);.        
143d0 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
143e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
143f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14400 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
14410 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
14420 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75  >outfile), p->ou
14430 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 61 7a 41  tfile, "%s", azA
14440 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rg[1]);.      }.
14450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14460 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74   p->out = output
14470 5f 66 69 6c 65 5f 6f 70 65 6e 28 61 7a 41 72 67  _file_open(azArg
14480 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
14490 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  p->out==0 ){.   
144a0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
144b0 61 7a 41 72 67 5b 31 5d 2c 22 6f 66 66 22 29 21  azArg[1],"off")!
144c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
144d0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
144e0 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72  Error: cannot wr
144f0 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
14500 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
14510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
14520 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
14530 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
14540 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
14550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
14560 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
14570 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f  ->outfile), p->o
14580 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 61 7a  utfile, "%s", az
14590 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  Arg[1]);.      }
145a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
145b0 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20    if( c=='p' && 
145c0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
145d0 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 69 6e 74  azArg[0], "print
145e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
145f0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
14600 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
14610 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 31 20  {.      if( i>1 
14620 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  ) fprintf(p->out
14630 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20 66 70  , " ");.      fp
14640 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
14650 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
14660 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
14670 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
14680 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
14690 3d 3d 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70  =='p' && strncmp
146a0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d  (azArg[0], "prom
146b0 70 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 28 6e  pt", n)==0 && (n
146c0 41 72 67 3d 3d 32 20 7c 7c 20 6e 41 72 67 3d 3d  Arg==2 || nArg==
146d0 33 29 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  3)){.    if( nAr
146e0 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20 20  g >= 2) {.      
146f0 73 74 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d  strncpy(mainProm
14700 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74  pt,azArg[1],(int
14710 29 41 72 72 61 79 53 69 7a 65 28 6d 61 69 6e 50  )ArraySize(mainP
14720 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d  rompt)-1);.    }
14730 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d  .    if( nArg >=
14740 20 33 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e   3) {.      strn
14750 63 70 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d  cpy(continueProm
14760 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74  pt,azArg[2],(int
14770 29 41 72 72 61 79 53 69 7a 65 28 63 6f 6e 74 69  )ArraySize(conti
14780 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20  nuePrompt)-1);. 
14790 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
147a0 69 66 28 20 63 3d 3d 27 71 27 20 26 26 20 73 74  if( c=='q' && st
147b0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
147c0 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30 20 26 26  "quit", n)==0 &&
147d0 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nArg==1 ){.    
147e0 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a  rc = 2;.  }else.
147f0 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26  .  if( c=='r' &&
14800 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
14810 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64  (azArg[0], "read
14820 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
14830 3d 3d 32 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==2 ){.    FILE 
14840 2a 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41  *alt = fopen(azA
14850 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20  rg[1], "rb");.  
14860 20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a    if( alt==0 ){.
14870 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
14880 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e  derr,"Error: can
14890 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
148a0 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
148b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
148c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
148d0 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74   = process_input
148e0 28 70 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20  (p, alt);.      
148f0 66 63 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20  fclose(alt);.   
14900 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
14910 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33  ( c=='r' && n>=3
14920 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
14930 67 5b 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c  g[0], "restore",
14940 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31   n)==0 && nArg>1
14950 20 26 26 20 6e 41 72 67 3c 34 29 7b 0a 20 20 20   && nArg<4){.   
14960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72   const char *zSr
14970 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  cFile;.    const
14980 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20   char *zDb;.    
14990 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20  sqlite3 *pSrc;. 
149a0 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
149b0 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20  p *pBackup;.    
149c0 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30  int nTimeout = 0
149d0 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ;..    if( nArg=
149e0 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63  =2 ){.      zSrc
149f0 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
14a00 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d 61  .      zDb = "ma
14a10 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  in";.    }else{.
14a20 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d        zSrcFile =
14a30 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20   azArg[2];.     
14a40 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b   zDb = azArg[1];
14a50 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
14a60 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72  sqlite3_open(zSr
14a70 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20  cFile, &pSrc);. 
14a80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14a90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70  E_OK ){.      fp
14aa0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
14ab0 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
14ac0 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72  n \"%s\"\n", zSr
14ad0 63 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  cFile);.      sq
14ae0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
14af0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14b00 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  1;.    }.    ope
14b10 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
14b20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
14b30 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 2d  3_backup_init(p-
14b40 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c 20  >db, zDb, pSrc, 
14b50 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28  "main");.    if(
14b60 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20   pBackup==0 ){. 
14b70 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
14b80 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
14b90 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
14ba0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
14bb0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
14bc0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
14bd0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
14be0 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
14bf0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
14c00 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
14c10 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
14c20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49       || rc==SQLI
14c30 54 45 5f 42 55 53 59 20 20 29 7b 0a 20 20 20 20  TE_BUSY  ){.    
14c40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14c50 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
14c60 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20   if( nTimeout++ 
14c70 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  >= 3 ) break;.  
14c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
14c90 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20  eep(100);.      
14ca0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
14cb0 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73  te3_backup_finis
14cc0 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20  h(pBackup);.    
14cd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
14ce0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ONE ){.      rc 
14cf0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
14d00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
14d10 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  SY || rc==SQLITE
14d20 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14d30 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14d40 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63 65 20   "Error: source 
14d50 64 61 74 61 62 61 73 65 20 69 73 20 62 75 73 79  database is busy
14d60 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
14d70 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
14d80 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
14d90 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
14da0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
14db0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
14dc0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
14dd0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
14de0 65 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65  e(pSrc);.  }else
14df0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
14e00 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
14e10 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
14e20 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b  ==0 && nArg<3 ){
14e30 0a 20 20 20 20 73 74 72 75 63 74 20 63 61 6c 6c  .    struct call
14e40 62 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a  back_data data;.
14e50 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
14e60 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f  g = 0;.    open_
14e70 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
14e80 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
14e90 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
14ea0 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
14eb0 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
14ec0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69  mode = MODE_Semi
14ed0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  ;.    if( nArg>1
14ee0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
14ef0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
14f00 61 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20 69 2b 2b  azArg[1][i]; i++
14f10 29 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 20 3d 20  ) azArg[1][i] = 
14f20 54 6f 4c 6f 77 65 72 28 61 7a 41 72 67 5b 31 5d  ToLower(azArg[1]
14f30 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
14f40 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
14f50 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  "sqlite_master")
14f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
14f70 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d  har *new_argv[2]
14f80 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a  , *new_colv[2];.
14f90 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
14fa0 5b 30 5d 20 3d 20 22 43 52 45 41 54 45 20 54 41  [0] = "CREATE TA
14fb0 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  BLE sqlite_maste
14fc0 72 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  r (\n".         
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
14fe0 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
15010 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
15020 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62             "  tb
15030 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a  l_name text,\n".
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15050 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67        "  rootpag
15060 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20  e integer,\n".  
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c      "  sql text\
15090 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
150a0 20 20 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20           ")";.  
150b0 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31        new_argv[1
150c0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  ] = 0;.        n
150d0 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71  ew_colv[0] = "sq
150e0 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  l";.        new_
150f0 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  colv[1] = 0;.   
15100 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64       callback(&d
15110 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76  ata, 1, new_argv
15120 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20  , new_colv);.   
15130 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15140 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
15150 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
15160 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f 74 65 6d  g[1],"sqlite_tem
15170 70 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  p_master")==0 ){
15180 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e  .        char *n
15190 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77  ew_argv[2], *new
151a0 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20  _colv[2];.      
151b0 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20    new_argv[0] = 
151c0 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
151d0 4c 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  LE sqlite_temp_m
151e0 61 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20  aster (\n".     
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e   "  type text,\n
15210 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
15220 20 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20          "  name 
15230 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15250 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c    tbl_name text,
15260 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
15270 20 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f            "  roo
15280 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e  tpage integer,\n
15290 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
152a0 20 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74          "  sql t
152b0 65 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ext\n".         
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22               ")"
152d0 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
152e0 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
152f0 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
15300 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
15310 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
15320 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
15330 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
15340 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
15350 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
15360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
15370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53  else{.        zS
15380 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41  hellStatic = azA
15390 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 72  rg[1];.        r
153a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
153b0 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
153c0 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
153d0 4f 4d 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  OM ".          "
153e0 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71    (SELECT sql sq
153f0 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74 62  l, type type, tb
15400 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c  l_name tbl_name,
15410 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69   name name, rowi
15420 64 20 78 22 0a 20 20 20 20 20 20 20 20 20 20 22  d x".          "
15430 20 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65       FROM sqlite
15440 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c  _master UNION AL
15450 4c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  L".          "  
15460 20 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70   SELECT sql, typ
15470 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d  e, tbl_name, nam
15480 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71  e, rowid FROM sq
15490 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
154a0 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 57  ) ".          "W
154b0 48 45 52 45 20 6c 6f 77 65 72 28 74 62 6c 5f 6e  HERE lower(tbl_n
154c0 61 6d 65 29 20 4c 49 4b 45 20 73 68 65 6c 6c 73  ame) LIKE shells
154d0 74 61 74 69 63 28 29 22 0a 20 20 20 20 20 20 20  tatic()".       
154e0 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 21 3d     "  AND type!=
154f0 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
15500 4f 54 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 20  OTNULL ".       
15510 20 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77     "ORDER BY row
15520 69 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63  id",.          c
15530 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
15540 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
15550 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20     zShellStatic 
15560 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
15570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
15580 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
15590 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
155a0 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
155b0 20 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 28   ".         "  (
155c0 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20  SELECT sql sql, 
155d0 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e  type type, tbl_n
155e0 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61  ame tbl_name, na
155f0 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78  me name, rowid x
15600 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20 20  ".         "    
15610 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
15620 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20  ter UNION ALL". 
15630 20 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45          "   SELE
15640 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62  CT sql, type, tb
15650 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f  l_name, name, ro
15660 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  wid FROM sqlite_
15670 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20  temp_master) ". 
15680 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
15690 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20  ype!='meta' AND 
156a0 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20  sql NOTNULL AND 
156b0 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
156c0 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20 20  qlite_%'".      
156d0 20 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77     "ORDER BY row
156e0 69 64 22 2c 0a 20 20 20 20 20 20 20 20 20 63 61  id",.         ca
156f0 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
15700 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b  zErrMsg.      );
15710 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
15720 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
15730 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
15740 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
15750 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
15760 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
15770 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
15780 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
15790 20 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc != SQLITE_OK
157a0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
157b0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
157c0 20 71 75 65 72 79 69 6e 67 20 73 63 68 65 6d 61   querying schema
157d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29   information\n")
157e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
157f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15800 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
15810 20 7d 65 6c 73 65 0a 0a 23 69 66 64 65 66 20 53   }else..#ifdef S
15820 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
15830 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f   Undocumented co
15840 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e 74 65 72  mmands for inter
15850 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20 20 53 75  nal testing.  Su
15860 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65 0a  bject to change.
15870 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6e 6f 74    ** without not
15880 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28 20 63 3d  ice. */.  if( c=
15890 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30 20 26 26  ='s' && n>=10 &&
158a0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
158b0 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d 22 2c 20  ], "selftest-", 
158c0 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  9)==0 ){.    if(
158d0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
158e0 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c 20  ]+9, "boolean", 
158f0 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n-9)==0 ){.     
15900 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20 20 20 20   int i, v;.     
15910 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
15920 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15930 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  v = booleanValue
15940 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
15950 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
15960 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78 25 78  ut, "%s: %d 0x%x
15970 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76  \n", azArg[i], v
15980 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , v);.      }.  
15990 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e    }.    if( strn
159a0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20  cmp(azArg[0]+9, 
159b0 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d  "integer", n-9)=
159c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
159d0 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  i; sqlite3_int64
159e0 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
159f0 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
15a00 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 42  .        char zB
15a10 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20 20  uf[200];.       
15a20 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75   v = integerValu
15a30 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(azArg[i]);.   
15a40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
15a50 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
15a60 66 29 2c 20 7a 42 75 66 2c 20 22 25 73 3a 20 25  f), zBuf, "%s: %
15a70 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61  lld 0x%llx\n", a
15a80 7a 41 72 67 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a  zArg[i], v, v);.
15a90 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15aa0 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42  p->out, "%s", zB
15ab0 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  uf);.      }.   
15ac0 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
15ad0 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  f..  if( c=='s' 
15ae0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
15af0 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22  [0], "separator"
15b00 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
15b10 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =2 ){.    sqlite
15b20 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
15b30 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2c  f(p->separator),
15b40 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 0a 20   p->separator,. 
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74      "%.*s", (int
15b70 29 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72  )sizeof(p->separ
15b80 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 31  ator)-1, azArg[1
15b90 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ]);.  }else..  i
15ba0 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
15bb0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
15bc0 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 26 26 20  show", n)==0 && 
15bd0 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 69  nArg==1 ){.    i
15be0 6e 74 20 69 3b 0a 20 20 20 20 66 70 72 69 6e 74  nt i;.    fprint
15bf0 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
15c00 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 20 70   %s\n","echo", p
15c10 2d 3e 65 63 68 6f 4f 6e 20 3f 20 22 6f 6e 22 20  ->echoOn ? "on" 
15c20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70  : "off");.    fp
15c30 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
15c40 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c  .9s: %s\n","expl
15c50 61 69 6e 22 2c 20 70 2d 3e 65 78 70 6c 61 69 6e  ain", p->explain
15c60 50 72 65 76 2e 76 61 6c 69 64 20 3f 20 22 6f 6e  Prev.valid ? "on
15c70 22 20 3a 22 6f 66 66 22 29 3b 0a 20 20 20 20 66  " :"off");.    f
15c80 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
15c90 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61  9.9s: %s\n","hea
15ca0 64 65 72 73 22 2c 20 70 2d 3e 73 68 6f 77 48 65  ders", p->showHe
15cb0 61 64 65 72 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  ader ? "on" : "o
15cc0 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ff");.    fprint
15cd0 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
15ce0 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d   %s\n","mode", m
15cf0 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65  odeDescr[p->mode
15d00 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ]);.    fprintf(
15d10 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22  p->out,"%9.9s: "
15d20 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a  , "nullvalue");.
15d30 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
15d40 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
15d50 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20  >nullvalue);.   
15d60 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
15d70 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70  t, "\n");.    fp
15d80 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
15d90 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70  .9s: %s\n","outp
15da0 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ut",.           
15db0 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74   strlen30(p->out
15dc0 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69  file) ? p->outfi
15dd0 6c 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a  le : "stdout");.
15de0 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
15df0 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22 73  ut,"%9.9s: ", "s
15e00 65 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20  eparator");.    
15e10 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
15e20 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 73 65 70  g(p->out, p->sep
15e30 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66  arator);.      f
15e40 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
15e50 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  \n");.    fprint
15e60 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a  f(p->out,"%9.9s:
15e70 20 25 73 5c 6e 22 2c 22 73 74 61 74 73 22 2c 20   %s\n","stats", 
15e80 70 2d 3e 73 74 61 74 73 4f 6e 20 3f 20 22 6f 6e  p->statsOn ? "on
15e90 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20  " : "off");.    
15ea0 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
15eb0 25 39 2e 39 73 3a 20 22 2c 22 77 69 64 74 68 22  %9.9s: ","width"
15ec0 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b  );.    for (i=0;
15ed0 69 3c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  i<(int)ArraySize
15ee0 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26  (p->colWidth) &&
15ef0 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20   p->colWidth[i] 
15f00 21 3d 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20  != 0;i++) {.    
15f10 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
15f20 2c 22 25 64 20 22 2c 70 2d 3e 63 6f 6c 57 69 64  ,"%d ",p->colWid
15f30 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  th[i]);.    }.  
15f40 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
15f50 2c 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a  ,"\n");.  }else.
15f60 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
15f70 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
15f80 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e 29 3d 3d  ], "stats", n)==
15f90 30 20 26 26 20 6e 41 72 67 3e 31 20 26 26 20 6e  0 && nArg>1 && n
15fa0 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 70 2d 3e  Arg<3 ){.    p->
15fb0 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61  statsOn = boolea
15fc0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
15fd0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
15fe0 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26   c=='t' && n>1 &
15ff0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
16000 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e 29  0], "tables", n)
16010 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b  ==0 && nArg<3 ){
16020 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
16030 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 68  t *pStmt;.    ch
16040 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20  ar **azResult;. 
16050 20 20 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c     int nRow, nAl
16060 6c 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  loc;.    char *z
16070 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Sql = 0;.    int
16080 20 69 69 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62   ii;.    open_db
16090 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
160a0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
160b0 5f 76 32 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  _v2(p->db, "PRAG
160c0 4d 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74  MA database_list
160d0 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  ", -1, &pStmt, 0
160e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
160f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7a  return rc;.    z
16100 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
16110 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
16120 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
16130 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
16140 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
16150 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27  type IN ('table'
16160 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20  ,'view')".      
16170 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e    "   AND name N
16180 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f  OT LIKE 'sqlite_
16190 25 25 27 22 0a 20 20 20 20 20 20 20 20 22 20 20  %%'".        "  
161a0 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f   AND name LIKE ?
161b0 31 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  1");.    while( 
161c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
161d0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
161e0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
161f0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 28  har *zDbName = (
16200 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
16210 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
16220 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
16230 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20   if( zDbName==0 
16240 7c 7c 20 73 74 72 63 6d 70 28 7a 44 62 4e 61 6d  || strcmp(zDbNam
16250 65 2c 22 6d 61 69 6e 22 29 3d 3d 30 20 29 20 63  e,"main")==0 ) c
16260 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
16270 66 28 20 73 74 72 63 6d 70 28 7a 44 62 4e 61 6d  f( strcmp(zDbNam
16280 65 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a  e,"temp")==0 ){.
16290 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
162a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 22 25 7a 20 55 4e 49 4f 4e 20 41 4c 4c 20 22   "%z UNION ALL "
162d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
162e0 20 20 22 53 45 4c 45 43 54 20 27 74 65 6d 70 2e    "SELECT 'temp.
162f0 27 20 7c 7c 20 6e 61 6d 65 20 46 52 4f 4d 20 73  ' || name FROM s
16300 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
16310 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
16320 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65      " WHERE type
16330 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69   IN ('table','vi
16340 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ew')".          
16350 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e         "   AND n
16360 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
16370 6c 69 74 65 5f 25 25 27 22 0a 20 20 20 20 20 20  lite_%%'".      
16380 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41             "   A
16390 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22  ND name LIKE ?1"
163a0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d  , zSql);.      }
163b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53  else{.        zS
163c0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
163d0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
163e0 20 20 20 20 20 20 20 22 25 7a 20 55 4e 49 4f 4e         "%z UNION
163f0 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 20   ALL ".         
16400 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
16410 27 25 71 2e 27 20 7c 7c 20 6e 61 6d 65 20 46 52  '%q.' || name FR
16420 4f 4d 20 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65  OM \"%w\".sqlite
16430 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
16440 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
16450 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c  E type IN ('tabl
16460 65 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20  e','view')".    
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
16480 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49   AND name NOT LI
16490 4b 45 20 27 73 71 6c 69 74 65 5f 25 25 27 22 0a  KE 'sqlite_%%'".
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164b0 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4c 49   "   AND name LI
164c0 4b 45 20 3f 31 22 2c 20 7a 53 71 6c 2c 20 7a 44  KE ?1", zSql, zD
164d0 62 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b  bName, zDbName);
164e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
164f0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
16500 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
16510 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
16520 70 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 45 52  printf("%z ORDER
16530 20 42 59 20 31 22 2c 20 7a 53 71 6c 29 3b 0a 20   BY 1", zSql);. 
16540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
16550 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
16560 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
16570 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
16580 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
16590 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
165a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 52 6f 77  urn rc;.    nRow
165b0 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20   = nAlloc = 0;. 
165c0 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 30 3b     azResult = 0;
165d0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
165e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
165f0 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
16600 2c 20 31 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d  , 1, azArg[1], -
16610 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
16620 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ENT);.    }else{
16630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
16640 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
16650 31 2c 20 22 25 22 2c 20 2d 31 2c 20 53 51 4c 49  1, "%", -1, SQLI
16660 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
16670 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  }.    while( sql
16680 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
16690 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
166a0 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 3d        if( nRow>=
166b0 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
166c0 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a    char **azNew;.
166d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
166e0 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20  nAlloc*2 + 10;. 
166f0 20 20 20 20 20 20 20 61 7a 4e 65 77 20 3d 20 73         azNew = s
16700 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
16710 7a 52 65 73 75 6c 74 2c 20 73 69 7a 65 6f 66 28  zResult, sizeof(
16720 61 7a 52 65 73 75 6c 74 5b 30 5d 29 2a 6e 29 3b  azResult[0])*n);
16730 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 7a 4e  .        if( azN
16740 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
16750 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16760 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
16770 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
16780 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
167a0 20 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 20   nAlloc = n;.   
167b0 20 20 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20       azResult = 
167c0 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20  azNew;.      }. 
167d0 20 20 20 20 20 61 7a 52 65 73 75 6c 74 5b 6e 52       azResult[nR
167e0 6f 77 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ow] = sqlite3_mp
167f0 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
16800 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
16810 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20  pStmt, 0));.    
16820 20 20 69 66 28 20 61 7a 52 65 73 75 6c 74 5b 6e    if( azResult[n
16830 52 6f 77 5d 20 29 20 6e 52 6f 77 2b 2b 3b 0a 20  Row] ) nRow++;. 
16840 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16850 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
16860 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 69 66  ;        .    if
16870 28 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20 20 20  ( nRow>0 ){.    
16880 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65    int len, maxle
16890 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  n = 0;.      int
168a0 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74   i, j;.      int
168b0 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69   nPrintCol, nPri
168c0 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72  ntRow;.      for
168d0 28 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20 69 2b  (i=0; i<nRow; i+
168e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  +){.        len 
168f0 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 52 65 73  = strlen30(azRes
16900 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ult[i]);.       
16910 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20   if( len>maxlen 
16920 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a  ) maxlen = len;.
16930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 50        }.      nP
16940 72 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28 6d 61  rintCol = 80/(ma
16950 78 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20 20 69  xlen+2);.      i
16960 66 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31 20 29  f( nPrintCol<1 )
16970 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a   nPrintCol = 1;.
16980 20 20 20 20 20 20 6e 50 72 69 6e 74 52 6f 77 20        nPrintRow 
16990 3d 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69 6e 74  = (nRow + nPrint
169a0 43 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e 74 43  Col - 1)/nPrintC
169b0 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ol;.      for(i=
169c0 30 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77 3b 20  0; i<nPrintRow; 
169d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  i++){.        fo
169e0 72 28 6a 3d 69 3b 20 6a 3c 6e 52 6f 77 3b 20 6a  r(j=i; j<nRow; j
169f0 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a 20 20  +=nPrintRow){.  
16a00 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
16a10 70 20 3d 20 6a 3c 6e 50 72 69 6e 74 52 6f 77 20  p = j<nPrintRow 
16a20 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a 20 20 20  ? "" : "  ";.   
16a30 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
16a40 2d 3e 6f 75 74 2c 20 22 25 73 25 2d 2a 73 22 2c  ->out, "%s%-*s",
16a50 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 20 61 7a   zSp, maxlen, az
16a60 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65  Result[j] ? azRe
16a70 73 75 6c 74 5b 6a 5d 20 3a 20 22 22 29 3b 0a 20  sult[j] : "");. 
16a80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16a90 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
16aa0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "\n");.      }.
16ab0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
16ac0 3d 30 3b 20 69 69 3c 6e 52 6f 77 3b 20 69 69 2b  =0; ii<nRow; ii+
16ad0 2b 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  +) sqlite3_free(
16ae0 61 7a 52 65 73 75 6c 74 5b 69 69 5d 29 3b 0a 20  azResult[ii]);. 
16af0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16b00 61 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d 65 6c  azResult);.  }el
16b10 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27  se..  if( c=='t'
16b20 20 26 26 20 6e 3e 3d 38 20 26 26 20 73 74 72 6e   && n>=8 && strn
16b30 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74  cmp(azArg[0], "t
16b40 65 73 74 63 74 72 6c 22 2c 20 6e 29 3d 3d 30 20  estctrl", n)==0 
16b50 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  && nArg>=2 ){.  
16b60 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
16b70 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63  truct {.       c
16b80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 74 72 6c  onst char *zCtrl
16b90 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
16ba0 6f 66 20 61 20 74 65 73 74 2d 63 6f 6e 74 72 6f  of a test-contro
16bb0 6c 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  l option */.    
16bc0 20 20 20 69 6e 74 20 63 74 72 6c 43 6f 64 65 3b     int ctrlCode;
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16be0 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20  nteger code for 
16bf0 74 68 61 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  that option */. 
16c00 20 20 20 7d 20 61 43 74 72 6c 5b 5d 20 3d 20 7b     } aCtrl[] = {
16c10 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 73  .      { "prng_s
16c20 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ave",           
16c30 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
16c40 4c 5f 50 52 4e 47 5f 53 41 56 45 20 20 20 20 20  L_PRNG_SAVE     
16c50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
16c60 20 20 7b 20 22 70 72 6e 67 5f 72 65 73 74 6f 72    { "prng_restor
16c70 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  e",          SQL
16c80 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
16c90 47 5f 52 45 53 54 4f 52 45 20 20 20 20 20 20 20  G_RESTORE       
16ca0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
16cb0 70 72 6e 67 5f 72 65 73 65 74 22 2c 20 20 20 20  prng_reset",    
16cc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
16cd0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
16ce0 45 54 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  ET             }
16cf0 2c 0a 20 20 20 20 20 20 7b 20 22 62 69 74 76 65  ,.      { "bitve
16d00 63 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  c_test",        
16d10 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
16d20 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 20 20  RL_BITVEC_TEST  
16d30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
16d40 20 20 20 7b 20 22 66 61 75 6c 74 5f 69 6e 73 74     { "fault_inst
16d50 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 53 51  all",         SQ
16d60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41  LITE_TESTCTRL_FA
16d70 55 4c 54 5f 49 4e 53 54 41 4c 4c 20 20 20 20 20  ULT_INSTALL     
16d80 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
16d90 22 62 65 6e 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68  "benign_malloc_h
16da0 6f 6f 6b 73 22 2c 20 20 20 53 51 4c 49 54 45 5f  ooks",   SQLITE_
16db0 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
16dc0 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 20 20 20 20  MALLOC_HOOKS    
16dd0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 65 6e 64  },.      { "pend
16de0 69 6e 67 5f 62 79 74 65 22 2c 20 20 20 20 20 20  ing_byte",      
16df0 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
16e00 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
16e10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
16e20 20 20 20 20 7b 20 22 61 73 73 65 72 74 22 2c 20      { "assert", 
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16e40 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
16e50 53 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  SSERT           
16e60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
16e70 20 22 61 6c 77 61 79 73 22 2c 20 20 20 20 20 20   "always",      
16e80 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16e90 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16eb0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 73   },.      { "res
16ec0 65 72 76 65 22 2c 20 20 20 20 20 20 20 20 20 20  erve",          
16ed0 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
16ee0 43 54 52 4c 5f 52 45 53 45 52 56 45 20 20 20 20  CTRL_RESERVE    
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
16f00 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61       { "optimiza
16f10 74 69 6f 6e 73 22 2c 20 20 20 20 20 20 20 20 20  tions",         
16f20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
16f30 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 20 20 20  OPTIMIZATIONS   
16f40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
16f50 7b 20 22 69 73 6b 65 79 77 6f 72 64 22 2c 20 20  { "iskeyword",  
16f60 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16f70 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
16f80 57 4f 52 44 20 20 20 20 20 20 20 20 20 20 20 20  WORD            
16f90 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 63    },.      { "sc
16fa0 72 61 74 63 68 6d 61 6c 6c 6f 63 22 2c 20 20 20  ratchmalloc",   
16fb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
16fc0 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
16fd0 4c 4f 43 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  LOC          },.
16fe0 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 74      };.    int t
16ff0 65 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20  estctrl = -1;.  
17000 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
17010 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20    int i, n;.    
17020 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 0a  open_db(p, 0);..
17030 20 20 20 20 2f 2a 20 63 6f 6e 76 65 72 74 20 74      /* convert t
17040 65 73 74 63 74 72 6c 20 74 65 78 74 20 6f 70 74  estctrl text opt
17050 69 6f 6e 20 74 6f 20 76 61 6c 75 65 2e 20 61 6c  ion to value. al
17060 6c 6f 77 20 61 6e 79 20 75 6e 69 71 75 65 20 70  low any unique p
17070 72 65 66 69 78 0a 20 20 20 20 2a 2a 20 6f 66 20  refix.    ** of 
17080 74 68 65 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c  the option name,
17090 20 6f 72 20 61 20 6e 75 6d 65 72 69 63 61 6c 20   or a numerical 
170a0 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 6e 20  value. */.    n 
170b0 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  = strlen30(azArg
170c0 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [1]);.    for(i=
170d0 30 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f  0; i<(int)(sizeo
170e0 66 28 61 43 74 72 6c 29 2f 73 69 7a 65 6f 66 28  f(aCtrl)/sizeof(
170f0 61 43 74 72 6c 5b 30 5d 29 29 3b 20 69 2b 2b 29  aCtrl[0])); i++)
17100 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
17110 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 43  cmp(azArg[1], aC
17120 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65  trl[i].zCtrlName
17130 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
17140 20 20 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c     if( testctrl<
17150 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  0 ){.          t
17160 65 73 74 63 74 72 6c 20 3d 20 61 43 74 72 6c 5b  estctrl = aCtrl[
17170 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20 20  i].ctrlCode;.   
17180 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17190 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
171a0 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73  derr, "ambiguous
171b0 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 3a 20 5c 22   option name: \"
171c0 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
171d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ]);.          te
171e0 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20  stctrl = -1;.   
171f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17210 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
17220 73 74 63 74 72 6c 3c 30 20 29 20 74 65 73 74 63  stctrl<0 ) testc
17230 74 72 6c 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  trl = (int)integ
17240 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  erValue(azArg[1]
17250 29 3b 0a 20 20 20 20 69 66 28 20 28 74 65 73 74  );.    if( (test
17260 63 74 72 6c 3c 53 51 4c 49 54 45 5f 54 45 53 54  ctrl<SQLITE_TEST
17270 43 54 52 4c 5f 46 49 52 53 54 29 20 7c 7c 20 28  CTRL_FIRST) || (
17280 74 65 73 74 63 74 72 6c 3e 53 51 4c 49 54 45 5f  testctrl>SQLITE_
17290 54 45 53 54 43 54 52 4c 5f 4c 41 53 54 29 20 29  TESTCTRL_LAST) )
172a0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
172b0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 69  stderr,"Error: i
172c0 6e 76 61 6c 69 64 20 74 65 73 74 63 74 72 6c 20  nvalid testctrl 
172d0 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61  option: %s\n", a
172e0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
172f0 6c 73 65 7b 0a 20 20 20 20 20 20 73 77 69 74 63  lse{.      switc
17300 68 28 74 65 73 74 63 74 72 6c 29 7b 0a 0a 20 20  h(testctrl){..  
17310 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
17320 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
17330 74 2c 20 64 62 2c 20 69 6e 74 29 20 2a 2f 0a 20  t, db, int) */. 
17340 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
17350 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
17360 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20 20 20 20 20  MIZATIONS:.     
17370 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
17380 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a  ESTCTRL_RESERVE:
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
173a0 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
173b0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==3 ){.         
173c0 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 28 69 6e     int opt = (in
173d0 74 29 73 74 72 74 6f 6c 28 61 7a 41 72 67 5b 32  t)strtol(azArg[2
173e0 5d 2c 20 30 2c 20 30 29 3b 20 20 20 20 20 20 20  ], 0, 0);       
173f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
17400 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
17410 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c  control(testctrl
17420 2c 20 70 2d 3e 64 62 2c 20 6f 70 74 29 3b 0a 20  , p->db, opt);. 
17430 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
17440 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28  tf(p->out, "%d (
17450 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c 20  0x%08x)\n", rc, 
17460 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rc);.          }
17470 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
17480 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17490 72 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63  rr,"Error: testc
174a0 74 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73  trl %s takes a s
174b0 69 6e 67 6c 65 20 69 6e 74 20 6f 70 74 69 6f 6e  ingle int option
174c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
174d0 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31           azArg[1
174e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
174f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
17500 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ..        /* sql
17510 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
17520 6c 28 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  l(int) */.      
17530 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
17540 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
17550 3a 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  :           .   
17560 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
17570 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
17580 45 53 54 4f 52 45 3a 20 20 20 20 20 20 20 20 0a  ESTORE:        .
17590 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
175a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
175b0 47 5f 52 45 53 45 54 3a 0a 20 20 20 20 20 20 20  G_RESET:.       
175c0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
175d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
175e0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
175f0 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c  control(testctrl
17600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
17610 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
17620 25 64 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20  %d (0x%08x)\n", 
17630 72 63 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  rc, rc);.       
17640 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
17650 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
17660 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 74  stderr,"Error: t
17670 65 73 74 63 74 72 6c 20 25 73 20 74 61 6b 65 73  estctrl %s takes
17680 20 6e 6f 20 6f 70 74 69 6f 6e 73 5c 6e 22 2c 20   no options\n", 
17690 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
176a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
176b0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
176c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
176d0 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 75 69  _control(int, ui
176e0 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  nt) */.        c
176f0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
17700 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
17710 3a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  :        .      
17720 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20      if( nArg==3 
17730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
17740 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f 70 74 20  nsigned int opt 
17750 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  = (unsigned int)
17760 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
17770 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[2]);.        
17780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17790 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65  _test_control(te
177a0 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20  stctrl, opt);.  
177b0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
177c0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30  f(p->out, "%d (0
177d0 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c 20 72  x%08x)\n", rc, r
177e0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  c);.          } 
177f0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
17800 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
17810 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74  r,"Error: testct
17820 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73 69  rl %s takes a si
17830 6e 67 6c 65 20 75 6e 73 69 67 6e 65 64 22 0a 20  ngle unsigned". 
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 20 20 20 20 20 20 20 20 20 20 22 20 69 6e 74 20            " int 
17860 6f 70 74 69 6f 6e 5c 6e 22 2c 20 61 7a 41 72 67  option\n", azArg
17870 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [1]);.          
17880 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
17890 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  k;.          .  
178a0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
178b0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
178c0 74 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20  t, int) */.     
178d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
178e0 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20  ESTCTRL_ASSERT: 
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
17900 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
17910 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
17920 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S:              
17930 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
17940 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
17950 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20        int opt = 
17960 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
17970 72 67 5b 32 5d 29 3b 20 20 20 20 20 20 20 20 0a  rg[2]);        .
17980 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
17990 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
179a0 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20  ntrol(testctrl, 
179b0 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
179c0 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
179d0 2c 20 22 25 64 20 28 30 78 25 30 38 78 29 5c 6e  , "%d (0x%08x)\n
179e0 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20 20 20 20  ", rc, rc);.    
179f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
17a00 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
17a10 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
17a20 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20 74 61  : testctrl %s ta
17a30 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  kes a single int
17a40 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20   option\n",.    
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d          azArg[1]
17a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
17a80 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17a90 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
17aa0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
17ab0 28 69 6e 74 2c 20 63 68 61 72 20 2a 29 20 2a 2f  (int, char *) */
17ac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
17ad0 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 20 20 20  _KEYWORD.       
17ae0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
17af0 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a  TCTRL_ISKEYWORD:
17b00 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
17b10 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
17b20 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
17b30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74   const char *opt
17b40 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20   = azArg[2];    
17b50 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
17b60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65   rc = sqlite3_te
17b70 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
17b80 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20  trl, opt);.     
17b90 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
17ba0 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30 78 25 30  ->out, "%d (0x%0
17bb0 38 78 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29 3b  8x)\n", rc, rc);
17bc0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
17bd0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
17be0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
17bf0 45 72 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20  Error: testctrl 
17c00 25 73 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c  %s takes a singl
17c10 65 20 63 68 61 72 20 2a 20 6f 70 74 69 6f 6e 5c  e char * option\
17c20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
17c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17c60 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
17c70 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
17c80 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54  ITE_TESTCTRL_BIT
17c90 56 45 43 5f 54 45 53 54 3a 20 20 20 20 20 20 20  VEC_TEST:       
17ca0 20 20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20    .        case 
17cb0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
17cc0 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 20  FAULT_INSTALL:  
17cd0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 63 61       .        ca
17ce0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
17cf0 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
17d00 5f 48 4f 4f 4b 53 3a 20 0a 20 20 20 20 20 20 20  _HOOKS: .       
17d10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
17d20 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
17d30 4c 4f 43 3a 20 20 20 20 20 20 20 0a 20 20 20 20  LOC:       .    
17d40 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
17d50 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
17d60 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 43 4c  tderr,"Error: CL
17d70 49 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 65  I support for te
17d80 73 74 63 74 72 6c 20 25 73 20 6e 6f 74 20 69 6d  stctrl %s not im
17d90 70 6c 65 6d 65 6e 74 65 64 5c 6e 22 2c 0a 20 20  plemented\n",.  
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17db0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
17dc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17dd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
17de0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20  e..  if( c=='t' 
17df0 26 26 20 6e 3e 34 20 26 26 20 73 74 72 6e 63 6d  && n>4 && strncm
17e00 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d  p(azArg[0], "tim
17e10 65 6f 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20  eout", n)==0 && 
17e20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 6f  nArg==2 ){.    o
17e30 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
17e40 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
17e50 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 28 69  imeout(p->db, (i
17e60 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
17e70 61 7a 41 72 67 5b 31 5d 29 29 3b 0a 20 20 7d 65  azArg[1]));.  }e
17e80 6c 73 65 0a 20 20 20 20 0a 20 20 69 66 28 20 48  lse.    .  if( H
17e90 41 53 5f 54 49 4d 45 52 20 26 26 20 63 3d 3d 27  AS_TIMER && c=='
17ea0 74 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74  t' && n>=5 && st
17eb0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
17ec0 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 0a 20  "timer", n)==0. 
17ed0 20 20 26 26 20 6e 41 72 67 3d 3d 32 0a 20 20 29    && nArg==2.  )
17ee0 7b 0a 20 20 20 20 65 6e 61 62 6c 65 54 69 6d 65  {.    enableTime
17ef0 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  r = booleanValue
17f00 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65  (azArg[1]);.  }e
17f10 6c 73 65 0a 20 20 0a 20 20 69 66 28 20 63 3d 3d  lse.  .  if( c==
17f20 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  't' && strncmp(a
17f30 7a 41 72 67 5b 30 5d 2c 20 22 74 72 61 63 65 22  zArg[0], "trace"
17f40 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e  , n)==0 && nArg>
17f50 31 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  1 ){.    open_db
17f60 28 70 2c 20 30 29 3b 0a 20 20 20 20 6f 75 74 70  (p, 0);.    outp
17f70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
17f80 3e 74 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20  >traceOut);.    
17f90 70 2d 3e 74 72 61 63 65 4f 75 74 20 3d 20 6f 75  p->traceOut = ou
17fa0 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 61  tput_file_open(a
17fb0 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 20 21 64  zArg[1]);.#if !d
17fc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17fd0 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
17fe0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17ff0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
18000 29 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61  ).    if( p->tra
18010 63 65 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ceOut==0 ){.    
18020 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
18030 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
18040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
18050 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 2d 3e  qlite3_trace(p->
18060 64 62 2c 20 73 71 6c 5f 74 72 61 63 65 5f 63 61  db, sql_trace_ca
18070 6c 6c 62 61 63 6b 2c 20 70 2d 3e 74 72 61 63 65  llback, p->trace
18080 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Out);.    }.#end
18090 69 66 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  if.  }else..  if
180a0 28 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e  ( c=='v' && strn
180b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76  cmp(azArg[0], "v
180c0 65 72 73 69 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29  ersion", n)==0 )
180d0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  {.    fprintf(p-
180e0 3e 6f 75 74 2c 20 22 53 51 4c 69 74 65 20 25 73  >out, "SQLite %s
180f0 20 25 73 5c 6e 22 20 2f 2a 65 78 74 72 61 2d 76   %s\n" /*extra-v
18100 65 72 73 69 6f 6e 2d 69 6e 66 6f 2a 2f 2c 0a 20  ersion-info*/,. 
18110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
18120 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c  ibversion(), sql
18130 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
18140 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
18150 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63   c=='v' && strnc
18160 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66  mp(azArg[0], "vf
18170 73 6e 61 6d 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  sname", n)==0 ){
18180 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
18190 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d  *zDbName = nArg=
181a0 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20  =2 ? azArg[1] : 
181b0 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 68 61 72  "main";.    char
181c0 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a   *zVfsName = 0;.
181d0 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b      if( p->db ){
181e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
181f0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64  ile_control(p->d
18200 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49  b, zDbName, SQLI
18210 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
18220 2c 20 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  , &zVfsName);.  
18230 20 20 20 20 69 66 28 20 7a 56 66 73 4e 61 6d 65      if( zVfsName
18240 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
18250 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
18260 6e 22 2c 20 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  n", zVfsName);. 
18270 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
18280 72 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  ree(zVfsName);. 
18290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
182a0 65 6c 73 65 0a 0a 23 69 66 20 64 65 66 69 6e 65  else..#if define
182b0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
182c0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
182d0 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52  E_ENABLE_WHERETR
182e0 41 43 45 29 0a 20 20 69 66 28 20 63 3d 3d 27 77  ACE).  if( c=='w
182f0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
18300 72 67 5b 30 5d 2c 20 22 77 68 65 72 65 74 72 61  rg[0], "wheretra
18310 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
18320 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
18330 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
18340 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
18350 54 72 61 63 65 20 3d 20 62 6f 6f 6c 65 61 6e 56  Trace = booleanV
18360 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
18370 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
18380 20 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20    if( c=='w' && 
18390 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
183a0 2c 20 22 77 69 64 74 68 22 2c 20 6e 29 3d 3d 30  , "width", n)==0
183b0 20 26 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20   && nArg>1 ){.  
183c0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 61 73 73    int j;.    ass
183d0 65 72 74 28 20 6e 41 72 67 3c 3d 41 72 72 61 79  ert( nArg<=Array
183e0 53 69 7a 65 28 61 7a 41 72 67 29 20 29 3b 0a 20  Size(azArg) );. 
183f0 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41     for(j=1; j<nA
18400 72 67 20 26 26 20 6a 3c 41 72 72 61 79 53 69 7a  rg && j<ArraySiz
18410 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 3b 20  e(p->colWidth); 
18420 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  j++){.      p->c
18430 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20 3d 20 28  olWidth[j-1] = (
18440 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65  int)integerValue
18450 28 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20  (azArg[j]);.    
18460 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 0a 20  }.  }else..  {. 
18470 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
18480 72 2c 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f  r, "Error: unkno
18490 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 69 6e  wn command or in
184a0 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 3a  valid arguments:
184b0 20 22 0a 20 20 20 20 20 20 22 20 5c 22 25 73 5c   ".      " \"%s\
184c0 22 2e 20 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70  ". Enter \".help
184d0 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20  \" for help\n", 
184e0 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 72  azArg[0]);.    r
184f0 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65  c = 1;.  }..  re
18500 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18510 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
18520 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 63 63   a semicolon occ
18530 75 72 73 20 61 6e 79 77 68 65 72 65 20 69 6e 20  urs anywhere in 
18540 74 68 65 20 66 69 72 73 74 20 4e 20 63 68 61 72  the first N char
18550 61 63 74 65 72 73 0a 2a 2a 20 6f 66 20 73 74 72  acters.** of str
18560 69 6e 67 20 7a 5b 5d 2e 0a 2a 2f 0a 73 74 61 74  ing z[]..*/.stat
18570 69 63 20 69 6e 74 20 6c 69 6e 65 5f 63 6f 6e 74  ic int line_cont
18580 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63  ains_semicolon(c
18590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
185a0 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t N){.  int i;. 
185b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
185c0 2b 2b 29 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  ++){  if( z[i]==
185d0 27 3b 27 20 29 20 72 65 74 75 72 6e 20 31 3b 20  ';' ) return 1; 
185e0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
185f0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
18600 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e  ee if a line con
18610 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
18620 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f  f whitespace..*/
18630 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c  .static int _all
18640 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73  _whitespace(cons
18650 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f  t char *z){.  fo
18660 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  r(; *z; z++){.  
18670 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b    if( IsSpace(z[
18680 30 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  0]) ) continue;.
18690 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20      if( *z=='/' 
186a0 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a  && z[1]=='*' ){.
186b0 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20        z += 2;.  
186c0 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26      while( *z &&
186d0 20 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31   (*z!='*' || z[1
186e0 5d 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20  ]!='/') ){ z++; 
186f0 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
18700 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18710 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63      z++;.      c
18720 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
18730 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26     if( *z=='-' &
18740 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  & z[1]=='-' ){. 
18750 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
18760 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
18770 2a 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b  *z!='\n' ){ z++;
18780 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d   }.      if( *z=
18790 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
187a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
187b0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
187c0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
187d0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
187e0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c  rn TRUE if the l
187f0 69 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20  ine typed in is 
18800 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74  an SQL command t
18810 65 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a  erminator other.
18820 2a 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63  ** than a semi-c
18830 6f 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53  olon.  The SQL S
18840 65 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22  erver style "go"
18850 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65   command is unde
18860 72 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20  rstood.** as is 
18870 74 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a  the Oracle "/"..
18880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
18890 6e 65 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65  ne_is_command_te
188a0 72 6d 69 6e 61 74 6f 72 28 63 6f 6e 73 74 20 63  rminator(const c
188b0 68 61 72 20 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77  har *zLine){.  w
188c0 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c  hile( IsSpace(zL
188d0 69 6e 65 5b 30 5d 29 20 29 7b 20 7a 4c 69 6e 65  ine[0]) ){ zLine
188e0 2b 2b 3b 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69  ++; };.  if( zLi
188f0 6e 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61  ne[0]=='/' && _a
18900 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a  ll_whitespace(&z
18910 4c 69 6e 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20  Line[1]) ){.    
18920 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72  return 1;  /* Or
18930 61 63 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  acle */.  }.  if
18940 28 20 54 6f 4c 6f 77 65 72 28 7a 4c 69 6e 65 5b  ( ToLower(zLine[
18950 30 5d 29 3d 3d 27 67 27 20 26 26 20 54 6f 4c 6f  0])=='g' && ToLo
18960 77 65 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27  wer(zLine[1])=='
18970 6f 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 5f  o'.         && _
18980 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26  all_whitespace(&
18990 7a 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20  zLine[2]) ){.   
189a0 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53   return 1;  /* S
189b0 51 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d  QL Server */.  }
189c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
189d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
189e0 65 20 69 66 20 7a 53 71 6c 20 69 73 20 61 20 63  e if zSql is a c
189f0 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74  omplete SQL stat
18a00 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 66  ement.  Return f
18a10 61 6c 73 65 20 69 66 20 69 74 0a 2a 2a 20 65 6e  alse if it.** en
18a20 64 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ds in the middle
18a30 20 6f 66 20 61 20 73 74 72 69 6e 67 20 6c 69 74   of a string lit
18a40 65 72 61 6c 20 6f 72 20 43 2d 73 74 79 6c 65 20  eral or C-style 
18a50 63 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  comment..*/.stat
18a60 69 63 20 69 6e 74 20 6c 69 6e 65 5f 69 73 5f 63  ic int line_is_c
18a70 6f 6d 70 6c 65 74 65 28 63 68 61 72 20 2a 7a 53  omplete(char *zS
18a80 71 6c 2c 20 69 6e 74 20 6e 53 71 6c 29 7b 0a 20  ql, int nSql){. 
18a90 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 7a   int rc;.  if( z
18aa0 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
18ab0 31 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20  1;.  zSql[nSql] 
18ac0 3d 20 27 3b 27 3b 0a 20 20 7a 53 71 6c 5b 6e 53  = ';';.  zSql[nS
18ad0 71 6c 2b 31 5d 20 3d 20 30 3b 0a 20 20 72 63 20  ql+1] = 0;.  rc 
18ae0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  = sqlite3_comple
18af0 74 65 28 7a 53 71 6c 29 3b 0a 20 20 7a 53 71 6c  te(zSql);.  zSql
18b00 5b 6e 53 71 6c 5d 20 3d 20 30 3b 0a 20 20 72 65  [nSql] = 0;.  re
18b10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18b20 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f  * Read input fro
18b30 6d 20 2a 69 6e 20 61 6e 64 20 70 72 6f 63 65 73  m *in and proces
18b40 73 20 69 74 2e 20 20 49 66 20 2a 69 6e 3d 3d 30  s it.  If *in==0
18b50 20 74 68 65 6e 20 69 6e 70 75 74 0a 2a 2a 20 69   then input.** i
18b60 73 20 69 6e 74 65 72 61 63 74 69 76 65 20 2d 20  s interactive - 
18b70 74 68 65 20 75 73 65 72 20 69 73 20 74 79 70 69  the user is typi
18b80 6e 67 20 69 74 20 69 74 2e 20 20 4f 74 68 65 72  ng it it.  Other
18b90 77 69 73 65 2c 20 69 6e 70 75 74 0a 2a 2a 20 69  wise, input.** i
18ba0 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20  s coming from a 
18bb0 66 69 6c 65 20 6f 72 20 64 65 76 69 63 65 2e 20  file or device. 
18bc0 20 41 20 70 72 6f 6d 70 74 20 69 73 20 69 73 73   A prompt is iss
18bd0 75 65 64 20 61 6e 64 20 68 69 73 74 6f 72 79 0a  ued and history.
18be0 2a 2a 20 69 73 20 73 61 76 65 64 20 6f 6e 6c 79  ** is saved only
18bf0 20 69 66 20 69 6e 70 75 74 20 69 73 20 69 6e 74   if input is int
18c00 65 72 61 63 74 69 76 65 2e 20 20 41 6e 20 69 6e  eractive.  An in
18c10 74 65 72 72 75 70 74 20 73 69 67 6e 61 6c 20 77  terrupt signal w
18c20 69 6c 6c 0a 2a 2a 20 63 61 75 73 65 20 74 68 69  ill.** cause thi
18c30 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 69  s routine to exi
18c40 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 75  t immediately, u
18c50 6e 6c 65 73 73 20 69 6e 70 75 74 20 69 73 20 69  nless input is i
18c60 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a  nteractive..**.*
18c70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
18c80 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
18c90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
18ca0 63 65 73 73 5f 69 6e 70 75 74 28 73 74 72 75 63  cess_input(struc
18cb0 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
18cc0 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20  *p, FILE *in){. 
18cd0 20 63 68 61 72 20 2a 7a 4c 69 6e 65 20 3d 20 30   char *zLine = 0
18ce0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
18cf0 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 6c 69 6e  single input lin
18d00 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  e */.  char *zSq
18d10 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
18d20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20   /* Accumulated 
18d30 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  SQL text */.  in
18d40 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20  t nLine;        
18d50 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
18d60 68 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 69 6e  h of current lin
18d70 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 20  e */.  int nSql 
18d80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18d90 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 53 71   /* Bytes of zSq
18da0 6c 5b 5d 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e  l[] used */.  in
18db0 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20  t nAlloc = 0;   
18dc0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
18dd0 61 74 65 64 20 7a 53 71 6c 5b 5d 20 73 70 61 63  ated zSql[] spac
18de0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 50  e */.  int nSqlP
18df0 72 69 6f 72 20 3d 20 30 3b 20 20 20 20 20 20 20  rior = 0;       
18e00 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 53 71   /* Bytes of zSq
18e10 6c 5b 5d 20 75 73 65 64 20 62 79 20 70 72 69 6f  l[] used by prio
18e20 72 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  r line */.  char
18e30 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 20 20   *zErrMsg;      
18e40 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
18e50 65 73 73 61 67 65 20 72 65 74 75 72 6e 65 64 20  essage returned 
18e60 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18e80 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  * Error code */.
18e90 20 20 69 6e 74 20 65 72 72 43 6e 74 20 3d 20 30    int errCnt = 0
18ea0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
18eb0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
18ec0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 69  seen */.  int li
18ed0 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  neno = 0;       
18ee0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
18ef0 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
18f00 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20  int startline = 
18f10 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e  0;        /* Lin
18f20 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61  e number for sta
18f30 72 74 20 6f 66 20 63 75 72 72 65 6e 74 20 69 6e  rt of current in
18f40 70 75 74 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28  put */..  while(
18f50 20 65 72 72 43 6e 74 3d 3d 30 20 7c 7c 20 21 62   errCnt==0 || !b
18f60 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 7c 7c 20  ail_on_error || 
18f70 28 69 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e 5f  (in==0 && stdin_
18f80 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 29 20  is_interactive) 
18f90 29 7b 0a 20 20 20 20 66 66 6c 75 73 68 28 70 2d  ){.    fflush(p-
18fa0 3e 6f 75 74 29 3b 0a 20 20 20 20 7a 4c 69 6e 65  >out);.    zLine
18fb0 20 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e   = one_input_lin
18fc0 65 28 69 6e 2c 20 7a 4c 69 6e 65 2c 20 6e 53 71  e(in, zLine, nSq
18fd0 6c 3e 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  l>0);.    if( zL
18fe0 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
18ff0 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70 75 74 20  /* End of input 
19000 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 64  */.      if( std
19010 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
19020 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29  e ) printf("\n")
19030 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19040 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 65     }.    if( see
19050 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20  nInterrupt ){.  
19060 20 20 20 20 69 66 28 20 69 6e 21 3d 30 20 29 20      if( in!=0 ) 
19070 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 73 65 65  break;.      see
19080 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a  nInterrupt = 0;.
19090 20 20 20 20 7d 0a 20 20 20 20 6c 69 6e 65 6e 6f      }.    lineno
190a0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6e 53 71 6c  ++;.    if( nSql
190b0 3d 3d 30 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74  ==0 && _all_whit
190c0 65 73 70 61 63 65 28 7a 4c 69 6e 65 29 20 29 7b  espace(zLine) ){
190d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 63  .      if( p->ec
190e0 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25  hoOn ) printf("%
190f0 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20  s\n", zLine);.  
19100 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
19110 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e    }.    if( zLin
19120 65 20 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27  e && zLine[0]=='
19130 2e 27 20 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b  .' && nSql==0 ){
19140 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 63  .      if( p->ec
19150 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25  hoOn ) printf("%
19160 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20  s\n", zLine);.  
19170 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61      rc = do_meta
19180 5f 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65 2c 20  _command(zLine, 
19190 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
191a0 3d 3d 32 20 29 7b 20 2f 2a 20 65 78 69 74 20 72  ==2 ){ /* exit r
191b0 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  equested */.    
191c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
191d0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b   }else if( rc ){
191e0 0a 20 20 20 20 20 20 20 20 65 72 72 43 6e 74 2b  .        errCnt+
191f0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
19200 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
19210 0a 20 20 20 20 69 66 28 20 6c 69 6e 65 5f 69 73  .    if( line_is
19220 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61  _command_termina
19230 74 6f 72 28 7a 4c 69 6e 65 29 20 26 26 20 6c 69  tor(zLine) && li
19240 6e 65 5f 69 73 5f 63 6f 6d 70 6c 65 74 65 28 7a  ne_is_complete(z
19250 53 71 6c 2c 20 6e 53 71 6c 29 20 29 7b 0a 20 20  Sql, nSql) ){.  
19260 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65      memcpy(zLine
19270 2c 22 3b 22 2c 32 29 3b 0a 20 20 20 20 7d 0a 20  ,";",2);.    }. 
19280 20 20 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65     nLine = strle
19290 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  n30(zLine);.    
192a0 69 66 28 20 6e 53 71 6c 2b 6e 4c 69 6e 65 2b 32  if( nSql+nLine+2
192b0 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >=nAlloc ){.    
192c0 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 53 71 6c 2b    nAlloc = nSql+
192d0 6e 4c 69 6e 65 2b 31 30 30 3b 0a 20 20 20 20 20  nLine+100;.     
192e0 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63 28   zSql = realloc(
192f0 7a 53 71 6c 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20  zSql, nAlloc);. 
19300 20 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30       if( zSql==0
19310 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
19320 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
19330 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
19340 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65  y\n");.        e
19350 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
19360 20 20 20 20 7d 0a 20 20 20 20 6e 53 71 6c 50 72      }.    nSqlPr
19370 69 6f 72 20 3d 20 6e 53 71 6c 3b 0a 20 20 20 20  ior = nSql;.    
19380 69 66 28 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( nSql==0 ){. 
19390 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
193a0 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4c 69 6e 65    for(i=0; zLine
193b0 5b 69 5d 20 26 26 20 49 73 53 70 61 63 65 28 7a  [i] && IsSpace(z
193c0 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  Line[i]); i++){}
193d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
193e0 41 6c 6c 6f 63 3e 30 20 26 26 20 7a 53 71 6c 21  Alloc>0 && zSql!
193f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
19400 70 79 28 7a 53 71 6c 2c 20 7a 4c 69 6e 65 2b 69  py(zSql, zLine+i
19410 2c 20 6e 4c 69 6e 65 2b 31 2d 69 29 3b 0a 20 20  , nLine+1-i);.  
19420 20 20 20 20 73 74 61 72 74 6c 69 6e 65 20 3d 20      startline = 
19430 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 6e 53  lineno;.      nS
19440 71 6c 20 3d 20 6e 4c 69 6e 65 2d 69 3b 0a 20 20  ql = nLine-i;.  
19450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
19460 53 71 6c 5b 6e 53 71 6c 2b 2b 5d 20 3d 20 27 5c  Sql[nSql++] = '\
19470 6e 27 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  n';.      memcpy
19480 28 7a 53 71 6c 2b 6e 53 71 6c 2c 20 7a 4c 69 6e  (zSql+nSql, zLin
19490 65 2c 20 6e 4c 69 6e 65 2b 31 29 3b 0a 20 20 20  e, nLine+1);.   
194a0 20 20 20 6e 53 71 6c 20 2b 3d 20 6e 4c 69 6e 65     nSql += nLine
194b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
194c0 6e 53 71 6c 20 26 26 20 6c 69 6e 65 5f 63 6f 6e  nSql && line_con
194d0 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28  tains_semicolon(
194e0 26 7a 53 71 6c 5b 6e 53 71 6c 50 72 69 6f 72 5d  &zSql[nSqlPrior]
194f0 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50 72 69 6f 72  , nSql-nSqlPrior
19500 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
19510 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6d    && sqlite3_com
19520 70 6c 65 74 65 28 7a 53 71 6c 29 20 29 7b 0a 20  plete(zSql) ){. 
19530 20 20 20 20 20 70 2d 3e 63 6e 74 20 3d 20 30 3b       p->cnt = 0;
19540 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  .      open_db(p
19550 2c 20 30 29 3b 0a 20 20 20 20 20 20 42 45 47 49  , 0);.      BEGI
19560 4e 5f 54 49 4d 45 52 3b 0a 20 20 20 20 20 20 72  N_TIMER;.      r
19570 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70  c = shell_exec(p
19580 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c  ->db, zSql, shel
19590 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26  l_callback, p, &
195a0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
195b0 45 4e 44 5f 54 49 4d 45 52 3b 0a 20 20 20 20 20  END_TIMER;.     
195c0 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d   if( rc || zErrM
195d0 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  sg ){.        ch
195e0 61 72 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b  ar zPrefix[100];
195f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 21  .        if( in!
19600 3d 30 20 7c 7c 20 21 73 74 64 69 6e 5f 69 73 5f  =0 || !stdin_is_
19610 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a 20  interactive ){. 
19620 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19630 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
19640 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65 66  (zPrefix), zPref
19650 69 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ix, .           
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 22 45 72 72 6f 72 3a 20 6e 65 61 72 20 6c 69 6e  "Error: near lin
19680 65 20 25 64 3a 22 2c 20 73 74 61 72 74 6c 69 6e  e %d:", startlin
19690 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
196a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
196b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
196c0 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a  zeof(zPrefix), z
196d0 50 72 65 66 69 78 2c 20 22 45 72 72 6f 72 3a 22  Prefix, "Error:"
196e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
196f0 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67       if( zErrMsg
19700 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
19710 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
19720 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65   "%s %s\n", zPre
19730 66 69 78 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  fix, zErrMsg);. 
19740 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19750 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
19760 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73            zErrMs
19770 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
19780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
19790 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
197a0 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65 66  "%s %s\n", zPref
197b0 69 78 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ix, sqlite3_errm
197c0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
197d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72      }.        er
197e0 72 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rCnt++;.      }.
197f0 20 20 20 20 20 20 6e 53 71 6c 20 3d 20 30 3b 0a        nSql = 0;.
19800 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 53      }else if( nS
19810 71 6c 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65  ql && _all_white
19820 73 70 61 63 65 28 7a 53 71 6c 29 20 29 7b 0a 20  space(zSql) ){. 
19830 20 20 20 20 20 69 66 28 20 70 2d 3e 65 63 68 6f       if( p->echo
19840 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c  On ) printf("%s\
19850 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n", zSql);.     
19860 20 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 7d   nSql = 0;.    }
19870 0a 20 20 7d 0a 20 20 69 66 28 20 6e 53 71 6c 20  .  }.  if( nSql 
19880 29 7b 0a 20 20 20 20 69 66 28 20 21 5f 61 6c 6c  ){.    if( !_all
19890 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53 71 6c  _whitespace(zSql
198a0 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
198b0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
198c0 72 3a 20 69 6e 63 6f 6d 70 6c 65 74 65 20 53 51  r: incomplete SQ
198d0 4c 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  L: %s\n", zSql);
198e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
198f0 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 66 72 65  zSql);.  }.  fre
19900 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 72 65 74 75  e(zLine);.  retu
19910 72 6e 20 65 72 72 43 6e 74 3e 30 3b 0a 7d 0a 0a  rn errCnt>0;.}..
19920 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
19930 61 74 68 6e 61 6d 65 20 77 68 69 63 68 20 69 73  athname which is
19940 20 74 68 65 20 75 73 65 72 27 73 20 68 6f 6d 65   the user's home
19950 20 64 69 72 65 63 74 6f 72 79 2e 20 20 41 0a 2a   directory.  A.*
19960 2a 20 30 20 72 65 74 75 72 6e 20 69 6e 64 69 63  * 0 return indic
19970 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6f 66  ates an error of
19980 20 73 6f 6d 65 20 6b 69 6e 64 2e 0a 2a 2f 0a 73   some kind..*/.s
19990 74 61 74 69 63 20 63 68 61 72 20 2a 66 69 6e 64  tatic char *find
199a0 5f 68 6f 6d 65 5f 64 69 72 28 76 6f 69 64 29 7b  _home_dir(void){
199b0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a  .  static char *
199c0 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b  home_dir = NULL;
199d0 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64 69 72 20  .  if( home_dir 
199e0 29 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69  ) return home_di
199f0 72 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  r;..#if !defined
19a00 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  (_WIN32) && !def
19a10 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20 21  ined(WIN32) && !
19a20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
19a30 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
19a40 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66  __RTP__) && !def
19a50 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
19a60 29 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ).  {.    struct
19a70 20 70 61 73 73 77 64 20 2a 70 77 65 6e 74 3b 0a   passwd *pwent;.
19a80 20 20 20 20 75 69 64 5f 74 20 75 69 64 20 3d 20      uid_t uid = 
19a90 67 65 74 75 69 64 28 29 3b 0a 20 20 20 20 69 66  getuid();.    if
19aa0 28 20 28 70 77 65 6e 74 3d 67 65 74 70 77 75 69  ( (pwent=getpwui
19ab0 64 28 75 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29  d(uid)) != NULL)
19ac0 20 7b 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64 69   {.      home_di
19ad0 72 20 3d 20 70 77 65 6e 74 2d 3e 70 77 5f 64 69  r = pwent->pw_di
19ae0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  r;.    }.  }.#en
19af0 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
19b00 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 2f  (_WIN32_WCE).  /
19b10 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61 72  * Windows CE (ar
19b20 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63  m-wince-mingw32c
19b30 65 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74 20  e-gcc) does not 
19b40 70 72 6f 76 69 64 65 20 67 65 74 65 6e 76 28 29  provide getenv()
19b50 0a 20 20 20 2a 2f 0a 20 20 68 6f 6d 65 5f 64 69  .   */.  home_di
19b60 72 20 3d 20 22 2f 22 3b 0a 23 65 6c 73 65 0a 0a  r = "/";.#else..
19b70 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
19b80 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
19b90 49 4e 33 32 29 0a 20 20 69 66 20 28 21 68 6f 6d  IN32).  if (!hom
19ba0 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d  e_dir) {.    hom
19bb0 65 5f 64 69 72 20 3d 20 67 65 74 65 6e 76 28 22  e_dir = getenv("
19bc0 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20  USERPROFILE");. 
19bd0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 20   }.#endif..  if 
19be0 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20  (!home_dir) {.  
19bf0 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74    home_dir = get
19c00 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20 20 7d  env("HOME");.  }
19c10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
19c20 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
19c30 28 57 49 4e 33 32 29 0a 20 20 69 66 20 28 21 68  (WIN32).  if (!h
19c40 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 63  ome_dir) {.    c
19c50 68 61 72 20 2a 7a 44 72 69 76 65 2c 20 2a 7a 50  har *zDrive, *zP
19c60 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  ath;.    int n;.
19c70 20 20 20 20 7a 44 72 69 76 65 20 3d 20 67 65 74      zDrive = get
19c80 65 6e 76 28 22 48 4f 4d 45 44 52 49 56 45 22 29  env("HOMEDRIVE")
19c90 3b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 67 65  ;.    zPath = ge
19ca0 74 65 6e 76 28 22 48 4f 4d 45 50 41 54 48 22 29  tenv("HOMEPATH")
19cb0 3b 0a 20 20 20 20 69 66 28 20 7a 44 72 69 76 65  ;.    if( zDrive
19cc0 20 26 26 20 7a 50 61 74 68 20 29 7b 0a 20 20 20   && zPath ){.   
19cd0 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
19ce0 7a 44 72 69 76 65 29 20 2b 20 73 74 72 6c 65 6e  zDrive) + strlen
19cf0 33 30 28 7a 50 61 74 68 29 20 2b 20 31 3b 0a 20  30(zPath) + 1;. 
19d00 20 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20       home_dir = 
19d10 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20  malloc( n );.   
19d20 20 20 20 69 66 28 20 68 6f 6d 65 5f 64 69 72 3d     if( home_dir=
19d30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19d40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
19d50 72 69 6e 74 66 28 6e 2c 20 68 6f 6d 65 5f 64 69  rintf(n, home_di
19d60 72 2c 20 22 25 73 25 73 22 2c 20 7a 44 72 69 76  r, "%s%s", zDriv
19d70 65 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e, zPath);.     
19d80 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72   return home_dir
19d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 6f 6d 65  ;.    }.    home
19da0 5f 64 69 72 20 3d 20 22 63 3a 5c 5c 22 3b 0a 20  _dir = "c:\\";. 
19db0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69   }.#endif..#endi
19dc0 66 20 2f 2a 20 21 5f 57 49 4e 33 32 5f 57 43 45  f /* !_WIN32_WCE
19dd0 20 2a 2f 0a 0a 20 20 69 66 28 20 68 6f 6d 65 5f   */..  if( home_
19de0 64 69 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  dir ){.    int n
19df0 20 3d 20 73 74 72 6c 65 6e 33 30 28 68 6f 6d 65   = strlen30(home
19e00 5f 64 69 72 29 20 2b 20 31 3b 0a 20 20 20 20 63  _dir) + 1;.    c
19e10 68 61 72 20 2a 7a 20 3d 20 6d 61 6c 6c 6f 63 28  har *z = malloc(
19e20 20 6e 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 20   n );.    if( z 
19e30 29 20 6d 65 6d 63 70 79 28 7a 2c 20 68 6f 6d 65  ) memcpy(z, home
19e40 5f 64 69 72 2c 20 6e 29 3b 0a 20 20 20 20 68 6f  _dir, n);.    ho
19e50 6d 65 5f 64 69 72 20 3d 20 7a 3b 0a 20 20 7d 0a  me_dir = z;.  }.
19e60 0a 20 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64  .  return home_d
19e70 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ir;.}../*.** Rea
19e80 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65  d input from the
19e90 20 66 69 6c 65 20 67 69 76 65 6e 20 62 79 20 73   file given by s
19ea0 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65  qliterc_override
19eb0 2e 20 20 4f 72 20 69 66 20 74 68 61 74 0a 2a 2a  .  Or if that.**
19ec0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 4e 55   parameter is NU
19ed0 4c 4c 2c 20 74 61 6b 65 20 69 6e 70 75 74 20 66  LL, take input f
19ee0 72 6f 6d 20 7e 2f 2e 73 71 6c 69 74 65 72 63 0a  rom ~/.sqliterc.
19ef0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
19f00 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
19f10 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
19f20 74 20 70 72 6f 63 65 73 73 5f 73 71 6c 69 74 65  t process_sqlite
19f30 72 63 28 0a 20 20 73 74 72 75 63 74 20 63 61 6c  rc(.  struct cal
19f40 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 20  lback_data *p,  
19f50 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
19f60 72 61 74 69 6f 6e 20 64 61 74 61 20 2a 2f 0a 20  ration data */. 
19f70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
19f80 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65 20 20  iterc_override  
19f90 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6e 66   /* Name of conf
19fa0 69 67 20 66 69 6c 65 2e 20 4e 55 4c 4c 20 74 6f  ig file. NULL to
19fb0 20 75 73 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a   use default */.
19fc0 29 7b 0a 20 20 63 68 61 72 20 2a 68 6f 6d 65 5f  ){.  char *home_
19fd0 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f  dir = NULL;.  co
19fe0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
19ff0 72 63 20 3d 20 73 71 6c 69 74 65 72 63 5f 6f 76  rc = sqliterc_ov
1a000 65 72 72 69 64 65 3b 0a 20 20 63 68 61 72 20 2a  erride;.  char *
1a010 7a 42 75 66 20 3d 20 30 3b 0a 20 20 46 49 4c 45  zBuf = 0;.  FILE
1a020 20 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69   *in = NULL;.  i
1a030 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 69 66  nt rc = 0;..  if
1a040 20 28 73 71 6c 69 74 65 72 63 20 3d 3d 20 4e 55   (sqliterc == NU
1a050 4c 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64  LL) {.    home_d
1a060 69 72 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f 64  ir = find_home_d
1a070 69 72 28 29 3b 0a 20 20 20 20 69 66 28 20 68 6f  ir();.    if( ho
1a080 6d 65 5f 64 69 72 3d 3d 30 20 29 7b 0a 23 69 66  me_dir==0 ){.#if
1a090 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f   !defined(__RTP_
1a0a0 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
1a0b0 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 20 20  WRS_KERNEL).    
1a0c0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1a0d0 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 63 61 6e  ,"%s: Error: can
1a0e0 6e 6f 74 20 6c 6f 63 61 74 65 20 79 6f 75 72 20  not locate your 
1a0f0 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 5c 6e  home directory\n
1a100 22 2c 20 41 72 67 76 30 29 3b 0a 23 65 6e 64 69  ", Argv0);.#endi
1a110 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  f.      return 1
1a120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1a130 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1a140 3b 0a 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c  ;.    zBuf = sql
1a150 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1a160 2f 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65  /.sqliterc",home
1a170 5f 64 69 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  _dir);.    sqlit
1a180 65 72 63 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a  erc = zBuf;.  }.
1a190 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c    in = fopen(sql
1a1a0 69 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69  iterc,"rb");.  i
1a1b0 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28  f( in ){.    if(
1a1c0 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
1a1d0 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 66  ctive ){.      f
1a1e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 2d  printf(stderr,"-
1a1f0 2d 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75 72  - Loading resour
1a200 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c 73  ces from %s\n",s
1a210 71 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d 0a  qliterc);.    }.
1a220 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73      rc = process
1a230 5f 69 6e 70 75 74 28 70 2c 69 6e 29 3b 0a 20 20  _input(p,in);.  
1a240 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1a250 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1a260 28 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e  (zBuf);.  return
1a270 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
1a280 6f 77 20 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d  ow available com
1a290 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
1a2a0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  s.*/.static cons
1a2b0 74 20 63 68 61 72 20 7a 4f 70 74 69 6f 6e 73 5b  t char zOptions[
1a2c0 5d 20 3d 20 0a 20 20 22 20 20 20 2d 62 61 69 6c  ] = .  "   -bail
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 73 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69  stop after hitti
1a2f0 6e 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20  ng an error\n". 
1a300 20 22 20 20 20 2d 62 61 74 63 68 20 20 20 20 20   "   -batch     
1a310 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 20            force 
1a320 62 61 74 63 68 20 49 2f 4f 5c 6e 22 0a 20 20 22  batch I/O\n".  "
1a330 20 20 20 2d 63 6f 6c 75 6d 6e 20 20 20 20 20 20     -column      
1a340 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70          set outp
1a350 75 74 20 6d 6f 64 65 20 74 6f 20 27 63 6f 6c 75  ut mode to 'colu
1a360 6d 6e 27 5c 6e 22 0a 20 20 22 20 20 20 2d 63 6d  mn'\n".  "   -cm
1a370 64 20 43 4f 4d 4d 41 4e 44 20 20 20 20 20 20 20  d COMMAND       
1a380 20 20 72 75 6e 20 5c 22 43 4f 4d 4d 41 4e 44 5c    run \"COMMAND\
1a390 22 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  " before reading
1a3a0 20 73 74 64 69 6e 5c 6e 22 0a 20 20 22 20 20 20   stdin\n".  "   
1a3b0 2d 63 73 76 20 20 20 20 20 20 20 20 20 20 20 20  -csv            
1a3c0 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20       set output 
1a3d0 6d 6f 64 65 20 74 6f 20 27 63 73 76 27 5c 6e 22  mode to 'csv'\n"
1a3e0 0a 20 20 22 20 20 20 2d 65 63 68 6f 20 20 20 20  .  "   -echo    
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
1a400 74 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66 6f 72  t commands befor
1a410 65 20 65 78 65 63 75 74 69 6f 6e 5c 6e 22 0a 20  e execution\n". 
1a420 20 22 20 20 20 2d 69 6e 69 74 20 46 49 4c 45 4e   "   -init FILEN
1a430 41 4d 45 20 20 20 20 20 20 20 72 65 61 64 2f 70  AME       read/p
1a440 72 6f 63 65 73 73 20 6e 61 6d 65 64 20 66 69 6c  rocess named fil
1a450 65 5c 6e 22 0a 20 20 22 20 20 20 2d 5b 6e 6f 5d  e\n".  "   -[no]
1a460 68 65 61 64 65 72 20 20 20 20 20 20 20 20 20 20  header          
1a470 74 75 72 6e 20 68 65 61 64 65 72 73 20 6f 6e 20  turn headers on 
1a480 6f 72 20 6f 66 66 5c 6e 22 0a 23 69 66 20 64 65  or off\n".#if de
1a490 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1a4a0 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20  BLE_MEMSYS3) || 
1a4b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1a4c0 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20  NABLE_MEMSYS5). 
1a4d0 20 22 20 20 20 2d 68 65 61 70 20 53 49 5a 45 20   "   -heap SIZE 
1a4e0 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f            Size o
1a4f0 66 20 68 65 61 70 20 66 6f 72 20 6d 65 6d 73 79  f heap for memsy
1a500 73 33 20 6f 72 20 6d 65 6d 73 79 73 35 5c 6e 22  s3 or memsys5\n"
1a510 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20 2d 68  .#endif.  "   -h
1a520 65 6c 70 20 20 20 20 20 20 20 20 20 20 20 20 20  elp             
1a530 20 20 20 73 68 6f 77 20 74 68 69 73 20 6d 65 73     show this mes
1a540 73 61 67 65 5c 6e 22 0a 20 20 22 20 20 20 2d 68  sage\n".  "   -h
1a550 74 6d 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  tml             
1a560 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f     set output mo
1a570 64 65 20 74 6f 20 48 54 4d 4c 5c 6e 22 0a 20 20  de to HTML\n".  
1a580 22 20 20 20 2d 69 6e 74 65 72 61 63 74 69 76 65  "   -interactive
1a590 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 20 69           force i
1a5a0 6e 74 65 72 61 63 74 69 76 65 20 49 2f 4f 5c 6e  nteractive I/O\n
1a5b0 22 0a 20 20 22 20 20 20 2d 6c 69 6e 65 20 20 20  ".  "   -line   
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1a5d0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
1a5e0 27 6c 69 6e 65 27 5c 6e 22 0a 20 20 22 20 20 20  'line'\n".  "   
1a5f0 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  -list           
1a600 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20       set output 
1a610 6d 6f 64 65 20 74 6f 20 27 6c 69 73 74 27 5c 6e  mode to 'list'\n
1a620 22 0a 20 20 22 20 20 20 2d 6d 6d 61 70 20 4e 20  ".  "   -mmap N 
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66               def
1a640 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 73  ault mmap size s
1a650 65 74 20 74 6f 20 4e 5c 6e 22 0a 23 69 66 64 65  et to N\n".#ifde
1a660 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a670 4d 55 4c 54 49 50 4c 45 58 0a 20 20 22 20 20 20  MULTIPLEX.  "   
1a680 2d 6d 75 6c 74 69 70 6c 65 78 20 20 20 20 20 20  -multiplex      
1a690 20 20 20 20 20 65 6e 61 62 6c 65 20 74 68 65 20       enable the 
1a6a0 6d 75 6c 74 69 70 6c 65 78 6f 72 20 56 46 53 5c  multiplexor VFS\
1a6b0 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20  n".#endif.  "   
1a6c0 2d 6e 75 6c 6c 76 61 6c 75 65 20 54 45 58 54 20  -nullvalue TEXT 
1a6d0 20 20 20 20 20 73 65 74 20 74 65 78 74 20 73 74       set text st
1a6e0 72 69 6e 67 20 66 6f 72 20 4e 55 4c 4c 20 76 61  ring for NULL va
1a6f0 6c 75 65 73 2e 20 44 65 66 61 75 6c 74 20 27 27  lues. Default ''
1a700 5c 6e 22 0a 20 20 22 20 20 20 2d 73 65 70 61 72  \n".  "   -separ
1a710 61 74 6f 72 20 53 45 50 20 20 20 20 20 20 20 73  ator SEP       s
1a720 65 74 20 6f 75 74 70 75 74 20 66 69 65 6c 64 20  et output field 
1a730 73 65 70 61 72 61 74 6f 72 2e 20 44 65 66 61 75  separator. Defau
1a740 6c 74 3a 20 27 7c 27 5c 6e 22 0a 20 20 22 20 20  lt: '|'\n".  "  
1a750 20 2d 73 74 61 74 73 20 20 20 20 20 20 20 20 20   -stats         
1a760 20 20 20 20 20 20 70 72 69 6e 74 20 6d 65 6d 6f        print memo
1a770 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  ry stats before 
1a780 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 5c 6e 22  each finalize\n"
1a790 0a 20 20 22 20 20 20 2d 76 65 72 73 69 6f 6e 20  .  "   -version 
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
1a7b0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 5c   SQLite version\
1a7c0 6e 22 0a 20 20 22 20 20 20 2d 76 66 73 20 4e 41  n".  "   -vfs NA
1a7d0 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ME            us
1a7e0 65 20 4e 41 4d 45 20 61 73 20 74 68 65 20 64 65  e NAME as the de
1a7f0 66 61 75 6c 74 20 56 46 53 5c 6e 22 0a 23 69 66  fault VFS\n".#if
1a800 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a810 45 5f 56 46 53 54 52 41 43 45 0a 20 20 22 20 20  E_VFSTRACE.  "  
1a820 20 2d 76 66 73 74 72 61 63 65 20 20 20 20 20 20   -vfstrace      
1a830 20 20 20 20 20 20 65 6e 61 62 6c 65 20 74 72 61        enable tra
1a840 63 69 6e 67 20 6f 66 20 61 6c 6c 20 56 46 53 20  cing of all VFS 
1a850 63 61 6c 6c 73 5c 6e 22 0a 23 65 6e 64 69 66 0a  calls\n".#endif.
1a860 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73  ;.static void us
1a870 61 67 65 28 69 6e 74 20 73 68 6f 77 44 65 74 61  age(int showDeta
1a880 69 6c 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73  il){.  fprintf(s
1a890 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 73  tderr,.      "Us
1a8a0 61 67 65 3a 20 25 73 20 5b 4f 50 54 49 4f 4e 53  age: %s [OPTIONS
1a8b0 5d 20 46 49 4c 45 4e 41 4d 45 20 5b 53 51 4c 5d  ] FILENAME [SQL]
1a8c0 5c 6e 22 20 20 0a 20 20 20 20 20 20 22 46 49 4c  \n"  .      "FIL
1a8d0 45 4e 41 4d 45 20 69 73 20 74 68 65 20 6e 61 6d  ENAME is the nam
1a8e0 65 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20 64  e of an SQLite d
1a8f0 61 74 61 62 61 73 65 2e 20 41 20 6e 65 77 20 64  atabase. A new d
1a900 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
1a910 65 64 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20  ed\n".      "if 
1a920 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1a930 74 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69  t previously exi
1a940 73 74 2e 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a  st.\n", Argv0);.
1a950 20 20 69 66 28 20 73 68 6f 77 44 65 74 61 69 6c    if( showDetail
1a960 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1a970 73 74 64 65 72 72 2c 20 22 4f 50 54 49 4f 4e 53  stderr, "OPTIONS
1a980 20 69 6e 63 6c 75 64 65 3a 5c 6e 25 73 22 2c 20   include:\n%s", 
1a990 7a 4f 70 74 69 6f 6e 73 29 3b 0a 20 20 7d 65 6c  zOptions);.  }el
1a9a0 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
1a9b0 73 74 64 65 72 72 2c 20 22 55 73 65 20 74 68 65  stderr, "Use the
1a9c0 20 2d 68 65 6c 70 20 6f 70 74 69 6f 6e 20 66 6f   -help option fo
1a9d0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1a9e0 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20  ormation\n");.  
1a9f0 7d 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  }.  exit(1);.}..
1aa00 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1aa10 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f 72   the state infor
1aa20 6d 61 74 69 6f 6e 20 69 6e 20 64 61 74 61 0a 2a  mation in data.*
1aa30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
1aa40 69 6e 5f 69 6e 69 74 28 73 74 72 75 63 74 20 63  in_init(struct c
1aa50 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 64 61  allback_data *da
1aa60 74 61 29 20 7b 0a 20 20 6d 65 6d 73 65 74 28 64  ta) {.  memset(d
1aa70 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ata, 0, sizeof(*
1aa80 64 61 74 61 29 29 3b 0a 20 20 64 61 74 61 2d 3e  data));.  data->
1aa90 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
1aaa0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2d  ;.  memcpy(data-
1aab0 3e 73 65 70 61 72 61 74 6f 72 2c 22 7c 22 2c 20  >separator,"|", 
1aac0 32 29 3b 0a 20 20 64 61 74 61 2d 3e 73 68 6f 77  2);.  data->show
1aad0 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 73 71  Header = 0;.  sq
1aae0 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
1aaf0 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 20  ITE_CONFIG_URI, 
1ab00 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  1);.  sqlite3_co
1ab10 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
1ab20 49 47 5f 4c 4f 47 2c 20 73 68 65 6c 6c 4c 6f 67  IG_LOG, shellLog
1ab30 2c 20 64 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  , data);.  sqlit
1ab40 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1ab50 6f 66 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2c 20  of(mainPrompt), 
1ab60 6d 61 69 6e 50 72 6f 6d 70 74 2c 22 73 71 6c 69  mainPrompt,"sqli
1ab70 74 65 3e 20 22 29 3b 0a 20 20 73 71 6c 69 74 65  te> ");.  sqlite
1ab80 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1ab90 66 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  f(continuePrompt
1aba0 29 2c 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70  ), continuePromp
1abb0 74 2c 22 20 20 20 2e 2e 2e 3e 20 22 29 3b 0a 20  t,"   ...> ");. 
1abc0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
1abd0 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49  SQLITE_CONFIG_SI
1abe0 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a 7d 0a 0a  NGLETHREAD);.}..
1abf0 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 61 72  /*.** Get the ar
1ac00 67 75 6d 65 6e 74 20 74 6f 20 61 6e 20 2d 2d 6f  gument to an --o
1ac10 70 74 69 6f 6e 2e 20 20 54 68 72 6f 77 20 61 6e  ption.  Throw an
1ac20 20 65 72 72 6f 72 20 61 6e 64 20 64 69 65 20 69   error and die i
1ac30 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  f no argument.**
1ac40 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
1ac50 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
1ac60 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61  mdline_option_va
1ac70 6c 75 65 28 69 6e 74 20 61 72 67 63 2c 20 63 68  lue(int argc, ch
1ac80 61 72 20 2a 2a 61 72 67 76 2c 20 69 6e 74 20 69  ar **argv, int i
1ac90 29 7b 0a 20 20 69 66 28 20 69 3d 3d 61 72 67 63  ){.  if( i==argc
1aca0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1acb0 73 74 64 65 72 72 2c 20 22 25 73 3a 20 45 72 72  stderr, "%s: Err
1acc0 6f 72 3a 20 6d 69 73 73 69 6e 67 20 61 72 67 75  or: missing argu
1acd0 6d 65 6e 74 20 74 6f 20 25 73 5c 6e 22 2c 0a 20  ment to %s\n",. 
1ace0 20 20 20 20 20 20 20 20 20 20 20 61 72 67 76 5b             argv[
1acf0 30 5d 2c 20 61 72 67 76 5b 61 72 67 63 2d 31 5d  0], argv[argc-1]
1ad00 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
1ad10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 67    }.  return arg
1ad20 76 5b 69 5d 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69  v[i];.}..int mai
1ad30 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  n(int argc, char
1ad40 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72   **argv){.  char
1ad50 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
1ad60 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
1ad70 5f 64 61 74 61 20 64 61 74 61 3b 0a 20 20 63 6f  _data data;.  co
1ad80 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 69 74 46  nst char *zInitF
1ad90 69 6c 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ile = 0;.  char 
1ada0 2a 7a 46 69 72 73 74 43 6d 64 20 3d 20 30 3b 0a  *zFirstCmd = 0;.
1adb0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
1adc0 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 77 61 72  c = 0;.  int war
1add0 6e 49 6e 6d 65 6d 6f 72 79 44 62 20 3d 20 30 3b  nInmemoryDb = 0;
1ade0 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 73  ..  if( strcmp(s
1adf0 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
1ae00 29 2c 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f  ),SQLITE_SOURCE_
1ae10 49 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 70  ID)!=0 ){.    fp
1ae20 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
1ae30 51 4c 69 74 65 20 68 65 61 64 65 72 20 61 6e 64  QLite header and
1ae40 20 73 6f 75 72 63 65 20 76 65 72 73 69 6f 6e 20   source version 
1ae50 6d 69 73 6d 61 74 63 68 5c 6e 25 73 5c 6e 25 73  mismatch\n%s\n%s
1ae60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ae70 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69   sqlite3_sourcei
1ae80 64 28 29 2c 20 53 51 4c 49 54 45 5f 53 4f 55 52  d(), SQLITE_SOUR
1ae90 43 45 5f 49 44 29 3b 0a 20 20 20 20 65 78 69 74  CE_ID);.    exit
1aea0 28 31 29 3b 0a 20 20 7d 0a 20 20 41 72 67 76 30  (1);.  }.  Argv0
1aeb0 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6d 61   = argv[0];.  ma
1aec0 69 6e 5f 69 6e 69 74 28 26 64 61 74 61 29 3b 0a  in_init(&data);.
1aed0 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72    stdin_is_inter
1aee0 61 63 74 69 76 65 20 3d 20 69 73 61 74 74 79 28  active = isatty(
1aef0 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  0);..  /* Make s
1af00 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
1af10 6c 69 64 20 73 69 67 6e 61 6c 20 68 61 6e 64 6c  lid signal handl
1af20 65 72 20 65 61 72 6c 79 2c 20 62 65 66 6f 72 65  er early, before
1af30 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 65   anything.  ** e
1af40 6c 73 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  lse is done..  *
1af50 2f 0a 23 69 66 64 65 66 20 53 49 47 49 4e 54 0a  /.#ifdef SIGINT.
1af60 20 20 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c    signal(SIGINT,
1af70 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c   interrupt_handl
1af80 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  er);.#endif..  /
1af90 2a 20 44 6f 20 61 6e 20 69 6e 69 74 69 61 6c 20  * Do an initial 
1afa0 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65  pass through the
1afb0 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
1afc0 67 75 6d 65 6e 74 20 74 6f 20 6c 6f 63 61 74 65  gument to locate
1afd0 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  .  ** the name o
1afe0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1aff0 69 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6f 66  ile, the name of
1b000 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1b010 69 6f 6e 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 74  ion file,.  ** t
1b020 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
1b030 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f  lternative mallo
1b040 63 20 68 65 61 70 2c 0a 20 20 2a 2a 20 61 6e 64  c heap,.  ** and
1b050 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61   the first comma
1b060 6e 64 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 20  nd to execute.. 
1b070 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
1b080 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1b090 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 7a 20   char *z;.    z 
1b0a0 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69  = argv[i];.    i
1b0b0 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a  f( z[0]!='-' ){.
1b0c0 20 20 20 20 20 20 69 66 28 20 64 61 74 61 2e 7a        if( data.z
1b0d0 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  DbFilename==0 ){
1b0e0 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 7a 44  .        data.zD
1b0f0 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 3b 0a 20  bFilename = z;. 
1b100 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1b110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b120 66 28 20 7a 46 69 72 73 74 43 6d 64 3d 3d 30 20  f( zFirstCmd==0 
1b130 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 69 72 73  ){.        zFirs
1b140 74 43 6d 64 20 3d 20 7a 3b 0a 20 20 20 20 20 20  tCmd = z;.      
1b150 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b160 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
1b170 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 45 72  f(stderr,"%s: Er
1b180 72 6f 72 3a 20 74 6f 6f 20 6d 61 6e 79 20 6f 70  ror: too many op
1b190 74 69 6f 6e 73 3a 20 5c 22 25 73 5c 22 5c 6e 22  tions: \"%s\"\n"
1b1a0 2c 20 41 72 67 76 30 2c 20 61 72 67 76 5b 69 5d  , Argv0, argv[i]
1b1b0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
1b1c0 28 73 74 64 65 72 72 2c 22 55 73 65 20 2d 68 65  (stderr,"Use -he
1b1d0 6c 70 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66  lp for a list of
1b1e0 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20   options.\n");. 
1b1f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b200 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 31     }.    if( z[1
1b210 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
1b220 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
1b230 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30 0a  -separator")==0.
1b240 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a       || strcmp(z
1b250 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d  ,"-nullvalue")==
1b260 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70  0.     || strcmp
1b270 28 7a 2c 22 2d 63 6d 64 22 29 3d 3d 30 0a 20 20  (z,"-cmd")==0.  
1b280 20 20 29 7b 0a 20 20 20 20 20 20 28 76 6f 69 64    ){.      (void
1b290 29 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f  )cmdline_option_
1b2a0 76 61 6c 75 65 28 61 72 67 63 2c 20 61 72 67 76  value(argc, argv
1b2b0 2c 20 2b 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  , ++i);.    }els
1b2c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
1b2d0 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20  -init")==0 ){.  
1b2e0 20 20 20 20 7a 49 6e 69 74 46 69 6c 65 20 3d 20      zInitFile = 
1b2f0 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
1b300 61 6c 75 65 28 61 72 67 63 2c 20 61 72 67 76 2c  alue(argc, argv,
1b310 20 2b 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ++i);.    }else
1b320 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1b330 62 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20  batch")==0 ){.  
1b340 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63      /* Need to c
1b350 68 65 63 6b 20 66 6f 72 20 62 61 74 63 68 20 6d  heck for batch m
1b360 6f 64 65 20 68 65 72 65 20 74 6f 20 73 6f 20 77  ode here to so w
1b370 65 20 63 61 6e 20 61 76 6f 69 64 20 70 72 69 6e  e can avoid prin
1b380 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ting.      ** in
1b390 66 6f 72 6d 61 74 69 6f 6e 61 6c 20 6d 65 73 73  formational mess
1b3a0 61 67 65 73 20 28 6c 69 6b 65 20 66 72 6f 6d 20  ages (like from 
1b3b0 70 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72 63  process_sqliterc
1b3c0 29 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  ) before .      
1b3d0 2a 2a 20 77 65 20 64 6f 20 74 68 65 20 61 63 74  ** we do the act
1b3e0 75 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ual processing o
1b3f0 66 20 61 72 67 75 6d 65 6e 74 73 20 6c 61 74 65  f arguments late
1b400 72 20 69 6e 20 61 20 73 65 63 6f 6e 64 20 70 61  r in a second pa
1b410 73 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ss..      */.   
1b420 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65     stdin_is_inte
1b430 72 61 63 74 69 76 65 20 3d 20 30 3b 0a 20 20 20  ractive = 0;.   
1b440 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1b450 70 28 7a 2c 22 2d 68 65 61 70 22 29 3d 3d 30 20  p(z,"-heap")==0 
1b460 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
1b470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1b480 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SYS3) || defined
1b490 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
1b4a0 45 4d 53 59 53 35 29 0a 20 20 20 20 20 20 63 6f  EMSYS5).      co
1b4b0 6e 73 74 20 63 68 61 72 20 2a 7a 53 69 7a 65 3b  nst char *zSize;
1b4c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
1b4d0 6e 74 36 34 20 73 7a 48 65 61 70 3b 0a 0a 20 20  nt64 szHeap;..  
1b4e0 20 20 20 20 7a 53 69 7a 65 20 3d 20 63 6d 64 6c      zSize = cmdl
1b4f0 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65  ine_option_value
1b500 28 61 72 67 63 2c 20 61 72 67 76 2c 20 2b 2b 69  (argc, argv, ++i
1b510 29 3b 0a 20 20 20 20 20 20 73 7a 48 65 61 70 20  );.      szHeap 
1b520 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a  = integerValue(z
1b530 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
1b540 20 73 7a 48 65 61 70 3e 30 78 37 66 66 66 30 30   szHeap>0x7fff00
1b550 30 30 20 29 20 73 7a 48 65 61 70 20 3d 20 30 78  00 ) szHeap = 0x
1b560 37 66 66 66 30 30 30 30 3b 0a 20 20 20 20 20 20  7fff0000;.      
1b570 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
1b580 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41  QLITE_CONFIG_HEA
1b590 50 2c 20 6d 61 6c 6c 6f 63 28 28 69 6e 74 29 73  P, malloc((int)s
1b5a0 7a 48 65 61 70 29 2c 20 28 69 6e 74 29 73 7a 48  zHeap), (int)szH
1b5b0 65 61 70 2c 20 36 34 29 3b 0a 23 65 6e 64 69 66  eap, 64);.#endif
1b5c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b5d0 4e 41 42 4c 45 5f 56 46 53 54 52 41 43 45 0a 20  NABLE_VFSTRACE. 
1b5e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1b5f0 63 6d 70 28 7a 2c 22 2d 76 66 73 74 72 61 63 65  cmp(z,"-vfstrace
1b600 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65  ")==0 ){.      e
1b610 78 74 65 72 6e 20 69 6e 74 20 76 66 73 74 72 61  xtern int vfstra
1b620 63 65 5f 72 65 67 69 73 74 65 72 28 0a 20 20 20  ce_register(.   
1b630 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1b640 20 2a 7a 54 72 61 63 65 4e 61 6d 65 2c 0a 20 20   *zTraceName,.  
1b650 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1b660 72 20 2a 7a 4f 6c 64 56 66 73 4e 61 6d 65 2c 0a  r *zOldVfsName,.
1b670 20 20 20 20 20 20 20 20 20 69 6e 74 20 28 2a 78           int (*x
1b680 4f 75 74 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  Out)(const char*
1b690 2c 76 6f 69 64 2a 29 2c 0a 20 20 20 20 20 20 20  ,void*),.       
1b6a0 20 20 76 6f 69 64 20 2a 70 4f 75 74 41 72 67 2c    void *pOutArg,
1b6b0 0a 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61  .         int ma
1b6c0 6b 65 44 65 66 61 75 6c 74 0a 20 20 20 20 20 20  keDefault.      
1b6d0 29 3b 0a 20 20 20 20 20 20 76 66 73 74 72 61 63  );.      vfstrac
1b6e0 65 5f 72 65 67 69 73 74 65 72 28 22 74 72 61 63  e_register("trac
1b6f0 65 22 2c 30 2c 28 69 6e 74 28 2a 29 28 63 6f 6e  e",0,(int(*)(con
1b700 73 74 20 63 68 61 72 2a 2c 76 6f 69 64 2a 29 29  st char*,void*))
1b710 66 70 75 74 73 2c 73 74 64 65 72 72 2c 31 29 3b  fputs,stderr,1);
1b720 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1b730 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c  QLITE_ENABLE_MUL
1b740 54 49 50 4c 45 58 0a 20 20 20 20 7d 65 6c 73 65  TIPLEX.    }else
1b750 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1b760 6d 75 6c 74 69 70 6c 65 78 22 29 3d 3d 30 20 29  multiplex")==0 )
1b770 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 69  {.      extern i
1b780 6e 74 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69  nt sqlite3_multi
1b790 70 6c 65 5f 69 6e 69 74 69 61 6c 69 7a 65 28 63  ple_initialize(c
1b7a0 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b  onst char*,int);
1b7b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1b7c0 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c  ultiplex_initial
1b7d0 69 7a 65 28 30 2c 20 31 29 3b 0a 23 65 6e 64 69  ize(0, 1);.#endi
1b7e0 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
1b7f0 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 6d 61 70 22  strcmp(z,"-mmap"
1b800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
1b810 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d  lite3_int64 sz =
1b820 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6d   integerValue(cm
1b830 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c  dline_option_val
1b840 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69  ue(argc,argv,++i
1b850 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1b860 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
1b870 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
1b880 2c 20 73 7a 2c 20 73 7a 29 3b 0a 20 20 20 20 7d  , sz, sz);.    }
1b890 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1b8a0 7a 2c 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a  z,"-vfs")==0 ){.
1b8b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
1b8c0 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65  s *pVfs = sqlite
1b8d0 33 5f 76 66 73 5f 66 69 6e 64 28 63 6d 64 6c 69  3_vfs_find(cmdli
1b8e0 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
1b8f0 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b  argc,argv,++i));
1b900 0a 20 20 20 20 20 20 69 66 28 20 70 56 66 73 20  .      if( pVfs 
1b910 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b920 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
1b930 70 56 66 73 2c 20 31 29 3b 0a 20 20 20 20 20 20  pVfs, 1);.      
1b940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
1b950 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1b960 6e 6f 20 73 75 63 68 20 56 46 53 3a 20 5c 22 25  no such VFS: \"%
1b970 73 5c 22 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29  s\"\n", argv[i])
1b980 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
1b990 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1b9a0 0a 20 20 7d 0a 20 20 69 66 28 20 64 61 74 61 2e  .  }.  if( data.
1b9b0 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  zDbFilename==0 )
1b9c0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1b9d0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
1b9e0 20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e     data.zDbFilen
1b9f0 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22  ame = ":memory:"
1ba00 3b 0a 20 20 20 20 77 61 72 6e 49 6e 6d 65 6d 6f  ;.    warnInmemo
1ba10 72 79 44 62 20 3d 20 31 3b 0a 23 65 6c 73 65 0a  ryDb = 1;.#else.
1ba20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1ba30 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 6e  rr,"%s: Error: n
1ba40 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  o database filen
1ba50 61 6d 65 20 73 70 65 63 69 66 69 65 64 5c 6e 22  ame specified\n"
1ba60 2c 20 41 72 67 76 30 29 3b 0a 20 20 20 20 72 65  , Argv0);.    re
1ba70 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20  turn 1;.#endif. 
1ba80 20 7d 0a 20 20 64 61 74 61 2e 6f 75 74 20 3d 20   }.  data.out = 
1ba90 73 74 64 6f 75 74 3b 0a 0a 20 20 2f 2a 20 47 6f  stdout;..  /* Go
1baa0 20 61 68 65 61 64 20 61 6e 64 20 6f 70 65 6e 20   ahead and open 
1bab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1bac0 65 20 69 66 20 69 74 20 61 6c 72 65 61 64 79 20  e if it already 
1bad0 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 0a  exists.  If the.
1bae0 20 20 2a 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e    ** file does n
1baf0 6f 74 20 65 78 69 73 74 2c 20 64 65 6c 61 79 20  ot exist, delay 
1bb00 6f 70 65 6e 69 6e 67 20 69 74 2e 20 20 54 68 69  opening it.  Thi
1bb10 73 20 70 72 65 76 65 6e 74 73 20 65 6d 70 74 79  s prevents empty
1bb20 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
1bb30 69 6c 65 73 20 66 72 6f 6d 20 62 65 69 6e 67 20  iles from being 
1bb40 63 72 65 61 74 65 64 20 69 66 20 61 20 75 73 65  created if a use
1bb50 72 20 6d 69 73 74 79 70 65 73 20 74 68 65 20 64  r mistypes the d
1bb60 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61 72 67  atabase name arg
1bb70 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68  ument.  ** to th
1bb80 65 20 73 71 6c 69 74 65 20 63 6f 6d 6d 61 6e 64  e sqlite command
1bb90 2d 6c 69 6e 65 20 74 6f 6f 6c 2e 0a 20 20 2a 2f  -line tool..  */
1bba0 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 64 61  .  if( access(da
1bbb0 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  ta.zDbFilename, 
1bbc0 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65  0)==0 ){.    ope
1bbd0 6e 5f 64 62 28 26 64 61 74 61 2c 20 30 29 3b 0a  n_db(&data, 0);.
1bbe0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
1bbf0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  s the initializa
1bc00 74 69 6f 6e 20 66 69 6c 65 20 69 66 20 74 68 65  tion file if the
1bc10 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 6e  re is one.  If n
1bc20 6f 20 2d 69 6e 69 74 20 6f 70 74 69 6f 6e 0a 20  o -init option. 
1bc30 20 2a 2a 20 69 73 20 67 69 76 65 6e 20 6f 6e 20   ** is given on 
1bc40 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1bc50 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 66 69 6c  , look for a fil
1bc60 65 20 6e 61 6d 65 64 20 7e 2f 2e 73 71 6c 69 74  e named ~/.sqlit
1bc70 65 72 63 20 61 6e 64 0a 20 20 2a 2a 20 74 72 79  erc and.  ** try
1bc80 20 74 6f 20 70 72 6f 63 65 73 73 20 69 74 2e 0a   to process it..
1bc90 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 72 6f 63    */.  rc = proc
1bca0 65 73 73 5f 73 71 6c 69 74 65 72 63 28 26 64 61  ess_sqliterc(&da
1bcb0 74 61 2c 7a 49 6e 69 74 46 69 6c 65 29 3b 0a 20  ta,zInitFile);. 
1bcc0 20 69 66 28 20 72 63 3e 30 20 29 7b 0a 20 20 20   if( rc>0 ){.   
1bcd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1bce0 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73 65 63  .  /* Make a sec
1bcf0 6f 6e 64 20 70 61 73 73 20 74 68 72 6f 75 67 68  ond pass through
1bd00 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e   the command-lin
1bd10 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  e argument and s
1bd20 65 74 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 73 2e  et.  ** options.
1bd30 20 20 54 68 69 73 20 73 65 63 6f 6e 64 20 70 61    This second pa
1bd40 73 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  ss is delayed un
1bd50 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 69 6e  til after the in
1bd60 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
1bd70 2a 20 66 69 6c 65 20 69 73 20 70 72 6f 63 65 73  * file is proces
1bd80 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  sed so that the 
1bd90 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
1bda0 75 6d 65 6e 74 73 20 77 69 6c 6c 20 6f 76 65 72  uments will over
1bdb0 72 69 64 65 0a 20 20 2a 2a 20 73 65 74 74 69 6e  ride.  ** settin
1bdc0 67 73 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61  gs in the initia
1bdd0 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 0a 20  lization file.. 
1bde0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
1bdf0 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1be00 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b   char *z = argv[
1be10 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  i];.    if( z[0]
1be20 21 3d 27 2d 27 20 29 20 63 6f 6e 74 69 6e 75 65  !='-' ) continue
1be30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d  ;.    if( z[1]==
1be40 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  '-' ){ z++; }.  
1be50 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
1be60 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20  -init")==0 ){.  
1be70 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c      i++;.    }el
1be80 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1be90 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29 7b 0a 20  "-html")==0 ){. 
1bea0 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d       data.mode =
1beb0 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20   MODE_Html;.    
1bec0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1bed0 28 7a 2c 22 2d 6c 69 73 74 22 29 3d 3d 30 20 29  (z,"-list")==0 )
1bee0 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64  {.      data.mod
1bef0 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20  e = MODE_List;. 
1bf00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1bf10 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22 29 3d 3d  cmp(z,"-line")==
1bf20 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
1bf30 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65  mode = MODE_Line
1bf40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1bf50 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f 6c 75 6d  strcmp(z,"-colum
1bf60 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
1bf70 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
1bf80 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c  _Column;.    }el
1bf90 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1bfa0 22 2d 63 73 76 22 29 3d 3d 30 20 29 7b 0a 20 20  "-csv")==0 ){.  
1bfb0 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
1bfc0 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20  MODE_Csv;.      
1bfd0 6d 65 6d 63 70 79 28 64 61 74 61 2e 73 65 70 61  memcpy(data.sepa
1bfe0 72 61 74 6f 72 2c 22 2c 22 2c 32 29 3b 0a 20 20  rator,",",2);.  
1bff0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1c000 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61 74 6f 72  mp(z,"-separator
1c010 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ")==0 ){.      s
1c020 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1c030 73 69 7a 65 6f 66 28 64 61 74 61 2e 73 65 70 61  sizeof(data.sepa
1c040 72 61 74 6f 72 29 2c 20 64 61 74 61 2e 73 65 70  rator), data.sep
1c050 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  arator,.        
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c070 25 73 22 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74 69  %s",cmdline_opti
1c080 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72  on_value(argc,ar
1c090 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 7d 65  gv,++i));.    }e
1c0a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1c0b0 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d 3d  ,"-nullvalue")==
1c0c0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1c0d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1c0e0 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c 75  of(data.nullvalu
1c0f0 65 29 2c 20 64 61 74 61 2e 6e 75 6c 6c 76 61 6c  e), data.nullval
1c100 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
1c110 20 20 20 20 20 20 20 20 20 20 20 22 25 73 22 2c             "%s",
1c120 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
1c130 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b  alue(argc,argv,+
1c140 2b 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  +i));.    }else 
1c150 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
1c160 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  eader")==0 ){.  
1c170 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
1c180 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  der = 1;.    }el
1c190 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1c1a0 22 2d 6e 6f 68 65 61 64 65 72 22 29 3d 3d 30 20  "-noheader")==0 
1c1b0 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73 68  ){.      data.sh
1c1c0 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
1c1d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1c1e0 6d 70 28 7a 2c 22 2d 65 63 68 6f 22 29 3d 3d 30  mp(z,"-echo")==0
1c1f0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 65   ){.      data.e
1c200 63 68 6f 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  choOn = 1;.    }
1c210 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1c220 7a 2c 22 2d 73 74 61 74 73 22 29 3d 3d 30 20 29  z,"-stats")==0 )
1c230 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73 74 61  {.      data.sta
1c240 74 73 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65  tsOn = 1;.    }e
1c250 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1c260 2c 22 2d 62 61 69 6c 22 29 3d 3d 30 20 29 7b 0a  ,"-bail")==0 ){.
1c270 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72        bail_on_er
1c280 72 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ror = 1;.    }el
1c290 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1c2a0 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29  "-version")==0 )
1c2b0 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
1c2c0 25 73 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  %s %s\n", sqlite
1c2d0 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
1c2e0 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
1c2f0 28 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ());.      retur
1c300 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
1c310 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e  f( strcmp(z,"-in
1c320 74 65 72 61 63 74 69 76 65 22 29 3d 3d 30 20 29  teractive")==0 )
1c330 7b 0a 20 20 20 20 20 20 73 74 64 69 6e 5f 69 73  {.      stdin_is
1c340 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20 31  _interactive = 1
1c350 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c360 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61 74 63 68  strcmp(z,"-batch
1c370 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ")==0 ){.      s
1c380 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
1c390 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ive = 0;.    }el
1c3a0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1c3b0 22 2d 68 65 61 70 22 29 3d 3d 30 20 29 7b 0a 20  "-heap")==0 ){. 
1c3c0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65       i++;.    }e
1c3d0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1c3e0 2c 22 2d 6d 6d 61 70 22 29 3d 3d 30 20 29 7b 0a  ,"-mmap")==0 ){.
1c3f0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
1c400 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1c410 7a 2c 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a  z,"-vfs")==0 ){.
1c420 20 20 20 20 20 20 69 2b 2b 3b 0a 23 69 66 64 65        i++;.#ifde
1c430 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c440 56 46 53 54 52 41 43 45 0a 20 20 20 20 7d 65 6c  VFSTRACE.    }el
1c450 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1c460 22 2d 76 66 73 74 72 61 63 65 22 29 3d 3d 30 20  "-vfstrace")==0 
1c470 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 23 65  ){.      i++;.#e
1c480 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1c490 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 50  TE_ENABLE_MULTIP
1c4a0 4c 45 58 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LEX.    }else if
1c4b0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 75 6c  ( strcmp(z,"-mul
1c4c0 74 69 70 6c 65 78 22 29 3d 3d 30 20 29 7b 0a 20  tiplex")==0 ){. 
1c4d0 20 20 20 20 20 69 2b 2b 3b 0a 23 65 6e 64 69 66       i++;.#endif
1c4e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1c4f0 74 72 63 6d 70 28 7a 2c 22 2d 68 65 6c 70 22 29  trcmp(z,"-help")
1c500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73 61  ==0 ){.      usa
1c510 67 65 28 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ge(1);.    }else
1c520 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1c530 63 6d 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cmd")==0 ){.    
1c540 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20    if( i==argc-1 
1c550 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7a  ) break;.      z
1c560 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f   = cmdline_optio
1c570 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67  n_value(argc,arg
1c580 76 2c 2b 2b 69 29 3b 0a 20 20 20 20 20 20 69 66  v,++i);.      if
1c590 28 20 7a 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( z[0]=='.' ){. 
1c5a0 20 20 20 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d         rc = do_m
1c5b0 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 2c 20 26  eta_command(z, &
1c5c0 64 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  data);.        i
1c5d0 66 28 20 72 63 20 26 26 20 62 61 69 6c 5f 6f 6e  f( rc && bail_on
1c5e0 5f 65 72 72 6f 72 20 29 20 72 65 74 75 72 6e 20  _error ) return 
1c5f0 72 63 3d 3d 32 20 3f 20 30 20 3a 20 72 63 3b 0a  rc==2 ? 0 : rc;.
1c600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c610 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61       open_db(&da
1c620 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ta, 0);.        
1c630 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28  rc = shell_exec(
1c640 64 61 74 61 2e 64 62 2c 20 7a 2c 20 73 68 65 6c  data.db, z, shel
1c650 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  l_callback, &dat
1c660 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
1c670 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73        if( zErrMs
1c680 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
1c690 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1c6a0 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
1c6b0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
1c6c0 20 20 20 20 69 66 28 20 62 61 69 6c 5f 6f 6e 5f      if( bail_on_
1c6d0 65 72 72 6f 72 20 29 20 72 65 74 75 72 6e 20 72  error ) return r
1c6e0 63 21 3d 30 20 3f 20 72 63 20 3a 20 31 3b 0a 20  c!=0 ? rc : 1;. 
1c6f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c700 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1c710 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1c720 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c  rr,"Error: unabl
1c730 65 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c  e to process SQL
1c740 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 29 3b 0a   \"%s\"\n", z);.
1c750 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 61            if( ba
1c760 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29 20 72 65  il_on_error ) re
1c770 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1c780 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c790 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
1c7a0 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
1c7b0 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 6f  Error: unknown o
1c7c0 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 41 72  ption: %s\n", Ar
1c7d0 67 76 30 2c 20 7a 29 3b 0a 20 20 20 20 20 20 66  gv0, z);.      f
1c7e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
1c7f0 73 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c  se -help for a l
1c800 69 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c  ist of options.\
1c810 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
1c820 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
1c830 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64 20    if( zFirstCmd 
1c840 29 7b 0a 20 20 20 20 2f 2a 20 52 75 6e 20 6a 75  ){.    /* Run ju
1c850 73 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74  st the command t
1c860 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1c870 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 20 20  database name.  
1c880 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 46 69    */.    if( zFi
1c890 72 73 74 43 6d 64 5b 30 5d 3d 3d 27 2e 27 20 29  rstCmd[0]=='.' )
1c8a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 6f 5f  {.      rc = do_
1c8b0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 46 69  meta_command(zFi
1c8c0 72 73 74 43 6d 64 2c 20 26 64 61 74 61 29 3b 0a  rstCmd, &data);.
1c8d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 32 20        if( rc==2 
1c8e0 29 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ) rc = 0;.    }e
1c8f0 6c 73 65 7b 0a 20 20 20 20 20 20 6f 70 65 6e 5f  lse{.      open_
1c900 64 62 28 26 64 61 74 61 2c 20 30 29 3b 0a 20 20  db(&data, 0);.  
1c910 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65      rc = shell_e
1c920 78 65 63 28 64 61 74 61 2e 64 62 2c 20 7a 46 69  xec(data.db, zFi
1c930 72 73 74 43 6d 64 2c 20 73 68 65 6c 6c 5f 63 61  rstCmd, shell_ca
1c940 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
1c950 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
1c960 69 66 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29  if( zErrMsg!=0 )
1c970 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1c980 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
1c990 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
1c9a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1c9b0 20 72 63 21 3d 30 20 3f 20 72 63 20 3a 20 31 3b   rc!=0 ? rc : 1;
1c9c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c9d0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1c9e0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1c9f0 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20  ,"Error: unable 
1ca00 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 5c  to process SQL \
1ca10 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 72 73 74  "%s\"\n", zFirst
1ca20 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Cmd);.        re
1ca30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1ca40 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1ca50 20 20 20 20 2f 2a 20 52 75 6e 20 63 6f 6d 6d 61      /* Run comma
1ca60 6e 64 73 20 72 65 63 65 69 76 65 64 20 66 72 6f  nds received fro
1ca70 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  m standard input
1ca80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ca90 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
1caa0 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 63 68  tive ){.      ch
1cab0 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 20 20 20  ar *zHome;.     
1cac0 20 63 68 61 72 20 2a 7a 48 69 73 74 6f 72 79 20   char *zHistory 
1cad0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
1cae0 48 69 73 74 6f 72 79 3b 0a 20 20 20 20 20 20 70  History;.      p
1caf0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
1cb00 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 25  SQLite version %
1cb10 73 20 25 2e 31 39 73 5c 6e 22 20 2f 2a 65 78 74  s %.19s\n" /*ext
1cb20 72 61 2d 76 65 72 73 69 6f 6e 2d 69 6e 66 6f 2a  ra-version-info*
1cb30 2f 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65 72  /.        "Enter
1cb40 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20 69   \".help\" for i
1cb50 6e 73 74 72 75 63 74 69 6f 6e 73 5c 6e 22 0a 20  nstructions\n". 
1cb60 20 20 20 20 20 20 20 22 45 6e 74 65 72 20 53 51         "Enter SQ
1cb70 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74 65 72  L statements ter
1cb80 6d 69 6e 61 74 65 64 20 77 69 74 68 20 61 20 5c  minated with a \
1cb90 22 3b 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ";\"\n",.       
1cba0 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
1cbb0 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73  ion(), sqlite3_s
1cbc0 6f 75 72 63 65 69 64 28 29 0a 20 20 20 20 20 20  ourceid().      
1cbd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 77 61 72  );.      if( war
1cbe0 6e 49 6e 6d 65 6d 6f 72 79 44 62 20 29 7b 0a 20  nInmemoryDb ){. 
1cbf0 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 0a          printf(.
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 22 57 61 72              "War
1cc10 6e 69 6e 67 3a 20 63 6f 6e 6e 65 63 74 65 64 20  ning: connected 
1cc20 74 6f 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  to an in-memory 
1cc30 64 61 74 61 62 61 73 65 2e 20 22 0a 20 20 20 20  database. ".    
1cc40 20 20 20 20 20 20 20 20 22 55 73 65 20 5c 22 2e          "Use \".
1cc50 6f 70 65 6e 20 46 49 4c 45 4e 41 4d 45 5c 22 20  open FILENAME\" 
1cc60 74 6f 20 63 68 61 6e 67 65 5c 6e 74 6f 20 61 20  to change\nto a 
1cc70 70 65 72 73 69 73 74 65 6e 74 20 22 0a 20 20 20  persistent ".   
1cc80 20 20 20 20 20 20 20 20 20 22 6f 6e 2d 64 69 73           "on-dis
1cc90 6b 20 64 61 74 61 62 61 73 65 2e 5c 6e 22 0a 20  k database.\n". 
1cca0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1ccb0 20 7d 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d   }.      zHome =
1ccc0 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29   find_home_dir()
1ccd0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d  ;.      if( zHom
1cce0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 48 69  e ){.        nHi
1ccf0 73 74 6f 72 79 20 3d 20 73 74 72 6c 65 6e 33 30  story = strlen30
1cd00 28 7a 48 6f 6d 65 29 20 2b 20 32 30 3b 0a 20 20  (zHome) + 20;.  
1cd10 20 20 20 20 20 20 69 66 28 20 28 7a 48 69 73 74        if( (zHist
1cd20 6f 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69  ory = malloc(nHi
1cd30 73 74 6f 72 79 29 29 21 3d 30 20 29 7b 0a 20 20  story))!=0 ){.  
1cd40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1cd50 73 6e 70 72 69 6e 74 66 28 6e 48 69 73 74 6f 72  snprintf(nHistor
1cd60 79 2c 20 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f  y, zHistory,"%s/
1cd70 2e 73 71 6c 69 74 65 5f 68 69 73 74 6f 72 79 22  .sqlite_history"
1cd80 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20  , zHome);.      
1cd90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
1cda0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
1cdb0 44 4c 49 4e 45 29 20 26 26 20 48 41 56 45 5f 52  DLINE) && HAVE_R
1cdc0 45 41 44 4c 49 4e 45 3d 3d 31 0a 20 20 20 20 20  EADLINE==1.     
1cdd0 20 69 66 28 20 7a 48 69 73 74 6f 72 79 20 29 20   if( zHistory ) 
1cde0 72 65 61 64 5f 68 69 73 74 6f 72 79 28 7a 48 69  read_history(zHi
1cdf0 73 74 6f 72 79 29 3b 0a 23 65 6e 64 69 66 0a 20  story);.#endif. 
1ce00 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73       rc = proces
1ce10 73 5f 69 6e 70 75 74 28 26 64 61 74 61 2c 20 30  s_input(&data, 0
1ce20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 48 69  );.      if( zHi
1ce30 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20  story ){.       
1ce40 20 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28   stifle_history(
1ce50 31 30 30 29 3b 0a 20 20 20 20 20 20 20 20 77 72  100);.        wr
1ce60 69 74 65 5f 68 69 73 74 6f 72 79 28 7a 48 69 73  ite_history(zHis
1ce70 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 20 20 66  tory);.        f
1ce80 72 65 65 28 7a 48 69 73 74 6f 72 79 29 3b 0a 20  ree(zHistory);. 
1ce90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1cea0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  {.      rc = pro
1ceb0 63 65 73 73 5f 69 6e 70 75 74 28 26 64 61 74 61  cess_input(&data
1cec0 2c 20 73 74 64 69 6e 29 3b 0a 20 20 20 20 7d 0a  , stdin);.    }.
1ced0 20 20 7d 0a 20 20 73 65 74 5f 74 61 62 6c 65 5f    }.  set_table_
1cee0 6e 61 6d 65 28 26 64 61 74 61 2c 20 30 29 3b 0a  name(&data, 0);.
1cef0 20 20 69 66 28 20 64 61 74 61 2e 64 62 20 29 7b    if( data.db ){
1cf00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
1cf10 73 65 28 64 61 74 61 2e 64 62 29 3b 0a 20 20 7d  se(data.db);.  }
1cf20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1cf30 64 61 74 61 2e 7a 46 72 65 65 4f 6e 43 6c 6f 73  data.zFreeOnClos
1cf40 65 29 3b 20 0a 20 20 72 65 74 75 72 6e 20 72 63  e); .  return rc
1cf50 3b 0a 7d 0a                                      ;.}.