/ Hex Artifact Content
Login

Artifact cee9f46f2688a261601b1fd3d7f4b3cddf9b5cdf:


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 20 64 65 66 69  #endif..#if defi
04d0: 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
04e0: 45 29 20 26 26 20 48 41 56 45 5f 52 45 41 44 4c  E) && HAVE_READL
04f0: 49 4e 45 21 3d 30 0a 23 20 69 6e 63 6c 75 64 65  INE!=0.# include
0500: 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c   <readline/readl
0510: 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ine.h>.# include
0520: 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f   <readline/histo
0530: 72 79 2e 68 3e 0a 23 65 6c 73 65 0a 23 20 75 6e  ry.h>.#else.# un
0540: 64 65 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e  def HAVE_READLIN
0550: 45 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  E.#endif.#if def
0560: 69 6e 65 64 28 48 41 56 45 5f 45 44 49 54 4c 49  ined(HAVE_EDITLI
0570: 4e 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  NE) && !defined(
0580: 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 0a 23  HAVE_READLINE).#
0590: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 52 45 41   define HAVE_REA
05a0: 44 4c 49 4e 45 20 31 0a 23 20 69 6e 63 6c 75 64  DLINE 1.# includ
05b0: 65 20 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64  e <editline/read
05c0: 6c 69 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  line.h>.#endif.#
05d0: 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45  if !defined(HAVE
05e0: 5f 52 45 41 44 4c 49 4e 45 29 0a 23 20 64 65 66  _READLINE).# def
05f0: 69 6e 65 20 61 64 64 5f 68 69 73 74 6f 72 79 28  ine add_history(
0600: 58 29 0a 23 20 64 65 66 69 6e 65 20 72 65 61 64  X).# define read
0610: 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65  _history(X).# de
0620: 66 69 6e 65 20 77 72 69 74 65 5f 68 69 73 74 6f  fine write_histo
0630: 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ry(X).# define s
0640: 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29  tifle_history(X)
0650: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
0660: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
0670: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23  defined(WIN32).#
0680: 20 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a   include <io.h>.
0690: 23 64 65 66 69 6e 65 20 69 73 61 74 74 79 28 68  #define isatty(h
06a0: 29 20 5f 69 73 61 74 74 79 28 68 29 0a 23 69 66  ) _isatty(h).#if
06b0: 6e 64 65 66 20 61 63 63 65 73 73 0a 23 20 64 65  ndef access.# de
06c0: 66 69 6e 65 20 61 63 63 65 73 73 28 66 2c 6d 29  fine access(f,m)
06d0: 20 5f 61 63 63 65 73 73 28 28 66 29 2c 28 6d 29   _access((f),(m)
06e0: 29 0a 23 65 6e 64 69 66 0a 23 75 6e 64 65 66 20  ).#endif.#undef 
06f0: 70 6f 70 65 6e 0a 23 64 65 66 69 6e 65 20 70 6f  popen.#define po
0700: 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 75 6e 64 65  pen _popen.#unde
0710: 66 20 70 63 6c 6f 73 65 0a 23 64 65 66 69 6e 65  f pclose.#define
0720: 20 70 63 6c 6f 73 65 20 5f 70 63 6c 6f 73 65 0a   pclose _pclose.
0730: 23 65 6c 73 65 0a 2f 2a 20 4d 61 6b 65 20 73 75  #else./* Make su
0740: 72 65 20 69 73 61 74 74 79 28 29 20 68 61 73 20  re isatty() has 
0750: 61 20 70 72 6f 74 6f 74 79 70 65 2e 0a 2a 2f 0a  a prototype..*/.
0760: 65 78 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74  extern int isatt
0770: 79 28 69 6e 74 29 3b 0a 0a 2f 2a 20 70 6f 70 65  y(int);../* pope
0780: 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65  n and pclose are
0790: 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f   not C89 functio
07a0: 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 20 73 6f  ns and so are so
07b0: 6d 65 74 69 6d 65 73 20 6f 6d 69 74 74 65 64 20  metimes omitted 
07c0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 3c 73 74 64  from.** the <std
07d0: 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a 2f 0a  io.h> header */.
07e0: 65 78 74 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70  extern FILE *pop
07f0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  en(const char*,c
0800: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 65 78 74  onst char*);.ext
0810: 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28 46  ern int pclose(F
0820: 49 4c 45 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ILE*);.#endif..#
0830: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
0840: 32 5f 57 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77  2_WCE)./* Window
0850: 73 20 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d  s CE (arm-wince-
0860: 6d 69 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64  mingw32ce-gcc) d
0870: 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20  oes not provide 
0880: 69 73 61 74 74 79 28 29 0a 20 2a 20 74 68 75 73  isatty(). * thus
0890: 20 77 65 20 61 6c 77 61 79 73 20 61 73 73 75 6d   we always assum
08a0: 65 20 74 68 61 74 20 77 65 20 68 61 76 65 20 61  e that we have a
08b0: 20 63 6f 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63   console. That c
08c0: 61 6e 20 62 65 0a 20 2a 20 6f 76 65 72 72 69 64  an be. * overrid
08d0: 64 65 6e 20 77 69 74 68 20 74 68 65 20 2d 62 61  den with the -ba
08e0: 74 63 68 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  tch command line
08f0: 20 6f 70 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65   option.. */.#de
0900: 66 69 6e 65 20 69 73 61 74 74 79 28 78 29 20 31  fine isatty(x) 1
0910: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70  .#endif../* ctyp
0920: 65 20 6d 61 63 72 6f 73 20 74 68 61 74 20 77 6f  e macros that wo
0930: 72 6b 20 77 69 74 68 20 73 69 67 6e 65 64 20 63  rk with signed c
0940: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 23 64 65  haracters */.#de
0950: 66 69 6e 65 20 49 73 53 70 61 63 65 28 58 29 20  fine IsSpace(X) 
0960: 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e   isspace((unsign
0970: 65 64 20 63 68 61 72 29 58 29 0a 23 64 65 66 69  ed char)X).#defi
0980: 6e 65 20 49 73 44 69 67 69 74 28 58 29 20 20 69  ne IsDigit(X)  i
0990: 73 64 69 67 69 74 28 28 75 6e 73 69 67 6e 65 64  sdigit((unsigned
09a0: 20 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65   char)X).#define
09b0: 20 54 6f 4c 6f 77 65 72 28 58 29 20 20 28 63 68   ToLower(X)  (ch
09c0: 61 72 29 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69  ar)tolower((unsi
09d0: 67 6e 65 64 20 63 68 61 72 29 58 29 0a 0a 0a 2f  gned char)X).../
09e0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74 69  * True if the ti
09f0: 6d 65 72 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  mer is enabled *
0a00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e 61  /.static int ena
0a10: 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a 0a 2f  bleTimer = 0;../
0a20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
0a30: 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20  rent wall-clock 
0a40: 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 73  time */.static s
0a50: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 69 6d  qlite3_int64 tim
0a60: 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a 20 20  eOfDay(void){.  
0a70: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
0a80: 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d 20 30  fs *clockVfs = 0
0a90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
0aa0: 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b  4 t;.  if( clock
0ab0: 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b 56 66  Vfs==0 ) clockVf
0ac0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
0ad0: 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 63  find(0);.  if( c
0ae0: 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73 69 6f  lockVfs->iVersio
0af0: 6e 3e 3d 31 20 26 26 20 63 6c 6f 63 6b 56 66 73  n>=1 && clockVfs
0b00: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
0b10: 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20 63 6c  t64!=0 ){.    cl
0b20: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
0b30: 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63 6b 56  TimeInt64(clockV
0b40: 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c 73 65  fs, &t);.  }else
0b50: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a  {.    double r;.
0b60: 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43      clockVfs->xC
0b70: 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f 63 6b  urrentTime(clock
0b80: 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20 74 20  Vfs, &r);.    t 
0b90: 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
0ba0: 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30 29 3b  )(r*86400000.0);
0bb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 3b  .  }.  return t;
0bc0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
0bd0: 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66  (_WIN32) && !def
0be0: 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20 21  ined(WIN32) && !
0bf0: 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52  defined(_WRS_KER
0c00: 4e 45 4c 29 20 5c 0a 20 26 26 20 21 64 65 66 69  NEL) \. && !defi
0c10: 6e 65 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e  ned(__minux).#in
0c20: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
0c30: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0c40: 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a  /resource.h>../*
0c50: 20 53 61 76 65 64 20 72 65 73 6f 75 72 63 65 20   Saved resource 
0c60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
0c70: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
0c80: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f   an operation */
0c90: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72  .static struct r
0ca0: 75 73 61 67 65 20 73 42 65 67 69 6e 3b 20 20 2f  usage sBegin;  /
0cb0: 2a 20 43 50 55 20 74 69 6d 65 20 61 74 20 73 74  * CPU time at st
0cc0: 61 72 74 20 2a 2f 0a 73 74 61 74 69 63 20 73 71  art */.static sq
0cd0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 65 67  lite3_int64 iBeg
0ce0: 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f  in;  /* Wall-clo
0cf0: 63 6b 20 74 69 6d 65 20 61 74 20 73 74 61 72 74  ck time at start
0d00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e   */../*.** Begin
0d10: 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61   timing an opera
0d20: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
0d30: 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72 28 76  oid beginTimer(v
0d40: 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62  oid){.  if( enab
0d50: 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20 20 20 67  leTimer ){.    g
0d60: 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
0d70: 53 45 4c 46 2c 20 26 73 42 65 67 69 6e 29 3b 0a  SELF, &sBegin);.
0d80: 20 20 20 20 69 42 65 67 69 6e 20 3d 20 74 69 6d      iBegin = tim
0d90: 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a  eOfDay();.  }.}.
0da0: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  ./* Return the d
0db0: 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f  ifference of two
0dc0: 20 74 69 6d 65 5f 73 74 72 75 63 74 73 20 69 6e   time_structs in
0dd0: 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74 61 74   seconds */.stat
0de0: 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65 44 69  ic double timeDi
0df0: 66 66 28 73 74 72 75 63 74 20 74 69 6d 65 76 61  ff(struct timeva
0e00: 6c 20 2a 70 53 74 61 72 74 2c 20 73 74 72 75 63  l *pStart, struc
0e10: 74 20 74 69 6d 65 76 61 6c 20 2a 70 45 6e 64 29  t timeval *pEnd)
0e20: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 45 6e 64  {.  return (pEnd
0e30: 2d 3e 74 76 5f 75 73 65 63 20 2d 20 70 53 74 61  ->tv_usec - pSta
0e40: 72 74 2d 3e 74 76 5f 75 73 65 63 29 2a 30 2e 30  rt->tv_usec)*0.0
0e50: 30 30 30 30 31 20 2b 20 0a 20 20 20 20 20 20 20  00001 + .       
0e60: 20 20 28 64 6f 75 62 6c 65 29 28 70 45 6e 64 2d    (double)(pEnd-
0e70: 3e 74 76 5f 73 65 63 20 2d 20 70 53 74 61 72 74  >tv_sec - pStart
0e80: 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a 0a 2f 2a  ->tv_sec);.}../*
0e90: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 74 69  .** Print the ti
0ea0: 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f  ming results..*/
0eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 64  .static void end
0ec0: 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69  Timer(void){.  i
0ed0: 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 29  f( enableTimer )
0ee0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 73  {.    struct rus
0ef0: 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20 73 71  age sEnd;.    sq
0f00: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64  lite3_int64 iEnd
0f10: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
0f20: 20 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55      getrusage(RU
0f30: 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 45 6e 64  SAGE_SELF, &sEnd
0f40: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 52  );.    printf("R
0f50: 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20 25 2e  un Time: real %.
0f60: 33 66 20 75 73 65 72 20 25 66 20 73 79 73 20 25  3f user %f sys %
0f70: 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28 69 45  f\n",.       (iE
0f80: 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a 30 2e 30  nd - iBegin)*0.0
0f90: 30 31 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44  01,.       timeD
0fa0: 69 66 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 75  iff(&sBegin.ru_u
0fb0: 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 75  time, &sEnd.ru_u
0fc0: 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20 74 69  time),.       ti
0fd0: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
0fe0: 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_stime, &sEnd.r
0ff0: 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20 7d 0a 7d  u_stime));.  }.}
1000: 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f  ..#define BEGIN_
1010: 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65 72  TIMER beginTimer
1020: 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54  ().#define END_T
1030: 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29 0a  IMER endTimer().
1040: 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45  #define HAS_TIME
1050: 52 20 31 0a 0a 23 65 6c 69 66 20 28 64 65 66 69  R 1..#elif (defi
1060: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
1070: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 0a 0a  efined(WIN32))..
1080: 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77  #include <window
1090: 73 2e 68 3e 0a 0a 2f 2a 20 53 61 76 65 64 20 72  s.h>../* Saved r
10a0: 65 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74  esource informat
10b0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69  ion for the begi
10c0: 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72  nning of an oper
10d0: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
10e0: 48 41 4e 44 4c 45 20 68 50 72 6f 63 65 73 73 3b  HANDLE hProcess;
10f0: 0a 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45  .static FILETIME
1100: 20 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a   ftKernelBegin;.
1110: 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20  static FILETIME 
1120: 66 74 55 73 65 72 42 65 67 69 6e 3b 0a 73 74 61  ftUserBegin;.sta
1130: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  tic sqlite3_int6
1140: 34 20 66 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74  4 ftWallBegin;.t
1150: 79 70 65 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e  ypedef BOOL (WIN
1160: 41 50 49 20 2a 47 45 54 50 52 4f 43 54 49 4d 45  API *GETPROCTIME
1170: 53 29 28 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c  S)(HANDLE, LPFIL
1180: 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ETIME, LPFILETIM
1190: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c  E, LPFILETIME, L
11a0: 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61 74  PFILETIME);.stat
11b0: 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53 20  ic GETPROCTIMES 
11c0: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
11d0: 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a  ddr = NULL;../*.
11e0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
11f0: 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65 72  if we have timer
1200: 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75 72   support.  Retur
1210: 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72 79  n 1 if necessary
1220: 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75 6e  .** support foun
1230: 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65 76  d (or found prev
1240: 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61 74  iously)..*/.stat
1250: 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72 28  ic int hasTimer(
1260: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65 74  void){.  if( get
1270: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1290: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
12a0: 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54 69   /* GetProcessTi
12b0: 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70 70  mes() isn't supp
12c0: 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20 61  orted in WIN95 a
12d0: 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57 69  nd some other Wi
12e0: 6e 64 6f 77 73 20 76 65 72 73 69 6f 6e 73 2e 0a  ndows versions..
12f0: 20 20 20 20 2a 2a 20 53 65 65 20 69 66 20 74 68      ** See if th
1300: 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72 65  e version we are
1310: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73 20   running on has 
1320: 69 74 2c 20 61 6e 64 20 69 66 20 69 74 20 64 6f  it, and if it do
1330: 65 73 2c 20 73 61 76 65 20 6f 66 66 0a 20 20 20  es, save off.   
1340: 20 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   ** a pointer to
1350: 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72 72   it and the curr
1360: 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e 64  ent process hand
1370: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 68  le..    */.    h
1380: 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75 72  Process = GetCur
1390: 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a 20  rentProcess();. 
13a0: 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73 20     if( hProcess 
13b0: 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41 4e  ){.      HINSTAN
13c0: 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c 6f  CE hinstLib = Lo
13d0: 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28 22  adLibrary(TEXT("
13e0: 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29 3b  Kernel32.dll"));
13f0: 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20  .      if( NULL 
1400: 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a 20  != hinstLib ){. 
1410: 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65 73         getProces
1420: 73 54 69 6d 65 73 41 64 64 72 20 3d 20 28 47 45  sTimesAddr = (GE
1430: 54 50 52 4f 43 54 49 4d 45 53 29 20 47 65 74 50  TPROCTIMES) GetP
1440: 72 6f 63 41 64 64 72 65 73 73 28 68 69 6e 73 74  rocAddress(hinst
1450: 4c 69 62 2c 20 22 47 65 74 50 72 6f 63 65 73 73  Lib, "GetProcess
1460: 54 69 6d 65 73 22 29 3b 0a 20 20 20 20 20 20 20  Times");.       
1470: 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74   if( NULL != get
1480: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1490: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
14a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
14b0: 7d 0a 20 20 20 20 20 20 20 20 46 72 65 65 4c 69  }.        FreeLi
14c0: 62 72 61 72 79 28 68 69 6e 73 74 4c 69 62 29 3b  brary(hinstLib);
14d0: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
14e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
14f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74  }../*.** Begin t
1500: 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  iming an operati
1510: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
1520: 64 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69  d beginTimer(voi
1530: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
1540: 54 69 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63  Timer && getProc
1550: 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a  essTimesAddr ){.
1560: 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66 74 43      FILETIME ftC
1570: 72 65 61 74 69 6f 6e 2c 20 66 74 45 78 69 74 3b  reation, ftExit;
1580: 0a 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54  .    getProcessT
1590: 69 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73  imesAddr(hProces
15a0: 73 2c 20 26 66 74 43 72 65 61 74 69 6f 6e 2c 20  s, &ftCreation, 
15b0: 26 66 74 45 78 69 74 2c 20 26 66 74 4b 65 72 6e  &ftExit, &ftKern
15c0: 65 6c 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72  elBegin, &ftUser
15d0: 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57 61  Begin);.    ftWa
15e0: 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66  llBegin = timeOf
15f0: 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Day();.  }.}../*
1600: 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66   Return the diff
1610: 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46 49  erence of two FI
1620: 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20 69  LETIME structs i
1630: 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74 61  n seconds */.sta
1640: 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65 44  tic double timeD
1650: 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70 53  iff(FILETIME *pS
1660: 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20 2a  tart, FILETIME *
1670: 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65 5f  pEnd){.  sqlite_
1680: 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20 3d  int64 i64Start =
1690: 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34   *((sqlite_int64
16a0: 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20 73   *) pStart);.  s
16b0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34 45  qlite_int64 i64E
16c0: 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69  nd = *((sqlite_i
16d0: 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a 20  nt64 *) pEnd);. 
16e0: 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65 29   return (double)
16f0: 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34 53   ((i64End - i64S
1700: 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30 30  tart) / 10000000
1710: 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .0);.}../*.** Pr
1720: 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72  int the timing r
1730: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
1740: 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72 28  c void endTimer(
1750: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
1760: 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74 50  bleTimer && getP
1770: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 29  rocessTimesAddr)
1780: 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66  {.    FILETIME f
1790: 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78 69  tCreation, ftExi
17a0: 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 20  t, ftKernelEnd, 
17b0: 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20 73  ftUserEnd;.    s
17c0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74 57  qlite3_int64 ftW
17d0: 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44  allEnd = timeOfD
17e0: 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72 6f  ay();.    getPro
17f0: 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50  cessTimesAddr(hP
1800: 72 6f 63 65 73 73 2c 20 26 66 74 43 72 65 61 74  rocess, &ftCreat
1810: 69 6f 6e 2c 20 26 66 74 45 78 69 74 2c 20 26 66  ion, &ftExit, &f
1820: 74 4b 65 72 6e 65 6c 45 6e 64 2c 20 26 66 74 55  tKernelEnd, &ftU
1830: 73 65 72 45 6e 64 29 3b 0a 20 20 20 20 70 72 69  serEnd);.    pri
1840: 6e 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20 72  ntf("Run Time: r
1850: 65 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25 66  eal %.3f user %f
1860: 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20   sys %f\n",.    
1870: 20 20 20 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20     (ftWallEnd - 
1880: 66 74 57 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30  ftWallBegin)*0.0
1890: 30 31 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44  01,.       timeD
18a0: 69 66 66 28 26 66 74 55 73 65 72 42 65 67 69 6e  iff(&ftUserBegin
18b0: 2c 20 26 66 74 55 73 65 72 45 6e 64 29 2c 0a 20  , &ftUserEnd),. 
18c0: 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26        timeDiff(&
18d0: 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26  ftKernelBegin, &
18e0: 66 74 4b 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20  ftKernelEnd));. 
18f0: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45   }.}..#define BE
1900: 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54  GIN_TIMER beginT
1910: 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45  imer().#define E
1920: 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65  ND_TIMER endTime
1930: 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f  r().#define HAS_
1940: 54 49 4d 45 52 20 68 61 73 54 69 6d 65 72 28 29  TIMER hasTimer()
1950: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
1960: 42 45 47 49 4e 5f 54 49 4d 45 52 20 0a 23 64 65  BEGIN_TIMER .#de
1970: 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 0a 23  fine END_TIMER.#
1980: 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52  define HAS_TIMER
1990: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
19a0: 20 55 73 65 64 20 74 6f 20 70 72 65 76 65 6e 74   Used to prevent
19b0: 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20   warnings about 
19c0: 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  unused parameter
19d0: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55  s.*/.#define UNU
19e0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29  SED_PARAMETER(x)
19f0: 20 28 76 6f 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a   (void)(x)../*.*
1a00: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
1a10: 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ng flag is set, 
1a20: 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78 65  then command exe
1a30: 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a 20  cution stops.** 
1a40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77  at an error if w
1a50: 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 61  e are not intera
1a60: 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ctive..*/.static
1a70: 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72 72   int bail_on_err
1a80: 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54  or = 0;../*.** T
1a90: 68 72 65 61 74 20 73 74 64 69 6e 20 61 73 20 61  hreat stdin as a
1aa0: 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e  n interactive in
1ab0: 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  put if the follo
1ac0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a  wing variable.**
1ad0: 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68 65 72   is true.  Other
1ae0: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73 74 64  wise, assume std
1af0: 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  in is connected 
1b00: 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70 69 70  to a file or pip
1b10: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b20: 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
1b30: 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a  ctive = 1;../*.*
1b40: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1b50: 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c 69  is the open SQLi
1b60: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57 65  te database.  We
1b70: 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72 0a   make a pointer.
1b80: 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ** to this datab
1b90: 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61 72  ase a static var
1ba0: 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74  iable so that it
1bb0: 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65 64   can be accessed
1bc0: 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49 4e  .** by the SIGIN
1bd0: 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e 74  T handler to int
1be0: 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  errupt database 
1bf0: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73  processing..*/.s
1c00: 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a 64  tatic sqlite3 *d
1c10: 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  b = 0;../*.** Tr
1c20: 75 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75  ue if an interru
1c30: 70 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68  pt (Control-C) h
1c40: 61 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64  as been received
1c50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61  ..*/.static vola
1c60: 74 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74  tile int seenInt
1c70: 65 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  errupt = 0;../*.
1c80: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e  ** This is the n
1c90: 61 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72  ame of our progr
1ca0: 61 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e  am. It is set in
1cb0: 20 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a   main(), used.**
1cc0: 20 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   in a number of 
1cd0: 6f 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f  other places, mo
1ce0: 73 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d  stly for error m
1cf0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
1d00: 69 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a  ic char *Argv0;.
1d10: 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74  ./*.** Prompt st
1d20: 72 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a  rings. Initializ
1d30: 65 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74  ed in main. Sett
1d40: 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e  able with.**   .
1d50: 70 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74  prompt main cont
1d60: 69 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  inue.*/.static c
1d70: 68 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32  har mainPrompt[2
1d80: 30 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74  0];     /* First
1d90: 20 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65   line prompt. de
1da0: 66 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20  fault: "sqlite> 
1db0: 22 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  "*/.static char 
1dc0: 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32  continuePrompt[2
1dd0: 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74  0]; /* Continuat
1de0: 69 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61  ion prompt. defa
1df0: 75 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20  ult: "   ...> " 
1e00: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  */../*.** Write 
1e10: 49 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68  I/O traces to th
1e20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65  e following stre
1e30: 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  am..*/.#ifdef SQ
1e40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
1e50: 41 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20  ACE.static FILE 
1e60: 2a 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65  *iotrace = 0;.#e
1e70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1e80: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
1e90: 69 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68  ike printf in th
1ea0: 61 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67  at its first arg
1eb0: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f  ument is a.** fo
1ec0: 72 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20  rmat string and 
1ed0: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
1ee0: 65 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20  ents are values 
1ef0: 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1f00: 64 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66  d.** in place of
1f10: 20 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20   % fields.  The 
1f20: 72 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74  result of format
1f30: 74 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67  ting this string
1f40: 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74  .** is written t
1f50: 6f 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69  o iotrace..*/.#i
1f60: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f70: 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69  LE_IOTRACE.stati
1f80: 63 20 76 6f 69 64 20 69 6f 74 72 61 63 65 50 72  c void iotracePr
1f90: 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20  intf(const char 
1fa0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1fb0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1fc0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 69  char *z;.  if( i
1fd0: 6f 74 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  otrace==0 ) retu
1fe0: 72 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  rn;.  va_start(a
1ff0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
2000: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
2010: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
2020: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2030: 20 20 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63    fprintf(iotrac
2040: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
2050: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
2060: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
2070: 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   Determines if a
2080: 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d   string is a num
2090: 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  ber of not..*/.s
20a0: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62  tatic int isNumb
20b0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
20c0: 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b  , int *realnum){
20d0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c  .  if( *z=='-' |
20e0: 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b  | *z=='+' ) z++;
20f0: 0a 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28  .  if( !IsDigit(
2100: 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  *z) ){.    retur
2110: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a  n 0;.  }.  z++;.
2120: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
2130: 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20  *realnum = 0;.  
2140: 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a  while( IsDigit(*
2150: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69  z) ){ z++; }.  i
2160: 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20  f( *z=='.' ){.  
2170: 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21    z++;.    if( !
2180: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
2190: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
21a0: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
21b0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
21c0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
21d0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  num = 1;.  }.  i
21e0: 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a  f( *z=='e' || *z
21f0: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b  =='E' ){.    z++
2200: 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b  ;.    if( *z=='+
2210: 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a  ' || *z=='-' ) z
2220: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44  ++;.    if( !IsD
2230: 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72  igit(*z) ) retur
2240: 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  n 0;.    while( 
2250: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  IsDigit(*z) ){ z
2260: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  ++; }.    if( re
2270: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
2280: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
2290: 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  rn *z==0;.}../*.
22a0: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 63 68 61 72  ** A global char
22b0: 2a 20 61 6e 64 20 61 6e 20 53 51 4c 20 66 75 6e  * and an SQL fun
22c0: 63 74 69 6f 6e 20 74 6f 20 61 63 63 65 73 73 20  ction to access 
22d0: 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
22e0: 65 20 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69  e .** from withi
22f0: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
2300: 6e 74 2e 20 54 68 69 73 20 70 72 6f 67 72 61 6d  nt. This program
2310: 20 75 73 65 64 20 74 6f 20 75 73 65 20 74 68 65   used to use the
2320: 20 0a 2a 2a 20 73 71 6c 69 74 65 5f 65 78 65 63   .** sqlite_exec
2330: 5f 70 72 69 6e 74 66 28 29 20 41 50 49 20 74 6f  _printf() API to
2340: 20 73 75 62 73 74 69 74 75 65 20 61 20 73 74 72   substitue a str
2350: 69 6e 67 20 69 6e 74 6f 20 61 6e 20 53 51 4c 20  ing into an SQL 
2360: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68  statement..** Th
2370: 65 20 63 6f 72 72 65 63 74 20 77 61 79 20 74 6f  e correct way to
2380: 20 64 6f 20 74 68 69 73 20 77 69 74 68 20 73 71   do this with sq
2390: 6c 69 74 65 33 20 69 73 20 74 6f 20 75 73 65 20  lite3 is to use 
23a0: 74 68 65 20 62 69 6e 64 20 41 50 49 2c 20 62 75  the bind API, bu
23b0: 74 0a 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 73  t.** since the s
23c0: 68 65 6c 6c 20 69 73 20 62 75 69 6c 74 20 61 72  hell is built ar
23d0: 6f 75 6e 64 20 74 68 65 20 63 61 6c 6c 62 61 63  ound the callbac
23e0: 6b 20 70 61 72 61 64 69 67 6d 20 69 74 20 77 6f  k paradigm it wo
23f0: 75 6c 64 20 62 65 20 61 20 6c 6f 74 0a 2a 2a 20  uld be a lot.** 
2400: 6f 66 20 77 6f 72 6b 2e 20 49 6e 73 74 65 61 64  of work. Instead
2410: 20 6a 75 73 74 20 75 73 65 20 74 68 69 73 20 68   just use this h
2420: 61 63 6b 2c 20 77 68 69 63 68 20 69 73 20 71 75  ack, which is qu
2430: 69 74 65 20 68 61 72 6d 6c 65 73 73 2e 0a 2a 2f  ite harmless..*/
2440: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2450: 61 72 20 2a 7a 53 68 65 6c 6c 53 74 61 74 69 63  ar *zShellStatic
2460: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f 69   = 0;.static voi
2470: 64 20 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e  d shellstaticFun
2480: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2490: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
24a0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
24b0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
24c0: 76 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 30  v.){.  assert( 0
24d0: 3d 3d 61 72 67 63 20 29 3b 0a 20 20 61 73 73 65  ==argc );.  asse
24e0: 72 74 28 20 7a 53 68 65 6c 6c 53 74 61 74 69 63  rt( zShellStatic
24f0: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2500: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
2510: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2520: 28 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65  (argv);.  sqlite
2530: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
2540: 6e 74 65 78 74 2c 20 7a 53 68 65 6c 6c 53 74 61  ntext, zShellSta
2550: 74 69 63 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  tic, -1, SQLITE_
2560: 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  STATIC);.}.../*.
2570: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2580: 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20  reads a line of 
2590: 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69  text from FILE i
25a0: 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65  n, stores.** the
25b0: 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20   text in memory 
25c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
25d0: 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72  lloc() and retur
25e0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
25f0: 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55  to the text.  NU
2600: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
2610: 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f  t end of file, o
2620: 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  r if malloc().**
2630: 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
2640: 20 7a 4c 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55   zLine is not NU
2650: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  LL then it is a 
2660: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20  malloced buffer 
2670: 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a  returned from.**
2680: 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c   a previous call
2690: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
26a0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 75   that may be reu
26b0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  sed..*/.static c
26c0: 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69  har *local_getli
26d0: 6e 65 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20  ne(char *zLine, 
26e0: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74  FILE *in){.  int
26f0: 20 6e 4c 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d   nLine = zLine==
2700: 30 20 3f 20 30 20 3a 20 31 30 30 3b 0a 20 20 69  0 ? 0 : 100;.  i
2710: 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69  nt n = 0;..  whi
2720: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
2730: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
2740: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
2750: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
2760: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
2770: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
2780: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
2790: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
27a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
27b0: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
27c0: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
27d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
27e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
27f0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
2800: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2810: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
2820: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
2830: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2840: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d   while( zLine[n]
2850: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) n++;.    if( 
2860: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
2870: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
2880: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20   n--;.      if( 
2890: 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31  n>0 && zLine[n-1
28a0: 5d 3d 3d 27 5c 72 27 20 29 20 6e 2d 2d 3b 0a 20  ]=='\r' ) n--;. 
28b0: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
28c0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
28d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28e0: 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zLine;.}../*.
28f0: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 73 69  ** Retrieve a si
2900: 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70  ngle line of inp
2910: 75 74 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49  ut text..**.** I
2920: 66 20 69 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61  f in==0 then rea
2930: 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20  d from standard 
2940: 69 6e 70 75 74 20 61 6e 64 20 70 72 6f 6d 70 74  input and prompt
2950: 20 62 65 66 6f 72 65 20 65 61 63 68 20 6c 69 6e   before each lin
2960: 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69  e..** If isConti
2970: 6e 75 61 74 69 6f 6e 20 69 73 20 74 72 75 65 2c  nuation is true,
2980: 20 74 68 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61   then a continua
2990: 74 69 6f 6e 20 70 72 6f 6d 70 74 20 69 73 20 61  tion prompt is a
29a0: 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49  ppropriate..** I
29b0: 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  f isContinuation
29c0: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
29d0: 68 65 20 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73  he main prompt s
29e0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a  hould be used..*
29f0: 2a 0a 2a 2a 20 49 66 20 7a 50 72 69 6f 72 20 69  *.** If zPrior i
2a00: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
2a10: 69 74 20 69 73 20 61 20 62 75 66 66 65 72 20 66  it is a buffer f
2a20: 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  rom a prior call
2a30: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   to this.** rout
2a40: 69 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ine that can be 
2a50: 72 65 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  reused..**.** Th
2a60: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
2a70: 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61  ed in space obta
2a80: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
2a90: 28 29 20 61 6e 64 20 6d 75 73 74 20 65 69 74 68  () and must eith
2aa0: 65 72 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62  er.** be freed b
2ab0: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 72 20  y the caller or 
2ac0: 65 6c 73 65 20 70 61 73 73 65 64 20 62 61 63 6b  else passed back
2ad0: 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
2ae0: 6e 65 20 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50  ne via the.** zP
2af0: 72 69 6f 72 20 61 72 67 75 6d 65 6e 74 20 66 6f  rior argument fo
2b00: 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74  r reuse..*/.stat
2b10: 69 63 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70  ic char *one_inp
2b20: 75 74 5f 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e  ut_line(FILE *in
2b30: 2c 20 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20  , char *zPrior, 
2b40: 69 6e 74 20 69 73 43 6f 6e 74 69 6e 75 61 74 69  int isContinuati
2b50: 6f 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72  on){.  char *zPr
2b60: 6f 6d 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52  ompt;.  char *zR
2b70: 65 73 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21  esult;.  if( in!
2b80: 3d 30 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c  =0 ){.    zResul
2b90: 74 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  t = local_getlin
2ba0: 65 28 7a 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20  e(zPrior, in);. 
2bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f   }else{.    zPro
2bc0: 6d 70 74 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61  mpt = isContinua
2bd0: 74 69 6f 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50  tion ? continueP
2be0: 72 6f 6d 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d  rompt : mainProm
2bf0: 70 74 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  pt;.#if defined(
2c00: 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 0a 20  HAVE_READLINE). 
2c10: 20 20 20 66 72 65 65 28 7a 50 72 69 6f 72 29 3b     free(zPrior);
2c20: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 72  .    zResult = r
2c30: 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29  eadline(zPrompt)
2c40: 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 73 75 6c  ;.    if( zResul
2c50: 74 20 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20  t && *zResult ) 
2c60: 61 64 64 5f 68 69 73 74 6f 72 79 28 7a 52 65 73  add_history(zRes
2c70: 75 6c 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ult);.#else.    
2c80: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 72  printf("%s", zPr
2c90: 6f 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c 75 73  ompt);.    fflus
2ca0: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7a  h(stdout);.    z
2cb0: 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67  Result = local_g
2cc0: 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 73  etline(zPrior, s
2cd0: 74 64 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20  tdin);.#endif.  
2ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 73 75  }.  return zResu
2cf0: 6c 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 70 72  lt;.}..struct pr
2d00: 65 76 69 6f 75 73 5f 6d 6f 64 65 5f 64 61 74 61  evious_mode_data
2d10: 20 7b 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b 20   {.  int valid; 
2d20: 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65         /* Is the
2d30: 72 65 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e  re legit data in
2d40: 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   here? */.  int 
2d50: 6d 6f 64 65 3b 0a 20 20 69 6e 74 20 73 68 6f 77  mode;.  int show
2d60: 48 65 61 64 65 72 3b 0a 20 20 69 6e 74 20 63 6f  Header;.  int co
2d70: 6c 57 69 64 74 68 5b 31 30 30 5d 3b 0a 7d 3b 0a  lWidth[100];.};.
2d80: 0a 2f 2a 0a 2a 2a 20 41 6e 20 70 6f 69 6e 74 65  ./*.** An pointe
2d90: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
2da0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
2db0: 72 65 20 69 73 20 70 61 73 73 65 64 20 66 72 6f  re is passed fro
2dc0: 6d 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 70 72  m.** the main pr
2dd0: 6f 67 72 61 6d 20 74 6f 20 74 68 65 20 63 61 6c  ogram to the cal
2de0: 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 69 73 20  lback.  This is 
2df0: 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63  used to communic
2e00: 61 74 65 0a 2a 2a 20 73 74 61 74 65 20 61 6e 64  ate.** state and
2e10: 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f   mode informatio
2e20: 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 63 61 6c  n..*/.struct cal
2e30: 6c 62 61 63 6b 5f 64 61 74 61 20 7b 0a 20 20 73  lback_data {.  s
2e40: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2e50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2e60: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65  abase */.  int e
2e70: 63 68 6f 4f 6e 3b 20 20 20 20 20 20 20 20 20 20  choOn;          
2e80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 63 68    /* True to ech
2e90: 6f 20 69 6e 70 75 74 20 63 6f 6d 6d 61 6e 64 73  o input commands
2ea0: 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 45 51   */.  int autoEQ
2eb0: 50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  P;           /* 
2ec0: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
2ed0: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
2ee0: 73 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d  seach SQL statem
2ef0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61  ent */.  int sta
2f00: 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tsOn;           
2f10: 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c  /* True to displ
2f20: 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 20  ay memory stats 
2f30: 62 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61  before each fina
2f40: 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  lize */.  int cn
2f50: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2f60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2f70: 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65 64 20  cords displayed 
2f80: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49 4c 45  so far */.  FILE
2f90: 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20   *out;          
2fa0: 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
2fb0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 46 49  lts here */.  FI
2fc0: 4c 45 20 2a 74 72 61 63 65 4f 75 74 3b 20 20 20  LE *traceOut;   
2fd0: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66       /* Output f
2fe0: 6f 72 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  or sqlite3_trace
2ff0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  () */.  int nErr
3000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3010: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
3020: 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  rs seen */.  int
3030: 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20   mode;          
3040: 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70 75 74      /* An output
3050: 20 6d 6f 64 65 20 73 65 74 74 69 6e 67 20 2a 2f   mode setting */
3060: 0a 20 20 69 6e 74 20 77 72 69 74 61 62 6c 65 53  .  int writableS
3070: 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75  chema;    /* Tru
3080: 65 20 69 66 20 50 52 41 47 4d 41 20 77 72 69 74  e if PRAGMA writ
3090: 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a  able_schema=ON *
30a0: 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64  /.  int showHead
30b0: 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  er;        /* Tr
30c0: 75 65 20 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d  ue to show colum
30d0: 6e 20 6e 61 6d 65 73 20 69 6e 20 4c 69 73 74 20  n names in List 
30e0: 6f 72 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a  or Column mode *
30f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 74 54  /.  char *zDestT
3100: 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61  able;      /* Na
3110: 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74 69 6f  me of destinatio
3120: 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d 4f 44  n table when MOD
3130: 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68  E_Insert */.  ch
3140: 61 72 20 73 65 70 61 72 61 74 6f 72 5b 32 30 5d  ar separator[20]
3150: 3b 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f  ;    /* Separato
3160: 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20  r character for 
3170: 4d 4f 44 45 5f 4c 69 73 74 20 2a 2f 0a 20 20 69  MODE_List */.  i
3180: 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d  nt colWidth[100]
3190: 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74  ;     /* Request
31a0: 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  ed width of each
31b0: 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20   column when in 
31c0: 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20  column mode*/.  
31d0: 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b  int actualWidth[
31e0: 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c  100];  /* Actual
31f0: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
3200: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
3210: 6e 75 6c 6c 76 61 6c 75 65 5b 32 30 5d 3b 20 20  nullvalue[20];  
3220: 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f    /* The text to
3230: 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55   print when a NU
3240: 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
3250: 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  om.             
3260: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
3270: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
3280: 20 73 74 72 75 63 74 20 70 72 65 76 69 6f 75 73   struct previous
3290: 5f 6d 6f 64 65 5f 64 61 74 61 20 65 78 70 6c 61  _mode_data expla
32a0: 69 6e 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20  inPrev;.        
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 2f 2a 20 48 6f 6c 64 73 20 74 68 65 20 6d 6f   /* Holds the mo
32d0: 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6a  de information j
32e0: 75 73 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20  ust before.     
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 2a 2a 20 2e 65 78 70 6c 61 69 6e 20      ** .explain 
3310: 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74  ON */.  char out
3320: 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41  file[FILENAME_MA
3330: 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  X]; /* Filename 
3340: 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f  for *out */.  co
3350: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 46 69 6c  nst char *zDbFil
3360: 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d  ename;    /* nam
3370: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
3380: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
3390: 20 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 3b 20   *zFreeOnClose; 
33a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
33b0: 61 6d 65 20 74 6f 20 66 72 65 65 20 77 68 65 6e  ame to free when
33c0: 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 63 6f   closing */.  co
33d0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b 20  nst char *zVfs; 
33e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
33f0: 65 20 6f 66 20 56 46 53 20 74 6f 20 75 73 65 20  e of VFS to use 
3400: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
3410: 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43  t *pStmt;   /* C
3420: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
3430: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 46 49   if any. */.  FI
3440: 4c 45 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20  LE *pLog;       
3450: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6c 6f       /* Write lo
3460: 67 20 6f 75 74 70 75 74 20 68 65 72 65 20 2a 2f  g output here */
3470: 0a 20 20 69 6e 74 20 2a 61 69 49 6e 64 65 6e 74  .  int *aiIndent
3480: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ;         /* Arr
3490: 61 79 20 6f 66 20 69 6e 64 65 6e 74 73 20 75 73  ay of indents us
34a0: 65 64 20 69 6e 20 4d 4f 44 45 5f 45 78 70 6c 61  ed in MODE_Expla
34b0: 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64  in */.  int nInd
34c0: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ent;           /
34d0: 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
34e0: 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20  aiIndent[] */.  
34f0: 69 6e 74 20 69 49 6e 64 65 6e 74 3b 20 20 20 20  int iIndent;    
3500: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3510: 6f 66 20 63 75 72 72 65 6e 74 20 6f 70 20 69 6e  of current op in
3520: 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 7d   aiIndent[] */.}
3530: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
3540: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d  re the allowed m
3550: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
3560: 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30   MODE_Line     0
3570: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
3580: 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b  per line.  Blank
3590: 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65   line between re
35a0: 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  cords */.#define
35b0: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31   MODE_Column   1
35c0: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
35d0: 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74  per line in neat
35e0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66   columns */.#def
35f0: 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20  ine MODE_List   
3600: 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f    2  /* One reco
3610: 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68  rd per line with
3620: 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a   a separator */.
3630: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d  #define MODE_Sem
3640: 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65  i     3  /* Same
3650: 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75   as MODE_List bu
3660: 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20  t append ";" to 
3670: 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65  each line */.#de
3680: 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20  fine MODE_Html  
3690: 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74     4  /* Generat
36a0: 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65  e an XHTML table
36b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
36c0: 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20  _Insert   5  /* 
36d0: 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e  Generate SQL "in
36e0: 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73  sert" statements
36f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
3700: 5f 54 63 6c 20 20 20 20 20 20 36 20 20 2f 2a 20  _Tcl      6  /* 
3710: 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20  Generate ANSI-C 
3720: 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c  or TCL quoted el
3730: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
3740: 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20  e MODE_Csv      
3750: 37 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69  7  /* Quote stri
3760: 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65  ngs, numbers are
3770: 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e   plain */.#defin
3780: 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20  e MODE_Explain  
3790: 38 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f  8  /* Like MODE_
37a0: 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e  Column, but do n
37b0: 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61  ot truncate data
37c0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73   */..static cons
37d0: 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63  t char *modeDesc
37e0: 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22  r[] = {.  "line"
37f0: 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20  ,.  "column",.  
3800: 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22  "list",.  "semi"
3810: 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69  ,.  "html",.  "i
3820: 6e 73 65 72 74 22 2c 0a 20 20 22 74 63 6c 22 2c  nsert",.  "tcl",
3830: 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70  .  "csv",.  "exp
3840: 6c 61 69 6e 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  lain",.};../*.**
3850: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3860: 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a  nts in an array.
3870: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79  */.#define Array
3880: 53 69 7a 65 28 58 29 20 20 28 69 6e 74 29 28 73  Size(X)  (int)(s
3890: 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28  izeof(X)/sizeof(
38a0: 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  X[0]))../*.** Co
38b0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c  mpute a string l
38c0: 65 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c 69  ength that is li
38d0: 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20 63 61  mited to what ca
38e0: 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  n be stored in.*
38f0: 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20  * lower 30 bits 
3900: 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e  of a 32-bit sign
3910: 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  ed integer..*/.s
3920: 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e  tatic int strlen
3930: 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  30(const char *z
3940: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3950: 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65  *z2 = z;.  while
3960: 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d  ( *z2 ){ z2++; }
3970: 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66 66 66  .  return 0x3fff
3980: 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20  ffff & (int)(z2 
3990: 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  - z);.}../*.** A
39a0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
39b0: 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
39c0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
39d0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c  atic void shellL
39e0: 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  og(void *pArg, i
39f0: 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e  nt iErrCode, con
3a00: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  st char *zMsg){.
3a10: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
3a20: 6b 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72  k_data *p = (str
3a30: 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74  uct callback_dat
3a40: 61 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  a*)pArg;.  if( p
3a50: 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75  ->pLog==0 ) retu
3a60: 72 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 2d  rn;.  fprintf(p-
3a70: 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c  >pLog, "(%d) %s\
3a80: 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d  n", iErrCode, zM
3a90: 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d  sg);.  fflush(p-
3aa0: 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pLog);.}../*.**
3ab0: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
3ac0: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65  n string as a he
3ad0: 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28  x-encoded blob (
3ae0: 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f  eg. X'1234' ).*/
3af0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
3b00: 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c  put_hex_blob(FIL
3b10: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f  E *out, const vo
3b20: 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  id *pBlob, int n
3b30: 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Blob){.  int i;.
3b40: 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20    char *zBlob = 
3b50: 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20  (char *)pBlob;. 
3b60: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27   fprintf(out,"X'
3b70: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
3b80: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 66 70  <nBlob; i++){ fp
3b90: 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78 22  rintf(out,"%02x"
3ba0: 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b  ,zBlob[i]&0xff);
3bb0: 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
3bc0: 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ,"'");.}../*.** 
3bd0: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
3be0: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
3bf0: 74 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67  ted string using
3c00: 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e   SQL quoting con
3c10: 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  ventions..*/.sta
3c20: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
3c30: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49  quoted_string(FI
3c40: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
3c50: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
3c60: 3b 0a 20 20 69 6e 74 20 6e 53 69 6e 67 6c 65 20  ;.  int nSingle 
3c70: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
3c80: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
3c90: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29  if( z[i]=='\'' )
3ca0: 20 6e 53 69 6e 67 6c 65 2b 2b 3b 0a 20 20 7d 0a   nSingle++;.  }.
3cb0: 20 20 69 66 28 20 6e 53 69 6e 67 6c 65 3d 3d 30    if( nSingle==0
3cc0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
3cd0: 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20  out,"'%s'",z);. 
3ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
3cf0: 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20  ntf(out,"'");.  
3d00: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
3d10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
3d20: 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27  i] && z[i]!='\''
3d30: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69  ; i++){}.      i
3d40: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
3d50: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
3d60: 27 27 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 2b  ''");.        z+
3d70: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
3d80: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  f( z[i]=='\'' ){
3d90: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
3da0: 28 6f 75 74 2c 22 25 2e 2a 73 27 27 22 2c 69 2c  (out,"%.*s''",i,
3db0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d  z);.        z +=
3dc0: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   i+1;.      }els
3dd0: 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
3de0: 74 66 28 6f 75 74 2c 22 25 73 22 2c 7a 29 3b 0a  tf(out,"%s",z);.
3df0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3e10: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22   fprintf(out,"'"
3e20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3e30: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
3e40: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
3e50: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ted according to
3e60: 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e   C or TCL quotin
3e70: 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  g rules..*/.stat
3e80: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
3e90: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
3ea0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
3eb0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
3ec0: 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27  t c;.  fputc('"'
3ed0: 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28  , out);.  while(
3ee0: 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30   (c = *(z++))!=0
3ef0: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ){.    if( c=='
3f00: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \\' ){.      fpu
3f10: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
3f20: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
3f30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
3f40: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 66  =='"' ){.      f
3f50: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
3f60: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 22 27  .      fputc('"'
3f70: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
3f80: 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b  e if( c=='\t' ){
3f90: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
3fa0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
3fb0: 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a  putc('t', out);.
3fc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
3fd0: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\n' ){.      f
3fe0: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
3ff0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e 27  .      fputc('n'
4000: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
4010: 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b  e if( c=='\r' ){
4020: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
4030: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
4040: 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a  putc('r', out);.
4050: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
4060: 73 70 72 69 6e 74 28 63 26 30 78 66 66 29 20 29  sprint(c&0xff) )
4070: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
4080: 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63  out, "\\%03o", c
4090: 26 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73  &0xff);.    }els
40a0: 65 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  e{.      fputc(c
40b0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  , out);.    }.  
40c0: 7d 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f  }.  fputc('"', o
40d0: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  ut);.}../*.** Ou
40e0: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
40f0: 74 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61  tring with chara
4100: 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73  cters that are s
4110: 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d  pecial to.** HTM
4120: 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74  L escaped..*/.st
4130: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
4140: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c  _html_string(FIL
4150: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
4160: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
4170: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20  .  if( z==0 ) z 
4180: 3d 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a  = "";.  while( *
4190: 7a 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  z ){.    for(i=0
41a0: 3b 20 20 20 7a 5b 69 5d 20 0a 20 20 20 20 20 20  ;   z[i] .      
41b0: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
41c0: 3c 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  <' .            
41d0: 26 26 20 7a 5b 69 5d 21 3d 27 26 27 20 0a 20 20  && z[i]!='&' .  
41e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
41f0: 5d 21 3d 27 3e 27 20 0a 20 20 20 20 20 20 20 20  ]!='>' .        
4200: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22      && z[i]!='\"
4210: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ' .            &
4220: 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20  & z[i]!='\'';.  
4230: 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20        i++){}.   
4240: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
4250: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
4260: 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d  .*s",i,z);.    }
4270: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
4280: 3c 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  <' ){.      fpri
4290: 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29 3b  ntf(out,"&lt;");
42a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
42b0: 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20  [i]=='&' ){.    
42c0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26    fprintf(out,"&
42d0: 61 6d 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  amp;");.    }els
42e0: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20  e if( z[i]=='>' 
42f0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4300: 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20  (out,"&gt;");.  
4310: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
4320: 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20  =='\"' ){.      
4330: 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75  fprintf(out,"&qu
4340: 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ot;");.    }else
4350: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20   if( z[i]=='\'' 
4360: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4370: 28 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20  (out,"&#39;");. 
4380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4390: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
43a0: 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d   z += i + 1;.  }
43b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66  .}../*.** If a f
43c0: 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ield contains an
43d0: 79 20 63 68 61 72 61 63 74 65 72 20 69 64 65 6e  y character iden
43e0: 74 69 66 69 65 64 20 62 79 20 61 20 31 20 69 6e  tified by a 1 in
43f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
4400: 2a 20 61 72 72 61 79 2c 20 74 68 65 6e 20 74 68  * array, then th
4410: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 62 65  e string must be
4420: 20 71 75 6f 74 65 64 20 66 6f 72 20 43 53 56 2e   quoted for CSV.
4430: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4440: 20 63 68 61 72 20 6e 65 65 64 43 73 76 51 75 6f   char needCsvQuo
4450: 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c  te[] = {.  1, 1,
4460: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4470: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
4480: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
4490: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
44a0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
44b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
44c0: 20 31 2c 20 20 20 0a 20 20 31 2c 20 30 2c 20 31   1,   .  1, 0, 1
44d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c  , 0, 0, 0, 0, 1,
44e0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
44f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c  , 0, 0, 0, .  0,
4500: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4510: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
4520: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4530: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
4540: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20  , 0, 0, 0,   0, 
4550: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4560: 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c  , 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: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
4590: 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20   0, 0, 0, .  0, 
45a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
45b0: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
45c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  0, 0, 0, 0, 0, .
45d0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
45e0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
45f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4600: 20 31 2c 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20   1, .  1, 1, 1, 
4610: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
4620: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4630: 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c  1, 1, 1,   .  1,
4640: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4650: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
4660: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4670: 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c    .  1, 1, 1, 1,
4680: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
4690: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
46a0: 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31   1, 1,   .  1, 1
46b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
46c0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
46d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
46e0: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
46f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
4700: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4710: 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20  , 1,   .  1, 1, 
4720: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4730: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
4740: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20  1, 1, 1, 1,   . 
4750: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4760: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
4770: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4780: 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c  1,   .  1, 1, 1,
4790: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
47a0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
47b0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 7d 3b 0a   1, 1, 1,   .};.
47c0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20  ./*.** Output a 
47d0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43  single term of C
47e0: 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70  SV.  Actually, p
47f0: 2d 3e 73 65 70 61 72 61 74 6f 72 20 69 73 20 75  ->separator is u
4800: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  sed for.** the s
4810: 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68 20  eparator, which 
4820: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
4830: 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e  e a comma.  p->n
4840: 75 6c 6c 76 61 6c 75 65 20 69 73 0a 2a 2a 20 74  ullvalue is.** t
4850: 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20 20  he null value.  
4860: 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f 74  Strings are quot
4870: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ed if necessary.
4880: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4890: 6f 75 74 70 75 74 5f 63 73 76 28 73 74 72 75 63  output_csv(struc
48a0: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
48b0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
48c0: 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20  z, int bSep){.  
48d0: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f  FILE *out = p->o
48e0: 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  ut;.  if( z==0 )
48f0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
4900: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 76 61  t,"%s",p->nullva
4910: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
4920: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
4930: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
4940: 30 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  0(p->separator);
4950: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
4960: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
4970: 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65  if( needCsvQuote
4980: 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [((unsigned char
4990: 2a 29 7a 29 5b 69 5d 5d 20 0a 20 20 20 20 20 20  *)z)[i]] .      
49a0: 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e     || (z[i]==p->
49b0: 73 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26 20  separator[0] && 
49c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e  .             (n
49d0: 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70  Sep==1 || memcmp
49e0: 28 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  (z, p->separator
49f0: 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a  , nSep)==0)) ){.
4a00: 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20          i = 0;. 
4a10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4a30: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
4a40: 20 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29    putc('"', out)
4a50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
4a60: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
4a70: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
4a80: 22 27 20 29 20 70 75 74 63 28 27 22 27 2c 20 6f  "' ) putc('"', o
4a90: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ut);.        put
4aa0: 63 28 7a 5b 69 5d 2c 20 6f 75 74 29 3b 0a 20 20  c(z[i], out);.  
4ab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 63      }.      putc
4ac0: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
4ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
4ae0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
4af0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
4b00: 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20  if( bSep ){.    
4b10: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
4b20: 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61 74  "%s", p->separat
4b30: 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64  or);.  }.}..#ifd
4b40: 65 66 20 53 49 47 49 4e 54 0a 2f 2a 0a 2a 2a 20  ef SIGINT./*.** 
4b50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
4b60: 73 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  s when the user 
4b70: 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a  presses Ctrl-C.*
4b80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4b90: 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28  terrupt_handler(
4ba0: 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20  int NotUsed){.  
4bb0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4bc0: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65  (NotUsed);.  see
4bd0: 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 31 3b 0a  nInterrupt = 1;.
4be0: 20 20 69 66 28 20 64 62 20 29 20 73 71 6c 69 74    if( db ) sqlit
4bf0: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
4c00: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4c10: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
4c20: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
4c30: 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a  hat the shell.**
4c40: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
4c50: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
4c60: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
4c70: 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c  ic int shell_cal
4c80: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
4c90: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
4ca0: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
4cb0: 2a 61 7a 43 6f 6c 2c 20 69 6e 74 20 2a 61 69 54  *azCol, int *aiT
4cc0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ype){.  int i;. 
4cd0: 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b   struct callback
4ce0: 5f 64 61 74 61 20 2a 70 20 3d 20 28 73 74 72 75  _data *p = (stru
4cf0: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
4d00: 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77 69 74 63  *)pArg;..  switc
4d10: 68 28 20 70 2d 3e 6d 6f 64 65 20 29 7b 0a 20 20  h( p->mode ){.  
4d20: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65    case MODE_Line
4d30: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20  : {.      int w 
4d40: 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 5;.      if( a
4d50: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
4d60: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4d70: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
4d80: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
4d90: 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69  strlen30(azCol[i
4da0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
4db0: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
4dc0: 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b  len>w ) w = len;
4dd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4de0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20  f( p->cnt++>0 ) 
4df0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
4e00: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
4e10: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
4e20: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
4e30: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d  tf(p->out,"%*s =
4e40: 20 25 73 5c 6e 22 2c 20 77 2c 20 61 7a 43 6f 6c   %s\n", w, azCol
4e50: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
4e60: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
4e70: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
4e80: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llvalue);.      
4e90: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
4eb0: 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20  DE_Explain:.    
4ec0: 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  case MODE_Column
4ed0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
4ee0: 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20  >cnt++==0 ){.   
4ef0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
4f00: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
4f10: 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a        int w, n;.
4f20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
4f30: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
4f40: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
4f50: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 63 6f 6c        w = p->col
4f60: 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  Width[i];.      
4f70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f80: 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20         w = 0;.  
4f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4fa0: 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a      if( w==0 ){.
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
4fc0: 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69  strlen30(azCol[i
4fd0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
4fe0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
4ff0: 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31  if( w<10 ) w = 1
5000: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0;.            n
5010: 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
5020: 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20  g && azArg[i] ? 
5030: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
5040: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llvalue);.      
5050: 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20        if( w<n ) 
5060: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  w = n;.         
5070: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
5080: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
5090: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
50b0: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20  ctualWidth[i] = 
50c0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  w;.          }. 
50d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
50e0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
50f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
5100: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
5110: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5120: 74 2c 22 25 2a 2e 2a 73 25 73 22 2c 2d 77 2c 2d  t,"%*.*s%s",-w,-
5130: 77 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e  w,azCol[i], i==n
5140: 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20  Arg-1 ? "\n": " 
5150: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ");.           
5160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5170: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
5180: 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c  >out,"%-*.*s%s",
5190: 77 2c 77 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d  w,w,azCol[i], i=
51a0: 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20  =nArg-1 ? "\n": 
51b0: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  "  ");.         
51c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
51d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
51e0: 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65     if( p->showHe
51f0: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
5200: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
5210: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
5220: 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20       int w;.    
5230: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
5240: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
5250: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
5260: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
5270: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b  >actualWidth[i];
5280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5290: 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20 2d 77  if( w<0 ) w = -w
52a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
52b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
52c0: 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20      w = 10;.    
52d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
52e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
52f0: 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c  >out,"%-*.*s%s",
5300: 77 2c 77 2c 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  w,w,"-----------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20  --------".      
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20  --------",.     
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
5390: 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a  ==nArg-1 ? "\n":
53a0: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20   "  ");.        
53b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
53c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
53d0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
53e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
53f0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
5400: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
5410: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
5420: 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57  ySize(p->actualW
5430: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
5440: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
5450: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
5460: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5470: 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20       w = 10;.   
5480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5490: 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
54a0: 5f 45 78 70 6c 61 69 6e 20 26 26 20 61 7a 41 72  _Explain && azAr
54b0: 67 5b 69 5d 20 26 26 20 73 74 72 6c 65 6e 33 30  g[i] && strlen30
54c0: 28 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a  (azArg[i])>w ){.
54d0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74            w = st
54e0: 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29  rlen30(azArg[i])
54f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5500: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20      if( i==1 && 
5510: 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70  p->aiIndent && p
5520: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
5530: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64       if( p->iInd
5540: 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29  ent<p->nIndent )
5550: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
5560: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
5570: 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e  *.s", p->aiInden
5580: 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22  t[p->iIndent], "
5590: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
55a0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49 6e            p->iIn
55b0: 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  dent++;.        
55c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 3c  }.        if( w<
55d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
55e0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
55f0: 2a 2e 2a 73 25 73 22 2c 2d 77 2c 2d 77 2c 0a 20  *.*s%s",-w,-w,. 
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
5610: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
5620: 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c   : p->nullvalue,
5630: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e   i==nArg-1 ? "\n
5640: 22 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20  ": "  ");.      
5650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5660: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5670: 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77  t,"%-*.*s%s",w,w
5680: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5690: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
56a0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c  [i] : p->nullval
56b0: 75 65 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20  ue, i==nArg-1 ? 
56c0: 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20 20 20  "\n": "  ");.   
56d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
56e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56f0: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
5700: 53 65 6d 69 3a 0a 20 20 20 20 63 61 73 65 20 4d  Semi:.    case M
5710: 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20  ODE_List: {.    
5720: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
5730: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
5740: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
5750: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
5760: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
5770: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5780: 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69  s%s",azCol[i], i
5790: 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 20  ==nArg-1 ? "\n" 
57a0: 3a 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  : p->separator);
57b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
57c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
57d0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
57e0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
57f0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5800: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
5810: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
5820: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
5830: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 3b 0a 20 20 20  ->nullvalue;.   
5840: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5850: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
5860: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72         if( i<nAr
5870: 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g-1 ){.         
5880: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
5890: 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61   "%s", p->separa
58a0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tor);.        }e
58b0: 6c 73 65 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d  lse if( p->mode=
58c0: 3d 4d 4f 44 45 5f 53 65 6d 69 20 29 7b 0a 20 20  =MODE_Semi ){.  
58d0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
58e0: 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a  p->out, ";\n");.
58f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5900: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
5910: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
5920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5930: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5940: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
5950: 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20 20  DE_Html: {.     
5960: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
5970: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
5980: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  r ){.        fpr
5990: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
59a0: 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  >");.        for
59b0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
59c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  +){.          fp
59d0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
59e0: 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  H>");.          
59f0: 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69  output_html_stri
5a00: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c  ng(p->out, azCol
5a10: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
5a20: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
5a30: 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TH>\n");.     
5a40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72     }.        fpr
5a50: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
5a60: 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  R>\n");.      }.
5a70: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
5a80: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
5a90: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5aa0: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
5ab0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
5ac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
5ad0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
5ae0: 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 6f  TD>");.        o
5af0: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
5b00: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
5b10: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
5b20: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
5b30: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
5b40: 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29  ->out,"</TD>\n")
5b50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b60: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
5b70: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
5b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5b90: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
5ba0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
5bb0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
5bc0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
5bd0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5be0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5bf0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
5c00: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
5c10: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
5c20: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
5c30: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 66    if(i<nArg-1) f
5c40: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
5c50: 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f  %s", p->separato
5c60: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
5c70: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
5c80: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
5c90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
5ca0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
5cb0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5cc0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
5cd0: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
5ce0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
5cf0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
5d00: 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29   : p->nullvalue)
5d10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e  ;.        if(i<n
5d20: 41 72 67 2d 31 29 20 66 70 72 69 6e 74 66 28 70  Arg-1) fprintf(p
5d30: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
5d40: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
5d50: 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
5d60: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
5d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5d80: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
5d90: 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Csv: {.      if
5da0: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
5db0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
5dc0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
5dd0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
5de0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
5df0: 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b 69  t_csv(p, azCol[i
5e00: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
5e10: 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ", i<nArg-1);.  
5e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5e30: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
5e40: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
5e50: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
5e60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5e70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
5e80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f   i++){.        o
5e90: 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41  utput_csv(p, azA
5ea0: 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29  rg[i], i<nArg-1)
5eb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ec0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
5ed0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
5ee0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5ef0: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b  e MODE_Insert: {
5f00: 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b  .      p->cnt++;
5f10: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
5f20: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
5f30: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5f40: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
5f50: 73 20 56 41 4c 55 45 53 28 22 2c 70 2d 3e 7a 44  s VALUES(",p->zD
5f60: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  estTable);.     
5f70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
5f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5f90: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 69 3e 30  char *zSep = i>0
5fa0: 20 3f 20 22 2c 22 3a 20 22 22 3b 0a 20 20 20 20   ? ",": "";.    
5fb0: 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69      if( (azArg[i
5fc0: 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65  ]==0) || (aiType
5fd0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
5fe0: 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20  QLITE_NULL) ){. 
5ff0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
6000: 28 70 2d 3e 6f 75 74 2c 22 25 73 4e 55 4c 4c 22  (p->out,"%sNULL"
6010: 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20  ,zSep);.        
6020: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
6030: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
6040: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
6050: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 70          if( zSep
6060: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 70 2d  [0] ) fprintf(p-
6070: 3e 6f 75 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b  >out,"%s",zSep);
6080: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
6090: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
60a0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
60b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
60c0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 28   if( aiType && (
60d0: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
60e0: 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 69 54  E_INTEGER || aiT
60f0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
6100: 4c 4f 41 54 29 20 29 7b 0a 20 20 20 20 20 20 20  LOAT) ){.       
6110: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
6120: 74 2c 22 25 73 25 73 22 2c 7a 53 65 70 2c 20 61  t,"%s%s",zSep, a
6130: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
6140: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
6150: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
6160: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
6170: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
6180: 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
6190: 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *pBlob = sqlite
61a0: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d  3_column_blob(p-
61b0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
61c0: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
61d0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
61e0: 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c  _bytes(p->pStmt,
61f0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
6200: 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70 72  f( zSep[0] ) fpr
6210: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
6220: 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20  ,zSep);.        
6230: 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f    output_hex_blo
6240: 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c  b(p->out, pBlob,
6250: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20   nBlob);.       
6260: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
6270: 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29  ber(azArg[i], 0)
6280: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
6290: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
62a0: 25 73 22 2c 7a 53 65 70 2c 20 61 7a 41 72 67 5b  %s",zSep, azArg[
62b0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
62c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
62d0: 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70 72 69  ( zSep[0] ) fpri
62e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
62f0: 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20  zSep);.         
6300: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
6310: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
6320: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
6330: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6340: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
6350: 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  ");\n");.      b
6360: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6380: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
6390: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
63a0: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
63b0: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76  e library.** inv
63c0: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
63d0: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
63e0: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
63f0: 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  nt callback(void
6400: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
6410: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
6420: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
6430: 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e   /* since we don
6440: 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e 66  't have type inf
6450: 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c  o, call the shel
6460: 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l_callback with 
6470: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  a NULL value */.
6480: 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63    return shell_c
6490: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41  allback(pArg, nA
64a0: 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c  rg, azArg, azCol
64b0: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , NULL);.}../*.*
64c0: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 69 6e  * Set the destin
64d0: 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c  ation table fiel
64e0: 64 20 6f 66 20 74 68 65 20 63 61 6c 6c 62 61 63  d of the callbac
64f0: 6b 5f 64 61 74 61 20 73 74 72 75 63 74 75 72 65  k_data structure
6500: 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
6510: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76  of the table giv
6520: 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20  en.  Escape any 
6530: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
6540: 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   in the.** table
6550: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
6560: 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f   void set_table_
6570: 6e 61 6d 65 28 73 74 72 75 63 74 20 63 61 6c 6c  name(struct call
6580: 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 63 6f  back_data *p, co
6590: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
65a0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
65b0: 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20  int needQuote;. 
65c0: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
65d0: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29   p->zDestTable )
65e0: 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44  {.    free(p->zD
65f0: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  estTable);.    p
6600: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30  ->zDestTable = 0
6610: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  ;.  }.  if( zNam
6620: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
6630: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 21 69 73   needQuote = !is
6640: 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64 20  alpha((unsigned 
6650: 63 68 61 72 29 2a 7a 4e 61 6d 65 29 20 26 26 20  char)*zName) && 
6660: 2a 7a 4e 61 6d 65 21 3d 27 5f 27 3b 0a 20 20 66  *zName!='_';.  f
6670: 6f 72 28 69 3d 6e 3d 30 3b 20 7a 4e 61 6d 65 5b  or(i=n=0; zName[
6680: 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20  i]; i++, n++){. 
6690: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
66a0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
66b0: 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a 4e 61 6d  Name[i]) && zNam
66c0: 65 5b 69 5d 21 3d 27 5f 27 20 29 7b 0a 20 20 20  e[i]!='_' ){.   
66d0: 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 31     needQuote = 1
66e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
66f0: 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 6e 2b 2b  e[i]=='\'' ) n++
6700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
6710: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 6e 20  ( needQuote ) n 
6720: 2b 3d 20 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a  += 2;.  z = p->z
6730: 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c  DestTable = mall
6740: 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  oc( n+1 );.  if(
6750: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   z==0 ){.    fpr
6760: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
6770: 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
6780: 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  y\n");.    exit(
6790: 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b  1);.  }.  n = 0;
67a0: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
67b0: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[n++] = '\''
67c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
67d0: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  me[i]; i++){.   
67e0: 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b   z[n++] = zName[
67f0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  i];.    if( zNam
6800: 65 5b 69 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 6e  e[i]=='\'' ) z[n
6810: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a  ++] = '\'';.  }.
6820: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
6830: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[n++] = '\'';
6840: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[n] = 0;.}..
6850: 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74 68 65 72  /* zIn is either
6860: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6870: 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20  NULL-terminated 
6880: 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79  string in memory
6890: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
68a0: 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72 20 61  m malloc(), or a
68b0: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 54   NULL pointer. T
68c0: 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  he string pointe
68d0: 64 20 74 6f 20 62 79 20 7a 41 70 70 65 6e 64 20  d to by zAppend 
68e0: 69 73 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 7a  is.** added to z
68f0: 49 6e 2c 20 61 6e 64 20 74 68 65 20 72 65 73 75  In, and the resu
6900: 6c 74 20 72 65 74 75 72 6e 65 64 20 69 6e 20 6d  lt returned in m
6910: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
6920: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  rom malloc()..**
6930: 20 7a 49 6e 2c 20 69 66 20 69 74 20 77 61 73 20   zIn, if it was 
6940: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20 66 72 65  not NULL, is fre
6950: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
6960: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2c   third argument,
6970: 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f 74 20 27   quote, is not '
6980: 5c 30 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20  \0', then it is 
6990: 75 73 65 64 20 61 73 20 61 20 0a 2a 2a 20 71 75  used as a .** qu
69a0: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 66 6f  ote character fo
69b0: 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a 73 74  r zAppend..*/.st
69c0: 61 74 69 63 20 63 68 61 72 20 2a 61 70 70 65 6e  atic char *appen
69d0: 64 54 65 78 74 28 63 68 61 72 20 2a 7a 49 6e 2c  dText(char *zIn,
69e0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70   char const *zAp
69f0: 70 65 6e 64 2c 20 63 68 61 72 20 71 75 6f 74 65  pend, char quote
6a00: 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ){.  int len;.  
6a10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70  int i;.  int nAp
6a20: 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e 33 30 28  pend = strlen30(
6a30: 7a 41 70 70 65 6e 64 29 3b 0a 20 20 69 6e 74 20  zAppend);.  int 
6a40: 6e 49 6e 20 3d 20 28 7a 49 6e 3f 73 74 72 6c 65  nIn = (zIn?strle
6a50: 6e 33 30 28 7a 49 6e 29 3a 30 29 3b 0a 0a 20 20  n30(zIn):0);..  
6a60: 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 6e 49  len = nAppend+nI
6a70: 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f 74 65  n+1;.  if( quote
6a80: 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 32   ){.    len += 2
6a90: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6aa0: 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a  <nAppend; i++){.
6ab0: 20 20 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e        if( zAppen
6ac0: 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20 6c 65  d[i]==quote ) le
6ad0: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
6ae0: 20 20 7a 49 6e 20 3d 20 28 63 68 61 72 20 2a 29    zIn = (char *)
6af0: 72 65 61 6c 6c 6f 63 28 7a 49 6e 2c 20 6c 65 6e  realloc(zIn, len
6b00: 29 3b 0a 20 20 69 66 28 20 21 7a 49 6e 20 29 7b  );.  if( !zIn ){
6b10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6b20: 20 7d 0a 0a 20 20 69 66 28 20 71 75 6f 74 65 20   }..  if( quote 
6b30: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 73  ){.    char *zCs
6b40: 72 20 3d 20 26 7a 49 6e 5b 6e 49 6e 5d 3b 0a 20  r = &zIn[nIn];. 
6b50: 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f     *zCsr++ = quo
6b60: 74 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  te;.    for(i=0;
6b70: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
6b80: 7b 0a 20 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20  {.      *zCsr++ 
6b90: 3d 20 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20  = zAppend[i];.  
6ba0: 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64 5b      if( zAppend[
6bb0: 69 5d 3d 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73  i]==quote ) *zCs
6bc0: 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  r++ = quote;.   
6bd0: 20 7d 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d   }.    *zCsr++ =
6be0: 20 71 75 6f 74 65 3b 0a 20 20 20 20 2a 7a 43 73   quote;.    *zCs
6bf0: 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  r++ = '\0';.    
6c00: 61 73 73 65 72 74 28 20 28 7a 43 73 72 2d 7a 49  assert( (zCsr-zI
6c10: 6e 29 3d 3d 6c 65 6e 20 29 3b 0a 20 20 7d 65 6c  n)==len );.  }el
6c20: 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  se{.    memcpy(&
6c30: 7a 49 6e 5b 6e 49 6e 5d 2c 20 7a 41 70 70 65 6e  zIn[nIn], zAppen
6c40: 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20  d, nAppend);.   
6c50: 20 7a 49 6e 5b 6c 65 6e 2d 31 5d 20 3d 20 27 5c   zIn[len-1] = '\
6c60: 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0';.  }..  retur
6c70: 6e 20 7a 49 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n zIn;.}.../*.**
6c80: 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
6c90: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
6ca0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51  will generate SQ
6cb0: 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74  L output.  Print
6cc0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
6cd0: 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65  olumns, comma-se
6ce0: 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69  parated, on a li
6cf0: 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20  ne and then add 
6d00: 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  a.** semicolon t
6d10: 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65  erminator to the
6d20: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e   end of that lin
6d30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
6d40: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
6d50: 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20  s is 1 and that 
6d60: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
6d70: 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65  text "--".** the
6d80: 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69  n write the semi
6d90: 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72  colon on a separ
6da0: 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20  ate line.  That 
6db0: 77 61 79 2c 20 69 66 20 61 20 0a 2a 2a 20 22 2d  way, if a .** "-
6dc0: 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72  -" comment occur
6dd0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
6de0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
6df0: 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f  he comment.** wo
6e00: 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20  n't consume the 
6e10: 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e  semicolon termin
6e20: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
6e30: 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75  int run_table_du
6e40: 6d 70 5f 71 75 65 72 79 28 0a 20 20 73 74 72 75  mp_query(.  stru
6e50: 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61  ct callback_data
6e60: 20 2a 70 2c 20 2f 2a 20 51 75 65 72 79 20 63 6f   *p, /* Query co
6e70: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
6e80: 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20   char *zSelect, 
6e90: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
6ea0: 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61  atement to extra
6eb0: 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ct content */.  
6ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72  const char *zFir
6ed0: 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e  stRow    /* Prin
6ee0: 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72  t before first r
6ef0: 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ow, if not NULL 
6f00: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
6f10: 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20  stmt *pSelect;. 
6f20: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
6f30: 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b  Result;.  int i;
6f40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6f50: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
6f60: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
6f70: 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20  b, zSelect, -1, 
6f80: 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  &pSelect, 0);.  
6f90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6fa0: 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b  K || !pSelect ){
6fb0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
6fc0: 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f  out, "/**** ERRO
6fd0: 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a  R: (%d) %s *****
6fe0: 2f 5c 6e 22 2c 20 72 63 2c 20 73 71 6c 69 74 65  /\n", rc, sqlite
6ff0: 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
7000: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78  ;.    if( (rc&0x
7010: 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ff)!=SQLITE_CORR
7020: 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b  UPT ) p->nErr++;
7030: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
7040: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
7050: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
7060: 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73 71  ;.  nResult = sq
7070: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
7080: 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77  nt(pSelect);.  w
7090: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
70a0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20  _ROW ){.    if( 
70b0: 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20  zFirstRow ){.   
70c0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
70d0: 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74 52  t, "%s", zFirstR
70e0: 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72 73  ow);.      zFirs
70f0: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  tRow = 0;.    }.
7100: 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63      z = (const c
7110: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
7120: 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74  umn_text(pSelect
7130: 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , 0);.    fprint
7140: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
7150: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  z);.    for(i=1;
7160: 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29   i<nResult; i++)
7170: 7b 20 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  { .      fprintf
7180: 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20  (p->out, ",%s", 
7190: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
71a0: 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29  ext(pSelect, i))
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
71c0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
71d0: 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26     while( z[0] &
71e0: 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20  & (z[0]!='-' || 
71f0: 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b  z[1]!='-') ) z++
7200: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29  ;.    if( z[0] )
7210: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
7220: 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29  p->out, "\n;\n")
7230: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7240: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
7250: 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  t, ";\n");.    }
7260: 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20 73 71      .    rc = sq
7270: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
7280: 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ct);.  }.  rc = 
7290: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
72a0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
72b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
72c0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  {.    fprintf(p-
72d0: 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
72e0: 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
72f0: 2a 2f 5c 6e 22 2c 20 72 63 2c 20 73 71 6c 69 74  */\n", rc, sqlit
7300: 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
7310: 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
7320: 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
7330: 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
7340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7350: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
7360: 63 61 74 65 20 73 70 61 63 65 20 61 6e 64 20 73  cate space and s
7370: 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20  ave off current 
7380: 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f  error string..*/
7390: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 61  .static char *sa
73a0: 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71  ve_err_msg(.  sq
73b0: 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20 20 20  lite3 *db       
73c0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
73d0: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a   to query */.){.
73e0: 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20    int nErrMsg = 
73f0: 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  1+strlen30(sqlit
7400: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
7410: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
7420: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7430: 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  (nErrMsg);.  if(
7440: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
7450: 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20  memcpy(zErrMsg, 
7460: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
7470: 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20  b), nErrMsg);.  
7480: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d  }.  return zErrM
7490: 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  sg;.}../*.** Dis
74a0: 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
74b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
74c0: 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a   display_stats(.
74d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
74f0: 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
7500: 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  ry */.  struct c
7510: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 41  allback_data *pA
7520: 72 67 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  rg, /* Pointer t
7530: 6f 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63  o struct callbac
7540: 6b 5f 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  k_data */.  int 
7550: 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20  bReset          
7560: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7570: 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
7580: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
7590: 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74  Cur;.  int iHiwt
75a0: 72 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26  r;..  if( pArg &
75b0: 26 20 70 41 72 67 2d 3e 6f 75 74 20 29 7b 0a 20  & pArg->out ){. 
75c0: 20 20 20 0a 20 20 20 20 69 48 69 77 74 72 20 3d     .    iHiwtr =
75d0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
75e0: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53  sqlite3_status(S
75f0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d  QLITE_STATUS_MEM
7600: 4f 52 59 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  ORY_USED, &iCur,
7610: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
7620: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
7630: 41 72 67 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72  Arg->out, "Memor
7640: 79 20 55 73 65 64 3a 20 20 20 20 20 20 20 20 20  y Used:         
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7660: 25 64 20 28 6d 61 78 20 25 64 29 20 62 79 74 65  %d (max %d) byte
7670: 73 5c 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77  s\n", iCur, iHiw
7680: 74 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  tr);.    iHiwtr 
7690: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
76a0: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28   sqlite3_status(
76b0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41  SQLITE_STATUS_MA
76c0: 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 26 69 43 75  LLOC_COUNT, &iCu
76d0: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
76e0: 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  et);.    fprintf
76f0: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d  (pArg->out, "Num
7700: 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e 64 69  ber of Outstandi
7710: 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 20  ng Allocations: 
7720: 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22    %d (max %d)\n"
7730: 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b  , iCur, iHiwtr);
7740: 0a 2f 2a 0a 2a 2a 20 4e 6f 74 20 63 75 72 72 65  ./*.** Not curre
7750: 6e 74 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  ntly used by the
7760: 20 43 4c 49 2e 0a 2a 2a 20 20 20 20 69 48 69 77   CLI..**    iHiw
7770: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
7780: 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  **    sqlite3_st
7790: 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54  atus(SQLITE_STAT
77a0: 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55 53 45  US_PAGECACHE_USE
77b0: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
77c0: 72 2c 20 62 52 65 73 65 74 29 3b 0a 2a 2a 20 20  r, bReset);.**  
77d0: 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e    fprintf(pArg->
77e0: 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  out, "Number of 
77f0: 50 63 61 63 68 65 20 50 61 67 65 73 20 55 73 65  Pcache Pages Use
7800: 64 3a 20 20 20 20 20 20 20 20 20 25 64 20 28 6d  d:         %d (m
7810: 61 78 20 25 64 29 20 70 61 67 65 73 5c 6e 22 2c  ax %d) pages\n",
7820: 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
7830: 2a 2f 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  */.    iHiwtr = 
7840: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
7850: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51  qlite3_status(SQ
7860: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
7870: 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20  CACHE_OVERFLOW, 
7880: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
7890: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
78a0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
78b0: 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
78c0: 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  e Overflow Bytes
78d0: 3a 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64  :     %d (max %d
78e0: 29 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72  ) bytes\n", iCur
78f0: 2c 20 69 48 69 77 74 72 29 3b 0a 2f 2a 0a 2a 2a  , iHiwtr);./*.**
7900: 20 4e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 75   Not currently u
7910: 73 65 64 20 62 79 20 74 68 65 20 43 4c 49 2e 0a  sed by the CLI..
7920: 2a 2a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  **    iHiwtr = i
7930: 43 75 72 20 3d 20 2d 31 3b 0a 2a 2a 20 20 20 20  Cur = -1;.**    
7940: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53  sqlite3_status(S
7950: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52  QLITE_STATUS_SCR
7960: 41 54 43 48 5f 55 53 45 44 2c 20 26 69 43 75 72  ATCH_USED, &iCur
7970: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
7980: 74 29 3b 0a 2a 2a 20 20 20 20 66 70 72 69 6e 74  t);.**    fprint
7990: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75  f(pArg->out, "Nu
79a0: 6d 62 65 72 20 6f 66 20 53 63 72 61 74 63 68 20  mber of Scratch 
79b0: 41 6c 6c 6f 63 61 74 69 6f 6e 73 20 55 73 65 64  Allocations Used
79c0: 3a 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e  :  %d (max %d)\n
79d0: 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29  ", iCur, iHiwtr)
79e0: 3b 0a 2a 2f 0a 20 20 20 20 69 48 69 77 74 72 20  ;.*/.    iHiwtr 
79f0: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
7a00: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28   sqlite3_status(
7a10: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43  SQLITE_STATUS_SC
7a20: 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57 2c 20  RATCH_OVERFLOW, 
7a30: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
7a40: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
7a50: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
7a60: 22 4e 75 6d 62 65 72 20 6f 66 20 53 63 72 61 74  "Number of Scrat
7a70: 63 68 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65  ch Overflow Byte
7a80: 73 3a 20 20 20 20 25 64 20 28 6d 61 78 20 25 64  s:    %d (max %d
7a90: 29 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72  ) bytes\n", iCur
7aa0: 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 69  , iHiwtr);.    i
7ab0: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
7ac0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  1;.    sqlite3_s
7ad0: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
7ae0: 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c  TUS_MALLOC_SIZE,
7af0: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
7b00: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70   bReset);.    fp
7b10: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
7b20: 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61   "Largest Alloca
7b30: 74 69 6f 6e 3a 20 20 20 20 20 20 20 20 20 20 20  tion:           
7b40: 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
7b50: 6e 22 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  n", iHiwtr);.   
7b60: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
7b70: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
7b80: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
7b90: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
7ba0: 53 49 5a 45 2c 20 26 69 43 75 72 2c 20 26 69 48  SIZE, &iCur, &iH
7bb0: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
7bc0: 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d     fprintf(pArg-
7bd0: 3e 6f 75 74 2c 20 22 4c 61 72 67 65 73 74 20 50  >out, "Largest P
7be0: 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e  cache Allocation
7bf0: 3a 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62  :           %d b
7c00: 79 74 65 73 5c 6e 22 2c 20 69 48 69 77 74 72 29  ytes\n", iHiwtr)
7c10: 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
7c20: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
7c30: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
7c40: 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54  ITE_STATUS_SCRAT
7c50: 43 48 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20  CH_SIZE, &iCur, 
7c60: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
7c70: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41  ;.    fprintf(pA
7c80: 72 67 2d 3e 6f 75 74 2c 20 22 4c 61 72 67 65 73  rg->out, "Larges
7c90: 74 20 53 63 72 61 74 63 68 20 41 6c 6c 6f 63 61  t Scratch Alloca
7ca0: 74 69 6f 6e 3a 20 20 20 20 20 20 20 20 20 20 25  tion:          %
7cb0: 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 48 69 77  d bytes\n", iHiw
7cc0: 74 72 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52  tr);.#ifdef YYTR
7cd0: 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48  ACKMAXSTACKDEPTH
7ce0: 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
7cf0: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
7d00: 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49  ite3_status(SQLI
7d10: 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52  TE_STATUS_PARSER
7d20: 5f 53 54 41 43 4b 2c 20 26 69 43 75 72 2c 20 26  _STACK, &iCur, &
7d30: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
7d40: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
7d50: 67 2d 3e 6f 75 74 2c 20 22 44 65 65 70 65 73 74  g->out, "Deepest
7d60: 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a 20 20   Parser Stack:  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
7d80: 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 20 69 43   (max %d)\n", iC
7d90: 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 23 65 6e  ur, iHiwtr);.#en
7da0: 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
7db0: 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74  Arg && pArg->out
7dc0: 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20 69 48   && db ){.    iH
7dd0: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
7de0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
7df0: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
7e00: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
7e10: 41 53 49 44 45 5f 55 53 45 44 2c 20 26 69 43 75  ASIDE_USED, &iCu
7e20: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
7e30: 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  et);.    fprintf
7e40: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
7e50: 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65  kaside Slots Use
7e60: 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d:              
7e70: 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22    %d (max %d)\n"
7e80: 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b  , iCur, iHiwtr);
7e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
7ea0: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
7eb0: 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
7ec0: 53 49 44 45 5f 48 49 54 2c 20 26 69 43 75 72 2c  SIDE_HIT, &iCur,
7ed0: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
7ee0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
7ef0: 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65  Arg->out, "Succe
7f00: 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20  ssful lookaside 
7f10: 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20  attempts:       
7f20: 25 64 5c 6e 22 2c 20 69 48 69 77 74 72 29 3b 0a  %d\n", iHiwtr);.
7f30: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
7f40: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
7f50: 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
7f60: 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 20 26  IDE_MISS_SIZE, &
7f70: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
7f80: 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69  Reset);.    fpri
7f90: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
7fa0: 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72  Lookaside failur
7fb0: 65 73 20 64 75 65 20 74 6f 20 73 69 7a 65 3a 20  es due to size: 
7fc0: 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 48 69 77       %d\n", iHiw
7fd0: 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tr);.    sqlite3
7fe0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
7ff0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
8000: 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55  OOKASIDE_MISS_FU
8010: 4c 4c 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  LL, &iCur, &iHiw
8020: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
8030: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
8040: 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66  ut, "Lookaside f
8050: 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20 4f  ailures due to O
8060: 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  OM:       %d\n",
8070: 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 69 48   iHiwtr);.    iH
8080: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
8090: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
80a0: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
80b0: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
80c0: 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  E_USED, &iCur, &
80d0: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
80e0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
80f0: 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48  g->out, "Pager H
8100: 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
8120: 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72 29   bytes\n", iCur)
8130: 3b 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  ;    iHiwtr = iC
8140: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
8150: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
8160: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
8170: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69  US_CACHE_HIT, &i
8180: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
8190: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41  ;.    fprintf(pA
81a0: 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
81b0: 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20  ache hits:      
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
81d0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
81e0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
81f0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
8200: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
8210: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
8220: 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72  ACHE_MISS, &iCur
8230: 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
8240: 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d     fprintf(pArg-
8250: 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
8260: 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20  e misses:       
8270: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
8280: 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 20 20 69  ", iCur); .    i
8290: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
82a0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
82b0: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
82c0: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
82d0: 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c  HE_WRITE, &iCur,
82e0: 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
82f0: 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e    fprintf(pArg->
8300: 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
8310: 20 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20   writes:        
8320: 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
8330: 2c 20 69 43 75 72 29 3b 20 0a 20 20 20 20 69 48  , iCur); .    iH
8340: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
8350: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
8360: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
8370: 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45  TE_DBSTATUS_SCHE
8380: 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  MA_USED, &iCur, 
8390: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
83a0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41  ;.    fprintf(pA
83b0: 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d 61  rg->out, "Schema
83c0: 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20   Heap Usage:    
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
83e0: 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72  d bytes\n", iCur
83f0: 29 3b 20 0a 20 20 20 20 69 48 69 77 74 72 20 3d  ); .    iHiwtr =
8400: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
8410: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
8420: 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
8430: 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c  TATUS_STMT_USED,
8440: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
8450: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70   bReset);.    fp
8460: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
8470: 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70   "Statement Heap
8480: 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67 65  /Lookaside Usage
8490: 3a 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c  :      %d bytes\
84a0: 6e 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 7d 0a  n", iCur); .  }.
84b0: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
84c0: 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 26  Arg->out && db &
84d0: 26 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b  & pArg->pStmt ){
84e0: 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
84f0: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
8500: 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
8510: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
8520: 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 20 62 52  ULLSCAN_STEP, bR
8530: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
8540: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 46  tf(pArg->out, "F
8550: 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a 20 20  ullscan Steps:  
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
8580: 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
8590: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
85a0: 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
85b0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
85c0: 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b 0a 20  SORT, bReset);. 
85d0: 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d     fprintf(pArg-
85e0: 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72  >out, "Sort Oper
85f0: 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20  ations:         
8600: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
8610: 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43  ", iCur);.    iC
8620: 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
8630: 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
8640: 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
8650: 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
8660: 58 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  X, bReset);.    
8670: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
8680: 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e  t, "Autoindex In
8690: 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20 20  serts:          
86a0: 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
86b0: 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
86c0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
86d0: 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
86e0: 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
86f0: 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52  ATUS_VM_STEP, bR
8700: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
8710: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56  tf(pArg->out, "V
8720: 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 53  irtual Machine S
8730: 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20  teps:           
8740: 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
8750: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8760: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  0;.}../*.** Para
8770: 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f  meter azArray po
8780: 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74  ints to a zero-t
8790: 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20  erminated array 
87a0: 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72  of strings. zStr
87b0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
87c0: 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69  single nul-termi
87d0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65  nated string. Re
87e0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
87f0: 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61   zStr.** is equa
8800: 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  l, according to 
8810: 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79  strcmp(), to any
8820: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73 20   of the strings 
8830: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a  in the array..**
8840: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
8850: 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  rn zero..*/.stat
8860: 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72  ic int str_in_ar
8870: 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ray(const char *
8880: 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zStr, const char
8890: 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69   **azArray){.  i
88a0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
88b0: 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b   azArray[i]; i++
88c0: 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74  ){.    if( 0==st
88d0: 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72  rcmp(zStr, azArr
88e0: 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20  ay[i]) ) return 
88f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
8900: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  0;.}../*.** If c
8910: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
8920: 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20 74  t pSql appears t
8930: 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20  o be an EXPLAIN 
8940: 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63  statement, alloc
8950: 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  ate.** and popul
8960: 61 74 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ate the callback
8970: 5f 64 61 74 61 2e 61 69 49 6e 64 65 6e 74 5b 5d  _data.aiIndent[]
8980: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
8990: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61  number of.** spa
89a0: 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20  ces each opcode 
89b0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74  should be indent
89c0: 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ed before it is 
89d0: 6f 75 74 70 75 74 2e 20 0a 2a 2a 0a 2a 2a 20 54  output. .**.** T
89e0: 68 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c  he indenting rul
89f0: 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
8a00: 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65    * For each "Ne
8a10: 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e  xt", "Prev", "VN
8a20: 65 78 74 22 20 6f 72 20 22 56 50 72 65 76 22 20  ext" or "VPrev" 
8a30: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64  instruction, ind
8a40: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c  ent.**       all
8a50: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63   opcodes that oc
8a60: 63 75 72 20 62 65 74 77 65 65 6e 20 74 68 65 20  cur between the 
8a70: 70 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74  p2 jump destinat
8a80: 69 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f  ion and the opco
8a90: 64 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65  de.**       itse
8aa0: 6c 66 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a  lf by 2 spaces..
8ab0: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20  **.**     * For 
8ac0: 65 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20  each "Goto", if 
8ad0: 74 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  the jump destina
8ae0: 74 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20  tion is earlier 
8af0: 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a  in the program.*
8b00: 2a 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73  *       and ends
8b10: 20 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20   on one of:.**  
8b20: 20 20 20 20 20 20 20 20 59 69 65 6c 64 20 20 53          Yield  S
8b30: 65 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52  eekGt  SeekLt  R
8b40: 6f 77 53 65 74 52 65 61 64 20 20 52 65 77 69 6e  owSetRead  Rewin
8b50: 64 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66  d.**       or if
8b60: 20 74 68 65 20 50 31 20 70 61 72 61 6d 65 74 65   the P1 paramete
8b70: 72 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64  r is one instead
8b80: 20 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20   of zero,.**    
8b90: 20 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61     then indent a
8ba0: 6c 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65  ll opcodes betwe
8bb0: 65 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20 69  en the earlier i
8bc0: 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20  nstruction.**   
8bd0: 20 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62      and "Goto" b
8be0: 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73  y 2 spaces..*/.s
8bf0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
8c00: 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
8c10: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
8c20: 64 61 74 61 20 2a 70 2c 20 73 71 6c 69 74 65 33  data *p, sqlite3
8c30: 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20  _stmt *pSql){.  
8c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
8c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8c60: 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  /* The text of t
8c70: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
8c80: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8c90: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
8ca0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
8cb0: 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   check if this i
8cc0: 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a  s an EXPLAIN */.
8cd0: 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d    int *abYield =
8ce0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8cf0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20    /* True if op 
8d00: 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a  is an OP_Yield *
8d10: 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  /.  int nAlloc =
8d20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8d30: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
8d40: 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e   size of p->aiIn
8d50: 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20  dent[], abYield 
8d60: 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20  */.  int iOp;   
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8d90: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d   operation in p-
8da0: 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a  >aiIndent[] */..
8db0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
8dc0: 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74  Next[] = { "Next
8dd0: 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72 65  ", "Prev", "VPre
8de0: 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f  v", "VNext", "So
8df0: 72 74 65 72 4e 65 78 74 22 2c 0a 20 20 20 20 20  rterNext",.     
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 20 20 20 22 4e 65 78 74 49 66 4f 70 65        "NextIfOpe
8e20: 6e 22 2c 20 22 50 72 65 76 49 66 4f 70 65 6e 22  n", "PrevIfOpen"
8e30: 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
8e40: 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d  har *azYield[] =
8e50: 20 7b 20 22 59 69 65 6c 64 22 2c 20 22 53 65 65   { "Yield", "See
8e60: 6b 4c 74 22 2c 20 22 53 65 65 6b 47 74 22 2c 20  kLt", "SeekGt", 
8e70: 22 52 6f 77 53 65 74 52 65 61 64 22 2c 20 22 52  "RowSetRead", "R
8e80: 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63  ewind", 0 };.  c
8e90: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74  onst char *azGot
8ea0: 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20  o[] = { "Goto", 
8eb0: 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  0 };..  /* Try t
8ec0: 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20  o figure out if 
8ed0: 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  this is really a
8ee0: 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d  n EXPLAIN statem
8ef0: 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a  ent. If this.  *
8f00: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69  * cannot be veri
8f10: 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72  fied, return ear
8f20: 6c 79 2e 20 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d  ly.  */.  zSql =
8f30: 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71   sqlite3_sql(pSq
8f40: 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d  l);.  if( zSql==
8f50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
8f60: 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20  r(z=zSql; *z==' 
8f70: 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c  ' || *z=='\t' ||
8f80: 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d   *z=='\n' || *z=
8f90: 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72  ='\f' || *z=='\r
8fa0: 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73  '; z++);.  if( s
8fb0: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
8fc0: 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29  z, "explain", 7)
8fd0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 6f   ) return;..  fo
8fe0: 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f  r(iOp=0; SQLITE_
8ff0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
9000: 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b  p(pSql); iOp++){
9010: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9020: 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
9030: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
9040: 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  Sql, 0);.    con
9050: 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28  st char *zOp = (
9060: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
9070: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
9080: 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  pSql, 1);..    /
9090: 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65 20  * Set p2 to the 
90a0: 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  P2 field of the 
90b0: 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20  current opcode. 
90c0: 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  Then, assuming t
90d0: 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73  hat.    ** p2 is
90e0: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
90f0: 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61 72  address, set var
9100: 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68  iable p2op to th
9110: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a  e index of that.
9120: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
9130: 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65  on in the aiInde
9140: 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61  nt[] array. p2 a
9150: 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64  nd p2op may be d
9160: 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20  ifferent if.    
9170: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ** the current i
9180: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61  nstruction is pa
9190: 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67  rt of a sub-prog
91a0: 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79  ram generated by
91b0: 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74   an.    ** SQL t
91c0: 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67  rigger or foreig
91d0: 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69  n key.  */.    i
91e0: 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f  nt p2 = sqlite3_
91f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
9200: 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f   3);.    int p2o
9210: 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69  p = (p2 + (iOp-i
9220: 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Addr));..    /* 
9230: 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e  Grow the p->aiIn
9240: 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72 65  dent array as re
9250: 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66  quired */.    if
9260: 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b  ( iOp>=nAlloc ){
9270: 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d  .      nAlloc +=
9280: 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   100;.      p->a
9290: 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29  iIndent = (int*)
92a0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
92b0: 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c  p->aiIndent, nAl
92c0: 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  loc*sizeof(int))
92d0: 3b 0a 20 20 20 20 20 20 61 62 59 69 65 6c 64 20  ;.      abYield 
92e0: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
92f0: 72 65 61 6c 6c 6f 63 28 61 62 59 69 65 6c 64 2c  realloc(abYield,
9300: 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
9310: 6e 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt));.    }.    
9320: 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73  abYield[iOp] = s
9330: 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c  tr_in_array(zOp,
9340: 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70   azYield);.    p
9350: 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20  ->aiIndent[iOp] 
9360: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64  = 0;.    p->nInd
9370: 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20  ent = iOp+1;..  
9380: 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72    if( str_in_arr
9390: 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20  ay(zOp, azNext) 
93a0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ){.      for(i=p
93b0: 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29  2op; i<iOp; i++)
93c0: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20   p->aiIndent[i] 
93d0: 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  += 2;.    }.    
93e0: 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
93f0: 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26  (zOp, azGoto) &&
9400: 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74   p2op<p->nIndent
9410: 0a 20 20 20 20 20 26 26 20 28 61 62 59 69 65 6c  .     && (abYiel
9420: 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74  d[p2op] || sqlit
9430: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
9440: 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20  ql, 2)).    ){. 
9450: 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 2b       for(i=p2op+
9460: 31 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  1; i<iOp; i++) p
9470: 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
9480: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   2;.    }.  }.. 
9490: 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
94a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
94b0: 61 62 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69  abYield);.  sqli
94c0: 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b  te3_reset(pSql);
94d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
94e0: 68 65 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74  he array allocat
94f0: 65 64 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61  ed by explain_da
9500: 74 61 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f  ta_prepare()..*/
9510: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9520: 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
9530: 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  (struct callback
9540: 5f 64 61 74 61 20 2a 70 29 7b 0a 20 20 73 71 6c  _data *p){.  sql
9550: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 49  ite3_free(p->aiI
9560: 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49  ndent);.  p->aiI
9570: 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ndent = 0;.  p->
9580: 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70  nIndent = 0;.  p
9590: 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d  ->iIndent = 0;.}
95a0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
95b0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  a statement or s
95c0: 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  et of statements
95d0: 2e 20 20 50 72 69 6e 74 20 0a 2a 2a 20 61 6e 79  .  Print .** any
95e0: 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c   result rows/col
95f0: 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  umns depending o
9600: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f  n the current mo
9610: 64 65 20 0a 2a 2a 20 73 65 74 20 76 69 61 20 74  de .** set via t
9620: 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c  he supplied call
9630: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
9640: 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
9650: 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69   to SQLite's bui
9660: 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78  lt-in sqlite3_ex
9670: 65 63 28 29 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  ec() .** functio
9680: 6e 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65  n except it take
9690: 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66  s a slightly dif
96a0: 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20  ferent callback 
96b0: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b  .** and callback
96c0: 20 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a   data argument..
96d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
96e0: 65 6c 6c 5f 65 78 65 63 28 0a 20 20 73 71 6c 69  ell_exec(.  sqli
96f0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9710: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70          /* An op
9720: 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  en database */. 
9730: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
9740: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9760: 53 51 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61  SQL to be evalua
9770: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ted */.  int (*x
9780: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
9790: 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68 61 72 2a  int,char**,char*
97a0: 2a 2c 69 6e 74 2a 29 2c 20 20 20 2f 2a 20 43 61  *,int*),   /* Ca
97b0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
97c0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 2f 2a 20 28 6e 6f 74 20 74 68 65 20 73 61 6d   /* (not the sam
9800: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 65 78 65  e as sqlite3_exe
9810: 63 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  c) */.  struct c
9820: 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 41  allback_data *pA
9830: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
9840: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9850: 6f 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63  o struct callbac
9860: 6b 5f 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72  k_data */.  char
9870: 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20   **pzErrMsg     
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
98a0: 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72   msg written her
98b0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
98c0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
98d0: 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61  NULL;     /* Sta
98e0: 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
98f0: 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  e. */.  int rc =
9900: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9910: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9920: 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
9930: 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc2;.  const cha
9940: 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20  r *zLeftover;   
9950: 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f         /* Tail o
9960: 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51  f unprocessed SQ
9970: 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 70 7a 45 72  L */..  if( pzEr
9980: 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45  rMsg ){.    *pzE
9990: 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rrMsg = NULL;.  
99a0: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  }..  while( zSql
99b0: 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  [0] && (SQLITE_O
99c0: 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
99d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
99e0: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
99f0: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
9a00: 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69  Leftover);.    i
9a10: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20  f( SQLITE_OK != 
9a20: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
9a30: 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
9a40: 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
9a50: 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29  save_err_msg(db)
9a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
9a70: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
9a80: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
9a90: 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73   /* this happens
9aa0: 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f   for a comment o
9ab0: 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f  r white-space */
9ac0: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
9ad0: 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20  zLeftover;.     
9ae0: 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
9af0: 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71  e(zSql[0]) ) zSq
9b00: 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  l++;.        con
9b10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
9b20: 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66        /* save of
9b30: 66 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  f the prepared s
9b40: 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61  tatment handle a
9b50: 6e 64 20 72 65 73 65 74 20 72 6f 77 20 63 6f 75  nd reset row cou
9b60: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  nt */.      if( 
9b70: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
9b80: 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53  pArg->pStmt = pS
9b90: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 70 41 72  tmt;.        pAr
9ba0: 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  g->cnt = 0;.    
9bb0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63    }..      /* ec
9bc0: 68 6f 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  ho the sql state
9bd0: 6d 65 6e 74 20 69 66 20 65 63 68 6f 20 6f 6e 20  ment if echo on 
9be0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
9bf0: 67 20 26 26 20 70 41 72 67 2d 3e 65 63 68 6f 4f  g && pArg->echoO
9c00: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  n ){.        con
9c10: 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71  st char *zStmtSq
9c20: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
9c30: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
9c40: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
9c50: 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74  t, "%s\n", zStmt
9c60: 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a  Sql ? zStmtSql :
9c70: 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zSql);.      }.
9c80: 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74  .      /* Show t
9c90: 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
9ca0: 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73   PLAN if .eqp is
9cb0: 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
9cc0: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61   pArg && pArg->a
9cd0: 75 74 6f 45 51 50 20 29 7b 0a 20 20 20 20 20 20  utoEQP ){.      
9ce0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9cf0: 70 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20  pExplain;.      
9d00: 20 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 73    char *zEQP = s
9d10: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
9d20: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
9d30: 41 4e 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  AN %s", sqlite3_
9d40: 73 71 6c 28 70 53 74 6d 74 29 29 3b 0a 20 20 20  sql(pStmt));.   
9d50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9d60: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
9d70: 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70   zEQP, -1, &pExp
9d80: 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lain, 0);.      
9d90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9da0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
9db0: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
9dc0: 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 3d 3d  step(pExplain)==
9dd0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
9de0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
9df0: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 2d 2d 45  f(pArg->out,"--E
9e00: 51 50 2d 2d 20 25 64 2c 22 2c 20 73 71 6c 69 74  QP-- %d,", sqlit
9e10: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
9e20: 78 70 6c 61 69 6e 2c 20 30 29 29 3b 0a 20 20 20  xplain, 0));.   
9e30: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
9e40: 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64 2c 22  (pArg->out,"%d,"
9e50: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
9e60: 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31  _int(pExplain, 1
9e70: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
9e80: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
9e90: 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33  t,"%d,", sqlite3
9ea0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
9eb0: 6c 61 69 6e 2c 20 32 29 29 3b 0a 20 20 20 20 20  lain, 2));.     
9ec0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
9ed0: 41 72 67 2d 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c  Arg->out,"%s\n",
9ee0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9ef0: 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33  text(pExplain, 3
9f00: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
9f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9f20: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
9f30: 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
9f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9f50: 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20  ee(zEQP);.      
9f60: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  }..      /* Outp
9f70: 75 74 20 54 45 53 54 43 54 52 4c 5f 45 58 50 4c  ut TESTCTRL_EXPL
9f80: 41 49 4e 20 74 65 78 74 20 6f 66 20 72 65 71 75  AIN text of requ
9f90: 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  ested */.      i
9fa0: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
9fb0: 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  >mode==MODE_Expl
9fc0: 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ain ){.        c
9fd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c  onst char *zExpl
9fe0: 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ain = 0;.       
9ff0: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
a000: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
a010: 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54  TCTRL_EXPLAIN_ST
a020: 4d 54 2c 20 70 53 74 6d 74 2c 20 26 7a 45 78 70  MT, pStmt, &zExp
a030: 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  lain);.        i
a040: 66 28 20 7a 45 78 70 6c 61 69 6e 20 26 26 20 7a  f( zExplain && z
a050: 45 78 70 6c 61 69 6e 5b 30 5d 20 29 7b 0a 20 20  Explain[0] ){.  
a060: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
a070: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  pArg->out, "%s",
a080: 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20   zExplain);.    
a090: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
a0a0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
a0b0: 68 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c  hell is currentl
a0c0: 79 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20  y in ".explain" 
a0d0: 6d 6f 64 65 2c 20 67 61 74 68 65 72 20 74 68 65  mode, gather the
a0e0: 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a 20   extra.      ** 
a0f0: 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74 6f  data required to
a100: 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f 20   add indents to 
a110: 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20  the output.*/.  
a120: 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
a130: 70 41 72 67 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  pArg->mode==MODE
a140: 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
a150: 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
a160: 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c 20 70  _prepare(pArg, p
a170: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Stmt);.      }..
a180: 20 20 20 20 20 20 2f 2a 20 70 65 72 66 6f 72 6d        /* perform
a190: 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e   the first step.
a1a0: 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c    this will tell
a1b0: 20 75 73 20 69 66 20 77 65 0a 20 20 20 20 20 20   us if we.      
a1c0: 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c 74  ** have a result
a1d0: 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20   set or not and 
a1e0: 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e 0a  how wide it is..
a1f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
a200: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
a210: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 2f  (pStmt);.      /
a220: 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72  * if we have a r
a230: 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a  esult set... */.
a240: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
a250: 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20  _ROW == rc ){.  
a260: 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68        /* if we h
a270: 61 76 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e  ave a callback..
a280: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
a290: 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20   xCallback ){.  
a2a0: 20 20 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63          /* alloc
a2b0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 63 6f  ate space for co
a2c0: 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c 75  l name ptr, valu
a2d0: 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65 20  e ptr, and type 
a2e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
a2f0: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
a300: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
a310: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 76  mt);.          v
a320: 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c  oid *pData = sql
a330: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 33 2a 6e 43  ite3_malloc(3*nC
a340: 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20  ol*sizeof(const 
a350: 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20  char*) + 1);.   
a360: 20 20 20 20 20 20 20 69 66 28 20 21 70 44 61 74         if( !pDat
a370: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  a ){.           
a380: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a390: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  EM;.          }e
a3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
a3b0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d   char **azCols =
a3c0: 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b   (char **)pData;
a3d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f        /* Names o
a3e0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
a3f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
a400: 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20  char **azVals = 
a410: 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20  &azCols[nCol];  
a420: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
a430: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
a440: 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69  nt *aiTypes = (i
a450: 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f  nt *)&azVals[nCo
a460: 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79  l]; /* Result ty
a470: 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pes */.         
a480: 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20     int i, x;.   
a490: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a4a0: 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73  sizeof(int) <= s
a4b0: 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 20  izeof(char *)); 
a4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
a4d0: 73 61 76 65 20 6f 66 66 20 70 74 72 73 20 74 6f  save off ptrs to
a4e0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
a4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
a500: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
a510: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
a520: 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63    azCols[i] = (c
a530: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
a540: 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
a550: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
a560: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   }.            d
a570: 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o{.             
a580: 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68 65 20   /* extract the 
a590: 64 61 74 61 20 61 6e 64 20 64 61 74 61 20 74 79  data and data ty
a5a0: 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pes */.         
a5b0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a5c0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 61 69 54 79              aiTy
a5e0: 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c  pes[i] = x = sql
a5f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
a600: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
a610: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
a620: 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  x==SQLITE_BLOB &
a630: 26 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  & pArg && pArg->
a640: 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72  mode==MODE_Inser
a650: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
a660: 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d         azVals[i]
a670: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   = "";.         
a680: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azVals[i] = (cha
a6b0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
a6c0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29  n_text(pStmt, i)
a6d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a6e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a6f0: 20 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b      if( !azVals[
a700: 69 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69  i] && (aiTypes[i
a710: 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]!=SQLITE_NULL) 
a720: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a730: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a740: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
a750: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a760: 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a   /* from for */.
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
a790: 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a  } /* end for */.
a7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
a7b0: 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79  * if data and ty
a7c0: 70 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75  pes extracted su
a7d0: 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f  ccessfully... */
a7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
a7f0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d  f( SQLITE_ROW ==
a800: 20 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20   rc ){ .        
a810: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c 6c 20          /* call 
a820: 74 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c  the supplied cal
a830: 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 72  lback with the r
a840: 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61 20 2a  esult row data *
a850: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
a860: 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 28    if( xCallback(
a870: 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61  pArg, nCol, azVa
a880: 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79  ls, azCols, aiTy
a890: 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pes) ){.        
a8a0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
a8b0: 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20  QLITE_ABORT;.   
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
a8d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
a8e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a8f0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
a920: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  }.            } 
a930: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
a940: 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20  W == rc );.     
a950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
a960: 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ree(pData);.    
a970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a980: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a990: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20   do{.           
a9a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
a9b0: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
a9c0: 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 72 63       } while( rc
a9d0: 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 29   == SQLITE_ROW )
a9e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a9f0: 20 20 7d 0a 0a 20 20 20 20 20 20 65 78 70 6c 61    }..      expla
aa00: 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
aa10: 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Arg);..      /* 
aa20: 70 72 69 6e 74 20 75 73 61 67 65 20 73 74 61 74  print usage stat
aa30: 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20 2a 2f  s if stats on */
aa40: 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
aa50: 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e  && pArg->statsOn
aa60: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70   ){.        disp
aa70: 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20 70 41  lay_stats(db, pA
aa80: 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  rg, 0);.      }.
aa90: 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  .      /* Finali
aaa0: 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ze the statement
aab0: 20 6a 75 73 74 20 65 78 65 63 75 74 65 64 2e 20   just executed. 
aac0: 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 73  If this fails, s
aad0: 61 76 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20  ave a .      ** 
aae0: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f  copy of the erro
aaf0: 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65 72  r message. Other
ab00: 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c 20 74  wise, set zSql t
ab10: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  o point to the. 
ab20: 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73 74 61       ** next sta
ab30: 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
ab40: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20  e. */.      rc2 
ab50: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
ab60: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
ab70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ab80: 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72 63 32  NOMEM ) rc = rc2
ab90: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
aba0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
abb0: 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
abc0: 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77  tover;.        w
abd0: 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53  hile( IsSpace(zS
abe0: 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b  ql[0]) ) zSql++;
abf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ac00: 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
ac10: 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
ac20: 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
ac30: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
ac40: 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65 64    /* clear saved
ac50: 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a   stmt handle */.
ac60: 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
ac70: 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
ac80: 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pStmt = NULL;.  
ac90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
aca0: 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a  /* end while */.
acb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
acc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
acd0: 61 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c  a different call
ace0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65  back routine use
acf0: 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68  d for dumping th
ad00: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45  e database..** E
ad10: 61 63 68 20 72 6f 77 20 72 65 63 65 69 76 65 64  ach row received
ad20: 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63   by this callbac
ad30: 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  k consists of a 
ad40: 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74  table name,.** t
ad50: 68 65 20 74 61 62 6c 65 20 74 79 70 65 20 28 22  he table type ("
ad60: 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65  index" or "table
ad70: 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72  ") and SQL to cr
ad80: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a  eate the table..
ad90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ada0: 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78  should print tex
adb0: 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  t sufficient to 
adc0: 72 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62  recreate the tab
add0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
ade0: 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  t dump_callback(
adf0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
ae00: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
ae10: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  rg, char **azCol
ae20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
ae30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
ae40: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
ae50: 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20  *zType;.  const 
ae60: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  char *zSql;.  co
ae70: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 70 53  nst char *zPrepS
ae80: 74 6d 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  tmt = 0;.  struc
ae90: 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20  t callback_data 
aea0: 2a 70 20 3d 20 28 73 74 72 75 63 74 20 63 61 6c  *p = (struct cal
aeb0: 6c 62 61 63 6b 5f 64 61 74 61 20 2a 29 70 41 72  lback_data *)pAr
aec0: 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g;..  UNUSED_PAR
aed0: 41 4d 45 54 45 52 28 61 7a 43 6f 6c 29 3b 0a 20  AMETER(azCol);. 
aee0: 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 20 72   if( nArg!=3 ) r
aef0: 65 74 75 72 6e 20 31 3b 0a 20 20 7a 54 61 62 6c  eturn 1;.  zTabl
af00: 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20  e = azArg[0];.  
af10: 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zType = azArg[1]
af20: 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72 67  ;.  zSql = azArg
af30: 5b 32 5d 3b 0a 20 20 0a 20 20 69 66 28 20 73 74  [2];.  .  if( st
af40: 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  rcmp(zTable, "sq
af50: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
af60: 3d 30 20 29 7b 0a 20 20 20 20 7a 50 72 65 70 53  =0 ){.    zPrepS
af70: 74 6d 74 20 3d 20 22 44 45 4c 45 54 45 20 46 52  tmt = "DELETE FR
af80: 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  OM sqlite_sequen
af90: 63 65 3b 5c 6e 22 3b 0a 20 20 7d 65 6c 73 65 20  ce;\n";.  }else 
afa0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67  if( sqlite3_strg
afb0: 6c 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74  lob("sqlite_stat
afc0: 3f 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29  ?", zTable)==0 )
afd0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  {.    fprintf(p-
afe0: 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
aff0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
b000: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
b010: 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  trncmp(zTable, "
b020: 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
b030: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
b040: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
b050: 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41  ncmp(zSql, "CREA
b060: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
b070: 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 20)==0 ){.   
b080: 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20   char *zIns;.   
b090: 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c   if( !p->writabl
b0a0: 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
b0b0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
b0c0: 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
b0d0: 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29  e_schema=ON;\n")
b0e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61  ;.      p->writa
b0f0: 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  bleSchema = 1;. 
b100: 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20     }.    zIns = 
b110: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
b120: 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20  .       "INSERT 
b130: 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74  INTO sqlite_mast
b140: 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  er(type,name,tbl
b150: 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73  _name,rootpage,s
b160: 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41 4c  ql)".       "VAL
b170: 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71 27  UES('table','%q'
b180: 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c  ,'%q',0,'%q');",
b190: 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c 20  .       zTable, 
b1a0: 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20  zTable, zSql);. 
b1b0: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
b1c0: 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73 29  t, "%s\n", zIns)
b1d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
b1e0: 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65  ee(zIns);.    re
b1f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
b200: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
b210: 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53  out, "%s;\n", zS
b220: 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ql);.  }..  if( 
b230: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74  strcmp(zType, "t
b240: 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  able")==0 ){.   
b250: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
b260: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a 20  TableInfo = 0;. 
b270: 20 20 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74     char *zSelect
b280: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
b290: 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a  zTableInfo = 0;.
b2a0: 20 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 20 3d      char *zTmp =
b2b0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77   0;.    int nRow
b2c0: 20 3d 20 30 3b 0a 20 20 20 0a 20 20 20 20 7a 54   = 0;.   .    zT
b2d0: 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e  ableInfo = appen
b2e0: 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f  dText(zTableInfo
b2f0: 2c 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  , "PRAGMA table_
b300: 69 6e 66 6f 28 22 2c 20 30 29 3b 0a 20 20 20 20  info(", 0);.    
b310: 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70  zTableInfo = app
b320: 65 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e  endText(zTableIn
b330: 66 6f 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27 29  fo, zTable, '"')
b340: 3b 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f  ;.    zTableInfo
b350: 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 54   = appendText(zT
b360: 61 62 6c 65 49 6e 66 6f 2c 20 22 29 3b 22 2c 20  ableInfo, ");", 
b370: 30 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  0);..    rc = sq
b380: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
b390: 28 70 2d 3e 64 62 2c 20 7a 54 61 62 6c 65 49 6e  (p->db, zTableIn
b3a0: 66 6f 2c 20 2d 31 2c 20 26 70 54 61 62 6c 65 49  fo, -1, &pTableI
b3b0: 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  nfo, 0);.    fre
b3c0: 65 28 7a 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20  e(zTableInfo);. 
b3d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b3e0: 45 5f 4f 4b 20 7c 7c 20 21 70 54 61 62 6c 65 49  E_OK || !pTableI
b3f0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nfo ){.      ret
b400: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
b410: 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65    zSelect = appe
b420: 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20  ndText(zSelect, 
b430: 22 53 45 4c 45 43 54 20 27 49 4e 53 45 52 54 20  "SELECT 'INSERT 
b440: 49 4e 54 4f 20 27 20 7c 7c 20 22 2c 20 30 29 3b  INTO ' || ", 0);
b450: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71  .    /* Always q
b460: 75 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  uote the table n
b470: 61 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20  ame, even if it 
b480: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 75  appears to be pu
b490: 72 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a  re ascii,.    **
b4a0: 20 69 6e 20 63 61 73 65 20 69 74 20 69 73 20 61   in case it is a
b4b0: 20 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49   keyword. Ex:  I
b4c0: 4e 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c  NSERT INTO "tabl
b4d0: 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 7a 54  e" ... */.    zT
b4e0: 6d 70 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  mp = appendText(
b4f0: 7a 54 6d 70 2c 20 7a 54 61 62 6c 65 2c 20 27 22  zTmp, zTable, '"
b500: 27 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 6d 70  ');.    if( zTmp
b510: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63   ){.      zSelec
b520: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
b530: 53 65 6c 65 63 74 2c 20 7a 54 6d 70 2c 20 27 5c  Select, zTmp, '\
b540: 27 27 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  '');.      free(
b550: 7a 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zTmp);.    }.   
b560: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
b570: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
b580: 20 7c 7c 20 27 20 56 41 4c 55 45 53 28 27 20 7c   || ' VALUES(' |
b590: 7c 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  | ", 0);.    rc 
b5a0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
b5b0: 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20  TableInfo);.    
b5c0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
b5d0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63  E_ROW ){.      c
b5e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
b5f0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
b600: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
b610: 74 65 78 74 28 70 54 61 62 6c 65 49 6e 66 6f 2c  text(pTableInfo,
b620: 20 31 29 3b 0a 20 20 20 20 20 20 7a 53 65 6c 65   1);.      zSele
b630: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
b640: 7a 53 65 6c 65 63 74 2c 20 22 71 75 6f 74 65 28  zSelect, "quote(
b650: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 65  ", 0);.      zSe
b660: 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78  lect = appendTex
b670: 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54 65 78 74  t(zSelect, zText
b680: 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 72 63  , '"');.      rc
b690: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
b6a0: 70 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20  pTableInfo);.   
b6b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b6c0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
b6d0: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
b6e0: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
b6f0: 29 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ), ", 0);.      
b700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
b710: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
b720: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 29 20  ext(zSelect, ") 
b730: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
b740: 20 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20       nRow++;.   
b750: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
b760: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 54 61  te3_finalize(pTa
b770: 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  bleInfo);.    if
b780: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b790: 7c 7c 20 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20  || nRow==0 ){.  
b7a0: 20 20 20 20 66 72 65 65 28 7a 53 65 6c 65 63 74      free(zSelect
b7b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b7c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 65  1;.    }.    zSe
b7d0: 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78  lect = appendTex
b7e0: 74 28 7a 53 65 6c 65 63 74 2c 20 22 7c 7c 20 27  t(zSelect, "|| '
b7f0: 29 27 20 46 52 4f 4d 20 20 22 2c 20 30 29 3b 0a  )' FROM  ", 0);.
b800: 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70      zSelect = ap
b810: 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74  pendText(zSelect
b820: 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a  , zTable, '"');.
b830: 0a 20 20 20 20 72 63 20 3d 20 72 75 6e 5f 74 61  .    rc = run_ta
b840: 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
b850: 2c 20 7a 53 65 6c 65 63 74 2c 20 7a 50 72 65 70  , zSelect, zPrep
b860: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
b870: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
b880: 54 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 6c 65  T ){.      zSele
b890: 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28  ct = appendText(
b8a0: 7a 53 65 6c 65 63 74 2c 20 22 20 4f 52 44 45 52  zSelect, " ORDER
b8b0: 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c   BY rowid DESC",
b8c0: 20 30 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74   0);.      run_t
b8d0: 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
b8e0: 70 2c 20 7a 53 65 6c 65 63 74 2c 20 30 29 3b 0a  p, zSelect, 0);.
b8f0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 7a      }.    free(z
b900: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72  Select);.  }.  r
b910: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
b920: 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55  * Run zQuery.  U
b930: 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  se dump_callback
b940: 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61  () as the callba
b950: 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ck routine so th
b960: 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  at.** the conten
b970: 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ts of the query 
b980: 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51  are output as SQ
b990: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
b9a0: 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20  .** If we get a 
b9b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
b9c0: 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20  rror, rerun the 
b9d0: 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65  query after appe
b9e0: 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20  nding.** "ORDER 
b9f0: 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74  BY rowid DESC" t
ba00: 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74  o the end..*/.st
ba10: 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68  atic int run_sch
ba20: 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a  ema_dump_query(.
ba30: 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63    struct callbac
ba40: 6b 5f 64 61 74 61 20 2a 70 2c 20 0a 20 20 63 6f  k_data *p, .  co
ba50: 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79  nst char *zQuery
ba60: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
ba70: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
ba80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
ba90: 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  xec(p->db, zQuer
baa0: 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  y, dump_callback
bab0: 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69  , p, &zErr);.  i
bac0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
bad0: 52 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61  RRUPT ){.    cha
bae0: 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20  r *zQ2;.    int 
baf0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  len = strlen30(z
bb00: 51 75 65 72 79 29 3b 0a 20 20 20 20 66 70 72 69  Query);.    fpri
bb10: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
bb20: 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20  **** CORRUPTION 
bb30: 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e  ERROR *******/\n
bb40: 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  ");.    if( zErr
bb50: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
bb60: 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
bb70: 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  ** %s ******/\n"
bb80: 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73  , zErr);.      s
bb90: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
bba0: 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20  );.      zErr = 
bbb0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51 32  0;.    }.    zQ2
bbc0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31   = malloc( len+1
bbd0: 30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51  00 );.    if( zQ
bbe0: 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  2==0 ) return rc
bbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
bc00: 70 72 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20  printf(len+100, 
bc10: 7a 51 32 2c 20 22 25 73 20 4f 52 44 45 52 20 42  zQ2, "%s ORDER B
bc20: 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a  Y rowid DESC", z
bc30: 51 75 65 72 79 29 3b 0a 20 20 20 20 72 63 20 3d  Query);.    rc =
bc40: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
bc50: 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63  >db, zQ2, dump_c
bc60: 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72  allback, p, &zEr
bc70: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  r);.    if( rc )
bc80: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
bc90: 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
bca0: 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a   ERROR: %s *****
bcb0: 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  */\n", zErr);.  
bcc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
bcd0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
bce0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  PT;.    }.    sq
bcf0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
bd00: 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b  ;.    free(zQ2);
bd10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bd20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20  ;.}../*.** Text 
bd30: 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67  of a help messag
bd40: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
bd50: 20 7a 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e 62   zHelp[] =.  ".b
bd60: 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20  ackup ?DB? FILE 
bd70: 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28       Backup DB (
bd80: 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
bd90: 29 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22  ) to FILE\n".  "
bda0: 2e 62 61 69 6c 20 4f 4e 7c 4f 46 46 20 20 20 20  .bail ON|OFF    
bdb0: 20 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65         Stop afte
bdc0: 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72  r hitting an err
bdd0: 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46  or.  Default OFF
bde0: 5c 6e 22 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45  \n".  ".clone NE
bdf0: 57 44 42 20 20 20 20 20 20 20 20 20 20 20 43 6c  WDB           Cl
be00: 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45  one data into NE
be10: 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69  WDB from the exi
be20: 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 5c 6e  sting database\n
be30: 22 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73 20  ".  ".databases 
be40: 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
be50: 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73   names and files
be60: 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
be70: 61 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64 75  abases\n".  ".du
be80: 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20  mp ?TABLE? ...  
be90: 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61 74      Dump the dat
bea0: 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c 20  abase in an SQL 
beb0: 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20  text format\n". 
bec0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
bed0: 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
bee0: 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
bef0: 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73 20  nly dump tables 
bf00: 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20  matching\n".  " 
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74          LIKE pat
bf30: 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20  tern TABLE.\n". 
bf40: 20 22 2e 65 63 68 6f 20 4f 4e 7c 4f 46 46 20 20   ".echo ON|OFF  
bf50: 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f           Turn co
bf60: 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72  mmand echo on or
bf70: 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 78 69 74   off\n".  ".exit
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67    Exit this prog
bfa0: 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 6c 61  ram\n".  ".expla
bfb0: 69 6e 20 3f 4f 4e 7c 4f 46 46 3f 20 20 20 20 20  in ?ON|OFF?     
bfc0: 20 54 75 72 6e 20 6f 75 74 70 75 74 20 6d 6f 64   Turn output mod
bfd0: 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 45  e suitable for E
bfe0: 58 50 4c 41 49 4e 20 6f 6e 20 6f 72 20 6f 66 66  XPLAIN on or off
bff0: 2e 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  .\n".  "        
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 57 69 74 68 20 6e 6f 20 61 72 67 73 2c 20 69   With no args, i
c020: 74 20 74 75 72 6e 73 20 45 58 50 4c 41 49 4e 20  t turns EXPLAIN 
c030: 6f 6e 2e 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65  on.\n".  ".heade
c040: 72 28 73 29 20 4f 4e 7c 4f 46 46 20 20 20 20 20  r(s) ON|OFF     
c050: 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66   Turn display of
c060: 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f   headers on or o
c070: 66 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20  ff\n".  ".help  
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 53 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61 67  Show this messag
c0a0: 65 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20  e\n".  ".import 
c0b0: 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 49  FILE TABLE     I
c0c0: 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20  mport data from 
c0d0: 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c  FILE into TABLE\
c0e0: 6e 22 0a 20 20 22 2e 69 6e 64 69 63 65 73 20 3f  n".  ".indices ?
c0f0: 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 68 6f  TABLE?       Sho
c100: 77 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69  w names of all i
c110: 6e 64 69 63 65 73 5c 6e 22 0a 20 20 22 20 20 20  ndices\n".  "   
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73        If TABLE s
c140: 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73  pecified, only s
c150: 68 6f 77 20 69 6e 64 69 63 65 73 20 66 6f 72 20  how indices for 
c160: 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20  tables\n".  "   
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20 4c        matching L
c190: 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
c1a0: 45 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51 4c  E.\n".#ifdef SQL
c1b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
c1c0: 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46  CE.  ".iotrace F
c1d0: 49 4c 45 20 20 20 20 20 20 20 20 20 20 45 6e 61  ILE          Ena
c1e0: 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74  ble I/O diagnost
c1f0: 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49  ic logging to FI
c200: 4c 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 23 69 66  LE\n".#endif.#if
c210: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c220: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
c230: 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45    ".load FILE ?E
c240: 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64 20 61  NTRY?     Load a
c250: 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72  n extension libr
c260: 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  ary\n".#endif.  
c270: 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20  ".log FILE|off  
c280: 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67          Turn log
c290: 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  ging on or off. 
c2a0: 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64   FILE can be std
c2b0: 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a 20 20  err/stdout\n".  
c2c0: 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42  ".mode MODE ?TAB
c2d0: 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75 74 70  LE?     Set outp
c2e0: 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20 4d 4f  ut mode where MO
c2f0: 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22  DE is one of:\n"
c300: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73 76               csv
c320: 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61        Comma-sepa
c330: 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a  rated values\n".
c340: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
c350: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
c360: 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65  mn   Left-aligne
c370: 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65  d columns.  (See
c380: 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20 22 20   .width)\n".  " 
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20 20 20          html    
c3b0: 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f   HTML <table> co
c3c0: 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  de\n".  "       
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69    insert   SQL i
c3f0: 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  nsert statements
c400: 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20 20   for TABLE\n".  
c410: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
c420: 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 20 20            line  
c430: 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72     One value per
c440: 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20 20 20   line\n".  "    
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 56 61       list     Va
c470: 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62  lues delimited b
c480: 79 20 2e 73 65 70 61 72 61 74 6f 72 20 73 74 72  y .separator str
c490: 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ing\n".  "      
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d     tabs     Tab-
c4c0: 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
c4d0: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73  tcl      TCL lis
c500: 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20 20  t elements\n".  
c510: 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49  ".nullvalue STRI
c520: 4e 47 20 20 20 20 20 20 55 73 65 20 53 54 52 49  NG      Use STRI
c530: 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e  NG in place of N
c540: 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20  ULL values\n".  
c550: 22 2e 6f 70 65 6e 20 3f 46 49 4c 45 4e 41 4d 45  ".open ?FILENAME
c560: 3f 20 20 20 20 20 20 20 43 6c 6f 73 65 20 65 78  ?       Close ex
c570: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
c580: 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 4e  and reopen FILEN
c590: 41 4d 45 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75  AME\n".  ".outpu
c5a0: 74 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20  t FILENAME      
c5b0: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
c5c0: 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e  FILENAME\n".  ".
c5d0: 6f 75 74 70 75 74 20 73 74 64 6f 75 74 20 20 20  output stdout   
c5e0: 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
c5f0: 74 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e 5c  t to the screen\
c600: 6e 22 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52  n".  ".print STR
c610: 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20 50 72 69  ING...       Pri
c620: 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e  nt literal STRIN
c630: 47 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20  G\n".  ".prompt 
c640: 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52  MAIN CONTINUE  R
c650: 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64  eplace the stand
c660: 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20  ard prompts\n". 
c670: 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20   ".quit         
c680: 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
c690: 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20  is program\n".  
c6a0: 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20  ".read FILENAME 
c6b0: 20 20 20 20 20 20 20 20 45 78 65 63 75 74 65 20          Execute 
c6c0: 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c  SQL in FILENAME\
c6d0: 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f  n".  ".restore ?
c6e0: 44 42 3f 20 46 49 4c 45 20 20 20 20 20 52 65 73  DB? FILE     Res
c6f0: 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tore content of 
c700: 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61  DB (default \"ma
c710: 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c  in\") from FILE\
c720: 6e 22 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45  n".  ".save FILE
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
c740: 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  te in-memory dat
c750: 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 5c  abase into FILE\
c760: 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 54  n".  ".schema ?T
c770: 41 42 4c 45 3f 20 20 20 20 20 20 20 20 53 68 6f  ABLE?        Sho
c780: 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  w the CREATE sta
c790: 74 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 20 20  tements\n".  "  
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20         If TABLE 
c7c0: 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
c7d0: 73 68 6f 77 20 74 61 62 6c 65 73 20 6d 61 74 63  show tables matc
c7e0: 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20  hing\n".  "     
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e      LIKE pattern
c810: 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 73   TABLE.\n".  ".s
c820: 65 70 61 72 61 74 6f 72 20 53 54 52 49 4e 47 20  eparator STRING 
c830: 20 20 20 20 20 43 68 61 6e 67 65 20 73 65 70 61       Change sepa
c840: 72 61 74 6f 72 20 75 73 65 64 20 62 79 20 6f 75  rator used by ou
c850: 74 70 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69  tput mode and .i
c860: 6d 70 6f 72 74 5c 6e 22 0a 20 20 22 2e 73 68 6f  mport\n".  ".sho
c870: 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
c880: 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72     Show the curr
c890: 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76  ent values for v
c8a0: 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 5c  arious settings\
c8b0: 6e 22 0a 20 20 22 2e 73 74 61 74 73 20 4f 4e 7c  n".  ".stats ON|
c8c0: 4f 46 46 20 20 20 20 20 20 20 20 20 20 54 75 72  OFF          Tur
c8d0: 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66  n stats on or of
c8e0: 66 5c 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20  f\n".  ".tables 
c8f0: 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c  ?TABLE?        L
c900: 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62  ist names of tab
c910: 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  les\n".  "      
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c930: 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63     If TABLE spec
c940: 69 66 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74  ified, only list
c950: 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
c960: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
c990: 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f  LE.\n".  ".timeo
c9a0: 75 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20  ut MS           
c9b0: 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63   Try opening loc
c9c0: 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d  ked tables for M
c9d0: 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e  S milliseconds\n
c9e0: 22 0a 20 20 22 2e 74 72 61 63 65 20 46 49 4c 45  ".  ".trace FILE
c9f0: 7c 6f 66 66 20 20 20 20 20 20 20 20 4f 75 74 70  |off        Outp
ca00: 75 74 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ut each SQL stat
ca10: 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 72  ement as it is r
ca20: 75 6e 5c 6e 22 0a 20 20 22 2e 76 66 73 6e 61 6d  un\n".  ".vfsnam
ca30: 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20  e ?AUX?         
ca40: 50 72 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f  Print the name o
ca50: 66 20 74 68 65 20 56 46 53 20 73 74 61 63 6b 5c  f the VFS stack\
ca60: 6e 22 0a 20 20 22 2e 77 69 64 74 68 20 4e 55 4d  n".  ".width NUM
ca70: 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 53 65 74  1 NUM2 ...   Set
ca80: 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66   column widths f
ca90: 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f  or \"column\" mo
caa0: 64 65 5c 6e 22 0a 3b 0a 0a 73 74 61 74 69 63 20  de\n".;..static 
cab0: 63 68 61 72 20 7a 54 69 6d 65 72 48 65 6c 70 5b  char zTimerHelp[
cac0: 5d 20 3d 0a 20 20 22 2e 74 69 6d 65 72 20 4f 4e  ] =.  ".timer ON
cad0: 7c 4f 46 46 20 20 20 20 20 20 20 20 20 20 54 75  |OFF          Tu
cae0: 72 6e 20 74 68 65 20 43 50 55 20 74 69 6d 65 72  rn the CPU timer
caf0: 20 6d 65 61 73 75 72 65 6d 65 6e 74 20 6f 6e 20   measurement on 
cb00: 6f 72 20 6f 66 66 5c 6e 22 0a 3b 0a 0a 2f 2a 20  or off\n".;../* 
cb10: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
cb20: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
cb30: 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 73 74  process_input(st
cb40: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
cb50: 74 61 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29  ta *p, FILE *in)
cb60: 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
cb70: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
cb80: 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20  is open.  If it 
cb90: 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65  is not, then ope
cba0: 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  n it.  If.** the
cbb0: 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20   database fails 
cbc0: 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61  to open, print a
cbd0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
cbe0: 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61  and exit..*/.sta
cbf0: 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62  tic void open_db
cc00: 28 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b  (struct callback
cc10: 5f 64 61 74 61 20 2a 70 2c 20 69 6e 74 20 6b 65  _data *p, int ke
cc20: 65 70 41 6c 69 76 65 29 7b 0a 20 20 69 66 28 20  epAlive){.  if( 
cc30: 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
cc40: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
cc50: 7a 65 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ze();.    sqlite
cc60: 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c  3_open(p->zDbFil
cc70: 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a  ename, &p->db);.
cc80: 20 20 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a      db = p->db;.
cc90: 20 20 20 20 69 66 28 20 64 62 20 26 26 20 73 71      if( db && sq
cca0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
ccb0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
ccc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72        sqlite3_cr
ccd0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
cce0: 2c 20 22 73 68 65 6c 6c 73 74 61 74 69 63 22 2c  , "shellstatic",
ccf0: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
cd00: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 73 68   0,.          sh
cd10: 65 6c 6c 73 74 61 74 69 63 46 75 6e 63 2c 20 30  ellstaticFunc, 0
cd20: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
cd30: 69 66 28 20 64 62 3d 3d 30 20 7c 7c 20 53 51 4c  if( db==0 || SQL
cd40: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
cd50: 65 72 72 63 6f 64 65 28 64 62 29 20 29 7b 0a 20  errcode(db) ){. 
cd60: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
cd70: 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62  err,"Error: unab
cd80: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
cd90: 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e  ase \"%s\": %s\n
cda0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ", .          p-
cdb0: 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71  >zDbFilename, sq
cdc0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
cdd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 65 65  );.      if( kee
cde0: 70 41 6c 69 76 65 20 29 20 72 65 74 75 72 6e 3b  pAlive ) return;
cdf0: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
ce00: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
ce10: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
ce20: 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c  XTENSION.    sql
ce30: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
ce40: 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62  _extension(p->db
ce50: 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 1);.#endif.  }
ce60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c  .}../*.** Do C-l
ce70: 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65  anguage style de
ce80: 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  quoting..**.**  
ce90: 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a    \t    -> tab.*
cea0: 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65  *    \n    -> ne
ceb0: 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 72 20 20  wline.**    \r  
cec0: 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65    -> carriage re
ced0: 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 22 20 20 20  turn.**    \"   
cee0: 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 4e 4e 4e   -> ".**    \NNN
cef0: 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61    -> ascii chara
cf00: 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61  cter NNN in octa
cf10: 6c 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e  l.**    \\    ->
cf20: 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2f 0a 73 74   backslash.*/.st
cf30: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
cf40: 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 63 68  e_backslashes(ch
cf50: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c  ar *z){.  int i,
cf60: 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   j;.  char c;.  
cf70: 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20  for(i=j=0; (c = 
cf80: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a  z[i])!=0; i++, j
cf90: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++){.    if( c==
cfa0: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 63 20  '\\' ){.      c 
cfb0: 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20  = z[++i];.      
cfc0: 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20  if( c=='n' ){.  
cfd0: 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a        c = '\n';.
cfe0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
cff0: 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  c=='t' ){.      
d000: 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20    c = '\t';.    
d010: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
d020: 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  r' ){.        c 
d030: 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65  = '\r';.      }e
d040: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20  lse if( c=='\\' 
d050: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
d060: 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \\';.      }else
d070: 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
d080: 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
d090: 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20   c -= '0';.     
d0a0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27     if( z[i+1]>='
d0b0: 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37  0' && z[i+1]<='7
d0c0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
d0d0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  ++;.          c 
d0e0: 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
d0f0: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
d100: 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
d110: 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
d120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
d130: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
d140: 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69  c = (c<<3) + z[i
d150: 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ] - '0';.       
d160: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
d170: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d180: 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20   z[j] = c;.  }. 
d190: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[j] = 0;.}../*
d1a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
d1b0: 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64 65  alue of a hexade
d1c0: 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52 65  cimal digit.  Re
d1d0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 69  turn -1 if the i
d1e0: 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  nput.** is not a
d1f0: 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73   hex digit..*/.s
d200: 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69 67  tatic int hexDig
d210: 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29 7b  itValue(char c){
d220: 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26  .  if( c>='0' &&
d230: 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72 6e   c<='9' ) return
d240: 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28 20   c - '0';.  if( 
d250: 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66 27  c>='a' && c<='f'
d260: 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 61   ) return c - 'a
d270: 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63 3e  ' + 10;.  if( c>
d280: 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20 29  ='A' && c<='F' )
d290: 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27 20   return c - 'A' 
d2a0: 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d  + 10;.  return -
d2b0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  1;.}../*.** Inte
d2c0: 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61 6e  rpret zArg as an
d2d0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20   integer value, 
d2e0: 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73 75  possibly with su
d2f0: 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ffixes..*/.stati
d300: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
d310: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f 6e  integerValue(con
d320: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a  st char *zArg){.
d330: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
d340: 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  v = 0;.  static 
d350: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63  const struct { c
d360: 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e  har *zSuffix; in
d370: 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74  t iMult; } aMult
d380: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69  [] = {.    { "Ki
d390: 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20 20  B", 1024 },.    
d3a0: 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31 30  { "MiB", 1024*10
d3b0: 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42  24 },.    { "GiB
d3c0: 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30 32  ", 1024*1024*102
d3d0: 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c  4 },.    { "KB",
d3e0: 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20    1000 },.    { 
d3f0: 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20 7d  "MB",  1000000 }
d400: 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20 31  ,.    { "GB",  1
d410: 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20  000000000 },.   
d420: 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20 7d   { "K",   1000 }
d430: 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20 31  ,.    { "M",   1
d440: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
d450: 22 47 22 2c 20 20 20 31 30 30 30 30 30 30 30 30  "G",   100000000
d460: 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  0 },.  };.  int 
d470: 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20 3d  i;.  int isNeg =
d480: 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30   0;.  if( zArg[0
d490: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69 73  ]=='-' ){.    is
d4a0: 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72  Neg = 1;.    zAr
d4b0: 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  g++;.  }else if(
d4c0: 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b   zArg[0]=='+' ){
d4d0: 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d  .    zArg++;.  }
d4e0: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
d4f0: 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d  '0' && zArg[1]==
d500: 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  'x' ){.    int x
d510: 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b  ;.    zArg += 2;
d520: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78 20 3d  .    while( (x =
d530: 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a   hexDigitValue(z
d540: 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20  Arg[0]))>=0 ){. 
d550: 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20       v = (v<<4) 
d560: 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b  + x;.      zArg+
d570: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  +;.    }.  }else
d580: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 44  {.    while( IsD
d590: 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b  igit(zArg[0]) ){
d5a0: 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20  .      v = v*10 
d5b0: 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b  + zArg[0] - '0';
d5c0: 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  .      zArg++;. 
d5d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
d5e0: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
d5f0: 61 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20  aMult); i++){.  
d600: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
d610: 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a  ricmp(aMult[i].z
d620: 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30  Suffix, zArg)==0
d630: 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20 61   ){.      v *= a
d640: 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20  Mult[i].iMult;. 
d650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d660: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
d670: 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a  sNeg? -v : v;.}.
d680: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
d690: 20 7a 41 72 67 20 61 73 20 65 69 74 68 65 72 20   zArg as either 
d6a0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20  an integer or a 
d6b0: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20  boolean value.  
d6c0: 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a  Return 1 or 0.**
d6d0: 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46 41   for TRUE and FA
d6e0: 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65  LSE.  Return the
d6f0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69   integer value i
d700: 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  f appropriate..*
d710: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f 6f  /.static int boo
d720: 6c 65 61 6e 56 61 6c 75 65 28 63 68 61 72 20 2a  leanValue(char *
d730: 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zArg){.  int i;.
d740: 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
d750: 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27  0' && zArg[1]=='
d760: 78 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  x' ){.    for(i=
d770: 32 3b 20 68 65 78 44 69 67 69 74 56 61 6c 75 65  2; hexDigitValue
d780: 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b  (zArg[i])>=0; i+
d790: 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +){}.  }else{.  
d7a0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b    for(i=0; zArg[
d7b0: 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  i]>='0' && zArg[
d7c0: 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a  i]<='9'; i++){}.
d7d0: 20 20 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26    }.  if( i>0 &&
d7e0: 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65   zArg[i]==0 ) re
d7f0: 74 75 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67  turn (int)(integ
d800: 65 72 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20  erValue(zArg) & 
d810: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69  0xffffffff);.  i
d820: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
d830: 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d  mp(zArg, "on")==
d840: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
d850: 69 63 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29  icmp(zArg,"yes")
d860: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d870: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
d880: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
d890: 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c  Arg, "off")==0 |
d8a0: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
d8b0: 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20  p(zArg,"no")==0 
d8c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d8d0: 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 73  .  }.  fprintf(s
d8e0: 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
d8f0: 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  ot a boolean val
d900: 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75  ue: \"%s\". Assu
d910: 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c  ming \"no\".\n",
d920: 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29  .          zArg)
d930: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
d940: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
d950: 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73  output file, ass
d960: 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20  uming it is not 
d970: 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74  stderr or stdout
d980: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d990: 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
d9a0: 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66  e(FILE *f){.  if
d9b0: 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74  ( f && f!=stdout
d9c0: 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20   && f!=stderr ) 
d9d0: 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a  fclose(f);.}../*
d9e0: 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20  .** Try to open 
d9f0: 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20  an output file. 
da00: 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64    The names "std
da10: 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72  out" and "stderr
da20: 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69  " are.** recogni
da30: 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72  zed and do the r
da40: 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c  ight thing.  NUL
da50: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
da60: 20 74 68 65 20 6f 75 74 70 75 74 20 0a 2a 2a 20   the output .** 
da70: 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66  filename is "off
da80: 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c  "..*/.static FIL
da90: 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f  E *output_file_o
daa0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
dab0: 7a 46 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a  zFile){.  FILE *
dac0: 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  f;.  if( strcmp(
dad0: 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d  zFile,"stdout")=
dae0: 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74  =0 ){.    f = st
daf0: 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  dout;.  }else if
db00: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
db10: 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a  "stderr")==0 ){.
db20: 20 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a      f = stderr;.
db30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
db40: 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29  mp(zFile, "off")
db50: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30  ==0 ){.    f = 0
db60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
db70: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
db80: 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66  "wb");.    if( f
db90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
dba0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
dbb0: 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
dbc0: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
dbd0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
dbe0: 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 2f 2a 0a  return f;.}../*.
dbf0: 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72  ** A routine for
dc00: 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74   handling output
dc10: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72   from sqlite3_tr
dc20: 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ace()..*/.static
dc30: 20 76 6f 69 64 20 73 71 6c 5f 74 72 61 63 65 5f   void sql_trace_
dc40: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
dc50: 41 72 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Arg, const char 
dc60: 2a 7a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d  *z){.  FILE *f =
dc70: 20 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20   (FILE*)pArg;.  
dc80: 69 66 28 20 66 20 29 20 66 70 72 69 6e 74 66 28  if( f ) fprintf(
dc90: 66 2c 20 22 25 73 5c 6e 22 2c 20 7a 29 3b 0a 7d  f, "%s\n", z);.}
dca0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70 20  ../*.** A no-op 
dcb0: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72 75 6e  routine that run
dcc0: 73 20 77 69 74 68 20 74 68 65 20 22 2e 62 72 65  s with the ".bre
dcd0: 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63 6f 6d  akpoint" doc-com
dce0: 6d 61 6e 64 2e 20 20 54 68 69 73 20 69 73 0a 2a  mand.  This is.*
dcf0: 2a 20 61 20 75 73 65 66 75 6c 20 73 70 6f 74 20  * a useful spot 
dd00: 74 6f 20 73 65 74 20 61 20 64 65 62 75 67 67 65  to set a debugge
dd10: 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f  r breakpoint..*/
dd20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
dd30: 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69  t_breakpoint(voi
dd40: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
dd50: 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43   nCall = 0;.  nC
dd60: 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  all++;.}../*.** 
dd70: 41 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20 74  An object used t
dd80: 6f 20 72 65 61 64 20 61 20 43 53 56 20 66 69 6c  o read a CSV fil
dd90: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
dda0: 75 63 74 20 43 53 56 52 65 61 64 65 72 20 43 53  uct CSVReader CS
ddb0: 56 52 65 61 64 65 72 3b 0a 73 74 72 75 63 74 20  VReader;.struct 
ddc0: 43 53 56 52 65 61 64 65 72 20 7b 0a 20 20 63 6f  CSVReader {.  co
ddd0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
dde0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
ddf0: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
de00: 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
de10: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
de20: 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74   CSV text from t
de30: 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d  his input stream
de40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
de50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
de60: 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f  umulated text fo
de70: 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  r a field */.  i
de80: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
de90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
dea0: 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20  bytes in z */.  
deb0: 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20  int nAlloc;     
dec0: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
ded0: 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a  ocated for z[] *
dee0: 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20  /.  int nLine;  
def0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
df00: 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  nt line number *
df10: 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20  /.  int cTerm;  
df20: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61          /* Chara
df30: 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e  cter that termin
df40: 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65  ated the most re
df50: 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20  cent field */.  
df60: 69 6e 74 20 63 53 65 70 61 72 61 74 6f 72 3b 20  int cSeparator; 
df70: 20 20 20 20 2f 2a 20 54 68 65 20 73 65 70 61 72      /* The separ
df80: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
df90: 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29 20 2a   (Usually ",") *
dfa0: 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  /.};../* Append 
dfb0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
dfc0: 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76   z[] */.static v
dfd0: 6f 69 64 20 63 73 76 5f 61 70 70 65 6e 64 5f 63  oid csv_append_c
dfe0: 68 61 72 28 43 53 56 52 65 61 64 65 72 20 2a 70  har(CSVReader *p
dff0: 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20  , int c){.  if( 
e000: 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f  p->n+1>=p->nAllo
e010: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  c ){.    p->nAll
e020: 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20  oc += p->nAlloc 
e030: 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20  + 100;.    p->z 
e040: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
e050: 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f  c(p->z, p->nAllo
e060: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  c);.    if( p->z
e070: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
e080: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75  intf(stderr, "ou
e090: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
e0a0: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
e0b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 7a      }.  }.  p->z
e0c0: 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72  [p->n++] = (char
e0d0: 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  )c;.}../* Read a
e0e0: 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
e0f0: 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70   CSV text.  Comp
e100: 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34  atible with rfc4
e110: 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64  180 and extended
e120: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74  .** with the opt
e130: 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20  ion of having a 
e140: 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20  separator other 
e150: 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20  than ","..**.** 
e160: 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
e170: 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
e180: 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
e190: 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
e1a0: 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
e1b0: 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
e1c0: 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
e1d0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
e1e0: 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  ()..**   +  Use 
e1f0: 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 73  p->cSep as the s
e200: 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
e210: 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a  efault is ","..*
e220: 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63  *   +  Keep trac
e230: 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75  k of the line nu
e240: 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65  mber in p->nLine
e250: 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
e260: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
e270: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68  at terminates th
e280: 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54  e field in p->cT
e290: 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20  erm.  Store.**  
e2a0: 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f      EOF on end-o
e2b0: 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20  f-file..**   +  
e2c0: 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72  Report syntax er
e2d0: 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a  rors on stderr.*
e2e0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
e2f0: 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
e300: 64 28 43 53 56 52 65 61 64 65 72 20 2a 70 29 7b  d(CSVReader *p){
e310: 0a 20 20 69 6e 74 20 63 2c 20 70 63 2c 20 70 70  .  int c, pc, pp
e320: 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
e330: 70 2d 3e 63 53 65 70 61 72 61 74 6f 72 3b 0a 20  p->cSeparator;. 
e340: 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d   p->n = 0;.  c =
e350: 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
e360: 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73   if( c==EOF || s
e370: 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a  eenInterrupt ){.
e380: 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45      p->cTerm = E
e390: 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  OF;.    return 0
e3a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27  ;.  }.  if( c=='
e3b0: 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 74  "' ){.    int st
e3c0: 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69  artLine = p->nLi
e3d0: 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f  ne;.    int cQuo
e3e0: 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d  te = c;.    pc =
e3f0: 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68   ppc = 0;.    wh
e400: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
e410: 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
e420: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
e430: 5c 6e 27 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b  \n' ) p->nLine++
e440: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63  ;.      if( c==c
e450: 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Quote ){.       
e460: 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
e470: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  ){.          pc 
e480: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 0;.          c
e490: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
e4a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
e4b0: 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26   if( (c==cSep &&
e4c0: 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
e4d0: 20 20 20 20 7c 7c 20 28 63 3d 3d 27 5c 6e 27 20      || (c=='\n' 
e4e0: 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
e4f0: 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 27 5c 6e        || (c=='\n
e500: 27 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26  ' && pc=='\r' &&
e510: 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20   ppc==cQuote).  
e520: 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20       || (c==EOF 
e530: 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
e540: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
e550: 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69  do{ p->n--; }whi
e560: 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d  le( p->z[p->n]!=
e570: 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20  cQuote );.      
e580: 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
e590: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e5a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e5b0: 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63   pc==cQuote && c
e5c0: 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  !='\r' ){.      
e5d0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
e5e0: 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61  , "%s:%d: unesca
e5f0: 70 65 64 20 25 63 20 63 68 61 72 61 63 74 65 72  ped %c character
e600: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
e610: 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70       p->zFile, p
e620: 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29  ->nLine, cQuote)
e630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e640: 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20  if( c==EOF ){.  
e650: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
e660: 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e  derr, "%s:%d: un
e670: 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71 75  terminated %c-qu
e680: 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20  oted field\n",. 
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e6a0: 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69  ->zFile, startLi
e6b0: 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20  ne, cQuote);.   
e6c0: 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20       p->cTerm = 
e6d0: 45 4f 46 3b 0a 20 20 20 20 20 20 20 20 62 72 65  EOF;.        bre
e6e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e6f0: 20 20 63 73 76 5f 61 70 70 65 6e 64 5f 63 68 61    csv_append_cha
e700: 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70  r(p, c);.      p
e710: 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70  pc = pc;.      p
e720: 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = c;.    }.  }
e730: 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
e740: 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53   c!=EOF && c!=cS
e750: 65 70 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 7b  ep && c!='\n' ){
e760: 0a 20 20 20 20 20 20 63 73 76 5f 61 70 70 65 6e  .      csv_appen
e770: 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
e780: 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
e790: 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >in);.    }.    
e7a0: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
e7b0: 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b       p->nLine++;
e7c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e  .      if( p->n>
e7d0: 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31  0 && p->z[p->n-1
e7e0: 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d  ]=='\r' ) p->n--
e7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63  ;.    }.    p->c
e800: 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  Term = c;.  }.  
e810: 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b  if( p->z ) p->z[
e820: 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74  p->n] = 0;.  ret
e830: 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a  urn p->z;.}../*.
e840: 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66  ** Try to transf
e850: 65 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  er data for tabl
e860: 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e  e zTable.  If an
e870: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77   error is seen w
e880: 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66  hile.** moving f
e890: 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67  orward, try to g
e8a0: 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68  o backwards.  Th
e8b0: 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65  e backwards move
e8c0: 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f  ment won't.** wo
e8d0: 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  rk for WITHOUT R
e8e0: 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  OWID tables..*/.
e8f0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
e900: 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 73 74  oCloneData(.  st
e910: 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f 64 61  ruct callback_da
e920: 74 61 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33  ta *p,.  sqlite3
e930: 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74   *newDb,.  const
e940: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29 7b   char *zTable.){
e950: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
e960: 2a 70 51 75 65 72 79 20 3d 20 30 3b 20 0a 20 20  *pQuery = 0; .  
e970: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
e980: 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63 68 61  nsert = 0;.  cha
e990: 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
e9a0: 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d   char *zInsert =
e9b0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
e9c0: 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69  int i, j, n;.  i
e9d0: 6e 74 20 6e 54 61 62 6c 65 20 3d 20 28 69 6e 74  nt nTable = (int
e9e0: 29 73 74 72 6c 65 6e 28 7a 54 61 62 6c 65 29 3b  )strlen(zTable);
e9f0: 0a 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20  .  int k = 0;.  
ea00: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63  int cnt = 0;.  c
ea10: 6f 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61 74  onst int spinRat
ea20: 65 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51  e = 10000;..  zQ
ea30: 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uery = sqlite3_m
ea40: 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
ea50: 20 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a   FROM \"%w\"", z
ea60: 54 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73  Table);.  rc = s
ea70: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
ea80: 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c  2(p->db, zQuery,
ea90: 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29   -1, &pQuery, 0)
eaa0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
eab0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
eac0: 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20  , "Error %d: %s 
ead0: 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
eae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eaf0: 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
eb00: 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
eb10: 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
eb30: 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
eb40: 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
eb50: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  .  n = sqlite3_c
eb60: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65  olumn_count(pQue
eb70: 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d  ry);.  zInsert =
eb80: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
eb90: 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20 6e  200 + nTable + n
eba0: 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73 65  *3);.  if( zInse
ebb0: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  rt==0 ){.    fpr
ebc0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75  intf(stderr, "ou
ebd0: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
ebe0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61  .    goto end_da
ebf0: 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 73  ta_xfer;.  }.  s
ec00: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ec10: 32 30 30 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65  200+nTable,zInse
ec20: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
ec30: 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f         "INSERT O
ec40: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22  R IGNORE INTO \"
ec50: 25 73 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20  %s\" VALUES(?", 
ec60: 7a 54 61 62 6c 65 29 3b 0a 20 20 69 20 3d 20 28  zTable);.  i = (
ec70: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 49 6e 73 65  int)strlen(zInse
ec80: 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b 20  rt);.  for(j=1; 
ec90: 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6d  j<n; j++){.    m
eca0: 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c  emcpy(zInsert+i,
ecb0: 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20 20 69   ",?", 2);.    i
ecc0: 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d 65 6d   += 2;.  }.  mem
ecd0: 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22  cpy(zInsert+i, "
ece0: 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20 3d 20  );", 3);.  rc = 
ecf0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
ed00: 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73 65 72  v2(newDb, zInser
ed10: 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72 74 2c  t, -1, &pInsert,
ed20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
ed30: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
ed40: 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20  err, "Error %d: 
ed50: 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
ed60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ed70: 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
ed80: 6f 64 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69  ode(newDb), sqli
ed90: 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
eda0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ),.            z
edb0: 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
edc0: 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a   end_data_xfer;.
edd0: 20 20 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b    }.  for(k=0; k
ede0: 3c 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68  <2; k++){.    wh
edf0: 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
ee00: 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
ee10: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
ee20: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ee30: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
ee40: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
ee50: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51  3_column_type(pQ
ee60: 75 65 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20  uery, i) ){.    
ee70: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ee80: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
ee90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
eea0: 6e 64 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c  nd_null(pInsert,
eeb0: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
eec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
eed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
eee0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
eef0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  GER: {.         
ef00: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ef10: 69 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69  int64(pInsert, i
ef20: 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  +1, sqlite3_colu
ef30: 6d 6e 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c  mn_int64(pQuery,
ef40: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i));.           
ef50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ef60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
ef70: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
ef80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
ef90: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
efa0: 6c 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c  le(pInsert, i+1,
efb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
efc0: 64 6f 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29  double(pQuery,i)
efd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
efe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
eff0: 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
f000: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a   SQLITE_TEXT: {.
f010: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f020: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49  te3_bind_text(pI
f030: 6e 73 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20  nsert, i+1,.    
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20           (const 
f060: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
f070: 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
f080: 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41    -1, SQLITE_STA
f0b0: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
f0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f0d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
f0e0: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
f0f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
f100: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
f110: 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
f120: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
f130: 6f 62 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20  ob(pQuery,i),.  
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f170: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
f180: 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20  Query,i),.      
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41        SQLITE_STA
f1c0: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
f1d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f1e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
f1f0: 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f       } /* End fo
f200: 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  r */.      rc = 
f210: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e  sqlite3_step(pIn
f220: 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28  sert);.      if(
f230: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
f240: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  & rc!=SQLITE_ROW
f250: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44   && rc!=SQLITE_D
f260: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ONE ){.        f
f270: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
f280: 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c  Error %d: %s\n",
f290: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
f2a0: 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29  d_errcode(newDb)
f2b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f2c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f2d0: 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29  3_errmsg(newDb))
f2e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f2f0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49  sqlite3_reset(pI
f300: 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 63 6e  nsert);.      cn
f310: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 28  t++;.      if( (
f320: 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d 3d 30  cnt%spinRate)==0
f330: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
f340: 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c  tf("%c\b", "|/-\
f350: 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74 65  \"[(cnt/spinRate
f360: 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  )%4]);.        f
f370: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
f380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
f390: 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20  End while */.   
f3a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f3b0: 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20  DONE ) break;.  
f3c0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
f3d0: 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20  ze(pQuery);.    
f3e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
f3f0: 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79  ery);.    zQuery
f400: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f410: 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
f420: 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52 20 42  M \"%w\" ORDER B
f430: 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a  Y rowid DESC;",.
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61               zTa
f460: 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ble);.    rc = s
f470: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
f480: 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c  2(p->db, zQuery,
f490: 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29   -1, &pQuery, 0)
f4a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
f4b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
f4c0: 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20  derr, "Warning: 
f4d0: 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73  cannot step \"%s
f4e0: 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a  \" backwards", z
f4f0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
f500: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f  eak;.    }.  } /
f510: 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e  * End for(k=0...
f520: 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78  ) */..end_data_x
f530: 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
f540: 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
f550: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
f560: 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  ize(pInsert);.  
f570: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
f580: 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
f590: 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d  free(zInsert);.}
f5a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
f5b0: 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77  transfer all row
f5c0: 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  s of the schema 
f5d0: 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72  that match zWher
f5e0: 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  e.  For.** each 
f5f0: 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72  row, invoke xFor
f600: 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62  Each() on the ob
f610: 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20  ject defined by 
f620: 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20  that row..** If 
f630: 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
f640: 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f  untered while mo
f650: 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72  ving forward thr
f660: 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ough the.** sqli
f670: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c  te_master table,
f680: 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e   try again movin
f690: 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a  g backwards..*/.
f6a0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
f6b0: 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20  oCloneSchema(.  
f6c0: 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
f6d0: 64 61 74 61 20 2a 70 2c 0a 20 20 73 71 6c 69 74  data *p,.  sqlit
f6e0: 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e  e3 *newDb,.  con
f6f0: 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c  st char *zWhere,
f700: 0a 20 20 76 6f 69 64 20 28 2a 78 46 6f 72 45 61  .  void (*xForEa
f710: 63 68 29 28 73 74 72 75 63 74 20 63 61 6c 6c 62  ch)(struct callb
f720: 61 63 6b 5f 64 61 74 61 2a 2c 73 71 6c 69 74 65  ack_data*,sqlite
f730: 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  3*,const char*).
f740: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
f750: 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20  t *pQuery = 0;. 
f760: 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20   char *zQuery = 
f770: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  0;.  int rc;.  c
f780: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f790: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e  ar *zName;.  con
f7a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f7b0: 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a   *zSql;.  char *
f7c0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
f7d0: 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  zQuery = sqlite3
f7e0: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
f7f0: 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20   name, sql FROM 
f800: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
f830: 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a  E %s", zWhere);.
f840: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
f850: 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
f860: 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
f870: 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20  uery, 0);.  if( 
f880: 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rc ){.    fprint
f890: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
f8a0: 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
f8b0: 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
f8c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f8d0: 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
f8e0: 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
f8f0: 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
f900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f910: 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
f920: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
f930: 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77  ma_xfer;.  }.  w
f940: 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
f950: 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
f960: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
f970: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
f980: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
f990: 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
f9a0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
f9b0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
f9c0: 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e  ry, 1);.    prin
f9d0: 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
f9e0: 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
f9f0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
fa00: 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
fa10: 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
fa20: 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
fa30: 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
fa40: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
fa50: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
fa60: 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c  : %s\nSQL: [%s]\
fa70: 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71  n", zErrMsg, zSq
fa80: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
fa90: 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
faa0: 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  .      zErrMsg =
fab0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
fac0: 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20  ( xForEach ){.  
fad0: 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20      xForEach(p, 
fae0: 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68  newDb, (const ch
faf0: 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ar*)zName);.    
fb00: 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f  }.    printf("do
fb10: 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ne\n");.  }.  if
fb20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
fb30: 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
fb40: 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79  _finalize(pQuery
fb50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
fb60: 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 20  ree(zQuery);.   
fb70: 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65   zQuery = sqlite
fb80: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
fb90: 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d  T name, sql FROM
fba0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
fbd0: 48 45 52 45 20 25 73 20 4f 52 44 45 52 20 42 59  HERE %s ORDER BY
fbe0: 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 57   rowid DESC", zW
fbf0: 68 65 72 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  here);.    rc = 
fc00: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
fc10: 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
fc20: 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
fc30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fc40: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
fc50: 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28  tderr, "Error: (
fc60: 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e  %d) %s on [%s]\n
fc70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
fc80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fc90: 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
fca0: 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65  e(p->db), sqlite
fcb0: 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c  3_errmsg(p->db),
fcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fcd0: 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
fce0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
fcf0: 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20  chema_xfer;.    
fd00: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  }.    while( (rc
fd10: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
fd20: 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
fd30: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e  _ROW ){.      zN
fd40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ame = sqlite3_co
fd50: 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
fd60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  , 0);.      zSql
fd70: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
fd80: 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 31  n_text(pQuery, 1
fd90: 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  );.      printf(
fda0: 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29  "%s... ", zName)
fdb0: 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
fdc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
fdd0: 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e  exec(newDb, (con
fde0: 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30  st char*)zSql, 0
fdf0: 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , 0, &zErrMsg);.
fe00: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73        if( zErrMs
fe10: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  g ){.        fpr
fe20: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
fe30: 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25  ror: %s\nSQL: [%
fe40: 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20  s]\n", zErrMsg, 
fe50: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zSql);.        s
fe60: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
fe70: 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 45  Msg);.        zE
fe80: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
fe90: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78 46 6f   }.      if( xFo
fea0: 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 20  rEach ){.       
feb0: 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77   xForEach(p, new
fec0: 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
fed0: 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  )zName);.      }
fee0: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 64  .      printf("d
fef0: 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  one\n");.    }. 
ff00: 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66   }.end_schema_xf
ff10: 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er:.  sqlite3_fi
ff20: 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a  nalize(pQuery);.
ff30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ff40: 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Query);.}../*.**
ff50: 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
ff60: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
ff70: 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79 20 74  "zNewDb".  Try t
ff80: 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d 75 63  o recover as muc
ff90: 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  h information.**
ffa0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f 75 74   as possible out
ffb0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
ffc0: 61 62 61 73 65 20 28 77 68 69 63 68 20 6d 69 67  abase (which mig
ffd0: 68 74 20 62 65 20 63 6f 72 72 75 70 74 29 20 61  ht be corrupt) a
ffe0: 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 69  nd write it.** i
fff0: 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73  nto zNewDb..*/.s
10000 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f  tatic void tryTo
10010 43 6c 6f 6e 65 28 73 74 72 75 63 74 20 63 61 6c  Clone(struct cal
10020 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 63  lback_data *p, c
10030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 44  onst char *zNewD
10040 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b){.  int rc;.  
10050 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20 3d  sqlite3 *newDb =
10060 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73   0;.  if( access
10070 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b  (zNewDb,0)==0 ){
10080 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
10090 65 72 72 2c 20 22 46 69 6c 65 20 5c 22 25 73 5c  err, "File \"%s\
100a0 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  " already exists
100b0 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62 29 3b 0a 20  .\n", zNewDb);. 
100c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
100d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
100e0 65 6e 28 7a 4e 65 77 44 62 2c 20 26 6e 65 77 44  en(zNewDb, &newD
100f0 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  b);.  if( rc ){.
10100 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
10110 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61  rr, "Cannot crea
10120 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61  te output databa
10130 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  se: %s\n",.     
10140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
10150 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
10160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
10170 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
10180 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
10190 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
101a0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
101b0 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
101c0 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79  pe='table'", try
101d0 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20  ToCloneData);.  
101e0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
101f0 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
10200 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29  pe!='table'", 0)
10210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
10220 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49  ec(newDb, "COMMI
10230 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  T;", 0, 0, 0);. 
10240 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f   }.  sqlite3_clo
10250 73 65 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a  se(newDb);.}../*
10260 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20  .** If an input 
10270 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68  line begins with
10280 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65   "." then invoke
10290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
102a0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74  .** process that
102b0 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   line..**.** Ret
102c0 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20  urn 1 on error, 
102d0 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30  2 to exit, and 0
102e0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
102f0 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74  tatic int do_met
10300 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a  a_command(char *
10310 7a 4c 69 6e 65 2c 20 73 74 72 75 63 74 20 63 61  zLine, struct ca
10320 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 70 29 7b  llback_data *p){
10330 0a 20 20 69 6e 74 20 69 20 3d 20 31 3b 0a 20 20  .  int i = 1;.  
10340 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20  int nArg = 0;.  
10350 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20  int n, c;.  int 
10360 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rc = 0;.  char *
10370 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f 2a  azArg[50];..  /*
10380 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74   Parse the input
10390 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e   line into token
103a0 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
103b0 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 6e 41 72   zLine[i] && nAr
103c0 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72  g<ArraySize(azAr
103d0 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  g) ){.    while(
103e0 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 69   IsSpace(zLine[i
103f0 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
10400 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 30   if( zLine[i]==0
10410 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
10420 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 27 27  ( zLine[i]=='\''
10430 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 22   || zLine[i]=='"
10440 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ' ){.      int d
10450 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 69 2b 2b  elim = zLine[i++
10460 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  ];.      azArg[n
10470 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
10480 69 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  i];.      while(
10490 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69   zLine[i] && zLi
104a0 6e 65 5b 69 5d 21 3d 64 65 6c 69 6d 20 29 7b 20  ne[i]!=delim ){ 
104b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69  .        if( zLi
104c0 6e 65 5b 69 5d 3d 3d 27 5c 5c 27 20 26 26 20 64  ne[i]=='\\' && d
104d0 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69  elim=='"' && zLi
104e0 6e 65 5b 69 2b 31 5d 21 3d 30 20 29 20 69 2b 2b  ne[i+1]!=0 ) i++
104f0 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 20 0a  ;.        i++; .
10500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10510 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 64 65 6c 69  ( zLine[i]==deli
10520 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  m ){.        zLi
10530 6e 65 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  ne[i++] = 0;.   
10540 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
10550 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f  elim=='"' ) reso
10560 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
10570 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a  azArg[nArg-1]);.
10580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10590 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d   azArg[nArg++] =
105a0 20 26 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20   &zLine[i];.    
105b0 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69    while( zLine[i
105c0 5d 20 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c  ] && !IsSpace(zL
105d0 69 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  ine[i]) ){ i++; 
105e0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  }.      if( zLin
105f0 65 5b 69 5d 20 29 20 7a 4c 69 6e 65 5b 69 2b 2b  e[i] ) zLine[i++
10600 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73  ] = 0;.      res
10610 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
10620 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b  (azArg[nArg-1]);
10630 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10640 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70   Process the inp
10650 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  ut line..  */.  
10660 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65  if( nArg==0 ) re
10670 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f  turn 0; /* no to
10680 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a  kens, no error *
10690 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  /.  n = strlen30
106a0 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20  (azArg[0]);.  c 
106b0 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20  = azArg[0][0];. 
106c0 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20   if( (c=='b' && 
106d0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
106e0 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75  azArg[0], "backu
106f0 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c  p", n)==0).   ||
10700 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33   (c=='s' && n>=3
10710 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
10720 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29  g[0], "save", n)
10730 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ==0).  ){.    co
10740 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
10750 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ile = 0;.    con
10760 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
10770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
10780 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Dest;.    sqlite
10790 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
107a0 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  p;.    int j;.  
107b0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72    for(j=1; j<nAr
107c0 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; j++){.      c
107d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
107e0 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  zArg[j];.      i
107f0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
10800 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
10810 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [0]=='-' ) z++;.
10820 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70          /* No op
10830 74 69 6f 6e 73 20 74 6f 20 70 72 6f 63 65 73 73  tions to process
10840 20 61 74 20 74 68 69 73 20 74 69 6d 65 20 2a 2f   at this time */
10850 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
10860 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
10870 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
10880 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41  tion: %s\n", azA
10890 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[j]);.        
108a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
108b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
108c0 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d  e if( zDestFile=
108d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
108e0 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  estFile = azArg[
108f0 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  j];.      }else 
10900 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
10910 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44 65 73        zDb = zDes
10920 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a  tFile;.        z
10930 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67  DestFile = azArg
10940 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [j];.      }else
10950 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
10960 66 28 73 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d  f(stderr, "too m
10970 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  any arguments to
10980 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20   .backup\n");.  
10990 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
109a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
109b0 20 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d    if( zDestFile=
109c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
109d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73  ntf(stderr, "mis
109e0 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72  sing FILENAME ar
109f0 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75  gument on .backu
10a00 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  p\n");.      ret
10a10 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
10a20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44   if( zDb==0 ) zD
10a30 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
10a40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
10a50 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44  n(zDestFile, &pD
10a60 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  est);.    if( rc
10a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10a80 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
10a90 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
10aa0 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
10ab0 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a  n", zDestFile);.
10ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
10ad0 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
10ae0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
10af0 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
10b00 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70   0);.    pBackup
10b10 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
10b20 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d  p_init(pDest, "m
10b30 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62  ain", p->db, zDb
10b40 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
10b50 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  up==0 ){.      f
10b60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
10b70 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
10b80 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
10b90 73 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  st));.      sqli
10ba0 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
10bb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
10bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
10bd0 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65  e(  (rc = sqlite
10be0 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42  3_backup_step(pB
10bf0 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c  ackup,100))==SQL
10c00 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73  ITE_OK ){}.    s
10c10 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
10c20 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
10c30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10c40 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
10c50 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
10c60 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
10c70 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
10c80 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
10c90 65 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a  errmsg(pDest));.
10ca0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
10cb0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
10cc0 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
10cd0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
10ce0 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
10cf0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
10d00 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 26   "bail", n)==0 &
10d10 26 20 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67  & nArg>1 && nArg
10d20 3c 33 20 29 7b 0a 20 20 20 20 62 61 69 6c 5f 6f  <3 ){.    bail_o
10d30 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61  n_error = boolea
10d40 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
10d50 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
10d60 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64  The undocumented
10d70 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63   ".breakpoint" c
10d80 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20  ommand causes a 
10d90 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f  call to the no-o
10da0 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e  p.  ** routine n
10db0 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70  amed test_breakp
10dc0 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69  oint()..  */.  i
10dd0 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
10de0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
10df0 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69  rg[0], "breakpoi
10e00 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
10e10 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e    test_breakpoin
10e20 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  t();.  }else..  
10e30 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74  if( c=='c' && st
10e40 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
10e50 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 26  "clone", n)==0 &
10e60 26 20 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67  & nArg>1 && nArg
10e70 3c 33 20 29 7b 0a 20 20 20 20 74 72 79 54 6f 43  <3 ){.    tryToC
10e80 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d  lone(p, azArg[1]
10e90 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
10ea0 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20  ( c=='d' && n>1 
10eb0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
10ec0 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22  [0], "databases"
10ed0 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
10ee0 3d 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =1 ){.    struct
10ef0 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 64   callback_data d
10f00 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
10f10 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
10f20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
10f30 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c     memcpy(&data,
10f40 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29   p, sizeof(data)
10f50 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77  );.    data.show
10f60 48 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Header = 1;.    
10f70 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
10f80 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 64 61 74  _Column;.    dat
10f90 61 2e 63 6f 6c 57 69 64 74 68 5b 30 5d 20 3d 20  a.colWidth[0] = 
10fa0 33 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c 57  3;.    data.colW
10fb0 69 64 74 68 5b 31 5d 20 3d 20 31 35 3b 0a 20 20  idth[1] = 15;.  
10fc0 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68 5b    data.colWidth[
10fd0 32 5d 20 3d 20 35 38 3b 0a 20 20 20 20 64 61 74  2] = 58;.    dat
10fe0 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  a.cnt = 0;.    s
10ff0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
11000 62 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61 62  b, "PRAGMA datab
11010 61 73 65 5f 6c 69 73 74 3b 20 22 2c 20 63 61 6c  ase_list; ", cal
11020 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
11030 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
11040 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
11050 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
11060 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
11070 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
11080 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
11090 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20  rMsg);.      rc 
110a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
110b0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
110c0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
110d0 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29  g[0], "dump", n)
110e0 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b  ==0 && nArg<3 ){
110f0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
11100 30 29 3b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0);.    /* When 
11110 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 61 20 22  playing back a "
11120 64 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74 65  dump", the conte
11130 6e 74 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  nt might appear 
11140 69 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20  in an order.    
11150 2a 2a 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ** which causes 
11160 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
11170 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
11180 73 20 74 6f 20 62 65 20 76 69 6f 6c 61 74 65 64  s to be violated
11190 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69 73 61  ..    ** So disa
111a0 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20  ble foreign-key 
111b0 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72  constraint enfor
111c0 63 65 6d 65 6e 74 20 74 6f 20 70 72 65 76 65 6e  cement to preven
111d0 74 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20  t problems. */. 
111e0 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
111f0 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69  t, "PRAGMA forei
11200 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29  gn_keys=OFF;\n")
11210 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  ;.    fprintf(p-
11220 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41  >out, "BEGIN TRA
11230 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20  NSACTION;\n");. 
11240 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63     p->writableSc
11250 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 73 71  hema = 0;.    sq
11260 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
11270 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 64 75 6d  , "SAVEPOINT dum
11280 70 3b 20 50 52 41 47 4d 41 20 77 72 69 74 61 62  p; PRAGMA writab
11290 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30  le_schema=ON", 0
112a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , 0, 0);.    p->
112b0 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  nErr = 0;.    if
112c0 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nArg==1 ){.   
112d0 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
112e0 6d 70 5f 71 75 65 72 79 28 70 2c 20 0a 20 20 20  mp_query(p, .   
112f0 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
11300 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f  e, type, sql FRO
11310 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
11320 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
11330 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e   sql NOT NULL AN
11340 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20  D type=='table' 
11350 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74  AND name!='sqlit
11360 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20  e_sequence'".   
11370 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f     );.      run_
11380 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
11390 79 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22 53  y(p, .        "S
113a0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
113b0 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
113c0 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
113d0 20 20 20 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d     "WHERE name==
113e0 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  'sqlite_sequence
113f0 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  '".      );.    
11400 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70    run_table_dump
11410 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
11420 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
11430 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
11440 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
11450 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41  E sql NOT NULL A
11460 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64  ND type IN ('ind
11470 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76  ex','trigger','v
11480 69 65 77 27 29 22 2c 20 30 0a 20 20 20 20 20 20  iew')", 0.      
11490 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
114a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
114b0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
114c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
114d0 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61  zShellStatic = a
114e0 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
114f0 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
11500 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
11510 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
11520 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
11530 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
11540 0a 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52  .          "WHER
11550 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  E tbl_name LIKE 
11560 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 41 4e  shellstatic() AN
11570 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22  D type=='table'"
11580 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e  .          "  AN
11590 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 29  D sql NOT NULL")
115a0 3b 0a 20 20 20 20 20 20 20 20 72 75 6e 5f 74 61  ;.        run_ta
115b0 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
115c0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  ,.          "SEL
115d0 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
115e0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
115f0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
11600 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20  l NOT NULL".    
11610 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 79 70        "  AND typ
11620 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74  e IN ('index','t
11630 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22  rigger','view')"
11640 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 41 4e  .          "  AN
11650 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
11660 73 68 65 6c 6c 73 74 61 74 69 63 28 29 22 2c 20  shellstatic()", 
11670 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
11680 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69       zShellStati
11690 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 0;.      }. 
116a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
116b0 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29  writableSchema )
116c0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
116d0 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
116e0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
116f0 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  OFF;\n");.      
11700 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
11710 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  a = 0;.    }.   
11720 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
11730 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69  >db, "PRAGMA wri
11740 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
11750 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
11760 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
11770 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64  ->db, "RELEASE d
11780 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  ump;", 0, 0, 0);
11790 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
117a0 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22  out, p->nErr ? "
117b0 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65  ROLLBACK; -- due
117c0 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20   to errors\n" : 
117d0 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20  "COMMIT;\n");.  
117e0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
117f0 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
11800 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c  zArg[0], "echo",
11810 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31   n)==0 && nArg>1
11820 20 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20   && nArg<3 ){.  
11830 20 20 70 2d 3e 65 63 68 6f 4f 6e 20 3d 20 62 6f    p->echoOn = bo
11840 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
11850 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  [1]);.  }else.. 
11860 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
11870 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
11880 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 26 26   "eqp", n)==0 &&
11890 20 6e 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c   nArg>1 && nArg<
118a0 33 20 29 7b 0a 20 20 20 20 70 2d 3e 61 75 74 6f  3 ){.    p->auto
118b0 45 51 50 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  EQP = booleanVal
118c0 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
118d0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
118e0 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
118f0 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c  zArg[0], "exit",
11900 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
11910 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72 63 20  ( nArg>1 && (rc 
11920 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
11930 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d  lue(azArg[1]))!=
11940 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a 20 20  0 ) exit(rc);.  
11950 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    rc = 2;.  }els
11960 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  e..  if( c=='e' 
11970 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
11980 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20  [0], "explain", 
11990 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3c 33 20  n)==0 && nArg<3 
119a0 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d  ){.    int val =
119b0 20 6e 41 72 67 3e 3d 32 20 3f 20 62 6f 6f 6c 65   nArg>=2 ? boole
119c0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
119d0 29 20 3a 20 31 3b 0a 20 20 20 20 69 66 28 76 61  ) : 1;.    if(va
119e0 6c 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20 20  l == 1) {.      
119f0 69 66 28 21 70 2d 3e 65 78 70 6c 61 69 6e 50 72  if(!p->explainPr
11a00 65 76 2e 76 61 6c 69 64 29 20 7b 0a 20 20 20 20  ev.valid) {.    
11a10 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e 50 72      p->explainPr
11a20 65 76 2e 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20  ev.valid = 1;.  
11a30 20 20 20 20 20 20 70 2d 3e 65 78 70 6c 61 69 6e        p->explain
11a40 50 72 65 76 2e 6d 6f 64 65 20 3d 20 70 2d 3e 6d  Prev.mode = p->m
11a50 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ode;.        p->
11a60 65 78 70 6c 61 69 6e 50 72 65 76 2e 73 68 6f 77  explainPrev.show
11a70 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77  Header = p->show
11a80 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20  Header;.        
11a90 6d 65 6d 63 70 79 28 70 2d 3e 65 78 70 6c 61 69  memcpy(p->explai
11aa0 6e 50 72 65 76 2e 63 6f 6c 57 69 64 74 68 2c 70  nPrev.colWidth,p
11ab0 2d 3e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f  ->colWidth,sizeo
11ac0 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b  f(p->colWidth));
11ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
11ae0 2a 20 57 65 20 63 6f 75 6c 64 20 70 75 74 20 74  * We could put t
11af0 68 69 73 20 63 6f 64 65 20 75 6e 64 65 72 20 74  his code under t
11b00 68 65 20 21 70 2d 3e 65 78 70 6c 61 69 6e 56 61  he !p->explainVa
11b10 6c 69 64 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  lid.      ** con
11b20 64 69 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  dition so that i
11b30 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 65 63 75  t does not execu
11b40 74 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  te if we are alr
11b50 65 61 64 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a  eady in.      **
11b60 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 2e 20 48   explain mode. H
11b70 6f 77 65 76 65 72 2c 20 61 6c 77 61 79 73 20 65  owever, always e
11b80 78 65 63 75 74 69 6e 67 20 69 74 20 61 6c 6c 6f  xecuting it allo
11b90 77 73 20 75 73 20 61 6e 20 65 61 73 79 0a 20 20  ws us an easy.  
11ba0 20 20 20 20 2a 2a 20 77 61 73 20 74 6f 20 72 65      ** was to re
11bb0 73 65 74 20 74 6f 20 65 78 70 6c 61 69 6e 20 6d  set to explain m
11bc0 6f 64 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ode in case the 
11bd0 75 73 65 72 20 70 72 65 76 69 6f 75 73 6c 79 0a  user previously.
11be0 20 20 20 20 20 20 2a 2a 20 64 69 64 20 61 6e 20        ** did an 
11bf0 2e 65 78 70 6c 61 69 6e 20 66 6f 6c 6c 6f 77 65  .explain followe
11c00 64 20 62 79 20 61 20 2e 77 69 64 74 68 2c 20 2e  d by a .width, .
11c10 6d 6f 64 65 20 6f 72 20 2e 68 65 61 64 65 72 0a  mode or .header.
11c20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64        ** command
11c30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11c40 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
11c50 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70  Explain;.      p
11c60 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31  ->showHeader = 1
11c70 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
11c80 2d 3e 63 6f 6c 57 69 64 74 68 2c 30 2c 73 69 7a  ->colWidth,0,siz
11c90 65 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29  eof(p->colWidth)
11ca0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57  );.      p->colW
11cb0 69 64 74 68 5b 30 5d 20 3d 20 34 3b 20 20 20 20  idth[0] = 4;    
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cd0 20 61 64 64 72 20 2a 2f 0a 20 20 20 20 20 20 70   addr */.      p
11ce0 2d 3e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20  ->colWidth[1] = 
11cf0 31 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  13;             
11d00 20 20 20 20 2f 2a 20 6f 70 63 6f 64 65 20 2a 2f      /* opcode */
11d10 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
11d20 74 68 5b 32 5d 20 3d 20 34 3b 20 20 20 20 20 20  th[2] = 4;      
11d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11d40 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f  1 */.      p->co
11d50 6c 57 69 64 74 68 5b 33 5d 20 3d 20 34 3b 20 20  lWidth[3] = 4;  
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70  /* P2 */.      p
11d80 2d 3e 63 6f 6c 57 69 64 74 68 5b 34 5d 20 3d 20  ->colWidth[4] = 
11d90 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4;              
11da0 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20      /* P3 */.   
11db0 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 35     p->colWidth[5
11dc0 5d 20 3d 20 31 33 3b 20 20 20 20 20 20 20 20 20  ] = 13;         
11dd0 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
11de0 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64  .      p->colWid
11df0 74 68 5b 36 5d 20 3d 20 32 3b 20 20 20 20 20 20  th[6] = 2;      
11e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11e10 35 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f  5 */.      p->co
11e20 6c 57 69 64 74 68 5b 37 5d 20 3d 20 31 33 3b 20  lWidth[7] = 13; 
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e40 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
11e50 20 20 20 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e     }else if (p->
11e60 65 78 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69  explainPrev.vali
11e70 64 29 20 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  d) {.      p->ex
11e80 70 6c 61 69 6e 50 72 65 76 2e 76 61 6c 69 64 20  plainPrev.valid 
11e90 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  = 0;.      p->mo
11ea0 64 65 20 3d 20 70 2d 3e 65 78 70 6c 61 69 6e 50  de = p->explainP
11eb0 72 65 76 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rev.mode;.      
11ec0 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
11ed0 70 2d 3e 65 78 70 6c 61 69 6e 50 72 65 76 2e 73  p->explainPrev.s
11ee0 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20  howHeader;.     
11ef0 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 57 69   memcpy(p->colWi
11f00 64 74 68 2c 70 2d 3e 65 78 70 6c 61 69 6e 50 72  dth,p->explainPr
11f10 65 76 2e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65  ev.colWidth,size
11f20 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29  of(p->colWidth))
11f30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
11f40 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26  .  if( c=='h' &&
11f50 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b   (strncmp(azArg[
11f60 30 5d 2c 20 22 68 65 61 64 65 72 22 2c 20 6e 29  0], "header", n)
11f70 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
11f80 20 20 20 20 20 20 20 20 73 74 72 6e 63 6d 70 28          strncmp(
11f90 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65  azArg[0], "heade
11fa0 72 73 22 2c 20 6e 29 3d 3d 30 29 20 26 26 20 6e  rs", n)==0) && n
11fb0 41 72 67 3e 31 20 26 26 20 6e 41 72 67 3c 33 20  Arg>1 && nArg<3 
11fc0 29 7b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  ){.    p->showHe
11fd0 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  ader = booleanVa
11fe0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
11ff0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
12000 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
12010 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22  azArg[0], "help"
12020 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  , n)==0 ){.    f
12030 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
12040 73 22 2c 7a 48 65 6c 70 29 3b 0a 20 20 20 20 69  s",zHelp);.    i
12050 66 28 20 48 41 53 5f 54 49 4d 45 52 20 29 7b 0a  f( HAS_TIMER ){.
12060 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
12070 64 65 72 72 2c 22 25 73 22 2c 7a 54 69 6d 65 72  derr,"%s",zTimer
12080 48 65 6c 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Help);.    }.  }
12090 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
120a0 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
120b0 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22  Arg[0], "import"
120c0 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
120d0 3d 33 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =3 ){.    char *
120e0 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32  zTable = azArg[2
120f0 5d 3b 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ];    /* Insert 
12100 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74  data into this t
12110 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
12120 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b   *zFile = azArg[
12130 31 5d 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  1];     /* Name 
12140 6f 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61  of file to extra
12150 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f   content from */
12160 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
12170 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  t *pStmt = NULL;
12180 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
12190 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
121c0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
121d0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
121e0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
121f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12200 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
12210 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
12220 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12240 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
12250 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43  */.    int needC
12260 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  ommit;          
12270 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f     /* True to CO
12280 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
12290 20 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69   at end */.    i
122a0 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20  nt nSep;        
122b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
122c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
122d0 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 5d 20   p->separator[] 
122e0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
122f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
12300 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61     /* An SQL sta
12310 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 43 53  tement */.    CS
12320 56 52 65 61 64 65 72 20 73 43 73 76 3b 20 20 20  VReader sCsv;   
12330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
12340 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  der context */. 
12350 20 20 20 69 6e 74 20 28 2a 78 43 6c 6f 73 65 72     int (*xCloser
12360 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f  )(FILE*);      /
12370 2a 20 50 72 6f 63 65 64 75 72 65 20 74 6f 20 63  * Procedure to c
12380 6c 6f 73 65 20 74 68 33 20 63 6f 6e 6e 65 63 74  lose th3 connect
12390 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 73 65 65 6e  ion */..    seen
123a0 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20  Interrupt = 0;. 
123b0 20 20 20 6d 65 6d 73 65 74 28 26 73 43 73 76 2c     memset(&sCsv,
123c0 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 73 76 29   0, sizeof(sCsv)
123d0 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  );.    open_db(p
123e0 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
123f0 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 65 70   strlen30(p->sep
12400 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  arator);.    if(
12410 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
12420 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
12430 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  , "Error: non-nu
12440 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ll separator req
12450 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74  uired for import
12460 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
12470 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
12480 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20  if( nSep>1 ){.  
12490 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
124a0 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74  rr, "Error: mult
124b0 69 2d 63 68 61 72 61 63 74 65 72 20 73 65 70 61  i-character sepa
124c0 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77  rators not allow
124d0 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed".            
124e0 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20            " for 
124f0 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20  import\n");.    
12500 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
12510 7d 0a 20 20 20 20 73 43 73 76 2e 7a 46 69 6c 65  }.    sCsv.zFile
12520 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43   = zFile;.    sC
12530 73 76 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20  sv.nLine = 1;.  
12540 20 20 69 66 28 20 73 43 73 76 2e 7a 46 69 6c 65    if( sCsv.zFile
12550 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 20 20 20 20  [0]=='|' ){.    
12560 20 20 73 43 73 76 2e 69 6e 20 3d 20 70 6f 70 65    sCsv.in = pope
12570 6e 28 73 43 73 76 2e 7a 46 69 6c 65 2b 31 2c 20  n(sCsv.zFile+1, 
12580 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43 73 76  "r");.      sCsv
12590 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e  .zFile = "<pipe>
125a0 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  ";.      xCloser
125b0 20 3d 20 70 63 6c 6f 73 65 3b 0a 20 20 20 20 7d   = pclose;.    }
125c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 73 76  else{.      sCsv
125d0 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 73 76  .in = fopen(sCsv
125e0 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  .zFile, "rb");. 
125f0 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66       xCloser = f
12600 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20  close;.    }.   
12610 20 69 66 28 20 73 43 73 76 2e 69 6e 3d 3d 30 20   if( sCsv.in==0 
12620 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
12630 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
12640 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
12650 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a  s\"\n", zFile);.
12660 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
12670 20 20 20 20 7d 0a 20 20 20 20 73 43 73 76 2e 63      }.    sCsv.c
12680 53 65 70 61 72 61 74 6f 72 20 3d 20 70 2d 3e 73  Separator = p->s
12690 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20  eparator[0];.   
126a0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
126b0 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
126c0 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62  * FROM %s", zTab
126d0 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  le);.    if( zSq
126e0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  l==0 ){.      fp
126f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
12700 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
12710 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78  ory\n");.      x
12720 43 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29 3b  Closer(sCsv.in);
12730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
12740 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
12750 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
12760 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12770 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
12780 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
12790 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
127a0 69 66 28 20 72 63 20 26 26 20 73 71 6c 69 74 65  if( rc && sqlite
127b0 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75  3_strglob("no su
127c0 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71  ch table: *", sq
127d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
127e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
127f0 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71  ar *zCreate = sq
12800 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43  lite3_mprintf("C
12810 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c  REATE TABLE %s",
12820 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   zTable);.      
12830 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
12840 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73  .      while( cs
12850 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  v_read_one_field
12860 28 26 73 43 73 76 29 20 29 7b 0a 20 20 20 20 20  (&sCsv) ){.     
12870 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c     zCreate = sql
12880 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
12890 25 63 5c 6e 20 20 5c 22 25 73 5c 22 20 54 45 58  %c\n  \"%s\" TEX
128a0 54 22 2c 20 7a 43 72 65 61 74 65 2c 20 63 53 65  T", zCreate, cSe
128b0 70 2c 20 73 43 73 76 2e 7a 29 3b 0a 20 20 20 20  p, sCsv.z);.    
128c0 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a      cSep = ',';.
128d0 20 20 20 20 20 20 20 20 69 66 28 20 73 43 73 76          if( sCsv
128e0 2e 63 54 65 72 6d 21 3d 73 43 73 76 2e 63 53 65  .cTerm!=sCsv.cSe
128f0 70 61 72 61 74 6f 72 20 29 20 62 72 65 61 6b 3b  parator ) break;
12900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12910 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a  f( cSep=='(' ){.
12920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12930 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
12940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12950 72 65 65 28 73 43 73 76 2e 7a 29 3b 0a 20 20 20  ree(sCsv.z);.   
12960 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 73       xCloser(sCs
12970 76 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  v.in);.        f
12980 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
12990 73 3a 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22  s: empty file\n"
129a0 2c 20 73 43 73 76 2e 7a 46 69 6c 65 29 3b 0a 20  , sCsv.zFile);. 
129b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
129c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
129d0 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Create = sqlite3
129e0 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c 6e 29 22  _mprintf("%z\n)"
129f0 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20  , zCreate);.    
12a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
12a10 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43 72 65 61  xec(p->db, zCrea
12a20 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  te, 0, 0, 0);.  
12a30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12a40 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20  (zCreate);.     
12a50 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12a60 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
12a70 72 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  r, "CREATE TABLE
12a80 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a   %s(...) failed:
12a90 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a   %s\n", zTable,.
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
12ac0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b));.        sql
12ad0 69 74 65 33 5f 66 72 65 65 28 73 43 73 76 2e 7a  ite3_free(sCsv.z
12ae0 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73  );.        xClos
12af0 65 72 28 73 43 73 76 2e 69 6e 29 3b 0a 20 20 20  er(sCsv.in);.   
12b00 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
12b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
12b20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
12b30 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
12b40 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
12b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12b60 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
12b70 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12b80 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73      if (pStmt) s
12b90 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
12ba0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 70  pStmt);.      fp
12bb0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
12bc0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
12bd0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
12be0 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73  .      xCloser(s
12bf0 43 73 76 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72  Csv.in);.      r
12c00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
12c10 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
12c20 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
12c30 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
12c40 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
12c50 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
12c60 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  0;.    if( nCol=
12c70 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  =0 ) return 0; /
12c80 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f  * no columns, no
12c90 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7a 53   error */.    zS
12ca0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ql = sqlite3_mal
12cb0 6c 6f 63 28 20 6e 42 79 74 65 2a 32 20 2b 20 32  loc( nByte*2 + 2
12cc0 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20  0 + nCol*2 );.  
12cd0 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
12ce0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
12cf0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f  tderr, "Error: o
12d00 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
12d10 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
12d20 73 43 73 76 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCsv.in);.      
12d30 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
12d40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12d50 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a  intf(nByte+20, z
12d60 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54  Sql, "INSERT INT
12d70 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45 53 28  O \"%w\" VALUES(
12d80 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ?", zTable);.   
12d90 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
12da0 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
12db0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
12dc0 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
12dd0 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
12de0 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
12df0 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
12e00 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
12e10 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
12e20 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
12e30 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
12e40 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
12e50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
12e60 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
12e70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66  f( rc ){.      f
12e80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
12e90 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
12ea0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
12eb0 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74  );.      if (pSt
12ec0 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  mt) sqlite3_fina
12ed0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
12ee0 20 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76 2e     xCloser(sCsv.
12ef0 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
12f00 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
12f10 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69  eedCommit = sqli
12f20 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
12f30 69 74 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  it(db);.    if( 
12f40 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c  needCommit ) sql
12f50 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 42  ite3_exec(db, "B
12f60 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
12f70 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
12f80 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 73  nt startLine = s
12f90 43 73 76 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20  Csv.nLine;.     
12fa0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
12fb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12fc0 63 68 61 72 20 2a 7a 20 3d 20 63 73 76 5f 72 65  char *z = csv_re
12fd0 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 26 73 43  ad_one_field(&sC
12fe0 73 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sv);.        if(
12ff0 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29 20   z==0 && i==0 ) 
13000 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73  break;.        s
13010 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
13020 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20  (pStmt, i+1, z, 
13030 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
13040 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69  IENT);.        i
13050 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73  f( i<nCol-1 && s
13060 43 73 76 2e 63 54 65 72 6d 21 3d 73 43 73 76 2e  Csv.cTerm!=sCsv.
13070 63 53 65 70 61 72 61 74 6f 72 20 29 7b 0a 20 20  cSeparator ){.  
13080 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
13090 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
130a0 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
130b0 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64  mns but found %d
130c0 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
130e0 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74  filling the rest
130f0 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20   with NULL\n",. 
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 20 20 20 20 73 43 73 76 2e 7a 46           sCsv.zF
13120 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
13130 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  nCol, i+1);.    
13140 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
13150 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43       while( i<nC
13160 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f 62 69  ol ){ sqlite3_bi
13170 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
13180 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ); i++; }.      
13190 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
131a0 20 20 69 66 28 20 73 43 73 76 2e 63 54 65 72 6d    if( sCsv.cTerm
131b0 3d 3d 73 43 73 76 2e 63 53 65 70 61 72 61 74 6f  ==sCsv.cSeparato
131c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  r ){.        do{
131d0 0a 20 20 20 20 20 20 20 20 20 20 63 73 76 5f 72  .          csv_r
131e0 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 26 73  ead_one_field(&s
131f0 43 73 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Csv);.          
13200 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77 68  i++;.        }wh
13210 69 6c 65 28 20 73 43 73 76 2e 63 54 65 72 6d 3d  ile( sCsv.cTerm=
13220 3d 73 43 73 76 2e 63 53 65 70 61 72 61 74 6f 72  =sCsv.cSeparator
13230 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   );.        fpri
13240 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
13250 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
13260 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e  columns but foun
13270 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20  d %d - ".       
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 22 65 78 74 72 61 73 20 69 67 6e 6f 72 65 64   "extras ignored
132a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43 73               sCs
132c0 76 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69  v.zFile, startLi
132d0 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20  ne, nCol, i);.  
132e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
132f0 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  i>=nCol ){.     
13300 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
13310 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
13320 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
13330 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
13340 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13360 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
13370 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53 45 52 54  , "%s:%d: INSERT
13380 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
13390 73 43 73 76 2e 7a 46 69 6c 65 2c 20 73 74 61 72  sCsv.zFile, star
133a0 74 4c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20  tLine,.         
133b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
133c0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
133d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
133e0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 73 76      }while( sCsv
133f0 2e 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a  .cTerm!=EOF );..
13400 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76      xCloser(sCsv
13410 2e 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  .in);.    sqlite
13420 33 5f 66 72 65 65 28 73 43 73 76 2e 7a 29 3b 0a  3_free(sCsv.z);.
13430 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
13440 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
13450 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20   if( needCommit 
13460 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  ) sqlite3_exec(d
13470 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  b, "COMMIT", 0, 
13480 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  0, 0);.  }else..
13490 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
134a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
134b0 2c 20 22 69 6e 64 69 63 65 73 22 2c 20 6e 29 3d  , "indices", n)=
134c0 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a  =0 && nArg<3 ){.
134d0 20 20 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62      struct callb
134e0 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20  ack_data data;. 
134f0 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
13500 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
13510 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d  b(p, 0);.    mem
13520 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
13530 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
13540 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
13550 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 6d   = 0;.    data.m
13560 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
13570 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31  .    if( nArg==1
13580 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
13590 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
135a0 62 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  b,.        "SELE
135b0 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
135c0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
135d0 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
135e0 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 6e 61 6d  ='index' AND nam
135f0 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
13600 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20 20  te_%' ".        
13610 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20  "UNION ALL ".   
13620 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
13630 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65  e FROM sqlite_te
13640 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  mp_master ".    
13650 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d      "WHERE type=
13660 27 69 6e 64 65 78 27 20 22 0a 20 20 20 20 20 20  'index' ".      
13670 20 20 22 4f 52 44 45 52 20 42 59 20 31 22 2c 0a    "ORDER BY 1",.
13680 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
13690 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
136a0 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  g.      );.    }
136b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 68 65  else{.      zShe
136c0 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67  llStatic = azArg
136d0 5b 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  [1];.      rc = 
136e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
136f0 64 62 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  db,.        "SEL
13700 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
13710 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
13720 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
13730 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
13740 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c  l_name LIKE shel
13750 6c 73 74 61 74 69 63 28 29 20 22 0a 20 20 20 20  lstatic() ".    
13760 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22      "UNION ALL "
13770 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
13780 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
13790 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a  e_temp_master ".
137a0 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
137b0 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20  ype='index' AND 
137c0 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68  tbl_name LIKE sh
137d0 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a 20 20  ellstatic() ".  
137e0 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
137f0 31 22 2c 0a 20 20 20 20 20 20 20 20 63 61 6c 6c  1",.        call
13800 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
13810 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
13820 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74 69       zShellStati
13830 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
13840 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
13850 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
13860 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
13870 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
13880 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13890 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
138a0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
138b0 73 65 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c  se if( rc != SQL
138c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
138d0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
138e0 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20  Error: querying 
138f0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
13900 64 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  d sqlite_temp_ma
13910 73 74 65 72 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ster\n");.      
13920 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
13930 7d 65 6c 73 65 0a 0a 23 69 66 64 65 66 20 53 51  }else..#ifdef SQ
13940 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
13950 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27  ACE.  if( c=='i'
13960 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
13970 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c  g[0], "iotrace",
13980 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78   n)==0 ){.    ex
13990 74 65 72 6e 20 76 6f 69 64 20 28 2a 73 71 6c 69  tern void (*sqli
139a0 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73  te3IoTrace)(cons
139b0 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20  t char*, ...);. 
139c0 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 20 26     if( iotrace &
139d0 26 20 69 6f 74 72 61 63 65 21 3d 73 74 64 6f 75  & iotrace!=stdou
139e0 74 20 29 20 66 63 6c 6f 73 65 28 69 6f 74 72 61  t ) fclose(iotra
139f0 63 65 29 3b 0a 20 20 20 20 69 6f 74 72 61 63 65  ce);.    iotrace
13a00 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
13a10 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 73 71  rg<2 ){.      sq
13a20 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30  lite3IoTrace = 0
13a30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13a40 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
13a50 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20   "-")==0 ){.    
13a60 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
13a70 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66   = iotracePrintf
13a80 3b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20  ;.      iotrace 
13a90 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
13aa0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  lse{.      iotra
13ab0 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67  ce = fopen(azArg
13ac0 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 20  [1], "w");.     
13ad0 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20   if( iotrace==0 
13ae0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
13af0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
13b00 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
13b10 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
13b20 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1]);.        sql
13b30 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b  ite3IoTrace = 0;
13b40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
13b50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
13b70 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72  race = iotracePr
13b80 69 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  intf;.      }.  
13b90 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
13ba0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
13bb0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
13bc0 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d  ENSION.  if( c==
13bd0 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'l' && strncmp(a
13be0 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c  zArg[0], "load",
13bf0 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 3d   n)==0 && nArg>=
13c00 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  2 ){.    const c
13c10 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72  har *zFile, *zPr
13c20 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  oc;.    char *zE
13c30 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7a  rrMsg = 0;.    z
13c40 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
13c50 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72  .    zProc = nAr
13c60 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20  g>=3 ? azArg[2] 
13c70 3a 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  : 0;.    open_db
13c80 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
13c90 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78   sqlite3_load_ex
13ca0 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a  tension(p->db, z
13cb0 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
13cc0 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
13cd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13ce0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
13cf0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
13d00 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
13d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13d20 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
13d30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
13d40 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
13d50 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
13d60 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
13d70 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20  ], "log", n)==0 
13d80 26 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  && nArg>=2 ){.  
13d90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
13da0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
13db0 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f      output_file_
13dc0 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a  close(p->pLog);.
13dd0 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75      p->pLog = ou
13de0 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a  tput_file_open(z
13df0 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  File);.  }else..
13e00 20 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20    if( c=='m' && 
13e10 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
13e20 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20  , "mode", n)==0 
13e30 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  && nArg==2 ){.  
13e40 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65    int n2 = strle
13e50 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n30(azArg[1]);. 
13e60 20 20 20 69 66 28 20 28 6e 32 3d 3d 34 20 26 26     if( (n2==4 &&
13e70 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
13e80 5d 2c 22 6c 69 6e 65 22 2c 6e 32 29 3d 3d 30 29  ],"line",n2)==0)
13e90 0a 20 20 20 20 20 20 20 20 7c 7c 0a 20 20 20 20  .        ||.    
13ea0 20 20 20 20 28 6e 32 3d 3d 35 20 26 26 20 73 74      (n2==5 && st
13eb0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
13ec0 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 29 20 29  lines",n2)==0) )
13ed0 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
13ee0 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20  = MODE_Line;.   
13ef0 20 7d 65 6c 73 65 20 69 66 28 20 28 6e 32 3d 3d   }else if( (n2==
13f00 36 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  6 && strncmp(azA
13f10 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 22 2c 6e  rg[1],"column",n
13f20 32 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  2)==0).         
13f30 20 20 20 20 20 7c 7c 0a 20 20 20 20 20 20 20 20       ||.        
13f40 20 20 20 20 20 20 28 6e 32 3d 3d 37 20 26 26 20        (n2==7 && 
13f50 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
13f60 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d  ,"columns",n2)==
13f70 30 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  0) ){.      p->m
13f80 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d  ode = MODE_Colum
13f90 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
13fa0 20 6e 32 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d   n2==4 && strncm
13fb0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74  p(azArg[1],"list
13fc0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
13fd0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
13fe0 5f 4c 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  _List;.    }else
13ff0 20 69 66 28 20 6e 32 3d 3d 34 20 26 26 20 73 74   if( n2==4 && st
14000 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
14010 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  html",n2)==0 ){.
14020 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
14030 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d  MODE_Html;.    }
14040 65 6c 73 65 20 69 66 28 20 6e 32 3d 3d 33 20 26  else if( n2==3 &
14050 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
14060 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20  1],"tcl",n2)==0 
14070 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
14080 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20   = MODE_Tcl;.   
14090 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
140a0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65  ntf(sizeof(p->se
140b0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70  parator), p->sep
140c0 61 72 61 74 6f 72 2c 20 22 20 22 29 3b 0a 20 20  arator, " ");.  
140d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 32 3d 3d    }else if( n2==
140e0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
140f0 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d  rg[1],"csv",n2)=
14100 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
14110 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a  ode = MODE_Csv;.
14120 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
14130 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
14140 3e 73 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  >separator), p->
14150 73 65 70 61 72 61 74 6f 72 2c 20 22 2c 22 29 3b  separator, ",");
14160 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
14170 32 3d 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28  2==4 && strncmp(
14180 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c  azArg[1],"tabs",
14190 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
141a0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
141b0 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
141c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
141d0 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  of(p->separator)
141e0 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20  , p->separator, 
141f0 22 5c 74 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  "\t");.    }else
14200 20 69 66 28 20 6e 32 3d 3d 36 20 26 26 20 73 74   if( n2==6 && st
14210 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
14220 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29  insert",n2)==0 )
14230 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
14240 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20  = MODE_Insert;. 
14250 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e       set_table_n
14260 61 6d 65 28 70 2c 20 22 74 61 62 6c 65 22 29 3b  ame(p, "table");
14270 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20  .    }else {.   
14280 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
14290 72 2c 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73  r,"Error: mode s
142a0 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
142b0 20 22 0a 20 20 20 20 20 20 20 20 20 22 63 6f 6c   ".         "col
142c0 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73  umn csv html ins
142d0 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20 74 61  ert line list ta
142e0 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20  bs tcl\n");.    
142f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
14300 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
14310 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70  =='m' && strncmp
14320 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65  (azArg[0], "mode
14330 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
14340 3d 3d 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==3 ){.    int n
14350 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 = strlen30(azA
14360 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[1]);.    if( 
14370 6e 32 3d 3d 36 20 26 26 20 73 74 72 6e 63 6d 70  n2==6 && strncmp
14380 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72  (azArg[1],"inser
14390 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
143a0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
143b0 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20  E_Insert;.      
143c0 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70  set_table_name(p
143d0 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20  , azArg[2]);.   
143e0 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 66   }else {.      f
143f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
14400 45 72 72 6f 72 3a 20 69 6e 76 61 6c 69 64 20 61  Error: invalid a
14410 72 67 75 6d 65 6e 74 73 3a 20 22 0a 20 20 20 20  rguments: ".    
14420 20 20 20 20 22 20 5c 22 25 73 5c 22 2e 20 45 6e      " \"%s\". En
14430 74 65 72 20 5c 22 2e 68 65 6c 70 5c 22 20 66 6f  ter \".help\" fo
14440 72 20 68 65 6c 70 5c 6e 22 2c 20 61 7a 41 72 67  r help\n", azArg
14450 5b 32 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [2]);.      rc =
14460 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
14470 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27 20  e..  if( c=='n' 
14480 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
14490 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22  [0], "nullvalue"
144a0 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
144b0 3d 32 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74  =2 ) {.    sqlit
144c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
144d0 6f 66 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29  of(p->nullvalue)
144e0 2c 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 0a  , p->nullvalue,.
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e       "%.*s", (in
14510 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e  t)ArraySize(p->n
14520 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 20 61 7a 41  ullvalue)-1, azA
14530 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a  rg[1]);.  }else.
14540 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26  .  if( c=='o' &&
14550 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
14560 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30  ], "open", n)==0
14570 20 26 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20   && n>=2 ){.    
14580 73 71 6c 69 74 65 33 20 2a 73 61 76 65 64 44 62  sqlite3 *savedDb
14590 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 63 6f   = p->db;.    co
145a0 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
145b0 46 69 6c 65 6e 61 6d 65 20 3d 20 70 2d 3e 7a 44  Filename = p->zD
145c0 62 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 63  bFilename;.    c
145d0 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d  har *zNewFilenam
145e0 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 64 62  e = 0;.    p->db
145f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
14600 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 70  rg>=2 ){.      p
14610 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
14620 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 73  zNewFilename = s
14630 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
14640 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  %s", azArg[1]);.
14650 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
14660 62 28 70 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  b(p, 1);.    if(
14670 20 70 2d 3e 64 62 21 3d 30 20 29 7b 0a 20 20 20   p->db!=0 ){.   
14680 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
14690 28 73 61 76 65 64 44 62 29 3b 0a 20 20 20 20 20  (savedDb);.     
146a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
146b0 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a  >zFreeOnClose);.
146c0 20 20 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e        p->zFreeOn
146d0 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69 6c 65  Close = zNewFile
146e0 6e 61 6d 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  name;.    }else{
146f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14700 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  ree(zNewFilename
14710 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20 3d  );.      p->db =
14720 20 73 61 76 65 64 44 62 3b 0a 20 20 20 20 20 20   savedDb;.      
14730 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  p->zDbFilename =
14740 20 7a 53 61 76 65 64 46 69 6c 65 6e 61 6d 65 3b   zSavedFilename;
14750 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
14760 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20    if( c=='o' && 
14770 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
14780 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d  , "output", n)==
14790 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b 0a  0 && nArg==2 ){.
147a0 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69      if( p->outfi
147b0 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 20 20  le[0]=='|' ){.  
147c0 20 20 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75      pclose(p->ou
147d0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
147e0 20 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65       output_file
147f0 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a  _close(p->out);.
14800 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6f 75 74      }.    p->out
14810 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  file[0] = 0;.   
14820 20 69 66 28 20 61 7a 41 72 67 5b 31 5d 5b 30 5d   if( azArg[1][0]
14830 3d 3d 27 7c 27 20 29 7b 0a 20 20 20 20 20 20 70  =='|' ){.      p
14840 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28 26 61  ->out = popen(&a
14850 7a 41 72 67 5b 31 5d 5b 31 5d 2c 20 22 77 22 29  zArg[1][1], "w")
14860 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  ;.      if( p->o
14870 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
14880 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14890 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
148a0 70 65 6e 20 70 69 70 65 20 5c 22 25 73 5c 22 5c  pen pipe \"%s\"\
148b0 6e 22 2c 20 26 61 7a 41 72 67 5b 31 5d 5b 31 5d  n", &azArg[1][1]
148c0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75  );.        p->ou
148d0 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20  t = stdout;.    
148e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
148f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14900 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14910 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66  f(sizeof(p->outf
14920 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65  ile), p->outfile
14930 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d  , "%s", azArg[1]
14940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14950 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f  else{.      p->o
14960 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65  ut = output_file
14970 5f 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 29 3b  _open(azArg[1]);
14980 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  .      if( p->ou
14990 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
149a0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
149b0 5b 31 5d 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b  [1],"off")!=0 ){
149c0 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
149d0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
149e0 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74  : cannot write t
149f0 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  o \"%s\"\n", azA
14a00 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
14a10 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74  }.        p->out
14a20 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20   = stdout;.     
14a30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
14a40 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
14a50 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
14a60 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74  tf(sizeof(p->out
14a70 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c  file), p->outfil
14a80 65 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 31  e, "%s", azArg[1
14a90 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
14aa0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
14ab0 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20   c=='p' && n>=3 
14ac0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
14ad0 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29  [0], "print", n)
14ae0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
14af0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
14b00 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
14b10 20 20 20 69 66 28 20 69 3e 31 20 29 20 66 70 72     if( i>1 ) fpr
14b20 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22  intf(p->out, " "
14b30 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
14b40 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61  (p->out, "%s", a
14b50 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[i]);.    }.
14b60 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
14b70 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c  ut, "\n");.  }el
14b80 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27  se..  if( c=='p'
14b90 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
14ba0 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20  g[0], "prompt", 
14bb0 6e 29 3d 3d 30 20 26 26 20 28 6e 41 72 67 3d 3d  n)==0 && (nArg==
14bc0 32 20 7c 7c 20 6e 41 72 67 3d 3d 33 29 29 7b 0a  2 || nArg==3)){.
14bd0 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20      if( nArg >= 
14be0 32 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63  2) {.      strnc
14bf0 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a  py(mainPrompt,az
14c00 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61  Arg[1],(int)Arra
14c10 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74  ySize(mainPrompt
14c20 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )-1);.    }.    
14c30 69 66 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b  if( nArg >= 3) {
14c40 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 63  .      strncpy(c
14c50 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a  ontinuePrompt,az
14c60 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61  Arg[2],(int)Arra
14c70 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72  ySize(continuePr
14c80 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a  ompt)-1);.    }.
14c90 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
14ca0 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70  =='q' && strncmp
14cb0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74  (azArg[0], "quit
14cc0 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67  ", n)==0 && nArg
14cd0 3d 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==1 ){.    rc = 
14ce0 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  2;.  }else..  if
14cf0 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33  ( c=='r' && n>=3
14d00 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
14d10 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29  g[0], "read", n)
14d20 3d 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29  ==0 && nArg==2 )
14d30 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61 6c 74 20  {.    FILE *alt 
14d40 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d  = fopen(azArg[1]
14d50 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
14d60 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   alt==0 ){.     
14d70 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14d80 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
14d90 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
14da0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
14db0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
14dc0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  e{.      rc = pr
14dd0 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61  ocess_input(p, a
14de0 6c 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73  lt);.      fclos
14df0 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(alt);.    }.  
14e00 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
14e10 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'r' && n>=3 && s
14e20 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
14e30 20 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d   "restore", n)==
14e40 30 20 26 26 20 6e 41 72 67 3e 31 20 26 26 20 6e  0 && nArg>1 && n
14e50 41 72 67 3c 34 29 7b 0a 20 20 20 20 63 6f 6e 73  Arg<4){.    cons
14e60 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65  t char *zSrcFile
14e70 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14e80 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71 6c 69 74   *zDb;.    sqlit
14e90 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
14ea0 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
14eb0 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
14ec0 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
14ed0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
14ee0 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
14ef0 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
14f00 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a    zDb = "main";.
14f10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14f20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72   zSrcFile = azAr
14f30 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20  g[2];.      zDb 
14f40 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
14f50 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
14f60 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65  e3_open(zSrcFile
14f70 2c 20 26 70 53 72 63 29 3b 0a 20 20 20 20 69 66  , &pSrc);.    if
14f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14f90 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
14fa0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
14fb0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
14fc0 73 5c 22 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65  s\"\n", zSrcFile
14fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14fe0 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
14ff0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15000 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
15010 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b  p, 0);.    pBack
15020 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
15030 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  kup_init(p->db, 
15040 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e  zDb, pSrc, "main
15050 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  ");.    if( pBac
15060 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
15070 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
15080 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
15090 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
150a0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  >db));.      sql
150b0 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
150c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
150d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
150e0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
150f0 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61  _backup_step(pBa
15100 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49  ckup,100))==SQLI
15110 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
15120 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  || rc==SQLITE_BU
15130 53 59 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28  SY  ){.      if(
15140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
15150 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15160 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20  nTimeout++ >= 3 
15170 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
15180 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31   sqlite3_sleep(1
15190 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  00);.      }.   
151a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
151b0 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
151c0 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
151d0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
151e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
151f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
15200 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
15210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
15220 45 44 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  ED ){.      fpri
15230 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
15240 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62  or: source datab
15250 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b  ase is busy\n");
15260 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
15270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15280 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
15290 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
152a0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
152b0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 72 63 20  >db));.      rc 
152c0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 1;.    }.    s
152d0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
152e0 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  c);.  }else..  i
152f0 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
15300 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
15310 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 26  schema", n)==0 &
15320 26 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20  & nArg<3 ){.    
15330 73 74 72 75 63 74 20 63 61 6c 6c 62 61 63 6b 5f  struct callback_
15340 64 61 74 61 20 64 61 74 61 3b 0a 20 20 20 20 63  data data;.    c
15350 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
15360 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
15370 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   0);.    memcpy(
15380 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66  &data, p, sizeof
15390 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74  (data));.    dat
153a0 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  a.showHeader = 0
153b0 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20  ;.    data.mode 
153c0 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20  = MODE_Semi;.   
153d0 20 69 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20   if( nArg>1 ){. 
153e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
153f0 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 67    for(i=0; azArg
15400 5b 31 5d 5b 69 5d 3b 20 69 2b 2b 29 20 61 7a 41  [1][i]; i++) azA
15410 72 67 5b 31 5d 5b 69 5d 20 3d 20 54 6f 4c 6f 77  rg[1][i] = ToLow
15420 65 72 28 61 7a 41 72 67 5b 31 5d 5b 69 5d 29 3b  er(azArg[1][i]);
15430 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
15440 70 28 61 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69  p(azArg[1],"sqli
15450 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29  te_master")==0 )
15460 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
15470 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65  new_argv[2], *ne
15480 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20  w_colv[2];.     
15490 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d     new_argv[0] =
154a0 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 73   "CREATE TABLE s
154b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 28 5c 6e  qlite_master (\n
154c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
154d0 20 20 20 20 20 20 20 20 22 20 20 74 79 70 65 20          "  type 
154e0 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15500 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a    name text,\n".
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d        "  tbl_nam
15530 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74   "  rootpage int
15560 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20  eger,\n".       
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15580 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20    sql text\n".  
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 20 20 20 22 29 22 3b 0a 20 20 20 20 20 20 20      ")";.       
155b0 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30   new_argv[1] = 0
155c0 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f  ;.        new_co
155d0 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20  lv[0] = "sql";. 
155e0 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
155f0 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
15600 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c 20  callback(&data, 
15610 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77  1, new_argv, new
15620 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20 20 20  _colv);.        
15630 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15640 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15650 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
15660 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
15670 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ter")==0 ){.    
15680 20 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72      char *new_ar
15690 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76  gv[2], *new_colv
156a0 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  [2];.        new
156b0 5f 61 72 67 76 5b 30 5d 20 3d 20 22 43 52 45 41  _argv[0] = "CREA
156c0 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73 71  TE TEMP TABLE sq
156d0 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
156e0 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20   (\n".          
156f0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74              "  t
15700 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ype text,\n".   
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c     "  name text,
15730 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
15740 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62 6c            "  tbl
15750 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20  _name text,\n". 
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15770 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65       "  rootpage
15780 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20   integer,\n".   
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e     "  sql text\n
157b0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
157c0 20 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20 20          ")";.   
157d0 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d       new_argv[1]
157e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65   = 0;.        ne
157f0 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c  w_colv[0] = "sql
15800 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63  ";.        new_c
15810 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  olv[1] = 0;.    
15820 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61      callback(&da
15830 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c  ta, 1, new_argv,
15840 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20   new_colv);.    
15850 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15860 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
15870 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c 53  .        zShellS
15880 74 61 74 69 63 20 3d 20 61 7a 41 72 67 5b 31 5d  tatic = azArg[1]
15890 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
158a0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
158b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  b,.          "SE
158c0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a  LECT sql FROM ".
158d0 20 20 20 20 20 20 20 20 20 20 22 20 20 28 53 45            "  (SE
158e0 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79  LECT sql sql, ty
158f0 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  pe type, tbl_nam
15900 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  e tbl_name, name
15910 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a   name, rowid x".
15920 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
15930 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
15940 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20  er UNION ALL".  
15950 20 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45          "   SELE
15960 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62  CT sql, type, tb
15970 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f  l_name, name, ro
15980 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  wid FROM sqlite_
15990 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20  temp_master) ". 
159a0 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
159b0 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d 65 29 20  lower(tbl_name) 
159c0 4c 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63  LIKE shellstatic
159d0 28 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ()".          " 
159e0 20 41 4e 44 20 74 79 70 65 21 3d 27 6d 65 74 61   AND type!='meta
159f0 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c  ' AND sql NOTNUL
15a00 4c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 4f  L ".          "O
15a10 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a  RDER BY rowid",.
15a20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61            callba
15a30 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
15a40 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 53  Msg);.        zS
15a50 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a  hellStatic = 0;.
15a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15a70 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
15a80 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
15a90 2c 0a 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  ,.         "SELE
15aa0 43 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a 20 20  CT sql FROM ".  
15ab0 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43         "  (SELEC
15ac0 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20  T sql sql, type 
15ad0 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74  type, tbl_name t
15ae0 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61  bl_name, name na
15af0 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20 20  me, rowid x".   
15b00 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d        "     FROM
15b10 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55   sqlite_master U
15b20 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20  NION ALL".      
15b30 20 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71     "   SELECT sq
15b40 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  l, type, tbl_nam
15b50 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46  e, name, rowid F
15b60 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ROM sqlite_temp_
15b70 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20  master) ".      
15b80 20 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d     "WHERE type!=
15b90 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
15ba0 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20  OTNULL AND name 
15bb0 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
15bc0 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 22 4f  _%'".         "O
15bd0 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a  RDER BY rowid",.
15be0 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
15bf0 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
15c00 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  sg.      );.    
15c10 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
15c20 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  g ){.      fprin
15c30 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
15c40 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
15c50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15c60 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
15c70 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
15c80 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21    }else if( rc !
15c90 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
15ca0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
15cb0 65 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72  err,"Error: quer
15cc0 79 69 6e 67 20 73 63 68 65 6d 61 20 69 6e 66 6f  ying schema info
15cd0 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20  rmation\n");.   
15ce0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
15cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
15d00 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
15d10 65 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e..#ifdef SQLITE
15d20 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64 6f  _DEBUG.  /* Undo
15d30 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e 64  cumented command
15d40 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 74  s for internal t
15d50 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65 63 74  esting.  Subject
15d60 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20   to change.  ** 
15d70 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e 20  without notice. 
15d80 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  */.  if( c=='s' 
15d90 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74 72 6e  && n>=10 && strn
15da0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
15db0 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d 30  elftest-", 9)==0
15dc0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e   ){.    if( strn
15dd0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20  cmp(azArg[0]+9, 
15de0 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29 3d  "boolean", n-9)=
15df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
15e00 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28  i, v;.      for(
15e10 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=1; i<nArg; i++
15e20 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 62  ){.        v = b
15e30 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
15e40 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  g[i]);.        f
15e50 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
15e60 25 73 3a 20 25 64 20 30 78 25 78 5c 6e 22 2c 20  %s: %d 0x%x\n", 
15e70 61 7a 41 72 67 5b 69 5d 2c 20 76 2c 20 76 29 3b  azArg[i], v, v);
15e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15e90 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
15ea0 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 69 6e 74 65  zArg[0]+9, "inte
15eb0 67 65 72 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b  ger", n-9)==0 ){
15ec0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 73 71  .      int i; sq
15ed0 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
15ee0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
15ef0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
15f00 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
15f10 30 5d 3b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  0];.        v = 
15f20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
15f30 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
15f40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
15f50 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
15f60 42 75 66 2c 20 22 25 73 3a 20 25 6c 6c 64 20 30  Buf, "%s: %lld 0
15f70 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41 72 67 5b  x%llx\n", azArg[
15f80 69 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20 20  i], v, v);.     
15f90 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
15fa0 74 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a  t, "%s", zBuf);.
15fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15fc0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
15fd0 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
15fe0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
15ff0 22 73 65 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d  "separator", n)=
16000 3d 30 20 26 26 20 6e 41 72 67 3d 3d 32 20 29 7b  =0 && nArg==2 ){
16010 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
16020 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
16030 73 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73  separator), p->s
16040 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20  eparator,.      
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16060 25 2e 2a 73 22 2c 20 28 69 6e 74 29 73 69 7a 65  %.*s", (int)size
16070 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  of(p->separator)
16080 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  -1, azArg[1]);. 
16090 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
160a0 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
160b0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77 22  azArg[0], "show"
160c0 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3d  , n)==0 && nArg=
160d0 3d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =1 ){.    int i;
160e0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
160f0 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e  out,"%9.9s: %s\n
16100 22 2c 22 65 63 68 6f 22 2c 20 70 2d 3e 65 63 68  ","echo", p->ech
16110 6f 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66  oOn ? "on" : "of
16120 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  f");.    fprintf
16130 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20  (p->out,"%9.9s: 
16140 25 73 5c 6e 22 2c 22 65 71 70 22 2c 20 70 2d 3e  %s\n","eqp", p->
16150 61 75 74 6f 45 51 50 20 3f 20 22 6f 6e 22 20 3a  autoEQP ? "on" :
16160 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72   "off");.    fpr
16170 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e  intf(p->out,"%9.
16180 39 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61  9s: %s\n","expla
16190 69 6e 22 2c 20 70 2d 3e 65 78 70 6c 61 69 6e 50  in", p->explainP
161a0 72 65 76 2e 76 61 6c 69 64 20 3f 20 22 6f 6e 22  rev.valid ? "on"
161b0 20 3a 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70   :"off");.    fp
161c0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39  rintf(p->out,"%9
161d0 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64  .9s: %s\n","head
161e0 65 72 73 22 2c 20 70 2d 3e 73 68 6f 77 48 65 61  ers", p->showHea
161f0 64 65 72 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66  der ? "on" : "of
16200 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  f");.    fprintf
16210 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20  (p->out,"%9.9s: 
16220 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f  %s\n","mode", mo
16230 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d  deDescr[p->mode]
16240 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
16250 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c  ->out,"%9.9s: ",
16260 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a 20   "nullvalue");. 
16270 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
16280 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  ring(p->out, p->
16290 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20  nullvalue);.    
162a0 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
162b0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72  , "\n");.    fpr
162c0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e  intf(p->out,"%9.
162d0 39 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75  9s: %s\n","outpu
162e0 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
162f0 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74 66  strlen30(p->outf
16300 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c  ile) ? p->outfil
16310 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20  e : "stdout");. 
16320 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
16330 74 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22 73 65  t,"%9.9s: ", "se
16340 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20  parator");.     
16350 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
16360 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 73 65 70 61  (p->out, p->sepa
16370 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 70  rator);.      fp
16380 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
16390 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  n");.    fprintf
163a0 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20  (p->out,"%9.9s: 
163b0 25 73 5c 6e 22 2c 22 73 74 61 74 73 22 2c 20 70  %s\n","stats", p
163c0 2d 3e 73 74 61 74 73 4f 6e 20 3f 20 22 6f 6e 22  ->statsOn ? "on"
163d0 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 66   : "off");.    f
163e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
163f0 39 2e 39 73 3a 20 22 2c 22 77 69 64 74 68 22 29  9.9s: ","width")
16400 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69  ;.    for (i=0;i
16410 3c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28  <(int)ArraySize(
16420 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20  p->colWidth) && 
16430 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21  p->colWidth[i] !
16440 3d 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20  = 0;i++) {.     
16450 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
16460 22 25 64 20 22 2c 70 2d 3e 63 6f 6c 57 69 64 74  "%d ",p->colWidt
16470 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  h[i]);.    }.   
16480 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
16490 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  "\n");.  }else..
164a0 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
164b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
164c0 2c 20 22 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30  , "stats", n)==0
164d0 20 26 26 20 6e 41 72 67 3e 31 20 26 26 20 6e 41   && nArg>1 && nA
164e0 72 67 3c 33 20 29 7b 0a 20 20 20 20 70 2d 3e 73  rg<3 ){.    p->s
164f0 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e  tatsOn = boolean
16500 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
16510 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
16520 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26 26  c=='t' && n>1 &&
16530 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
16540 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e 29 3d  ], "tables", n)=
16550 3d 30 20 26 26 20 6e 41 72 67 3c 33 20 29 7b 0a  =0 && nArg<3 ){.
16560 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
16570 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61   *pStmt;.    cha
16580 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20  r **azResult;.  
16590 20 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c    int nRow, nAll
165a0 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  oc;.    char *zS
165b0 71 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ql = 0;.    int 
165c0 69 69 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  ii;.    open_db(
165d0 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
165e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
165f0 76 32 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  v2(p->db, "PRAGM
16600 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22  A database_list"
16610 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
16620 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
16630 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7a 53  eturn rc;.    zS
16640 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
16650 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53  intf(.        "S
16660 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
16670 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
16680 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74         " WHERE t
16690 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
166a0 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20  'view')".       
166b0 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f   "   AND name NO
166c0 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25  T LIKE 'sqlite_%
166d0 25 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 20  %'".        "   
166e0 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31  AND name LIKE ?1
166f0 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73  ");.    while( s
16700 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
16710 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
16720 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
16730 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 28 63  ar *zDbName = (c
16740 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
16750 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
16760 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
16770 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c  if( zDbName==0 |
16780 7c 20 73 74 72 63 6d 70 28 7a 44 62 4e 61 6d 65  | strcmp(zDbName
16790 2c 22 6d 61 69 6e 22 29 3d 3d 30 20 29 20 63 6f  ,"main")==0 ) co
167a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
167b0 28 20 73 74 72 63 6d 70 28 7a 44 62 4e 61 6d 65  ( strcmp(zDbName
167c0 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20  ,"temp")==0 ){. 
167d0 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
167e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 22 25 7a 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a  "%z UNION ALL ".
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16820 20 22 53 45 4c 45 43 54 20 27 74 65 6d 70 2e 27   "SELECT 'temp.'
16830 20 7c 7c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71   || name FROM sq
16840 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
16850 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
16860 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 20     " WHERE type 
16870 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65  IN ('table','vie
16880 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  w')".           
16890 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61        "   AND na
168a0 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c  me NOT LIKE 'sql
168b0 69 74 65 5f 25 25 27 22 0a 20 20 20 20 20 20 20  ite_%%'".       
168c0 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
168d0 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c  D name LIKE ?1",
168e0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 65   zSql);.      }e
168f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 71  lse{.        zSq
16900 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
16910 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
16920 20 20 20 20 20 20 22 25 7a 20 55 4e 49 4f 4e 20        "%z UNION 
16930 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ALL ".          
16940 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 27         "SELECT '
16950 25 71 2e 27 20 7c 7c 20 6e 61 6d 65 20 46 52 4f  %q.' || name FRO
16960 4d 20 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f  M \"%w\".sqlite_
16970 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
16980 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
16990 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65   type IN ('table
169a0 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20  ','view')".     
169b0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
169c0 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
169d0 45 20 27 73 71 6c 69 74 65 5f 25 25 27 22 0a 20  E 'sqlite_%%'". 
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169f0 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b  "   AND name LIK
16a00 45 20 3f 31 22 2c 20 7a 53 71 6c 2c 20 7a 44 62  E ?1", zSql, zDb
16a10 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  Name, zDbName);.
16a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16a30 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
16a40 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a  ze(pStmt);.    z
16a50 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
16a60 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 45 52 20  rintf("%z ORDER 
16a70 42 59 20 31 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  BY 1", zSql);.  
16a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
16a90 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
16aa0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
16ab0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
16ac0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
16ad0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
16ae0 72 6e 20 72 63 3b 0a 20 20 20 20 6e 52 6f 77 20  rn rc;.    nRow 
16af0 3d 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  = nAlloc = 0;.  
16b00 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a    azResult = 0;.
16b10 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29      if( nArg>1 )
16b20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
16b30 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
16b40 20 31 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d 31   1, azArg[1], -1
16b50 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
16b60 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  NT);.    }else{.
16b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
16b80 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
16b90 2c 20 22 25 22 2c 20 2d 31 2c 20 53 51 4c 49 54  , "%", -1, SQLIT
16ba0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
16bb0 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
16bc0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
16bd0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
16be0 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 3d 6e       if( nRow>=n
16bf0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
16c00 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a 20   char **azNew;. 
16c10 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 6e         int n = n
16c20 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20  Alloc*2 + 10;.  
16c30 20 20 20 20 20 20 61 7a 4e 65 77 20 3d 20 73 71        azNew = sq
16c40 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a  lite3_realloc(az
16c50 52 65 73 75 6c 74 2c 20 73 69 7a 65 6f 66 28 61  Result, sizeof(a
16c60 7a 52 65 73 75 6c 74 5b 30 5d 29 2a 6e 29 3b 0a  zResult[0])*n);.
16c70 20 20 20 20 20 20 20 20 69 66 28 20 61 7a 4e 65          if( azNe
16c80 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
16c90 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
16ca0 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
16cb0 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
16cc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16ce0 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 20 20  nAlloc = n;.    
16cf0 20 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 61      azResult = a
16d00 7a 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zNew;.      }.  
16d10 20 20 20 20 61 7a 52 65 73 75 6c 74 5b 6e 52 6f      azResult[nRo
16d20 77 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  w] = sqlite3_mpr
16d30 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
16d40 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
16d50 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20  Stmt, 0));.     
16d60 20 69 66 28 20 61 7a 52 65 73 75 6c 74 5b 6e 52   if( azResult[nR
16d70 6f 77 5d 20 29 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ow] ) nRow++;.  
16d80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
16d90 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
16da0 20 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28          .    if(
16db0 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20   nRow>0 ){.     
16dc0 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e   int len, maxlen
16dd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
16de0 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  i, j;.      int 
16df0 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e  nPrintCol, nPrin
16e00 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28  tRow;.      for(
16e10 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20 69 2b 2b  i=0; i<nRow; i++
16e20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  ){.        len =
16e30 20 73 74 72 6c 65 6e 33 30 28 61 7a 52 65 73 75   strlen30(azResu
16e40 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lt[i]);.        
16e50 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29  if( len>maxlen )
16e60 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20   maxlen = len;. 
16e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 50 72       }.      nPr
16e80 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28 6d 61 78  intCol = 80/(max
16e90 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  len+2);.      if
16ea0 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31 20 29 20  ( nPrintCol<1 ) 
16eb0 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20  nPrintCol = 1;. 
16ec0 20 20 20 20 20 6e 50 72 69 6e 74 52 6f 77 20 3d       nPrintRow =
16ed0 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69 6e 74 43   (nRow + nPrintC
16ee0 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e 74 43 6f  ol - 1)/nPrintCo
16ef0 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  l;.      for(i=0
16f00 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77 3b 20 69  ; i<nPrintRow; i
16f10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
16f20 28 6a 3d 69 3b 20 6a 3c 6e 52 6f 77 3b 20 6a 2b  (j=i; j<nRow; j+
16f30 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a 20 20 20  =nPrintRow){.   
16f40 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 70         char *zSp
16f50 20 3d 20 6a 3c 6e 50 72 69 6e 74 52 6f 77 20 3f   = j<nPrintRow ?
16f60 20 22 22 20 3a 20 22 20 20 22 3b 0a 20 20 20 20   "" : "  ";.    
16f70 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
16f80 3e 6f 75 74 2c 20 22 25 73 25 2d 2a 73 22 2c 20  >out, "%s%-*s", 
16f90 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 20 61 7a 52  zSp, maxlen, azR
16fa0 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65 73  esult[j] ? azRes
16fb0 75 6c 74 5b 6a 5d 20 3a 20 22 22 29 3b 0a 20 20  ult[j] : "");.  
16fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16fd0 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
16fe0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
16ff0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
17000 30 3b 20 69 69 3c 6e 52 6f 77 3b 20 69 69 2b 2b  0; ii<nRow; ii++
17010 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61  ) sqlite3_free(a
17020 7a 52 65 73 75 6c 74 5b 69 69 5d 29 3b 0a 20 20  zResult[ii]);.  
17030 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
17040 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73  zResult);.  }els
17050 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20  e..  if( c=='t' 
17060 26 26 20 6e 3e 3d 38 20 26 26 20 73 74 72 6e 63  && n>=8 && strnc
17070 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 65  mp(azArg[0], "te
17080 73 74 63 74 72 6c 22 2c 20 6e 29 3d 3d 30 20 26  stctrl", n)==0 &
17090 26 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  & nArg>=2 ){.   
170a0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
170b0 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f  ruct {.       co
170c0 6e 73 74 20 63 68 61 72 20 2a 7a 43 74 72 6c 4e  nst char *zCtrlN
170d0 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
170e0 66 20 61 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c  f a test-control
170f0 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20   option */.     
17100 20 20 69 6e 74 20 63 74 72 6c 43 6f 64 65 3b 20    int ctrlCode; 
17110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17120 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20 74  teger code for t
17130 68 61 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  hat option */.  
17140 20 20 7d 20 61 43 74 72 6c 5b 5d 20 3d 20 7b 0a    } aCtrl[] = {.
17150 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 73 61        { "prng_sa
17160 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ve",            
17170 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
17180 5f 50 52 4e 47 5f 53 41 56 45 20 20 20 20 20 20  _PRNG_SAVE      
17190 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
171a0 20 7b 20 22 70 72 6e 67 5f 72 65 73 74 6f 72 65   { "prng_restore
171b0 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
171c0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
171d0 5f 52 45 53 54 4f 52 45 20 20 20 20 20 20 20 20  _RESTORE        
171e0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70     },.      { "p
171f0 72 6e 67 5f 72 65 73 65 74 22 2c 20 20 20 20 20  rng_reset",     
17200 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
17210 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
17220 54 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  T             },
17230 0a 20 20 20 20 20 20 7b 20 22 62 69 74 76 65 63  .      { "bitvec
17240 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20  _test",         
17250 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
17260 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 20 20 20  L_BITVEC_TEST   
17270 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
17280 20 20 7b 20 22 66 61 75 6c 74 5f 69 6e 73 74 61    { "fault_insta
17290 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c  ll",         SQL
172a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
172b0 4c 54 5f 49 4e 53 54 41 4c 4c 20 20 20 20 20 20  LT_INSTALL      
172c0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
172d0 62 65 6e 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68 6f  benign_malloc_ho
172e0 6f 6b 73 22 2c 20 20 20 53 51 4c 49 54 45 5f 54  oks",   SQLITE_T
172f0 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
17300 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 20 20 20 20 7d  ALLOC_HOOKS    }
17310 2c 0a 20 20 20 20 20 20 7b 20 22 70 65 6e 64 69  ,.      { "pendi
17320 6e 67 5f 62 79 74 65 22 2c 20 20 20 20 20 20 20  ng_byte",       
17330 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
17340 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  RL_PENDING_BYTE 
17350 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
17360 20 20 20 7b 20 22 61 73 73 65 72 74 22 2c 20 20     { "assert",  
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
17380 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
17390 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
173a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
173b0 22 61 6c 77 61 79 73 22 2c 20 20 20 20 20 20 20  "always",       
173c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
173d0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 20  TESTCTRL_ALWAYS 
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 73 65  },.      { "rese
17400 72 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  rve",           
17410 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
17420 54 52 4c 5f 52 45 53 45 52 56 45 20 20 20 20 20  TRL_RESERVE     
17430 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
17440 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74      { "optimizat
17450 69 6f 6e 73 22 2c 20 20 20 20 20 20 20 20 20 53  ions",         S
17460 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
17470 50 54 49 4d 49 5a 41 54 49 4f 4e 53 20 20 20 20  PTIMIZATIONS    
17480 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
17490 20 22 69 73 6b 65 79 77 6f 72 64 22 2c 20 20 20   "iskeyword",   
174a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
174b0 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
174c0 4f 52 44 20 20 20 20 20 20 20 20 20 20 20 20 20  ORD             
174d0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 63 72   },.      { "scr
174e0 61 74 63 68 6d 61 6c 6c 6f 63 22 2c 20 20 20 20  atchmalloc",    
174f0 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
17500 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
17510 4f 43 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OC          },. 
17520 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 74 65     };.    int te
17530 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20  stctrl = -1;.   
17540 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20   int rc = 0;.   
17550 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6f   int i, n;.    o
17560 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 0a 20  pen_db(p, 0);.. 
17570 20 20 20 2f 2a 20 63 6f 6e 76 65 72 74 20 74 65     /* convert te
17580 73 74 63 74 72 6c 20 74 65 78 74 20 6f 70 74 69  stctrl text opti
17590 6f 6e 20 74 6f 20 76 61 6c 75 65 2e 20 61 6c 6c  on to value. all
175a0 6f 77 20 61 6e 79 20 75 6e 69 71 75 65 20 70 72  ow any unique pr
175b0 65 66 69 78 0a 20 20 20 20 2a 2a 20 6f 66 20 74  efix.    ** of t
175c0 68 65 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c 20  he option name, 
175d0 6f 72 20 61 20 6e 75 6d 65 72 69 63 61 6c 20 76  or a numerical v
175e0 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d  alue. */.    n =
175f0 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b   strlen30(azArg[
17600 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  1]);.    for(i=0
17610 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ; i<(int)(sizeof
17620 28 61 43 74 72 6c 29 2f 73 69 7a 65 6f 66 28 61  (aCtrl)/sizeof(a
17630 43 74 72 6c 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b  Ctrl[0])); i++){
17640 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
17650 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 43 74  mp(azArg[1], aCt
17660 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65 2c  rl[i].zCtrlName,
17670 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
17680 20 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c 30    if( testctrl<0
17690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
176a0 73 74 63 74 72 6c 20 3d 20 61 43 74 72 6c 5b 69  stctrl = aCtrl[i
176b0 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20 20 20  ].ctrlCode;.    
176c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
176d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
176e0 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73 20  err, "ambiguous 
176f0 6f 70 74 69 6f 6e 20 6e 61 6d 65 3a 20 5c 22 25  option name: \"%
17700 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
17710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
17720 74 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  tctrl = -1;.    
17730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17750 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73     }.    if( tes
17760 74 63 74 72 6c 3c 30 20 29 20 74 65 73 74 63 74  tctrl<0 ) testct
17770 72 6c 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  rl = (int)intege
17780 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  rValue(azArg[1])
17790 3b 0a 20 20 20 20 69 66 28 20 28 74 65 73 74 63  ;.    if( (testc
177a0 74 72 6c 3c 53 51 4c 49 54 45 5f 54 45 53 54 43  trl<SQLITE_TESTC
177b0 54 52 4c 5f 46 49 52 53 54 29 20 7c 7c 20 28 74  TRL_FIRST) || (t
177c0 65 73 74 63 74 72 6c 3e 53 51 4c 49 54 45 5f 54  estctrl>SQLITE_T
177d0 45 53 54 43 54 52 4c 5f 4c 41 53 54 29 20 29 7b  ESTCTRL_LAST) ){
177e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
177f0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 69 6e  tderr,"Error: in
17800 76 61 6c 69 64 20 74 65 73 74 63 74 72 6c 20 6f  valid testctrl o
17810 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a  ption: %s\n", az
17820 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
17830 73 65 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68  se{.      switch
17840 28 74 65 73 74 63 74 72 6c 29 7b 0a 0a 20 20 20  (testctrl){..   
17850 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
17860 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
17870 2c 20 64 62 2c 20 69 6e 74 29 20 2a 2f 0a 20 20  , db, int) */.  
17880 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
17890 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
178a0 49 5a 41 54 49 4f 4e 53 3a 0a 20 20 20 20 20 20  IZATIONS:.      
178b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
178c0 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20  STCTRL_RESERVE: 
178d0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
178e0 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
178f0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =3 ){.          
17900 20 20 69 6e 74 20 6f 70 74 20 3d 20 28 69 6e 74    int opt = (int
17910 29 73 74 72 74 6f 6c 28 61 7a 41 72 67 5b 32 5d  )strtol(azArg[2]
17920 2c 20 30 2c 20 30 29 3b 20 20 20 20 20 20 20 20  , 0, 0);        
17930 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17940 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
17950 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c  ontrol(testctrl,
17960 20 70 2d 3e 64 62 2c 20 6f 70 74 29 3b 0a 20 20   p->db, opt);.  
17970 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
17980 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30  f(p->out, "%d (0
17990 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c 20 72  x%08x)\n", rc, r
179a0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  c);.          } 
179b0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
179c0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
179d0 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74  r,"Error: testct
179e0 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73 69  rl %s takes a si
179f0 6e 67 6c 65 20 69 6e 74 20 6f 70 74 69 6f 6e 5c  ngle int option\
17a00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
17a10 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d          azArg[1]
17a20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
17a30 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17a40 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
17a50 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
17a60 28 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20  (int) */.       
17a70 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
17a80 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a  TCTRL_PRNG_SAVE:
17a90 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
17aa0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
17ab0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
17ac0 53 54 4f 52 45 3a 20 20 20 20 20 20 20 20 0a 20  STORE:        . 
17ad0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
17ae0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
17af0 5f 52 45 53 45 54 3a 0a 20 20 20 20 20 20 20 20  _RESET:.        
17b00 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
17b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17b20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
17b30 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 29  ontrol(testctrl)
17b40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
17b50 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
17b60 64 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72  d (0x%08x)\n", r
17b70 63 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  c, rc);.        
17b80 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
17b90 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
17ba0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 74 65  tderr,"Error: te
17bb0 73 74 63 74 72 6c 20 25 73 20 74 61 6b 65 73 20  stctrl %s takes 
17bc0 6e 6f 20 6f 70 74 69 6f 6e 73 5c 6e 22 2c 20 61  no options\n", a
17bd0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
17be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17bf0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20  break;..        
17c00 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
17c10 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 75 69 6e  control(int, uin
17c20 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  t) */.        ca
17c30 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
17c40 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a  RL_PENDING_BYTE:
17c50 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
17c60 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29     if( nArg==3 )
17c70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e  {.            un
17c80 73 69 67 6e 65 64 20 69 6e 74 20 6f 70 74 20 3d  signed int opt =
17c90 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 69   (unsigned int)i
17ca0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
17cb0 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[2]);.         
17cc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
17cd0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
17ce0 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20  tctrl, opt);.   
17cf0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
17d00 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30 78  (p->out, "%d (0x
17d10 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c 20 72 63  %08x)\n", rc, rc
17d20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  );.          } e
17d30 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
17d40 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
17d50 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74 72  ,"Error: testctr
17d60 6c 20 25 73 20 74 61 6b 65 73 20 61 20 73 69 6e  l %s takes a sin
17d70 67 6c 65 20 75 6e 73 69 67 6e 65 64 22 0a 20 20  gle unsigned".  
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 20 20 20 20 20 20 20 22 20 69 6e 74 20 6f           " int o
17da0 70 74 69 6f 6e 5c 6e 22 2c 20 61 7a 41 72 67 5b  ption\n", azArg[
17db0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  1]);.          }
17dc0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
17dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  ;.          .   
17de0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
17df0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
17e00 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  , int) */.      
17e10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
17e20 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 20  STCTRL_ASSERT:  
17e30 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
17e40 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
17e50 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
17e60 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a  :              .
17e70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
17e80 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
17e90 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 62       int opt = b
17ea0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
17eb0 67 5b 32 5d 29 3b 20 20 20 20 20 20 20 20 0a 20  g[2]);        . 
17ec0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
17ed0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
17ee0 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f  trol(testctrl, o
17ef0 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pt);.           
17f00 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
17f10 20 22 25 64 20 28 30 78 25 30 38 78 29 5c 6e 22   "%d (0x%08x)\n"
17f20 2c 20 72 63 2c 20 72 63 29 3b 0a 20 20 20 20 20  , rc, rc);.     
17f30 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
17f40 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
17f50 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
17f60 20 74 65 73 74 63 74 72 6c 20 25 73 20 74 61 6b   testctrl %s tak
17f70 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 20  es a single int 
17f80 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20  option\n",.     
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29         azArg[1])
17fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17fc0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
17fd0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
17fe0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
17ff0 69 6e 74 2c 20 63 68 61 72 20 2a 29 20 2a 2f 0a  int, char *) */.
18000 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f  #ifdef SQLITE_N_
18010 4b 45 59 57 4f 52 44 0a 20 20 20 20 20 20 20 20  KEYWORD.        
18020 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18030 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20  CTRL_ISKEYWORD: 
18040 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
18050 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33       if( nArg==3
18060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18070 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 20  const char *opt 
18080 3d 20 61 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20  = azArg[2];     
18090 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
180a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
180b0 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
180c0 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20  rl, opt);.      
180d0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
180e0 3e 6f 75 74 2c 20 22 25 64 20 28 30 78 25 30 38  >out, "%d (0x%08
180f0 78 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a  x)\n", rc, rc);.
18100 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
18110 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
18120 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
18130 72 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25  rror: testctrl %
18140 73 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  s takes a single
18150 20 63 68 61 72 20 2a 20 6f 70 74 69 6f 6e 5c 6e   char * option\n
18160 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
18180 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
18190 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
181a0 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
181b0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
181c0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56  TE_TESTCTRL_BITV
181d0 45 43 5f 54 45 53 54 3a 20 20 20 20 20 20 20 20  EC_TEST:        
181e0 20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53   .        case S
181f0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
18200 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 20 20  AULT_INSTALL:   
18210 20 20 20 20 0a 20 20 20 20 20 20 20 20 63 61 73      .        cas
18220 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
18230 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
18240 48 4f 4f 4b 53 3a 20 0a 20 20 20 20 20 20 20 20  HOOKS: .        
18250 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18260 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
18270 4f 43 3a 20 20 20 20 20 20 20 0a 20 20 20 20 20  OC:       .     
18280 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
18290 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
182a0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 43 4c 49  derr,"Error: CLI
182b0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 65 73   support for tes
182c0 74 63 74 72 6c 20 25 73 20 6e 6f 74 20 69 6d 70  tctrl %s not imp
182d0 6c 65 6d 65 6e 74 65 64 5c 6e 22 2c 0a 20 20 20  lemented\n",.   
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
182f0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
18300 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18310 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
18320 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26  ..  if( c=='t' &
18330 26 20 6e 3e 34 20 26 26 20 73 74 72 6e 63 6d 70  & n>4 && strncmp
18340 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65  (azArg[0], "time
18350 6f 75 74 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  out", n)==0 && n
18360 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 6f 70  Arg==2 ){.    op
18370 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
18380 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
18390 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 28 69 6e  meout(p->db, (in
183a0 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
183b0 7a 41 72 67 5b 31 5d 29 29 3b 0a 20 20 7d 65 6c  zArg[1]));.  }el
183c0 73 65 0a 20 20 20 20 0a 20 20 69 66 28 20 48 41  se.    .  if( HA
183d0 53 5f 54 49 4d 45 52 20 26 26 20 63 3d 3d 27 74  S_TIMER && c=='t
183e0 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72  ' && n>=5 && str
183f0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
18400 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 0a 20 20  timer", n)==0.  
18410 20 26 26 20 6e 41 72 67 3d 3d 32 0a 20 20 29 7b   && nArg==2.  ){
18420 0a 20 20 20 20 65 6e 61 62 6c 65 54 69 6d 65 72  .    enableTimer
18430 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
18440 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c  azArg[1]);.  }el
18450 73 65 0a 20 20 0a 20 20 69 66 28 20 63 3d 3d 27  se.  .  if( c=='
18460 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  t' && strncmp(az
18470 41 72 67 5b 30 5d 2c 20 22 74 72 61 63 65 22 2c  Arg[0], "trace",
18480 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72 67 3e 31   n)==0 && nArg>1
18490 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
184a0 70 2c 20 30 29 3b 0a 20 20 20 20 6f 75 74 70 75  p, 0);.    outpu
184b0 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e  t_file_close(p->
184c0 74 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20 70  traceOut);.    p
184d0 2d 3e 74 72 61 63 65 4f 75 74 20 3d 20 6f 75 74  ->traceOut = out
184e0 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 61 7a  put_file_open(az
184f0 41 72 67 5b 31 5d 29 3b 0a 23 69 66 20 21 64 65  Arg[1]);.#if !de
18500 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
18510 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
18520 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18530 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
18540 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63  .    if( p->trac
18550 65 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eOut==0 ){.     
18560 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70   sqlite3_trace(p
18570 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
18580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
18590 6c 69 74 65 33 5f 74 72 61 63 65 28 70 2d 3e 64  lite3_trace(p->d
185a0 62 2c 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c  b, sql_trace_cal
185b0 6c 62 61 63 6b 2c 20 70 2d 3e 74 72 61 63 65 4f  lback, p->traceO
185c0 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ut);.    }.#endi
185d0 66 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  f.  }else..  if(
185e0 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63   c=='v' && strnc
185f0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 65  mp(azArg[0], "ve
18600 72 73 69 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b  rsion", n)==0 ){
18610 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
18620 6f 75 74 2c 20 22 53 51 4c 69 74 65 20 25 73 20  out, "SQLite %s 
18630 25 73 5c 6e 22 20 2f 2a 65 78 74 72 61 2d 76 65  %s\n" /*extra-ve
18640 72 73 69 6f 6e 2d 69 6e 66 6f 2a 2f 2c 0a 20 20  rsion-info*/,.  
18650 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
18660 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c 69  bversion(), sqli
18670 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
18680 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
18690 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d  c=='v' && strncm
186a0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66 73  p(azArg[0], "vfs
186b0 6e 61 6d 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  name", n)==0 ){.
186c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
186d0 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d 3d  zDbName = nArg==
186e0 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
186f0 6d 61 69 6e 22 3b 0a 20 20 20 20 63 68 61 72 20  main";.    char 
18700 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20  *zVfsName = 0;. 
18710 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a     if( p->db ){.
18720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
18730 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
18740 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54  , zDbName, SQLIT
18750 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c  E_FCNTL_VFSNAME,
18760 20 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20   &zVfsName);.   
18770 20 20 20 69 66 28 20 7a 56 66 73 4e 61 6d 65 20     if( zVfsName 
18780 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
18790 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
187a0 22 2c 20 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  ", zVfsName);.  
187b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
187c0 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  ee(zVfsName);.  
187d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
187e0 6c 73 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  lse..#if defined
187f0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
18800 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
18810 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
18820 43 45 29 0a 20 20 69 66 28 20 63 3d 3d 27 77 27  CE).  if( c=='w'
18830 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
18840 67 5b 30 5d 2c 20 22 77 68 65 72 65 74 72 61 63  g[0], "wheretrac
18850 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
18860 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
18870 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20  te3WhereTrace;. 
18880 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54     sqlite3WhereT
18890 72 61 63 65 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  race = booleanVa
188a0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
188b0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
188c0 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73   if( c=='w' && s
188d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
188e0 20 22 77 69 64 74 68 22 2c 20 6e 29 3d 3d 30 20   "width", n)==0 
188f0 26 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20  && nArg>1 ){.   
18900 20 69 6e 74 20 6a 3b 0a 20 20 20 20 61 73 73 65   int j;.    asse
18910 72 74 28 20 6e 41 72 67 3c 3d 41 72 72 61 79 53  rt( nArg<=ArrayS
18920 69 7a 65 28 61 7a 41 72 67 29 20 29 3b 0a 20 20  ize(azArg) );.  
18930 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72    for(j=1; j<nAr
18940 67 20 26 26 20 6a 3c 41 72 72 61 79 53 69 7a 65  g && j<ArraySize
18950 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 3b 20 6a  (p->colWidth); j
18960 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6f  ++){.      p->co
18970 6c 57 69 64 74 68 5b 6a 2d 31 5d 20 3d 20 28 69  lWidth[j-1] = (i
18980 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
18990 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 7d  azArg[j]);.    }
189a0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 0a 20 20  .  }else..  {.  
189b0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
189c0 2c 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77  , "Error: unknow
189d0 6e 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 69 6e 76  n command or inv
189e0 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 3a 20  alid arguments: 
189f0 22 0a 20 20 20 20 20 20 22 20 5c 22 25 73 5c 22  ".      " \"%s\"
18a00 2e 20 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70 5c  . Enter \".help\
18a10 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 61  " for help\n", a
18a20 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 72 63  zArg[0]);.    rc
18a30 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 1;.  }..  ret
18a40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18a50 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
18a60 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 63 63 75  a semicolon occu
18a70 72 73 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74  rs anywhere in t
18a80 68 65 20 66 69 72 73 74 20 4e 20 63 68 61 72 61  he first N chara
18a90 63 74 65 72 73 0a 2a 2a 20 6f 66 20 73 74 72 69  cters.** of stri
18aa0 6e 67 20 7a 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69  ng z[]..*/.stati
18ab0 63 20 69 6e 74 20 6c 69 6e 65 5f 63 6f 6e 74 61  c int line_conta
18ac0 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63 6f  ins_semicolon(co
18ad0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
18ae0 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   N){.  int i;.  
18af0 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
18b00 2b 29 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  +){  if( z[i]=='
18b10 3b 27 20 29 20 72 65 74 75 72 6e 20 31 3b 20 7d  ;' ) return 1; }
18b20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
18b30 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65  /*.** Test to se
18b40 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e 73  e if a line cons
18b50 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
18b60 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f 0a   whitespace..*/.
18b70 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c 5f  static int _all_
18b80 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73 74  whitespace(const
18b90 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f 72   char *z){.  for
18ba0 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  (; *z; z++){.   
18bb0 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 30   if( IsSpace(z[0
18bc0 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ]) ) continue;. 
18bd0 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26     if( *z=='/' &
18be0 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20  & z[1]=='*' ){. 
18bf0 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
18c00 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
18c10 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d  (*z!='*' || z[1]
18c20 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d  !='/') ){ z++; }
18c30 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30  .      if( *z==0
18c40 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
18c50 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f     z++;.      co
18c60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
18c70 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26    if( *z=='-' &&
18c80 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[1]=='-' ){.  
18c90 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20      z += 2;.    
18ca0 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
18cb0 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20  z!='\n' ){ z++; 
18cc0 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
18cd0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
18ce0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
18cf0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
18d00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
18d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18d20 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 69  n TRUE if the li
18d30 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20 61  ne typed in is a
18d40 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65  n SQL command te
18d50 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a  rminator other.*
18d60 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f  * than a semi-co
18d70 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65  lon.  The SQL Se
18d80 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20  rver style "go" 
18d90 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72  command is under
18da0 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74  stood.** as is t
18db0 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a  he Oracle "/"..*
18dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e  /.static int lin
18dd0 65 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72  e_is_command_ter
18de0 6d 69 6e 61 74 6f 72 28 63 6f 6e 73 74 20 63 68  minator(const ch
18df0 61 72 20 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77 68  ar *zLine){.  wh
18e00 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69  ile( IsSpace(zLi
18e10 6e 65 5b 30 5d 29 20 29 7b 20 7a 4c 69 6e 65 2b  ne[0]) ){ zLine+
18e20 2b 3b 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  +; };.  if( zLin
18e30 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61 6c  e[0]=='/' && _al
18e40 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c  l_whitespace(&zL
18e50 69 6e 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20 72  ine[1]) ){.    r
18e60 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72 61  eturn 1;  /* Ora
18e70 63 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  cle */.  }.  if(
18e80 20 54 6f 4c 6f 77 65 72 28 7a 4c 69 6e 65 5b 30   ToLower(zLine[0
18e90 5d 29 3d 3d 27 67 27 20 26 26 20 54 6f 4c 6f 77  ])=='g' && ToLow
18ea0 65 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27 6f  er(zLine[1])=='o
18eb0 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 5f 61  '.         && _a
18ec0 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a  ll_whitespace(&z
18ed0 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20 20  Line[2]) ){.    
18ee0 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53 51  return 1;  /* SQ
18ef0 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d 0a  L Server */.  }.
18f00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
18f10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
18f20 20 69 66 20 7a 53 71 6c 20 69 73 20 61 20 63 6f   if zSql is a co
18f30 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
18f40 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 66 61  ment.  Return fa
18f50 6c 73 65 20 69 66 20 69 74 0a 2a 2a 20 65 6e 64  lse if it.** end
18f60 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  s in the middle 
18f70 6f 66 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  of a string lite
18f80 72 61 6c 20 6f 72 20 43 2d 73 74 79 6c 65 20 63  ral or C-style c
18f90 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  omment..*/.stati
18fa0 63 20 69 6e 74 20 6c 69 6e 65 5f 69 73 5f 63 6f  c int line_is_co
18fb0 6d 70 6c 65 74 65 28 63 68 61 72 20 2a 7a 53 71  mplete(char *zSq
18fc0 6c 2c 20 69 6e 74 20 6e 53 71 6c 29 7b 0a 20 20  l, int nSql){.  
18fd0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 7a 53  int rc;.  if( zS
18fe0 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ql==0 ) return 1
18ff0 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d  ;.  zSql[nSql] =
19000 20 27 3b 27 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71   ';';.  zSql[nSq
19010 6c 2b 31 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d  l+1] = 0;.  rc =
19020 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
19030 65 28 7a 53 71 6c 29 3b 0a 20 20 7a 53 71 6c 5b  e(zSql);.  zSql[
19040 6e 53 71 6c 5d 20 3d 20 30 3b 0a 20 20 72 65 74  nSql] = 0;.  ret
19050 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19060 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   Read input from
19070 20 2a 69 6e 20 61 6e 64 20 70 72 6f 63 65 73 73   *in and process
19080 20 69 74 2e 20 20 49 66 20 2a 69 6e 3d 3d 30 20   it.  If *in==0 
19090 74 68 65 6e 20 69 6e 70 75 74 0a 2a 2a 20 69 73  then input.** is
190a0 20 69 6e 74 65 72 61 63 74 69 76 65 20 2d 20 74   interactive - t
190b0 68 65 20 75 73 65 72 20 69 73 20 74 79 70 69 6e  he user is typin
190c0 67 20 69 74 20 69 74 2e 20 20 4f 74 68 65 72 77  g it it.  Otherw
190d0 69 73 65 2c 20 69 6e 70 75 74 0a 2a 2a 20 69 73  ise, input.** is
190e0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 66   coming from a f
190f0 69 6c 65 20 6f 72 20 64 65 76 69 63 65 2e 20 20  ile or device.  
19100 41 20 70 72 6f 6d 70 74 20 69 73 20 69 73 73 75  A prompt is issu
19110 65 64 20 61 6e 64 20 68 69 73 74 6f 72 79 0a 2a  ed and history.*
19120 2a 20 69 73 20 73 61 76 65 64 20 6f 6e 6c 79 20  * is saved only 
19130 69 66 20 69 6e 70 75 74 20 69 73 20 69 6e 74 65  if input is inte
19140 72 61 63 74 69 76 65 2e 20 20 41 6e 20 69 6e 74  ractive.  An int
19150 65 72 72 75 70 74 20 73 69 67 6e 61 6c 20 77 69  errupt signal wi
19160 6c 6c 0a 2a 2a 20 63 61 75 73 65 20 74 68 69 73  ll.** cause this
19170 20 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 69 74   routine to exit
19180 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 75 6e   immediately, un
19190 6c 65 73 73 20 69 6e 70 75 74 20 69 73 20 69 6e  less input is in
191a0 74 65 72 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a  teractive..**.**
191b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
191c0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
191d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
191e0 65 73 73 5f 69 6e 70 75 74 28 73 74 72 75 63 74  ess_input(struct
191f0 20 63 61 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a   callback_data *
19200 70 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20  p, FILE *in){.  
19210 63 68 61 72 20 2a 7a 4c 69 6e 65 20 3d 20 30 3b  char *zLine = 0;
19220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
19230 69 6e 67 6c 65 20 69 6e 70 75 74 20 6c 69 6e 65  ingle input line
19240 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   */.  char *zSql
19250 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
19260 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20 53  /* Accumulated S
19270 51 4c 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  QL text */.  int
19280 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20   nLine;         
19290 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
192a0 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 69 6e 65   of current line
192b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 20 3d   */.  int nSql =
192c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
192d0 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 53 71 6c  /* Bytes of zSql
192e0 5b 5d 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  [] used */.  int
192f0 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20   nAlloc = 0;    
19300 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
19310 74 65 64 20 7a 53 71 6c 5b 5d 20 73 70 61 63 65  ted zSql[] space
19320 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 50 72   */.  int nSqlPr
19330 69 6f 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ior = 0;        
19340 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 53 71 6c  /* Bytes of zSql
19350 5b 5d 20 75 73 65 64 20 62 79 20 70 72 69 6f 72  [] used by prior
19360 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20   line */.  char 
19370 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 20 20 20  *zErrMsg;       
19380 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
19390 73 73 61 67 65 20 72 65 74 75 72 6e 65 64 20 2a  ssage returned *
193a0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
193c0 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
193d0 20 69 6e 74 20 65 72 72 43 6e 74 20 3d 20 30 3b   int errCnt = 0;
193e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
193f0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
19400 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e  een */.  int lin
19410 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eno = 0;        
19420 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69     /* Current li
19430 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
19440 6e 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30  nt startline = 0
19450 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65  ;        /* Line
19460 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72   number for star
19470 74 20 6f 66 20 63 75 72 72 65 6e 74 20 69 6e 70  t of current inp
19480 75 74 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20  ut */..  while( 
19490 65 72 72 43 6e 74 3d 3d 30 20 7c 7c 20 21 62 61  errCnt==0 || !ba
194a0 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 7c 7c 20 28  il_on_error || (
194b0 69 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e 5f 69  in==0 && stdin_i
194c0 73 5f 69 6e 74 65 72 61 63 74 69 76 65 29 20 29  s_interactive) )
194d0 7b 0a 20 20 20 20 66 66 6c 75 73 68 28 70 2d 3e  {.    fflush(p->
194e0 6f 75 74 29 3b 0a 20 20 20 20 7a 4c 69 6e 65 20  out);.    zLine 
194f0 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65  = one_input_line
19500 28 69 6e 2c 20 7a 4c 69 6e 65 2c 20 6e 53 71 6c  (in, zLine, nSql
19510 3e 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69  >0);.    if( zLi
19520 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ne==0 ){.      /
19530 2a 20 45 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a  * End of input *
19540 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 64 69  /.      if( stdi
19550 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
19560 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b   ) printf("\n");
19570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19580 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 65 6e    }.    if( seen
19590 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
195a0 20 20 20 69 66 28 20 69 6e 21 3d 30 20 29 20 62     if( in!=0 ) b
195b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 73 65 65 6e  reak;.      seen
195c0 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20  Interrupt = 0;. 
195d0 20 20 20 7d 0a 20 20 20 20 6c 69 6e 65 6e 6f 2b     }.    lineno+
195e0 2b 3b 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3d  +;.    if( nSql=
195f0 3d 30 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65  =0 && _all_white
19600 73 70 61 63 65 28 7a 4c 69 6e 65 29 20 29 7b 0a  space(zLine) ){.
19610 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 63 68        if( p->ech
19620 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25 73  oOn ) printf("%s
19630 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20  \n", zLine);.   
19640 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
19650 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
19660 20 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e   && zLine[0]=='.
19670 27 20 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a  ' && nSql==0 ){.
19680 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 63 68        if( p->ech
19690 6f 4f 6e 20 29 20 70 72 69 6e 74 66 28 22 25 73  oOn ) printf("%s
196a0 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 20  \n", zLine);.   
196b0 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65 74 61 5f     rc = do_meta_
196c0 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65 2c 20 70  command(zLine, p
196d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
196e0 3d 32 20 29 7b 20 2f 2a 20 65 78 69 74 20 72 65  =2 ){ /* exit re
196f0 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 20  quested */.     
19700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19710 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
19720 20 20 20 20 20 20 20 20 65 72 72 43 6e 74 2b 2b          errCnt++
19730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19740 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
19750 20 20 20 20 69 66 28 20 6c 69 6e 65 5f 69 73 5f      if( line_is_
19760 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69 6e 61 74  command_terminat
19770 6f 72 28 7a 4c 69 6e 65 29 20 26 26 20 6c 69 6e  or(zLine) && lin
19780 65 5f 69 73 5f 63 6f 6d 70 6c 65 74 65 28 7a 53  e_is_complete(zS
19790 71 6c 2c 20 6e 53 71 6c 29 20 29 7b 0a 20 20 20  ql, nSql) ){.   
197a0 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65 2c     memcpy(zLine,
197b0 22 3b 22 2c 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ";",2);.    }.  
197c0 20 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e    nLine = strlen
197d0 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 69  30(zLine);.    i
197e0 66 28 20 6e 53 71 6c 2b 6e 4c 69 6e 65 2b 32 3e  f( nSql+nLine+2>
197f0 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
19800 20 6e 41 6c 6c 6f 63 20 3d 20 6e 53 71 6c 2b 6e   nAlloc = nSql+n
19810 4c 69 6e 65 2b 31 30 30 3b 0a 20 20 20 20 20 20  Line+100;.      
19820 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  zSql = realloc(z
19830 53 71 6c 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20  Sql, nAlloc);.  
19840 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
19850 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
19860 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
19870 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r: out of memory
19880 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78  \n");.        ex
19890 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(1);.      }. 
198a0 20 20 20 7d 0a 20 20 20 20 6e 53 71 6c 50 72 69     }.    nSqlPri
198b0 6f 72 20 3d 20 6e 53 71 6c 3b 0a 20 20 20 20 69  or = nSql;.    i
198c0 66 28 20 6e 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( nSql==0 ){.  
198d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
198e0 20 66 6f 72 28 69 3d 30 3b 20 7a 4c 69 6e 65 5b   for(i=0; zLine[
198f0 69 5d 20 26 26 20 49 73 53 70 61 63 65 28 7a 4c  i] && IsSpace(zL
19900 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  ine[i]); i++){}.
19910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
19920 6c 6c 6f 63 3e 30 20 26 26 20 7a 53 71 6c 21 3d  lloc>0 && zSql!=
19930 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 );.      memcp
19940 79 28 7a 53 71 6c 2c 20 7a 4c 69 6e 65 2b 69 2c  y(zSql, zLine+i,
19950 20 6e 4c 69 6e 65 2b 31 2d 69 29 3b 0a 20 20 20   nLine+1-i);.   
19960 20 20 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 6c     startline = l
19970 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 6e 53 71  ineno;.      nSq
19980 6c 20 3d 20 6e 4c 69 6e 65 2d 69 3b 0a 20 20 20  l = nLine-i;.   
19990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
199a0 71 6c 5b 6e 53 71 6c 2b 2b 5d 20 3d 20 27 5c 6e  ql[nSql++] = '\n
199b0 27 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ';.      memcpy(
199c0 7a 53 71 6c 2b 6e 53 71 6c 2c 20 7a 4c 69 6e 65  zSql+nSql, zLine
199d0 2c 20 6e 4c 69 6e 65 2b 31 29 3b 0a 20 20 20 20  , nLine+1);.    
199e0 20 20 6e 53 71 6c 20 2b 3d 20 6e 4c 69 6e 65 3b    nSql += nLine;
199f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
19a00 53 71 6c 20 26 26 20 6c 69 6e 65 5f 63 6f 6e 74  Sql && line_cont
19a10 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 26  ains_semicolon(&
19a20 7a 53 71 6c 5b 6e 53 71 6c 50 72 69 6f 72 5d 2c  zSql[nSqlPrior],
19a30 20 6e 53 71 6c 2d 6e 53 71 6c 50 72 69 6f 72 29   nSql-nSqlPrior)
19a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19a50 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70   && sqlite3_comp
19a60 6c 65 74 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20  lete(zSql) ){.  
19a70 20 20 20 20 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a      p->cnt = 0;.
19a80 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c        open_db(p,
19a90 20 30 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e   0);.      BEGIN
19aa0 5f 54 49 4d 45 52 3b 0a 20 20 20 20 20 20 72 63  _TIMER;.      rc
19ab0 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d   = shell_exec(p-
19ac0 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c 6c  >db, zSql, shell
19ad0 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a  _callback, p, &z
19ae0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 45  ErrMsg);.      E
19af0 4e 44 5f 54 49 4d 45 52 3b 0a 20 20 20 20 20 20  ND_TIMER;.      
19b00 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73  if( rc || zErrMs
19b10 67 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  g ){.        cha
19b20 72 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 0a  r zPrefix[100];.
19b30 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 21 3d          if( in!=
19b40 30 20 7c 7c 20 21 73 74 64 69 6e 5f 69 73 5f 69  0 || !stdin_is_i
19b50 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a 20 20  nteractive ){.  
19b60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
19b70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
19b80 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65 66 69  zPrefix), zPrefi
19b90 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  x, .            
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19bb0 45 72 72 6f 72 3a 20 6e 65 61 72 20 6c 69 6e 65  Error: near line
19bc0 20 25 64 3a 22 2c 20 73 74 61 72 74 6c 69 6e 65   %d:", startline
19bd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
19be0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
19bf0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
19c00 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50  eof(zPrefix), zP
19c10 72 65 66 69 78 2c 20 22 45 72 72 6f 72 3a 22 29  refix, "Error:")
19c20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19c30 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 21      if( zErrMsg!
19c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
19c50 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
19c60 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65 66  "%s %s\n", zPref
19c70 69 78 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ix, zErrMsg);.  
19c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
19c90 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
19ca0 20 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67           zErrMsg
19cb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
19cc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
19cd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
19ce0 25 73 20 25 73 5c 6e 22 2c 20 7a 50 72 65 66 69  %s %s\n", zPrefi
19cf0 78 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  x, sqlite3_errms
19d00 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
19d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72 72     }.        err
19d20 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Cnt++;.      }. 
19d30 20 20 20 20 20 6e 53 71 6c 20 3d 20 30 3b 0a 20       nSql = 0;. 
19d40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 53 71     }else if( nSq
19d50 6c 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73  l && _all_whites
19d60 70 61 63 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20  pace(zSql) ){.  
19d70 20 20 20 20 69 66 28 20 70 2d 3e 65 63 68 6f 4f      if( p->echoO
19d80 6e 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c 6e  n ) printf("%s\n
19d90 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ", zSql);.      
19da0 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nSql = 0;.    }.
19db0 20 20 7d 0a 20 20 69 66 28 20 6e 53 71 6c 20 29    }.  if( nSql )
19dc0 7b 0a 20 20 20 20 69 66 28 20 21 5f 61 6c 6c 5f  {.    if( !_all_
19dd0 77 68 69 74 65 73 70 61 63 65 28 7a 53 71 6c 29  whitespace(zSql)
19de0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
19df0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
19e00 3a 20 69 6e 63 6f 6d 70 6c 65 74 65 20 53 51 4c  : incomplete SQL
19e10 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  : %s\n", zSql);.
19e20 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 7a      }.    free(z
19e30 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65  Sql);.  }.  free
19e40 28 7a 4c 69 6e 65 29 3b 0a 20 20 72 65 74 75 72  (zLine);.  retur
19e50 6e 20 65 72 72 43 6e 74 3e 30 3b 0a 7d 0a 0a 2f  n errCnt>0;.}../
19e60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 61  *.** Return a pa
19e70 74 68 6e 61 6d 65 20 77 68 69 63 68 20 69 73 20  thname which is 
19e80 74 68 65 20 75 73 65 72 27 73 20 68 6f 6d 65 20  the user's home 
19e90 64 69 72 65 63 74 6f 72 79 2e 20 20 41 0a 2a 2a  directory.  A.**
19ea0 20 30 20 72 65 74 75 72 6e 20 69 6e 64 69 63 61   0 return indica
19eb0 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6f 66 20  tes an error of 
19ec0 73 6f 6d 65 20 6b 69 6e 64 2e 0a 2a 2f 0a 73 74  some kind..*/.st
19ed0 61 74 69 63 20 63 68 61 72 20 2a 66 69 6e 64 5f  atic char *find_
19ee0 68 6f 6d 65 5f 64 69 72 28 76 6f 69 64 29 7b 0a  home_dir(void){.
19ef0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 68    static char *h
19f00 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c 3b 0a  ome_dir = NULL;.
19f10 20 20 69 66 28 20 68 6f 6d 65 5f 64 69 72 20 29    if( home_dir )
19f20 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72   return home_dir
19f30 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
19f40 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
19f50 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20 21 64  ned(WIN32) && !d
19f60 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
19f70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  E) && !defined(_
19f80 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69  _RTP__) && !defi
19f90 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29  ned(_WRS_KERNEL)
19fa0 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
19fb0 70 61 73 73 77 64 20 2a 70 77 65 6e 74 3b 0a 20  passwd *pwent;. 
19fc0 20 20 20 75 69 64 5f 74 20 75 69 64 20 3d 20 67     uid_t uid = g
19fd0 65 74 75 69 64 28 29 3b 0a 20 20 20 20 69 66 28  etuid();.    if(
19fe0 20 28 70 77 65 6e 74 3d 67 65 74 70 77 75 69 64   (pwent=getpwuid
19ff0 28 75 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (uid)) != NULL) 
1a000 7b 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64 69 72  {.      home_dir
1a010 20 3d 20 70 77 65 6e 74 2d 3e 70 77 5f 64 69 72   = pwent->pw_dir
1a020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1a030 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1a040 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 2f 2a  _WIN32_WCE).  /*
1a050 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d   Windows CE (arm
1a060 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65  -wince-mingw32ce
1a070 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70  -gcc) does not p
1a080 72 6f 76 69 64 65 20 67 65 74 65 6e 76 28 29 0a  rovide getenv().
1a090 20 20 20 2a 2f 0a 20 20 68 6f 6d 65 5f 64 69 72     */.  home_dir
1a0a0 20 3d 20 22 2f 22 3b 0a 23 65 6c 73 65 0a 0a 23   = "/";.#else..#
1a0b0 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
1a0c0 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
1a0d0 4e 33 32 29 0a 20 20 69 66 20 28 21 68 6f 6d 65  N32).  if (!home
1a0e0 5f 64 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65  _dir) {.    home
1a0f0 5f 64 69 72 20 3d 20 67 65 74 65 6e 76 28 22 55  _dir = getenv("U
1a100 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20  SERPROFILE");.  
1a110 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 20 28  }.#endif..  if (
1a120 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20  !home_dir) {.   
1a130 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65   home_dir = gete
1a140 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20 20 7d 0a  nv("HOME");.  }.
1a150 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
1a160 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
1a170 57 49 4e 33 32 29 0a 20 20 69 66 20 28 21 68 6f  WIN32).  if (!ho
1a180 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 63 68  me_dir) {.    ch
1a190 61 72 20 2a 7a 44 72 69 76 65 2c 20 2a 7a 50 61  ar *zDrive, *zPa
1a1a0 74 68 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  th;.    int n;. 
1a1b0 20 20 20 7a 44 72 69 76 65 20 3d 20 67 65 74 65     zDrive = gete
1a1c0 6e 76 28 22 48 4f 4d 45 44 52 49 56 45 22 29 3b  nv("HOMEDRIVE");
1a1d0 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 67 65 74  .    zPath = get
1a1e0 65 6e 76 28 22 48 4f 4d 45 50 41 54 48 22 29 3b  env("HOMEPATH");
1a1f0 0a 20 20 20 20 69 66 28 20 7a 44 72 69 76 65 20  .    if( zDrive 
1a200 26 26 20 7a 50 61 74 68 20 29 7b 0a 20 20 20 20  && zPath ){.    
1a210 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
1a220 44 72 69 76 65 29 20 2b 20 73 74 72 6c 65 6e 33  Drive) + strlen3
1a230 30 28 7a 50 61 74 68 29 20 2b 20 31 3b 0a 20 20  0(zPath) + 1;.  
1a240 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 6d      home_dir = m
1a250 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20  alloc( n );.    
1a260 20 20 69 66 28 20 68 6f 6d 65 5f 64 69 72 3d 3d    if( home_dir==
1a270 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1a280 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1a290 69 6e 74 66 28 6e 2c 20 68 6f 6d 65 5f 64 69 72  intf(n, home_dir
1a2a0 2c 20 22 25 73 25 73 22 2c 20 7a 44 72 69 76 65  , "%s%s", zDrive
1a2b0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , zPath);.      
1a2c0 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b  return home_dir;
1a2d0 0a 20 20 20 20 7d 0a 20 20 20 20 68 6f 6d 65 5f  .    }.    home_
1a2e0 64 69 72 20 3d 20 22 63 3a 5c 5c 22 3b 0a 20 20  dir = "c:\\";.  
1a2f0 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
1a300 20 2f 2a 20 21 5f 57 49 4e 33 32 5f 57 43 45 20   /* !_WIN32_WCE 
1a310 2a 2f 0a 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64  */..  if( home_d
1a320 69 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  ir ){.    int n 
1a330 3d 20 73 74 72 6c 65 6e 33 30 28 68 6f 6d 65 5f  = strlen30(home_
1a340 64 69 72 29 20 2b 20 31 3b 0a 20 20 20 20 63 68  dir) + 1;.    ch
1a350 61 72 20 2a 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20  ar *z = malloc( 
1a360 6e 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29  n );.    if( z )
1a370 20 6d 65 6d 63 70 79 28 7a 2c 20 68 6f 6d 65 5f   memcpy(z, home_
1a380 64 69 72 2c 20 6e 29 3b 0a 20 20 20 20 68 6f 6d  dir, n);.    hom
1a390 65 5f 64 69 72 20 3d 20 7a 3b 0a 20 20 7d 0a 0a  e_dir = z;.  }..
1a3a0 20 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69    return home_di
1a3b0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1a3c0 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
1a3d0 66 69 6c 65 20 67 69 76 65 6e 20 62 79 20 73 71  file given by sq
1a3e0 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65 2e  literc_override.
1a3f0 20 20 4f 72 20 69 66 20 74 68 61 74 0a 2a 2a 20    Or if that.** 
1a400 70 61 72 61 6d 65 74 65 72 20 69 73 20 4e 55 4c  parameter is NUL
1a410 4c 2c 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72  L, take input fr
1a420 6f 6d 20 7e 2f 2e 73 71 6c 69 74 65 72 63 0a 2a  om ~/.sqliterc.*
1a430 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
1a440 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1a450 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1a460 20 70 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72   process_sqliter
1a470 63 28 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c  c(.  struct call
1a480 62 61 63 6b 5f 64 61 74 61 20 2a 70 2c 20 20 20  back_data *p,   
1a490 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
1a4a0 61 74 69 6f 6e 20 64 61 74 61 20 2a 2f 0a 20 20  ation data */.  
1a4b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1a4c0 74 65 72 63 5f 6f 76 65 72 72 69 64 65 20 20 20  terc_override   
1a4d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6e 66 69  /* Name of confi
1a4e0 67 20 66 69 6c 65 2e 20 4e 55 4c 4c 20 74 6f 20  g file. NULL to 
1a4f0 75 73 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 29  use default */.)
1a500 7b 0a 20 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64  {.  char *home_d
1a510 69 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 6e  ir = NULL;.  con
1a520 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 72  st char *sqliter
1a530 63 20 3d 20 73 71 6c 69 74 65 72 63 5f 6f 76 65  c = sqliterc_ove
1a540 72 72 69 64 65 3b 0a 20 20 63 68 61 72 20 2a 7a  rride;.  char *z
1a550 42 75 66 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20  Buf = 0;.  FILE 
1a560 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e  *in = NULL;.  in
1a570 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 69 66 20  t rc = 0;..  if 
1a580 28 73 71 6c 69 74 65 72 63 20 3d 3d 20 4e 55 4c  (sqliterc == NUL
1a590 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69  L) {.    home_di
1a5a0 72 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69  r = find_home_di
1a5b0 72 28 29 3b 0a 20 20 20 20 69 66 28 20 68 6f 6d  r();.    if( hom
1a5c0 65 5f 64 69 72 3d 3d 30 20 29 7b 0a 23 69 66 20  e_dir==0 ){.#if 
1a5d0 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f  !defined(__RTP__
1a5e0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
1a5f0 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 20 20 20  RS_KERNEL).     
1a600 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1a610 22 25 73 3a 20 45 72 72 6f 72 3a 20 63 61 6e 6e  "%s: Error: cann
1a620 6f 74 20 6c 6f 63 61 74 65 20 79 6f 75 72 20 68  ot locate your h
1a630 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 5c 6e 22  ome directory\n"
1a640 2c 20 41 72 67 76 30 29 3b 0a 23 65 6e 64 69 66  , Argv0);.#endif
1a650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1a660 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a670 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
1a680 0a 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69  .    zBuf = sqli
1a690 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
1a6a0 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f  .sqliterc",home_
1a6b0 64 69 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dir);.    sqlite
1a6c0 72 63 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  rc = zBuf;.  }. 
1a6d0 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c 69   in = fopen(sqli
1a6e0 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69 66  terc,"rb");.  if
1a6f0 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  ( in ){.    if( 
1a700 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
1a710 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 66 70  tive ){.      fp
1a720 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 2d 2d  rintf(stderr,"--
1a730 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75 72 63   Loading resourc
1a740 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c 73 71  es from %s\n",sq
1a750 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d 0a 20  literc);.    }. 
1a760 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f     rc = process_
1a770 69 6e 70 75 74 28 70 2c 69 6e 29 3b 0a 20 20 20  input(p,in);.   
1a780 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d   fclose(in);.  }
1a790 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1a7a0 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  zBuf);.  return 
1a7b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f  rc;.}../*.** Sho
1a7c0 77 20 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d 6d  w available comm
1a7d0 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73  and line options
1a7e0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1a7f0 20 63 68 61 72 20 7a 4f 70 74 69 6f 6e 73 5b 5d   char zOptions[]
1a800 20 3d 20 0a 20 20 22 20 20 20 2d 62 61 69 6c 20   = .  "   -bail 
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1a820 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e  top after hittin
1a830 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20 20  g an error\n".  
1a840 22 20 20 20 2d 62 61 74 63 68 20 20 20 20 20 20  "   -batch      
1a850 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 20 62           force b
1a860 61 74 63 68 20 49 2f 4f 5c 6e 22 0a 20 20 22 20  atch I/O\n".  " 
1a870 20 20 2d 63 6f 6c 75 6d 6e 20 20 20 20 20 20 20    -column       
1a880 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75         set outpu
1a890 74 20 6d 6f 64 65 20 74 6f 20 27 63 6f 6c 75 6d  t mode to 'colum
1a8a0 6e 27 5c 6e 22 0a 20 20 22 20 20 20 2d 63 6d 64  n'\n".  "   -cmd
1a8b0 20 43 4f 4d 4d 41 4e 44 20 20 20 20 20 20 20 20   COMMAND        
1a8c0 20 72 75 6e 20 5c 22 43 4f 4d 4d 41 4e 44 5c 22   run \"COMMAND\"
1a8d0 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20   before reading 
1a8e0 73 74 64 69 6e 5c 6e 22 0a 20 20 22 20 20 20 2d  stdin\n".  "   -
1a8f0 63 73 76 20 20 20 20 20 20 20 20 20 20 20 20 20  csv             
1a900 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d      set output m
1a910 6f 64 65 20 74 6f 20 27 63 73 76 27 5c 6e 22 0a  ode to 'csv'\n".
1a920 20 20 22 20 20 20 2d 65 63 68 6f 20 20 20 20 20    "   -echo     
1a930 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
1a940 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66 6f 72 65   commands before
1a950 20 65 78 65 63 75 74 69 6f 6e 5c 6e 22 0a 20 20   execution\n".  
1a960 22 20 20 20 2d 69 6e 69 74 20 46 49 4c 45 4e 41  "   -init FILENA
1a970 4d 45 20 20 20 20 20 20 20 72 65 61 64 2f 70 72  ME       read/pr
1a980 6f 63 65 73 73 20 6e 61 6d 65 64 20 66 69 6c 65  ocess named file
1a990 5c 6e 22 0a 20 20 22 20 20 20 2d 5b 6e 6f 5d 68  \n".  "   -[no]h
1a9a0 65 61 64 65 72 20 20 20 20 20 20 20 20 20 20 74  eader          t
1a9b0 75 72 6e 20 68 65 61 64 65 72 73 20 6f 6e 20 6f  urn headers on o
1a9c0 72 20 6f 66 66 5c 6e 22 0a 23 69 66 20 64 65 66  r off\n".#if def
1a9d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1a9e0 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64  LE_MEMSYS3) || d
1a9f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1aa00 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20  ABLE_MEMSYS5).  
1aa10 22 20 20 20 2d 68 65 61 70 20 53 49 5a 45 20 20  "   -heap SIZE  
1aa20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66           Size of
1aa30 20 68 65 61 70 20 66 6f 72 20 6d 65 6d 73 79 73   heap for memsys
1aa40 33 20 6f 72 20 6d 65 6d 73 79 73 35 5c 6e 22 0a  3 or memsys5\n".
1aa50 23 65 6e 64 69 66 0a 20 20 22 20 20 20 2d 68 65  #endif.  "   -he
1aa60 6c 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lp              
1aa70 20 20 73 68 6f 77 20 74 68 69 73 20 6d 65 73 73    show this mess
1aa80 61 67 65 5c 6e 22 0a 20 20 22 20 20 20 2d 68 74  age\n".  "   -ht
1aa90 6d 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ml              
1aaa0 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64    set output mod
1aab0 65 20 74 6f 20 48 54 4d 4c 5c 6e 22 0a 20 20 22  e to HTML\n".  "
1aac0 20 20 20 2d 69 6e 74 65 72 61 63 74 69 76 65 20     -interactive 
1aad0 20 20 20 20 20 20 20 20 66 6f 72 63 65 20 69 6e          force in
1aae0 74 65 72 61 63 74 69 76 65 20 49 2f 4f 5c 6e 22  teractive I/O\n"
1aaf0 0a 20 20 22 20 20 20 2d 6c 69 6e 65 20 20 20 20  .  "   -line    
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1ab10 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
1ab20 6c 69 6e 65 27 5c 6e 22 0a 20 20 22 20 20 20 2d  line'\n".  "   -
1ab30 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
1ab40 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d      set output m
1ab50 6f 64 65 20 74 6f 20 27 6c 69 73 74 27 5c 6e 22  ode to 'list'\n"
1ab60 0a 20 20 22 20 20 20 2d 6d 6d 61 70 20 4e 20 20  .  "   -mmap N  
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
1ab80 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 73 65  ult mmap size se
1ab90 74 20 74 6f 20 4e 5c 6e 22 0a 23 69 66 64 65 66  t to N\n".#ifdef
1aba0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
1abb0 55 4c 54 49 50 4c 45 58 0a 20 20 22 20 20 20 2d  ULTIPLEX.  "   -
1abc0 6d 75 6c 74 69 70 6c 65 78 20 20 20 20 20 20 20  multiplex       
1abd0 20 20 20 20 65 6e 61 62 6c 65 20 74 68 65 20 6d      enable the m
1abe0 75 6c 74 69 70 6c 65 78 6f 72 20 56 46 53 5c 6e  ultiplexor VFS\n
1abf0 22 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20 2d  ".#endif.  "   -
1ac00 6e 75 6c 6c 76 61 6c 75 65 20 54 45 58 54 20 20  nullvalue TEXT  
1ac10 20 20 20 20 73 65 74 20 74 65 78 74 20 73 74 72      set text str
1ac20 69 6e 67 20 66 6f 72 20 4e 55 4c 4c 20 76 61 6c  ing for NULL val
1ac30 75 65 73 2e 20 44 65 66 61 75 6c 74 20 27 27 5c  ues. Default ''\
1ac40 6e 22 0a 20 20 22 20 20 20 2d 73 65 70 61 72 61  n".  "   -separa
1ac50 74 6f 72 20 53 45 50 20 20 20 20 20 20 20 73 65  tor SEP       se
1ac60 74 20 6f 75 74 70 75 74 20 66 69 65 6c 64 20 73  t output field s
1ac70 65 70 61 72 61 74 6f 72 2e 20 44 65 66 61 75 6c  eparator. Defaul
1ac80 74 3a 20 27 7c 27 5c 6e 22 0a 20 20 22 20 20 20  t: '|'\n".  "   
1ac90 2d 73 74 61 74 73 20 20 20 20 20 20 20 20 20 20  -stats          
1aca0 20 20 20 20 20 70 72 69 6e 74 20 6d 65 6d 6f 72       print memor
1acb0 79 20 73 74 61 74 73 20 62 65 66 6f 72 65 20 65  y stats before e
1acc0 61 63 68 20 66 69 6e 61 6c 69 7a 65 5c 6e 22 0a  ach finalize\n".
1acd0 20 20 22 20 20 20 2d 76 65 72 73 69 6f 6e 20 20    "   -version  
1ace0 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 20             show 
1acf0 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 5c 6e  SQLite version\n
1ad00 22 0a 20 20 22 20 20 20 2d 76 66 73 20 4e 41 4d  ".  "   -vfs NAM
1ad10 45 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65  E            use
1ad20 20 4e 41 4d 45 20 61 73 20 74 68 65 20 64 65 66   NAME as the def
1ad30 61 75 6c 74 20 56 46 53 5c 6e 22 0a 23 69 66 64  ault VFS\n".#ifd
1ad40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ad50 5f 56 46 53 54 52 41 43 45 0a 20 20 22 20 20 20  _VFSTRACE.  "   
1ad60 2d 76 66 73 74 72 61 63 65 20 20 20 20 20 20 20  -vfstrace       
1ad70 20 20 20 20 20 65 6e 61 62 6c 65 20 74 72 61 63       enable trac
1ad80 69 6e 67 20 6f 66 20 61 6c 6c 20 56 46 53 20 63  ing of all VFS c
1ad90 61 6c 6c 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 3b  alls\n".#endif.;
1ada0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73 61  .static void usa
1adb0 67 65 28 69 6e 74 20 73 68 6f 77 44 65 74 61 69  ge(int showDetai
1adc0 6c 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  l){.  fprintf(st
1add0 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 73 61  derr,.      "Usa
1ade0 67 65 3a 20 25 73 20 5b 4f 50 54 49 4f 4e 53 5d  ge: %s [OPTIONS]
1adf0 20 46 49 4c 45 4e 41 4d 45 20 5b 53 51 4c 5d 5c   FILENAME [SQL]\
1ae00 6e 22 20 20 0a 20 20 20 20 20 20 22 46 49 4c 45  n"  .      "FILE
1ae10 4e 41 4d 45 20 69 73 20 74 68 65 20 6e 61 6d 65  NAME is the name
1ae20 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20 64 61   of an SQLite da
1ae30 74 61 62 61 73 65 2e 20 41 20 6e 65 77 20 64 61  tabase. A new da
1ae40 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
1ae50 64 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 74  d\n".      "if t
1ae60 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1ae70 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73   previously exis
1ae80 74 2e 5c 6e 22 2c 20 41 72 67 76 30 29 3b 0a 20  t.\n", Argv0);. 
1ae90 20 69 66 28 20 73 68 6f 77 44 65 74 61 69 6c 20   if( showDetail 
1aea0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
1aeb0 74 64 65 72 72 2c 20 22 4f 50 54 49 4f 4e 53 20  tderr, "OPTIONS 
1aec0 69 6e 63 6c 75 64 65 3a 5c 6e 25 73 22 2c 20 7a  include:\n%s", z
1aed0 4f 70 74 69 6f 6e 73 29 3b 0a 20 20 7d 65 6c 73  Options);.  }els
1aee0 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  e{.    fprintf(s
1aef0 74 64 65 72 72 2c 20 22 55 73 65 20 74 68 65 20  tderr, "Use the 
1af00 2d 68 65 6c 70 20 6f 70 74 69 6f 6e 20 66 6f 72  -help option for
1af10 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1af20 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 7d  rmation\n");.  }
1af30 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f  .  exit(1);.}../
1af40 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1af50 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f 72 6d  the state inform
1af60 61 74 69 6f 6e 20 69 6e 20 64 61 74 61 0a 2a 2f  ation in data.*/
1af70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 69  .static void mai
1af80 6e 5f 69 6e 69 74 28 73 74 72 75 63 74 20 63 61  n_init(struct ca
1af90 6c 6c 62 61 63 6b 5f 64 61 74 61 20 2a 64 61 74  llback_data *dat
1afa0 61 29 20 7b 0a 20 20 6d 65 6d 73 65 74 28 64 61  a) {.  memset(da
1afb0 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 64  ta, 0, sizeof(*d
1afc0 61 74 61 29 29 3b 0a 20 20 64 61 74 61 2d 3e 6d  ata));.  data->m
1afd0 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
1afe0 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2d 3e  .  memcpy(data->
1aff0 73 65 70 61 72 61 74 6f 72 2c 22 7c 22 2c 20 32  separator,"|", 2
1b000 29 3b 0a 20 20 64 61 74 61 2d 3e 73 68 6f 77 48  );.  data->showH
1b010 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c  eader = 0;.  sql
1b020 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
1b030 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 20 31  TE_CONFIG_URI, 1
1b040 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  );.  sqlite3_con
1b050 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
1b060 47 5f 4c 4f 47 2c 20 73 68 65 6c 6c 4c 6f 67 2c  G_LOG, shellLog,
1b070 20 64 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65   data);.  sqlite
1b080 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1b090 66 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2c 20 6d  f(mainPrompt), m
1b0a0 61 69 6e 50 72 6f 6d 70 74 2c 22 73 71 6c 69 74  ainPrompt,"sqlit
1b0b0 65 3e 20 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  e> ");.  sqlite3
1b0c0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1b0d0 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29  (continuePrompt)
1b0e0 2c 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  , continuePrompt
1b0f0 2c 22 20 20 20 2e 2e 2e 3e 20 22 29 3b 0a 20 20  ,"   ...> ");.  
1b100 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
1b110 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
1b120 47 4c 45 54 48 52 45 41 44 29 3b 0a 7d 0a 0a 2f  GLETHREAD);.}../
1b130 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 65 78 74  *.** Output text
1b140 20 74 6f 20 74 68 65 20 63 6f 6e 73 6f 6c 65 20   to the console 
1b150 69 6e 20 61 20 66 6f 6e 74 20 74 68 61 74 20 61  in a font that a
1b160 74 74 72 61 63 74 73 20 65 78 74 72 61 20 61 74  ttracts extra at
1b170 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64  tention..*/.#ifd
1b180 65 66 20 5f 57 49 4e 33 32 0a 73 74 61 74 69 63  ef _WIN32.static
1b190 20 76 6f 69 64 20 70 72 69 6e 74 42 6f 6c 64 28   void printBold(
1b1a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
1b1b0 74 29 7b 0a 20 20 48 41 4e 44 4c 45 20 6f 75 74  t){.  HANDLE out
1b1c0 20 3d 20 47 65 74 53 74 64 48 61 6e 64 6c 65 28   = GetStdHandle(
1b1d0 53 54 44 5f 4f 55 54 50 55 54 5f 48 41 4e 44 4c  STD_OUTPUT_HANDL
1b1e0 45 29 3b 0a 20 20 43 4f 4e 53 4f 4c 45 5f 53 43  E);.  CONSOLE_SC
1b1f0 52 45 45 4e 5f 42 55 46 46 45 52 5f 49 4e 46 4f  REEN_BUFFER_INFO
1b200 20 64 65 66 61 75 6c 74 53 63 72 65 65 6e 49 6e   defaultScreenIn
1b210 66 6f 3b 0a 20 20 47 65 74 43 6f 6e 73 6f 6c 65  fo;.  GetConsole
1b220 53 63 72 65 65 6e 42 75 66 66 65 72 49 6e 66 6f  ScreenBufferInfo
1b230 28 6f 75 74 2c 20 26 64 65 66 61 75 6c 74 53 63  (out, &defaultSc
1b240 72 65 65 6e 49 6e 66 6f 29 3b 0a 20 20 53 65 74  reenInfo);.  Set
1b250 43 6f 6e 73 6f 6c 65 54 65 78 74 41 74 74 72 69  ConsoleTextAttri
1b260 62 75 74 65 28 6f 75 74 2c 0a 20 20 20 20 20 20  bute(out,.      
1b270 20 20 20 46 4f 52 45 47 52 4f 55 4e 44 5f 52 45     FOREGROUND_RE
1b280 44 7c 46 4f 52 45 47 52 4f 55 4e 44 5f 49 4e 54  D|FOREGROUND_INT
1b290 45 4e 53 49 54 59 0a 20 20 29 3b 0a 20 20 70 72  ENSITY.  );.  pr
1b2a0 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78 74  intf("%s", zText
1b2b0 29 3b 0a 20 20 53 65 74 43 6f 6e 73 6f 6c 65 54  );.  SetConsoleT
1b2c0 65 78 74 41 74 74 72 69 62 75 74 65 28 6f 75 74  extAttribute(out
1b2d0 2c 20 64 65 66 61 75 6c 74 53 63 72 65 65 6e 49  , defaultScreenI
1b2e0 6e 66 6f 2e 77 41 74 74 72 69 62 75 74 65 73 29  nfo.wAttributes)
1b2f0 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69 63  ;.}.#else.static
1b300 20 76 6f 69 64 20 70 72 69 6e 74 42 6f 6c 64 28   void printBold(
1b310 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
1b320 74 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 5c 30  t){.  printf("\0
1b330 33 33 5b 31 6d 25 73 5c 30 33 33 5b 30 6d 22 2c  33[1m%s\033[0m",
1b340 20 7a 54 65 78 74 29 3b 0a 7d 0a 23 65 6e 64 69   zText);.}.#endi
1b350 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65  f../*.** Get the
1b360 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 20   argument to an 
1b370 2d 2d 6f 70 74 69 6f 6e 2e 20 20 54 68 72 6f 77  --option.  Throw
1b380 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 64 69   an error and di
1b390 65 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74  e if no argument
1b3a0 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
1b3b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1b3c0 20 2a 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e   *cmdline_option
1b3d0 5f 76 61 6c 75 65 28 69 6e 74 20 61 72 67 63 2c  _value(int argc,
1b3e0 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 69 6e   char **argv, in
1b3f0 74 20 69 29 7b 0a 20 20 69 66 28 20 69 3d 3d 61  t i){.  if( i==a
1b400 72 67 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  rgc ){.    fprin
1b410 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20  tf(stderr, "%s: 
1b420 45 72 72 6f 72 3a 20 6d 69 73 73 69 6e 67 20 61  Error: missing a
1b430 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 5c 6e 22  rgument to %s\n"
1b440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  ,.            ar
1b450 67 76 5b 30 5d 2c 20 61 72 67 76 5b 61 72 67 63  gv[0], argv[argc
1b460 2d 31 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31  -1]);.    exit(1
1b470 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b480 61 72 67 76 5b 69 5d 3b 0a 7d 0a 0a 69 6e 74 20  argv[i];.}..int 
1b490 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
1b4a0 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  har **argv){.  c
1b4b0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
1b4c0 3b 0a 20 20 73 74 72 75 63 74 20 63 61 6c 6c 62  ;.  struct callb
1b4d0 61 63 6b 5f 64 61 74 61 20 64 61 74 61 3b 0a 20  ack_data data;. 
1b4e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
1b4f0 69 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 68  itFile = 0;.  ch
1b500 61 72 20 2a 7a 46 69 72 73 74 43 6d 64 20 3d 20  ar *zFirstCmd = 
1b510 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
1b520 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t rc = 0;.  int 
1b530 77 61 72 6e 49 6e 6d 65 6d 6f 72 79 44 62 20 3d  warnInmemoryDb =
1b540 20 30 3b 0a 0a 23 69 66 20 55 53 45 5f 53 59 53   0;..#if USE_SYS
1b550 54 45 4d 5f 53 51 4c 49 54 45 2b 30 21 3d 31 0a  TEM_SQLITE+0!=1.
1b560 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c    if( strcmp(sql
1b570 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
1b580 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44  SQLITE_SOURCE_ID
1b590 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  )!=0 ){.    fpri
1b5a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c  ntf(stderr, "SQL
1b5b0 69 74 65 20 68 65 61 64 65 72 20 61 6e 64 20 73  ite header and s
1b5c0 6f 75 72 63 65 20 76 65 72 73 69 6f 6e 20 6d 69  ource version mi
1b5d0 73 6d 61 74 63 68 5c 6e 25 73 5c 6e 25 73 5c 6e  smatch\n%s\n%s\n
1b5e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ",.            s
1b5f0 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
1b600 29 2c 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  ), SQLITE_SOURCE
1b610 5f 49 44 29 3b 0a 20 20 20 20 65 78 69 74 28 31  _ID);.    exit(1
1b620 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1b630 41 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b  Argv0 = argv[0];
1b640 0a 20 20 6d 61 69 6e 5f 69 6e 69 74 28 26 64 61  .  main_init(&da
1b650 74 61 29 3b 0a 20 20 73 74 64 69 6e 5f 69 73 5f  ta);.  stdin_is_
1b660 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20 69 73  interactive = is
1b670 61 74 74 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 4d  atty(0);..  /* M
1b680 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
1b690 20 61 20 76 61 6c 69 64 20 73 69 67 6e 61 6c 20   a valid signal 
1b6a0 68 61 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20 62  handler early, b
1b6b0 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a 20  efore anything. 
1b6c0 20 2a 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e 65   ** else is done
1b6d0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 49  ..  */.#ifdef SI
1b6e0 47 49 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53 49  GINT.  signal(SI
1b6f0 47 49 4e 54 2c 20 69 6e 74 65 72 72 75 70 74 5f  GINT, interrupt_
1b700 68 61 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66  handler);.#endif
1b710 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 69  ..  /* Do an ini
1b720 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67  tial pass throug
1b730 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  h the command-li
1b740 6e 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c  ne argument to l
1b750 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 6e  ocate.  ** the n
1b760 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1b770 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 61  ase file, the na
1b780 6d 65 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  me of the initia
1b790 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2c 0a 20  lization file,. 
1b7a0 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20   ** the size of 
1b7b0 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
1b7c0 6d 61 6c 6c 6f 63 20 68 65 61 70 2c 0a 20 20 2a  malloc heap,.  *
1b7d0 2a 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  * and the first 
1b7e0 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 75  command to execu
1b7f0 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  te..  */.  for(i
1b800 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =1; i<argc; i++)
1b810 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
1b820 20 20 20 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a     z = argv[i];.
1b830 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d      if( z[0]!='-
1b840 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ' ){.      if( d
1b850 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d  ata.zDbFilename=
1b860 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 61  =0 ){.        da
1b870 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  ta.zDbFilename =
1b880 20 7a 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   z;.        cont
1b890 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
1b8a0 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d      if( zFirstCm
1b8b0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
1b8c0 7a 46 69 72 73 74 43 6d 64 20 3d 20 7a 3b 0a 20  zFirstCmd = z;. 
1b8d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1b8e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1b8f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
1b900 73 3a 20 45 72 72 6f 72 3a 20 74 6f 6f 20 6d 61  s: Error: too ma
1b910 6e 79 20 6f 70 74 69 6f 6e 73 3a 20 5c 22 25 73  ny options: \"%s
1b920 5c 22 5c 6e 22 2c 20 41 72 67 76 30 2c 20 61 72  \"\n", Argv0, ar
1b930 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 66 70  gv[i]);.      fp
1b940 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 73  rintf(stderr,"Us
1b950 65 20 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c 69  e -help for a li
1b960 73 74 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e  st of options.\n
1b970 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
1b980 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1b990 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  ( z[1]=='-' ) z+
1b9a0 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  +;.    if( strcm
1b9b0 70 28 7a 2c 22 2d 73 65 70 61 72 61 74 6f 72 22  p(z,"-separator"
1b9c0 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72  )==0.     || str
1b9d0 63 6d 70 28 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75  cmp(z,"-nullvalu
1b9e0 65 22 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73  e")==0.     || s
1b9f0 74 72 63 6d 70 28 7a 2c 22 2d 63 6d 64 22 29 3d  trcmp(z,"-cmd")=
1ba00 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1ba10 28 76 6f 69 64 29 63 6d 64 6c 69 6e 65 5f 6f 70  (void)cmdline_op
1ba20 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c  tion_value(argc,
1ba30 20 61 72 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20   argv, ++i);.   
1ba40 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1ba50 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20  p(z,"-init")==0 
1ba60 29 7b 0a 20 20 20 20 20 20 7a 49 6e 69 74 46 69  ){.      zInitFi
1ba70 6c 65 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f 70 74  le = cmdline_opt
1ba80 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 20  ion_value(argc, 
1ba90 61 72 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20 20  argv, ++i);.    
1baa0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1bab0 28 7a 2c 22 2d 62 61 74 63 68 22 29 3d 3d 30 20  (z,"-batch")==0 
1bac0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  ){.      /* Need
1bad0 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 62 61   to check for ba
1bae0 74 63 68 20 6d 6f 64 65 20 68 65 72 65 20 74 6f  tch mode here to
1baf0 20 73 6f 20 77 65 20 63 61 6e 20 61 76 6f 69 64   so we can avoid
1bb00 20 70 72 69 6e 74 69 6e 67 0a 20 20 20 20 20 20   printing.      
1bb10 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 61 6c  ** informational
1bb20 20 6d 65 73 73 61 67 65 73 20 28 6c 69 6b 65 20   messages (like 
1bb30 66 72 6f 6d 20 70 72 6f 63 65 73 73 5f 73 71 6c  from process_sql
1bb40 69 74 65 72 63 29 20 62 65 66 6f 72 65 20 0a 20  iterc) before . 
1bb50 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 74 68       ** we do th
1bb60 65 20 61 63 74 75 61 6c 20 70 72 6f 63 65 73 73  e actual process
1bb70 69 6e 67 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ing of arguments
1bb80 20 6c 61 74 65 72 20 69 6e 20 61 20 73 65 63 6f   later in a seco
1bb90 6e 64 20 70 61 73 73 2e 0a 20 20 20 20 20 20 2a  nd pass..      *
1bba0 2f 0a 20 20 20 20 20 20 73 74 64 69 6e 5f 69 73  /.      stdin_is
1bbb0 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20 30  _interactive = 0
1bbc0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1bbd0 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61 70 22  strcmp(z,"-heap"
1bbe0 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69  )==0 ){.#if defi
1bbf0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1bc00 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65  E_MEMSYS3) || de
1bc10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1bc20 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20  BLE_MEMSYS5).   
1bc30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1bc40 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Size;.      sqli
1bc50 74 65 33 5f 69 6e 74 36 34 20 73 7a 48 65 61 70  te3_int64 szHeap
1bc60 3b 0a 0a 20 20 20 20 20 20 7a 53 69 7a 65 20 3d  ;..      zSize =
1bc70 20 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f   cmdline_option_
1bc80 76 61 6c 75 65 28 61 72 67 63 2c 20 61 72 67 76  value(argc, argv
1bc90 2c 20 2b 2b 69 29 3b 0a 20 20 20 20 20 20 73 7a  , ++i);.      sz
1bca0 48 65 61 70 20 3d 20 69 6e 74 65 67 65 72 56 61  Heap = integerVa
1bcb0 6c 75 65 28 7a 53 69 7a 65 29 3b 0a 20 20 20 20  lue(zSize);.    
1bcc0 20 20 69 66 28 20 73 7a 48 65 61 70 3e 30 78 37    if( szHeap>0x7
1bcd0 66 66 66 30 30 30 30 20 29 20 73 7a 48 65 61 70  fff0000 ) szHeap
1bce0 20 3d 20 30 78 37 66 66 66 30 30 30 30 3b 0a 20   = 0x7fff0000;. 
1bcf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e       sqlite3_con
1bd00 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
1bd10 47 5f 48 45 41 50 2c 20 6d 61 6c 6c 6f 63 28 28  G_HEAP, malloc((
1bd20 69 6e 74 29 73 7a 48 65 61 70 29 2c 20 28 69 6e  int)szHeap), (in
1bd30 74 29 73 7a 48 65 61 70 2c 20 36 34 29 3b 0a 23  t)szHeap, 64);.#
1bd40 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1bd50 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52  ITE_ENABLE_VFSTR
1bd60 41 43 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ACE.    }else if
1bd70 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73  ( strcmp(z,"-vfs
1bd80 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
1bd90 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 76      extern int v
1bda0 66 73 74 72 61 63 65 5f 72 65 67 69 73 74 65 72  fstrace_register
1bdb0 28 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  (.         const
1bdc0 20 63 68 61 72 20 2a 7a 54 72 61 63 65 4e 61 6d   char *zTraceNam
1bdd0 65 2c 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 73  e,.         cons
1bde0 74 20 63 68 61 72 20 2a 7a 4f 6c 64 56 66 73 4e  t char *zOldVfsN
1bdf0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 69 6e  ame,.         in
1be00 74 20 28 2a 78 4f 75 74 29 28 63 6f 6e 73 74 20  t (*xOut)(const 
1be10 63 68 61 72 2a 2c 76 6f 69 64 2a 29 2c 0a 20 20  char*,void*),.  
1be20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4f 75         void *pOu
1be30 74 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 69  tArg,.         i
1be40 6e 74 20 6d 61 6b 65 44 65 66 61 75 6c 74 0a 20  nt makeDefault. 
1be50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 76 66       );.      vf
1be60 73 74 72 61 63 65 5f 72 65 67 69 73 74 65 72 28  strace_register(
1be70 22 74 72 61 63 65 22 2c 30 2c 28 69 6e 74 28 2a  "trace",0,(int(*
1be80 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 76 6f  )(const char*,vo
1be90 69 64 2a 29 29 66 70 75 74 73 2c 73 74 64 65 72  id*))fputs,stder
1bea0 72 2c 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  r,1);.#endif.#if
1beb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1bec0 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 20 20  E_MULTIPLEX.    
1bed0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1bee0 28 7a 2c 22 2d 6d 75 6c 74 69 70 6c 65 78 22 29  (z,"-multiplex")
1bef0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 78 74  ==0 ){.      ext
1bf00 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1bf10 6d 75 6c 74 69 70 6c 65 5f 69 6e 69 74 69 61 6c  multiple_initial
1bf20 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ize(const char*,
1bf30 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
1bf40 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e  te3_multiplex_in
1bf50 69 74 69 61 6c 69 7a 65 28 30 2c 20 31 29 3b 0a  itialize(0, 1);.
1bf60 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1bf70 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1bf80 6d 6d 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mmap")==0 ){.   
1bf90 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1bfa0 20 73 7a 20 3d 20 69 6e 74 65 67 65 72 56 61 6c   sz = integerVal
1bfb0 75 65 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f  ue(cmdline_optio
1bfc0 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67  n_value(argc,arg
1bfd0 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 73  v,++i));.      s
1bfe0 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
1bff0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
1c000 5f 53 49 5a 45 2c 20 73 7a 2c 20 73 7a 29 3b 0a  _SIZE, sz, sz);.
1c010 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1c020 72 63 6d 70 28 7a 2c 22 2d 76 66 73 22 29 3d 3d  rcmp(z,"-vfs")==
1c030 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1c040 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73  e3_vfs *pVfs = s
1c050 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1c060 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
1c070 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b  alue(argc,argv,+
1c080 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +i));.      if( 
1c090 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
1c0a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1c0b0 73 74 65 72 28 70 56 66 73 2c 20 31 29 3b 0a 20  ster(pVfs, 1);. 
1c0c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c0d0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1c0e0 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 56 46 53  rr, "no such VFS
1c0f0 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 72 67  : \"%s\"\n", arg
1c100 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 65  v[i]);.        e
1c110 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
1c120 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1c130 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65  data.zDbFilename
1c140 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
1c150 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
1c160 59 44 42 0a 20 20 20 20 64 61 74 61 2e 7a 44 62  YDB.    data.zDb
1c170 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d  Filename = ":mem
1c180 6f 72 79 3a 22 3b 0a 20 20 20 20 77 61 72 6e 49  ory:";.    warnI
1c190 6e 6d 65 6d 6f 72 79 44 62 20 3d 20 61 72 67 63  nmemoryDb = argc
1c1a0 3d 3d 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66  ==1;.#else.    f
1c1b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
1c1c0 73 3a 20 45 72 72 6f 72 3a 20 6e 6f 20 64 61 74  s: Error: no dat
1c1d0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 73  abase filename s
1c1e0 70 65 63 69 66 69 65 64 5c 6e 22 2c 20 41 72 67  pecified\n", Arg
1c1f0 76 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  v0);.    return 
1c200 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  1;.#endif.#ifdef
1c210 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 44 42   SQLITE_SHELL_DB
1c220 4e 41 4d 45 5f 50 52 4f 43 0a 20 20 20 20 7b 20  NAME_PROC.    { 
1c230 65 78 74 65 72 6e 20 76 6f 69 64 20 53 51 4c 49  extern void SQLI
1c240 54 45 5f 53 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f  TE_SHELL_DBNAME_
1c250 50 52 4f 43 28 63 6f 6e 73 74 20 63 68 61 72 2a  PROC(const char*
1c260 2a 29 3b 0a 20 20 20 20 20 20 53 51 4c 49 54 45  *);.      SQLITE
1c270 5f 53 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52  _SHELL_DBNAME_PR
1c280 4f 43 28 26 64 61 74 61 2e 7a 44 62 46 69 6c 65  OC(&data.zDbFile
1c290 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 77 61 72  name);.      war
1c2a0 6e 49 6e 6d 65 6d 6f 72 79 44 62 20 3d 20 30 3b  nInmemoryDb = 0;
1c2b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1c2c0 64 61 74 61 2e 6f 75 74 20 3d 20 73 74 64 6f 75  data.out = stdou
1c2d0 74 3b 0a 0a 20 20 2f 2a 20 47 6f 20 61 68 65 61  t;..  /* Go ahea
1c2e0 64 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 64  d and open the d
1c2f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
1c300 69 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  it already exist
1c310 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  s.  If the.  ** 
1c320 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
1c330 69 73 74 2c 20 64 65 6c 61 79 20 6f 70 65 6e 69  ist, delay openi
1c340 6e 67 20 69 74 2e 20 20 54 68 69 73 20 70 72 65  ng it.  This pre
1c350 76 65 6e 74 73 20 65 6d 70 74 79 20 64 61 74 61  vents empty data
1c360 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20  base.  ** files 
1c370 66 72 6f 6d 20 62 65 69 6e 67 20 63 72 65 61 74  from being creat
1c380 65 64 20 69 66 20 61 20 75 73 65 72 20 6d 69 73  ed if a user mis
1c390 74 79 70 65 73 20 74 68 65 20 64 61 74 61 62 61  types the databa
1c3a0 73 65 20 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  se name argument
1c3b0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 71 6c  .  ** to the sql
1c3c0 69 74 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  ite command-line
1c3d0 20 74 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66   tool..  */.  if
1c3e0 28 20 61 63 63 65 73 73 28 64 61 74 61 2e 7a 44  ( access(data.zD
1c3f0 62 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30  bFilename, 0)==0
1c400 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
1c410 26 64 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 0a  &data, 0);.  }..
1c420 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
1c430 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1c440 66 69 6c 65 20 69 66 20 74 68 65 72 65 20 69 73  file if there is
1c450 20 6f 6e 65 2e 20 20 49 66 20 6e 6f 20 2d 69 6e   one.  If no -in
1c460 69 74 20 6f 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  it option.  ** i
1c470 73 20 67 69 76 65 6e 20 6f 6e 20 74 68 65 20 63  s given on the c
1c480 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 6c 6f 6f  ommand line, loo
1c490 6b 20 66 6f 72 20 61 20 66 69 6c 65 20 6e 61 6d  k for a file nam
1c4a0 65 64 20 7e 2f 2e 73 71 6c 69 74 65 72 63 20 61  ed ~/.sqliterc a
1c4b0 6e 64 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 70  nd.  ** try to p
1c4c0 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a  rocess it..  */.
1c4d0 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 73    rc = process_s
1c4e0 71 6c 69 74 65 72 63 28 26 64 61 74 61 2c 7a 49  qliterc(&data,zI
1c4f0 6e 69 74 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  nitFile);.  if( 
1c500 72 63 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rc>0 ){.    retu
1c510 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
1c520 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64 20 70   Make a second p
1c530 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
1c540 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
1c550 75 6d 65 6e 74 20 61 6e 64 20 73 65 74 0a 20 20  ument and set.  
1c560 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20 20 54 68 69  ** options.  Thi
1c570 73 20 73 65 63 6f 6e 64 20 70 61 73 73 20 69 73  s second pass is
1c580 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 61   delayed until a
1c590 66 74 65 72 20 74 68 65 20 69 6e 69 74 69 61 6c  fter the initial
1c5a0 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 66 69 6c  ization.  ** fil
1c5b0 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 73  e is processed s
1c5c0 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6d 6d 61  o that the comma
1c5d0 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
1c5e0 73 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65 0a  s will override.
1c5f0 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 69 6e    ** settings in
1c600 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1c610 69 6f 6e 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ion file..  */. 
1c620 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
1c630 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
1c640 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20   *z = argv[i];. 
1c650 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27     if( z[0]!='-'
1c660 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c670 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29   if( z[1]=='-' )
1c680 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
1c690 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74   strcmp(z,"-init
1c6a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
1c6b0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
1c6c0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74 6d  ( strcmp(z,"-htm
1c6d0 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
1c6e0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
1c6f0 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  _Html;.    }else
1c700 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1c710 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  list")==0 ){.   
1c720 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
1c730 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d 65  ODE_List;.    }e
1c740 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1c750 2c 22 2d 6c 69 6e 65 22 29 3d 3d 30 20 29 7b 0a  ,"-line")==0 ){.
1c760 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
1c770 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20  = MODE_Line;.   
1c780 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1c790 70 28 7a 2c 22 2d 63 6f 6c 75 6d 6e 22 29 3d 3d  p(z,"-column")==
1c7a0 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
1c7b0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75  mode = MODE_Colu
1c7c0 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  mn;.    }else if
1c7d0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 73 76  ( strcmp(z,"-csv
1c7e0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
1c7f0 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
1c800 43 73 76 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  Csv;.      memcp
1c810 79 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72  y(data.separator
1c820 2c 22 2c 22 2c 32 29 3b 0a 20 20 20 20 7d 65 6c  ,",",2);.    }el
1c830 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1c840 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30  "-separator")==0
1c850 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c860 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1c870 66 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72  f(data.separator
1c880 29 2c 20 64 61 74 61 2e 73 65 70 61 72 61 74 6f  ), data.separato
1c890 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1c8a0 20 20 20 20 20 20 20 20 20 20 22 25 73 22 2c 63            "%s",c
1c8b0 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61  mdline_option_va
1c8c0 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b  lue(argc,argv,++
1c8d0 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i));.    }else i
1c8e0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 75  f( strcmp(z,"-nu
1c8f0 6c 6c 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a  llvalue")==0 ){.
1c900 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1c910 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61  printf(sizeof(da
1c920 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 29 2c 20 64  ta.nullvalue), d
1c930 61 74 61 2e 6e 75 6c 6c 76 61 6c 75 65 2c 0a 20  ata.nullvalue,. 
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c950 20 20 20 20 20 20 22 25 73 22 2c 63 6d 64 6c 69        "%s",cmdli
1c960 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
1c970 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b  argc,argv,++i));
1c980 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1c990 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61 64 65 72  trcmp(z,"-header
1c9a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
1c9b0 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d  ata.showHeader =
1c9c0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
1c9d0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 6f 68  ( strcmp(z,"-noh
1c9e0 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  eader")==0 ){.  
1c9f0 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
1ca00 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  der = 0;.    }el
1ca10 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1ca20 22 2d 65 63 68 6f 22 29 3d 3d 30 20 29 7b 0a 20  "-echo")==0 ){. 
1ca30 20 20 20 20 20 64 61 74 61 2e 65 63 68 6f 4f 6e       data.echoOn
1ca40 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
1ca50 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 65  if( strcmp(z,"-e
1ca60 71 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qp")==0 ){.     
1ca70 20 64 61 74 61 2e 61 75 74 6f 45 51 50 20 3d 20   data.autoEQP = 
1ca80 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1ca90 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73 74 61 74   strcmp(z,"-stat
1caa0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
1cab0 64 61 74 61 2e 73 74 61 74 73 4f 6e 20 3d 20 31  data.statsOn = 1
1cac0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1cad0 73 74 72 63 6d 70 28 7a 2c 22 2d 62 61 69 6c 22  strcmp(z,"-bail"
1cae0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 61  )==0 ){.      ba
1caf0 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 31 3b  il_on_error = 1;
1cb00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1cb10 74 72 63 6d 70 28 7a 2c 22 2d 76 65 72 73 69 6f  trcmp(z,"-versio
1cb20 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
1cb30 70 72 69 6e 74 66 28 22 25 73 20 25 73 5c 6e 22  printf("%s %s\n"
1cb40 2c 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  , sqlite3_libver
1cb50 73 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f  sion(), sqlite3_
1cb60 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 20  sourceid());.   
1cb70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1cb80 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1cb90 70 28 7a 2c 22 2d 69 6e 74 65 72 61 63 74 69 76  p(z,"-interactiv
1cba0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
1cbb0 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
1cbc0 74 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65  tive = 1;.    }e
1cbd0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1cbe0 2c 22 2d 62 61 74 63 68 22 29 3d 3d 30 20 29 7b  ,"-batch")==0 ){
1cbf0 0a 20 20 20 20 20 20 73 74 64 69 6e 5f 69 73 5f  .      stdin_is_
1cc00 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20 30 3b  interactive = 0;
1cc10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1cc20 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61 70 22 29  trcmp(z,"-heap")
1cc30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
1cc40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1cc50 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 6d 61 70 22  strcmp(z,"-mmap"
1cc60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
1cc70 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
1cc80 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 22   strcmp(z,"-vfs"
1cc90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
1cca0 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
1ccb0 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52 41 43 45  _ENABLE_VFSTRACE
1ccc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1ccd0 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 74 72 61  trcmp(z,"-vfstra
1cce0 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
1ccf0 20 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 23 69 66   i++;.#endif.#if
1cd00 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1cd10 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 20 20  E_MULTIPLEX.    
1cd20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1cd30 28 7a 2c 22 2d 6d 75 6c 74 69 70 6c 65 78 22 29  (z,"-multiplex")
1cd40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
1cd50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1cd60 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1cd70 22 2d 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20  "-help")==0 ){. 
1cd80 20 20 20 20 20 75 73 61 67 65 28 31 29 3b 0a 20       usage(1);. 
1cd90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1cda0 63 6d 70 28 7a 2c 22 2d 63 6d 64 22 29 3d 3d 30  cmp(z,"-cmd")==0
1cdb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d   ){.      if( i=
1cdc0 3d 61 72 67 63 2d 31 20 29 20 62 72 65 61 6b 3b  =argc-1 ) break;
1cdd0 0a 20 20 20 20 20 20 7a 20 3d 20 63 6d 64 6c 69  .      z = cmdli
1cde0 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
1cdf0 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 3b 0a  argc,argv,++i);.
1ce00 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
1ce10 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  '.' ){.        r
1ce20 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  c = do_meta_comm
1ce30 61 6e 64 28 7a 2c 20 26 64 61 74 61 29 3b 0a 20  and(z, &data);. 
1ce40 20 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26         if( rc &&
1ce50 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29   bail_on_error )
1ce60 20 72 65 74 75 72 6e 20 72 63 3d 3d 32 20 3f 20   return rc==2 ? 
1ce70 30 20 3a 20 72 63 3b 0a 20 20 20 20 20 20 7d 65  0 : rc;.      }e
1ce80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 70 65  lse{.        ope
1ce90 6e 5f 64 62 28 26 64 61 74 61 2c 20 30 29 3b 0a  n_db(&data, 0);.
1cea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65          rc = she
1ceb0 6c 6c 5f 65 78 65 63 28 64 61 74 61 2e 64 62 2c  ll_exec(data.db,
1cec0 20 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61   z, shell_callba
1ced0 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
1cee0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Msg);.        if
1cef0 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a  ( zErrMsg!=0 ){.
1cf00 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
1cf10 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
1cf20 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
1cf30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1cf40 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29 20  bail_on_error ) 
1cf50 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f 20 72  return rc!=0 ? r
1cf60 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c : 1;.        }
1cf70 65 6c 73 65 20 69 66 28 20 72 63 21 3d 30 20 29  else if( rc!=0 )
1cf80 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
1cf90 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
1cfa0 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 6f  r: unable to pro
1cfb0 63 65 73 73 20 53 51 4c 20 5c 22 25 73 5c 22 5c  cess SQL \"%s\"\
1cfc0 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
1cfd0 20 20 69 66 28 20 62 61 69 6c 5f 6f 6e 5f 65 72    if( bail_on_er
1cfe0 72 6f 72 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ror ) return rc;
1cff0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d000 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1d010 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1d020 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 75  rr,"%s: Error: u
1d030 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
1d040 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20 7a 29 3b  s\n", Argv0, z);
1d050 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
1d060 74 64 65 72 72 2c 22 55 73 65 20 2d 68 65 6c 70  tderr,"Use -help
1d070 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 6f   for a list of o
1d080 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20  ptions.\n");.   
1d090 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1d0a0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 46   }.  }..  if( zF
1d0b0 69 72 73 74 43 6d 64 20 29 7b 0a 20 20 20 20 2f  irstCmd ){.    /
1d0c0 2a 20 52 75 6e 20 6a 75 73 74 20 74 68 65 20 63  * Run just the c
1d0d0 6f 6d 6d 61 6e 64 20 74 68 61 74 20 66 6f 6c 6c  ommand that foll
1d0e0 6f 77 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ows the database
1d0f0 20 6e 61 6d 65 0a 20 20 20 20 2a 2f 0a 20 20 20   name.    */.   
1d100 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64 5b 30   if( zFirstCmd[0
1d110 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
1d120 72 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d  rc = do_meta_com
1d130 6d 61 6e 64 28 7a 46 69 72 73 74 43 6d 64 2c 20  mand(zFirstCmd, 
1d140 26 64 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  &data);.      if
1d150 28 20 72 63 3d 3d 32 20 29 20 72 63 20 3d 20 30  ( rc==2 ) rc = 0
1d160 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d170 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61     open_db(&data
1d180 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
1d190 20 73 68 65 6c 6c 5f 65 78 65 63 28 64 61 74 61   shell_exec(data
1d1a0 2e 64 62 2c 20 7a 46 69 72 73 74 43 6d 64 2c 20  .db, zFirstCmd, 
1d1b0 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
1d1c0 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
1d1d0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72  ;.      if( zErr
1d1e0 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Msg!=0 ){.      
1d1f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1d200 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
1d210 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
1d220 20 20 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f    return rc!=0 ?
1d230 20 72 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d   rc : 1;.      }
1d240 65 6c 73 65 20 69 66 28 20 72 63 21 3d 30 20 29  else if( rc!=0 )
1d250 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1d260 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
1d270 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63 65   unable to proce
1d280 73 73 20 53 51 4c 20 5c 22 25 73 5c 22 5c 6e 22  ss SQL \"%s\"\n"
1d290 2c 20 7a 46 69 72 73 74 43 6d 64 29 3b 0a 20 20  , zFirstCmd);.  
1d2a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d2b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
1d2d0 75 6e 20 63 6f 6d 6d 61 6e 64 73 20 72 65 63 65  un commands rece
1d2e0 69 76 65 64 20 66 72 6f 6d 20 73 74 61 6e 64 61  ived from standa
1d2f0 72 64 20 69 6e 70 75 74 0a 20 20 20 20 2a 2f 0a  rd input.    */.
1d300 20 20 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73      if( stdin_is
1d310 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a  _interactive ){.
1d320 20 20 20 20 20 20 63 68 61 72 20 2a 7a 48 6f 6d        char *zHom
1d330 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e;.      char *z
1d340 48 69 73 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  History = 0;.   
1d350 20 20 20 69 6e 74 20 6e 48 69 73 74 6f 72 79 3b     int nHistory;
1d360 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 0a 20  .      printf(. 
1d370 20 20 20 20 20 20 20 22 53 51 4c 69 74 65 20 76         "SQLite v
1d380 65 72 73 69 6f 6e 20 25 73 20 25 2e 31 39 73 5c  ersion %s %.19s\
1d390 6e 22 20 2f 2a 65 78 74 72 61 2d 76 65 72 73 69  n" /*extra-versi
1d3a0 6f 6e 2d 69 6e 66 6f 2a 2f 0a 20 20 20 20 20 20  on-info*/.      
1d3b0 20 20 22 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70    "Enter \".help
1d3c0 5c 22 20 66 6f 72 20 75 73 61 67 65 20 68 69 6e  \" for usage hin
1d3d0 74 73 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ts.\n",.        
1d3e0 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
1d3f0 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f  on(), sqlite3_so
1d400 75 72 63 65 69 64 28 29 0a 20 20 20 20 20 20 29  urceid().      )
1d410 3b 0a 20 20 20 20 20 20 69 66 28 20 77 61 72 6e  ;.      if( warn
1d420 49 6e 6d 65 6d 6f 72 79 44 62 20 29 7b 0a 20 20  InmemoryDb ){.  
1d430 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 43 6f        printf("Co
1d440 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 22 29 3b  nnected to a ");
1d450 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 42 6f  .        printBo
1d460 6c 64 28 22 74 72 61 6e 73 69 65 6e 74 20 69 6e  ld("transient in
1d470 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1d480 22 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e  ");.        prin
1d490 74 66 28 22 2e 5c 6e 55 73 65 20 5c 22 2e 6f 70  tf(".\nUse \".op
1d4a0 65 6e 20 46 49 4c 45 4e 41 4d 45 5c 22 20 74 6f  en FILENAME\" to
1d4b0 20 72 65 6f 70 65 6e 20 6f 6e 20 61 20 22 0a 20   reopen on a ". 
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
1d4d0 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
1d4e0 73 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  se.\n");.      }
1d4f0 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66  .      zHome = f
1d500 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a  ind_home_dir();.
1d510 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 20        if( zHome 
1d520 29 7b 0a 20 20 20 20 20 20 20 20 6e 48 69 73 74  ){.        nHist
1d530 6f 72 79 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ory = strlen30(z
1d540 48 6f 6d 65 29 20 2b 20 32 30 3b 0a 20 20 20 20  Home) + 20;.    
1d550 20 20 20 20 69 66 28 20 28 7a 48 69 73 74 6f 72      if( (zHistor
1d560 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69 73 74  y = malloc(nHist
1d570 6f 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ory))!=0 ){.    
1d580 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1d590 70 72 69 6e 74 66 28 6e 48 69 73 74 6f 72 79 2c  printf(nHistory,
1d5a0 20 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f 2e 73   zHistory,"%s/.s
1d5b0 71 6c 69 74 65 5f 68 69 73 74 6f 72 79 22 2c 20  qlite_history", 
1d5c0 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zHome);.        
1d5d0 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 64 65  }.      }.#if de
1d5e0 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c  fined(HAVE_READL
1d5f0 49 4e 45 29 0a 20 20 20 20 20 20 69 66 28 20 7a  INE).      if( z
1d600 48 69 73 74 6f 72 79 20 29 20 72 65 61 64 5f 68  History ) read_h
1d610 69 73 74 6f 72 79 28 7a 48 69 73 74 6f 72 79 29  istory(zHistory)
1d620 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
1d630 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75  c = process_inpu
1d640 74 28 26 64 61 74 61 2c 20 30 29 3b 0a 20 20 20  t(&data, 0);.   
1d650 20 20 20 69 66 28 20 7a 48 69 73 74 6f 72 79 20     if( zHistory 
1d660 29 7b 0a 20 20 20 20 20 20 20 20 73 74 69 66 6c  ){.        stifl
1d670 65 5f 68 69 73 74 6f 72 79 28 31 30 30 29 3b 0a  e_history(100);.
1d680 20 20 20 20 20 20 20 20 77 72 69 74 65 5f 68 69          write_hi
1d690 73 74 6f 72 79 28 7a 48 69 73 74 6f 72 79 29 3b  story(zHistory);
1d6a0 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 48  .        free(zH
1d6b0 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 7d  istory);.      }
1d6c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d6d0 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69    rc = process_i
1d6e0 6e 70 75 74 28 26 64 61 74 61 2c 20 73 74 64 69  nput(&data, stdi
1d6f0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
1d700 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 26  set_table_name(&
1d710 64 61 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20  data, 0);.  if( 
1d720 64 61 74 61 2e 64 62 20 29 7b 0a 20 20 20 20 73  data.db ){.    s
1d730 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 61 74  qlite3_close(dat
1d740 61 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  a.db);.  }.  sql
1d750 69 74 65 33 5f 66 72 65 65 28 64 61 74 61 2e 7a  ite3_free(data.z
1d760 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 20 0a 20  FreeOnClose); . 
1d770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.