/ Hex Artifact Content
Login

Artifact bc28d5992109717c87804e2eb1a08a7c8cc7a2fd:


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 66 20 53 51 4c 49 54 45 5f 55 53  h".#if SQLITE_US
03f0: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
0400: 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22 73 71 6c  N.# include "sql
0410: 69 74 65 33 75 73 65 72 61 75 74 68 2e 68 22 0a  ite3userauth.h".
0420: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0430: 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75  <ctype.h>.#inclu
0440: 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 23  de <stdarg.h>..#
0450: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  if !defined(_WIN
0460: 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  32) && !defined(
0470: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
0480: 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23 20 69 66   <signal.h>.# if
0490: 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f   !defined(__RTP_
04a0: 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
04b0: 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 69  WRS_KERNEL).#  i
04c0: 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a 23  nclude <pwd.h>.#
04d0: 20 65 6e 64 69 66 0a 23 20 69 6e 63 6c 75 64 65   endif.# include
04e0: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e   <unistd.h>.# in
04f0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0500: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
0510: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
0520: 44 4c 49 4e 45 29 20 26 26 20 48 41 56 45 5f 52  DLINE) && HAVE_R
0530: 45 41 44 4c 49 4e 45 21 3d 30 0a 23 20 69 6e 63  EADLINE!=0.# inc
0540: 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65 2f 72  lude <readline/r
0550: 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69 6e 63  eadline.h>.# inc
0560: 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65 2f 68  lude <readline/h
0570: 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6c 73 65 0a  istory.h>.#else.
0580: 23 20 75 6e 64 65 66 20 48 41 56 45 5f 52 45 41  # undef HAVE_REA
0590: 44 4c 49 4e 45 0a 23 65 6e 64 69 66 0a 23 69 66  DLINE.#endif.#if
05a0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 45 44   defined(HAVE_ED
05b0: 49 54 4c 49 4e 45 29 20 26 26 20 21 64 65 66 69  ITLINE) && !defi
05c0: 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
05d0: 45 29 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45  E).# define HAVE
05e0: 5f 52 45 41 44 4c 49 4e 45 20 31 0a 23 20 69 6e  _READLINE 1.# in
05f0: 63 6c 75 64 65 20 3c 65 64 69 74 6c 69 6e 65 2f  clude <editline/
0600: 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 65 6e 64  readline.h>.#end
0610: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
0620: 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 29 0a 23  HAVE_READLINE).#
0630: 20 64 65 66 69 6e 65 20 61 64 64 5f 68 69 73 74   define add_hist
0640: 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20  ory(X).# define 
0650: 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a  read_history(X).
0660: 23 20 64 65 66 69 6e 65 20 77 72 69 74 65 5f 68  # define write_h
0670: 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69  istory(X).# defi
0680: 6e 65 20 73 74 69 66 6c 65 5f 68 69 73 74 6f 72  ne stifle_histor
0690: 79 28 58 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y(X).#endif..#if
06a0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
06b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
06c0: 32 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f  2).# include <io
06d0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 66  .h>.# include <f
06e0: 63 6e 74 6c 2e 68 3e 0a 23 64 65 66 69 6e 65 20  cntl.h>.#define 
06f0: 69 73 61 74 74 79 28 68 29 20 5f 69 73 61 74 74  isatty(h) _isatt
0700: 79 28 68 29 0a 23 69 66 6e 64 65 66 20 61 63 63  y(h).#ifndef acc
0710: 65 73 73 0a 23 20 64 65 66 69 6e 65 20 61 63 63  ess.# define acc
0720: 65 73 73 28 66 2c 6d 29 20 5f 61 63 63 65 73 73  ess(f,m) _access
0730: 28 28 66 29 2c 28 6d 29 29 0a 23 65 6e 64 69 66  ((f),(m)).#endif
0740: 0a 23 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23 64  .#undef popen.#d
0750: 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70 6f 70  efine popen _pop
0760: 65 6e 0a 23 75 6e 64 65 66 20 70 63 6c 6f 73 65  en.#undef pclose
0770: 0a 23 64 65 66 69 6e 65 20 70 63 6c 6f 73 65 20  .#define pclose 
0780: 5f 70 63 6c 6f 73 65 0a 23 65 6c 73 65 0a 2f 2a  _pclose.#else./*
0790: 20 4d 61 6b 65 20 73 75 72 65 20 69 73 61 74 74   Make sure isatt
07a0: 79 28 29 20 68 61 73 20 61 20 70 72 6f 74 6f 74  y() has a protot
07b0: 79 70 65 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69  ype..*/.extern i
07c0: 6e 74 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a  nt isatty(int);.
07d0: 0a 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70 63  ./* popen and pc
07e0: 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38 39  lose are not C89
07f0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 73   functions and s
0800: 6f 20 61 72 65 20 73 6f 6d 65 74 69 6d 65 73 20  o are sometimes 
0810: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  omitted from.** 
0820: 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e 20 68 65  the <stdio.h> he
0830: 61 64 65 72 20 2a 2f 0a 65 78 74 65 72 6e 20 46  ader */.extern F
0840: 49 4c 45 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74  ILE *popen(const
0850: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
0860: 72 2a 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  r*);.extern int 
0870: 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23  pclose(FILE*);.#
0880: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
0890: 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f  ed(_WIN32_WCE)./
08a0: 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61 72  * Windows CE (ar
08b0: 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63  m-wince-mingw32c
08c0: 65 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74 20  e-gcc) does not 
08d0: 70 72 6f 76 69 64 65 20 69 73 61 74 74 79 28 29  provide isatty()
08e0: 0a 20 2a 20 74 68 75 73 20 77 65 20 61 6c 77 61  . * thus we alwa
08f0: 79 73 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  ys assume that w
0900: 65 20 68 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65  e have a console
0910: 2e 20 54 68 61 74 20 63 61 6e 20 62 65 0a 20 2a  . That can be. *
0920: 20 6f 76 65 72 72 69 64 64 65 6e 20 77 69 74 68   overridden with
0930: 20 74 68 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d   the -batch comm
0940: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e  and line option.
0950: 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 61  . */.#define isa
0960: 74 74 79 28 78 29 20 31 0a 23 65 6e 64 69 66 0a  tty(x) 1.#endif.
0970: 0a 2f 2a 20 63 74 79 70 65 20 6d 61 63 72 6f 73  ./* ctype macros
0980: 20 74 68 61 74 20 77 6f 72 6b 20 77 69 74 68 20   that work with 
0990: 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72  signed character
09a0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 73 53  s */.#define IsS
09b0: 70 61 63 65 28 58 29 20 20 69 73 73 70 61 63 65  pace(X)  isspace
09c0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
09d0: 58 29 0a 23 64 65 66 69 6e 65 20 49 73 44 69 67  X).#define IsDig
09e0: 69 74 28 58 29 20 20 69 73 64 69 67 69 74 28 28  it(X)  isdigit((
09f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29  unsigned char)X)
0a00: 0a 23 64 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72  .#define ToLower
0a10: 28 58 29 20 20 28 63 68 61 72 29 74 6f 6c 6f 77  (X)  (char)tolow
0a20: 65 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  er((unsigned cha
0a30: 72 29 58 29 0a 0a 0a 2f 2a 20 54 72 75 65 20 69  r)X).../* True i
0a40: 66 20 74 68 65 20 74 69 6d 65 72 20 69 73 20 65  f the timer is e
0a50: 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63  nabled */.static
0a60: 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d 65 72   int enableTimer
0a70: 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e   = 0;../* Return
0a80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 61 6c   the current wal
0a90: 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a 2f 0a  l-clock time */.
0aa0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
0ab0: 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79 28 76  nt64 timeOfDay(v
0ac0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
0ad0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f 63  qlite3_vfs *cloc
0ae0: 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69  kVfs = 0;.  sqli
0af0: 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20 69  te3_int64 t;.  i
0b00: 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20 29  f( clockVfs==0 )
0b10: 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c 69   clockVfs = sqli
0b20: 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
0b30: 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 2d  .  if( clockVfs-
0b40: 3e 69 56 65 72 73 69 6f 6e 3e 3d 31 20 26 26 20  >iVersion>=1 && 
0b50: 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65  clockVfs->xCurre
0b60: 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30 20 29  ntTimeInt64!=0 )
0b70: 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e  {.    clockVfs->
0b80: 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
0b90: 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29 3b  4(clockVfs, &t);
0ba0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
0bb0: 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c 6f 63  uble r;.    cloc
0bc0: 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  kVfs->xCurrentTi
0bd0: 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26 72 29  me(clockVfs, &r)
0be0: 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c 69 74  ;.    t = (sqlit
0bf0: 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36 34 30  e3_int64)(r*8640
0c00: 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20 20 72  0000.0);.  }.  r
0c10: 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69 66 20  eturn t;.}..#if 
0c20: 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  !defined(_WIN32)
0c30: 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e   && !defined(WIN
0c40: 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  32) && !defined(
0c50: 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 20 5c 0a 20  _WRS_KERNEL) \. 
0c60: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69  && !defined(__mi
0c70: 6e 75 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73  nux).#include <s
0c80: 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  ys/time.h>.#incl
0c90: 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63  ude <sys/resourc
0ca0: 65 2e 68 3e 0a 0a 2f 2a 20 53 61 76 65 64 20 72  e.h>../* Saved r
0cb0: 65 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74  esource informat
0cc0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69  ion for the begi
0cd0: 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72  nning of an oper
0ce0: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
0cf0: 73 74 72 75 63 74 20 72 75 73 61 67 65 20 73 42  struct rusage sB
0d00: 65 67 69 6e 3b 20 20 2f 2a 20 43 50 55 20 74 69  egin;  /* CPU ti
0d10: 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a 73  me at start */.s
0d20: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
0d30: 74 36 34 20 69 42 65 67 69 6e 3b 20 20 2f 2a 20  t64 iBegin;  /* 
0d40: 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20  Wall-clock time 
0d50: 61 74 20 73 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a  at start */../*.
0d60: 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20  ** Begin timing 
0d70: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a  an operation.*/.
0d80: 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 67 69  static void begi
0d90: 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20  nTimer(void){.  
0da0: 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20  if( enableTimer 
0db0: 29 7b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  ){.    getrusage
0dc0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
0dd0: 42 65 67 69 6e 29 3b 0a 20 20 20 20 69 42 65 67  Begin);.    iBeg
0de0: 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29  in = timeOfDay()
0df0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ;.  }.}../* Retu
0e00: 72 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  rn the differenc
0e10: 65 20 6f 66 20 74 77 6f 20 74 69 6d 65 5f 73 74  e of two time_st
0e20: 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73  ructs in seconds
0e30: 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c   */.static doubl
0e40: 65 20 74 69 6d 65 44 69 66 66 28 73 74 72 75 63  e timeDiff(struc
0e50: 74 20 74 69 6d 65 76 61 6c 20 2a 70 53 74 61 72  t timeval *pStar
0e60: 74 2c 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  t, struct timeva
0e70: 6c 20 2a 70 45 6e 64 29 7b 0a 20 20 72 65 74 75  l *pEnd){.  retu
0e80: 72 6e 20 28 70 45 6e 64 2d 3e 74 76 5f 75 73 65  rn (pEnd->tv_use
0e90: 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 75  c - pStart->tv_u
0ea0: 73 65 63 29 2a 30 2e 30 30 30 30 30 31 20 2b 20  sec)*0.000001 + 
0eb0: 0a 20 20 20 20 20 20 20 20 20 28 64 6f 75 62 6c  .         (doubl
0ec0: 65 29 28 70 45 6e 64 2d 3e 74 76 5f 73 65 63 20  e)(pEnd->tv_sec 
0ed0: 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 73 65 63  - pStart->tv_sec
0ee0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  );.}../*.** Prin
0ef0: 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72 65 73  t the timing res
0f00: 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ults..*/.static 
0f10: 76 6f 69 64 20 65 6e 64 54 69 6d 65 72 28 76 6f  void endTimer(vo
0f20: 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c  id){.  if( enabl
0f30: 65 54 69 6d 65 72 20 29 7b 0a 20 20 20 20 73 74  eTimer ){.    st
0f40: 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e 64  ruct rusage sEnd
0f50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
0f60: 74 36 34 20 69 45 6e 64 20 3d 20 74 69 6d 65 4f  t64 iEnd = timeO
0f70: 66 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74 72  fDay();.    getr
0f80: 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c  usage(RUSAGE_SEL
0f90: 46 2c 20 26 73 45 6e 64 29 3b 0a 20 20 20 20 70  F, &sEnd);.    p
0fa0: 72 69 6e 74 66 28 22 52 75 6e 20 54 69 6d 65 3a  rintf("Run Time:
0fb0: 20 72 65 61 6c 20 25 2e 33 66 20 75 73 65 72 20   real %.3f user 
0fc0: 25 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20  %f sys %f\n",.  
0fd0: 20 20 20 20 20 28 69 45 6e 64 20 2d 20 69 42 65       (iEnd - iBe
0fe0: 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20  gin)*0.001,.    
0ff0: 20 20 20 74 69 6d 65 44 69 66 66 28 26 73 42 65     timeDiff(&sBe
1000: 67 69 6e 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73  gin.ru_utime, &s
1010: 45 6e 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20  End.ru_utime),. 
1020: 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26        timeDiff(&
1030: 73 42 65 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c  sBegin.ru_stime,
1040: 20 26 73 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29   &sEnd.ru_stime)
1050: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e  );.  }.}..#defin
1060: 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65  e BEGIN_TIMER be
1070: 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69  ginTimer().#defi
1080: 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64  ne END_TIMER end
1090: 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20  Timer().#define 
10a0: 48 41 53 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c  HAS_TIMER 1..#el
10b0: 69 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e  if (defined(_WIN
10c0: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
10d0: 49 4e 33 32 29 29 0a 0a 23 69 6e 63 6c 75 64 65  IN32))..#include
10e0: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a   <windows.h>../*
10f0: 20 53 61 76 65 64 20 72 65 73 6f 75 72 63 65 20   Saved resource 
1100: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1110: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1120: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f   an operation */
1130: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 68  .static HANDLE h
1140: 50 72 6f 63 65 73 73 3b 0a 73 74 61 74 69 63 20  Process;.static 
1150: 46 49 4c 45 54 49 4d 45 20 66 74 4b 65 72 6e 65  FILETIME ftKerne
1160: 6c 42 65 67 69 6e 3b 0a 73 74 61 74 69 63 20 46  lBegin;.static F
1170: 49 4c 45 54 49 4d 45 20 66 74 55 73 65 72 42 65  ILETIME ftUserBe
1180: 67 69 6e 3b 0a 73 74 61 74 69 63 20 73 71 6c 69  gin;.static sqli
1190: 74 65 33 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c  te3_int64 ftWall
11a0: 42 65 67 69 6e 3b 0a 74 79 70 65 64 65 66 20 42  Begin;.typedef B
11b0: 4f 4f 4c 20 28 57 49 4e 41 50 49 20 2a 47 45 54  OOL (WINAPI *GET
11c0: 50 52 4f 43 54 49 4d 45 53 29 28 48 41 4e 44 4c  PROCTIMES)(HANDL
11d0: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c  E, LPFILETIME, L
11e0: 50 46 49 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20  PFILETIME,.     
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
1210: 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c  PFILETIME, LPFIL
1220: 45 54 49 4d 45 29 3b 0a 73 74 61 74 69 63 20 47  ETIME);.static G
1230: 45 54 50 52 4f 43 54 49 4d 45 53 20 67 65 74 50  ETPROCTIMES getP
1240: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20  rocessTimesAddr 
1250: 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43  = NULL;../*.** C
1260: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
1270: 65 20 68 61 76 65 20 74 69 6d 65 72 20 73 75 70  e have timer sup
1280: 70 6f 72 74 2e 20 20 52 65 74 75 72 6e 20 31 20  port.  Return 1 
1290: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20  if necessary.** 
12a0: 73 75 70 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f  support found (o
12b0: 72 20 66 6f 75 6e 64 20 70 72 65 76 69 6f 75 73  r found previous
12c0: 6c 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ly)..*/.static i
12d0: 6e 74 20 68 61 73 54 69 6d 65 72 28 76 6f 69 64  nt hasTimer(void
12e0: 29 7b 0a 20 20 69 66 28 20 67 65 74 50 72 6f 63  ){.  if( getProc
12f0: 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a  essTimesAddr ){.
1300: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1310: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
1320: 47 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 28  GetProcessTimes(
1330: 29 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  ) isn't supporte
1340: 64 20 69 6e 20 57 49 4e 39 35 20 61 6e 64 20 73  d in WIN95 and s
1350: 6f 6d 65 20 6f 74 68 65 72 20 57 69 6e 64 6f 77  ome other Window
1360: 73 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  s.    ** version
1370: 73 2e 20 53 65 65 20 69 66 20 74 68 65 20 76 65  s. See if the ve
1380: 72 73 69 6f 6e 20 77 65 20 61 72 65 20 72 75 6e  rsion we are run
1390: 6e 69 6e 67 20 6f 6e 20 68 61 73 20 69 74 2c 20  ning on has it, 
13a0: 61 6e 64 20 69 66 20 69 74 0a 20 20 20 20 2a 2a  and if it.    **
13b0: 20 64 6f 65 73 2c 20 73 61 76 65 20 6f 66 66 20   does, save off 
13c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20  a pointer to it 
13d0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
13e0: 70 72 6f 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a  process handle..
13f0: 20 20 20 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63      */.    hProc
1400: 65 73 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74  ess = GetCurrent
1410: 50 72 6f 63 65 73 73 28 29 3b 0a 20 20 20 20 69  Process();.    i
1420: 66 28 20 68 50 72 6f 63 65 73 73 20 29 7b 0a 20  f( hProcess ){. 
1430: 20 20 20 20 20 48 49 4e 53 54 41 4e 43 45 20 68       HINSTANCE h
1440: 69 6e 73 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69  instLib = LoadLi
1450: 62 72 61 72 79 28 54 45 58 54 28 22 4b 65 72 6e  brary(TEXT("Kern
1460: 65 6c 33 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20  el32.dll"));.   
1470: 20 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68     if( NULL != h
1480: 69 6e 73 74 4c 69 62 20 29 7b 0a 20 20 20 20 20  instLib ){.     
1490: 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d     getProcessTim
14a0: 65 73 41 64 64 72 20 3d 0a 20 20 20 20 20 20 20  esAddr =.       
14b0: 20 20 20 20 20 28 47 45 54 50 52 4f 43 54 49 4d       (GETPROCTIM
14c0: 45 53 29 20 47 65 74 50 72 6f 63 41 64 64 72 65  ES) GetProcAddre
14d0: 73 73 28 68 69 6e 73 74 4c 69 62 2c 20 22 47 65  ss(hinstLib, "Ge
14e0: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 22 29 3b  tProcessTimes");
14f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e 55 4c  .        if( NUL
1500: 4c 20 21 3d 20 67 65 74 50 72 6f 63 65 73 73 54  L != getProcessT
1510: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
1520: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1540: 20 20 46 72 65 65 4c 69 62 72 61 72 79 28 68 69    FreeLibrary(hi
1550: 6e 73 74 4c 69 62 29 3b 20 0a 20 20 20 20 20 20  nstLib); .      
1560: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1570: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1580: 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e   Begin timing an
1590: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74   operation.*/.st
15a0: 61 74 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54  atic void beginT
15b0: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
15c0: 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26  ( enableTimer &&
15d0: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
15e0: 41 64 64 72 20 29 7b 0a 20 20 20 20 46 49 4c 45  Addr ){.    FILE
15f0: 54 49 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c  TIME ftCreation,
1600: 20 66 74 45 78 69 74 3b 0a 20 20 20 20 67 65 74   ftExit;.    get
1610: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1620: 28 68 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65  (hProcess,&ftCre
1630: 61 74 69 6f 6e 2c 26 66 74 45 78 69 74 2c 0a 20  ation,&ftExit,. 
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 20 26 66 74 4b 65 72 6e 65 6c         &ftKernel
1660: 42 65 67 69 6e 2c 26 66 74 55 73 65 72 42 65 67  Begin,&ftUserBeg
1670: 69 6e 29 3b 0a 20 20 20 20 66 74 57 61 6c 6c 42  in);.    ftWallB
1680: 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79  egin = timeOfDay
1690: 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65  ();.  }.}../* Re
16a0: 74 75 72 6e 20 74 68 65 20 64 69 66 66 65 72 65  turn the differe
16b0: 6e 63 65 20 6f 66 20 74 77 6f 20 46 49 4c 45 54  nce of two FILET
16c0: 49 4d 45 20 73 74 72 75 63 74 73 20 69 6e 20 73  IME structs in s
16d0: 65 63 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63  econds */.static
16e0: 20 64 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66   double timeDiff
16f0: 28 46 49 4c 45 54 49 4d 45 20 2a 70 53 74 61 72  (FILETIME *pStar
1700: 74 2c 20 46 49 4c 45 54 49 4d 45 20 2a 70 45 6e  t, FILETIME *pEn
1710: 64 29 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  d){.  sqlite_int
1720: 36 34 20 69 36 34 53 74 61 72 74 20 3d 20 2a 28  64 i64Start = *(
1730: 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29  (sqlite_int64 *)
1740: 20 70 53 74 61 72 74 29 3b 0a 20 20 73 71 6c 69   pStart);.  sqli
1750: 74 65 5f 69 6e 74 36 34 20 69 36 34 45 6e 64 20  te_int64 i64End 
1760: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
1770: 34 20 2a 29 20 70 45 6e 64 29 3b 0a 20 20 72 65  4 *) pEnd);.  re
1780: 74 75 72 6e 20 28 64 6f 75 62 6c 65 29 20 28 28  turn (double) ((
1790: 69 36 34 45 6e 64 20 2d 20 69 36 34 53 74 61 72  i64End - i64Star
17a0: 74 29 20 2f 20 31 30 30 30 30 30 30 30 2e 30 29  t) / 10000000.0)
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
17c0: 20 74 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75   the timing resu
17d0: 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lts..*/.static v
17e0: 6f 69 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69  oid endTimer(voi
17f0: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
1800: 54 69 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63  Timer && getProc
1810: 65 73 73 54 69 6d 65 73 41 64 64 72 29 7b 0a 20  essTimesAddr){. 
1820: 20 20 20 46 49 4c 45 54 49 4d 45 20 66 74 43 72     FILETIME ftCr
1830: 65 61 74 69 6f 6e 2c 20 66 74 45 78 69 74 2c 20  eation, ftExit, 
1840: 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 20 66 74 55  ftKernelEnd, ftU
1850: 73 65 72 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69  serEnd;.    sqli
1860: 74 65 33 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c  te3_int64 ftWall
1870: 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28  End = timeOfDay(
1880: 29 3b 0a 20 20 20 20 67 65 74 50 72 6f 63 65 73  );.    getProces
1890: 73 54 69 6d 65 73 41 64 64 72 28 68 50 72 6f 63  sTimesAddr(hProc
18a0: 65 73 73 2c 26 66 74 43 72 65 61 74 69 6f 6e 2c  ess,&ftCreation,
18b0: 26 66 74 45 78 69 74 2c 26 66 74 4b 65 72 6e 65  &ftExit,&ftKerne
18c0: 6c 45 6e 64 2c 26 66 74 55 73 65 72 45 6e 64 29  lEnd,&ftUserEnd)
18d0: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 52 75  ;.    printf("Ru
18e0: 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33  n Time: real %.3
18f0: 66 20 75 73 65 72 20 25 66 20 73 79 73 20 25 66  f user %f sys %f
1900: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28 66 74 57  \n",.       (ftW
1910: 61 6c 6c 45 6e 64 20 2d 20 66 74 57 61 6c 6c 42  allEnd - ftWallB
1920: 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20  egin)*0.001,.   
1930: 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74      timeDiff(&ft
1940: 55 73 65 72 42 65 67 69 6e 2c 20 26 66 74 55 73  UserBegin, &ftUs
1950: 65 72 45 6e 64 29 2c 0a 20 20 20 20 20 20 20 74  erEnd),.       t
1960: 69 6d 65 44 69 66 66 28 26 66 74 4b 65 72 6e 65  imeDiff(&ftKerne
1970: 6c 42 65 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65  lBegin, &ftKerne
1980: 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  lEnd));.  }.}..#
1990: 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d  define BEGIN_TIM
19a0: 45 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a  ER beginTimer().
19b0: 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45  #define END_TIME
19c0: 52 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65  R endTimer().#de
19d0: 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 68  fine HAS_TIMER h
19e0: 61 73 54 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65  asTimer()..#else
19f0: 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54  .#define BEGIN_T
1a00: 49 4d 45 52 20 0a 23 64 65 66 69 6e 65 20 45 4e  IMER .#define EN
1a10: 44 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20  D_TIMER.#define 
1a20: 48 41 53 5f 54 49 4d 45 52 20 30 0a 23 65 6e 64  HAS_TIMER 0.#end
1a30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74  if../*.** Used t
1a40: 6f 20 70 72 65 76 65 6e 74 20 77 61 72 6e 69 6e  o prevent warnin
1a50: 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20  gs about unused 
1a60: 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f 0a 23 64  parameters.*/.#d
1a70: 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52  efine UNUSED_PAR
1a80: 41 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29  AMETER(x) (void)
1a90: 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  (x)../*.** If th
1aa0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67  e following flag
1ab0: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f   is set, then co
1ac0: 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20  mmand execution 
1ad0: 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65  stops.** at an e
1ae0: 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e  rror if we are n
1af0: 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  ot interactive..
1b00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
1b10: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b  il_on_error = 0;
1b20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73  ../*.** Threat s
1b30: 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72  tdin as an inter
1b40: 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20  active input if 
1b50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
1b60: 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75  riable.** is tru
1b70: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  e.  Otherwise, a
1b80: 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63  ssume stdin is c
1b90: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69  onnected to a fi
1ba0: 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73  le or pipe..*/.s
1bb0: 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f  tatic int stdin_
1bc0: 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
1bd0: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   1;../*.** The f
1be0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
1bf0: 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61  open SQLite data
1c00: 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61  base.  We make a
1c10: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
1c20: 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73  his database a s
1c30: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73  tatic variable s
1c40: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
1c50: 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20   accessed.** by 
1c60: 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c  the SIGINT handl
1c70: 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20  er to interrupt 
1c80: 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73  database process
1c90: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ing..*/.static s
1ca0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
1cb0: 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61  ./*.** True if a
1cc0: 6e 20 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e  n interrupt (Con
1cd0: 74 72 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e  trol-C) has been
1ce0: 20 72 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74   received..*/.st
1cf0: 61 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e  atic volatile in
1d00: 74 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  t seenInterrupt 
1d10: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  = 0;../*.** This
1d20: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1d30: 6f 75 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20  our program. It 
1d40: 69 73 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29  is set in main()
1d50: 2c 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e  , used.** in a n
1d60: 75 6d 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70  umber of other p
1d70: 6c 61 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f  laces, mostly fo
1d80: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
1d90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1da0: 20 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20   *Argv0;../*.** 
1db0: 50 72 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20  Prompt strings. 
1dc0: 49 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d  Initialized in m
1dd0: 61 69 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69  ain. Settable wi
1de0: 74 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20  th.**   .prompt 
1df0: 6d 61 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f  main continue.*/
1e00: 0a 73 74 61 74 69 63 20 63 68 61 72 20 6d 61 69  .static char mai
1e10: 6e 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20  nPrompt[20];    
1e20: 20 2f 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70   /* First line p
1e30: 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20  rompt. default: 
1e40: 22 73 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61  "sqlite> "*/.sta
1e50: 74 69 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75  tic char continu
1e60: 65 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20  ePrompt[20]; /* 
1e70: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f  Continuation pro
1e80: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20  mpt. default: " 
1e90: 20 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a    ...> " */../*.
1ea0: 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72 61  ** Write I/O tra
1eb0: 63 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ces to the follo
1ec0: 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a  wing stream..*/.
1ed0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1ee0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61  ABLE_IOTRACE.sta
1ef0: 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63  tic FILE *iotrac
1f00: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
1f10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f20: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69  e works like pri
1f30: 6e 74 66 20 69 6e 20 74 68 61 74 20 69 74 73 20  ntf in that its 
1f40: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1f50: 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74  s a.** format st
1f60: 72 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71 75  ring and subsequ
1f70: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61 72  ent arguments ar
1f80: 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73  e values to be s
1f90: 75 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69 6e  ubstituted.** in
1fa0: 20 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65 6c   place of % fiel
1fb0: 64 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  ds.  The result 
1fc0: 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 68  of formatting th
1fd0: 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  is string.** is 
1fe0: 77 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72 61  written to iotra
1ff0: 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ce..*/.#ifdef SQ
2000: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
2010: 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ACE.static void 
2020: 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f  iotracePrintf(co
2030: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
2040: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
2050: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
2060: 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d  ;.  if( iotrace=
2070: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  =0 ) return;.  v
2080: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
2090: 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  mat);.  z = sqli
20a0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
20b0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
20c0: 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e  end(ap);.  fprin
20d0: 74 66 28 69 6f 74 72 61 63 65 2c 20 22 25 73 22  tf(iotrace, "%s"
20e0: 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , z);.  sqlite3_
20f0: 66 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64 69  free(z);.}.#endi
2100: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  f.../*.** Determ
2110: 69 6e 65 73 20 69 66 20 61 20 73 74 72 69 6e 67  ines if a string
2120: 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   is a number of 
2130: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
2140: 6e 74 20 69 73 4e 75 6d 62 65 72 28 63 6f 6e 73  nt isNumber(cons
2150: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t char *z, int *
2160: 72 65 61 6c 6e 75 6d 29 7b 0a 20 20 69 66 28 20  realnum){.  if( 
2170: 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27  *z=='-' || *z=='
2180: 2b 27 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20  +' ) z++;.  if( 
2190: 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 0a  !IsDigit(*z) ){.
21a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21b0: 7d 0a 20 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 72  }.  z++;.  if( r
21c0: 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75  ealnum ) *realnu
21d0: 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  m = 0;.  while( 
21e0: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  IsDigit(*z) ){ z
21f0: 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d  ++; }.  if( *z==
2200: 27 2e 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a  '.' ){.    z++;.
2210: 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69 74      if( !IsDigit
2220: 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b  (*z) ) return 0;
2230: 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69  .    while( IsDi
2240: 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  git(*z) ){ z++; 
2250: 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75  }.    if( realnu
2260: 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31  m ) *realnum = 1
2270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d  ;.  }.  if( *z==
2280: 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29  'e' || *z=='E' )
2290: 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69  {.    z++;.    i
22a0: 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a  f( *z=='+' || *z
22b0: 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
22c0: 20 69 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a   if( !IsDigit(*z
22d0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
22e0: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
22f0: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
2300: 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29     if( realnum )
2310: 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20   *realnum = 1;. 
2320: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d   }.  return *z==
2330: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  0;.}../*.** A gl
2340: 6f 62 61 6c 20 63 68 61 72 2a 20 61 6e 64 20 61  obal char* and a
2350: 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  n SQL function t
2360: 6f 20 61 63 63 65 73 73 20 69 74 73 20 63 75 72  o access its cur
2370: 72 65 6e 74 20 76 61 6c 75 65 20 0a 2a 2a 20 66  rent value .** f
2380: 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 53 51  rom within an SQ
2390: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  L statement. Thi
23a0: 73 20 70 72 6f 67 72 61 6d 20 75 73 65 64 20 74  s program used t
23b0: 6f 20 75 73 65 20 74 68 65 20 0a 2a 2a 20 73 71  o use the .** sq
23c0: 6c 69 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66  lite_exec_printf
23d0: 28 29 20 41 50 49 20 74 6f 20 73 75 62 73 74 69  () API to substi
23e0: 74 75 65 20 61 20 73 74 72 69 6e 67 20 69 6e 74  tue a string int
23f0: 6f 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  o an SQL stateme
2400: 6e 74 2e 0a 2a 2a 20 54 68 65 20 63 6f 72 72 65  nt..** The corre
2410: 63 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 69  ct way to do thi
2420: 73 20 77 69 74 68 20 73 71 6c 69 74 65 33 20 69  s with sqlite3 i
2430: 73 20 74 6f 20 75 73 65 20 74 68 65 20 62 69 6e  s to use the bin
2440: 64 20 41 50 49 2c 20 62 75 74 0a 2a 2a 20 73 69  d API, but.** si
2450: 6e 63 65 20 74 68 65 20 73 68 65 6c 6c 20 69 73  nce the shell is
2460: 20 62 75 69 6c 74 20 61 72 6f 75 6e 64 20 74 68   built around th
2470: 65 20 63 61 6c 6c 62 61 63 6b 20 70 61 72 61 64  e callback parad
2480: 69 67 6d 20 69 74 20 77 6f 75 6c 64 20 62 65 20  igm it would be 
2490: 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 77 6f 72 6b  a lot.** of work
24a0: 2e 20 49 6e 73 74 65 61 64 20 6a 75 73 74 20 75  . Instead just u
24b0: 73 65 20 74 68 69 73 20 68 61 63 6b 2c 20 77 68  se this hack, wh
24c0: 69 63 68 20 69 73 20 71 75 69 74 65 20 68 61 72  ich is quite har
24d0: 6d 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  mless..*/.static
24e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 68   const char *zSh
24f0: 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 73  ellStatic = 0;.s
2500: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2510: 73 74 61 74 69 63 46 75 6e 63 28 0a 20 20 73 71  staticFunc(.  sq
2520: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
2530: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
2540: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
2550: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
2560: 61 73 73 65 72 74 28 20 30 3d 3d 61 72 67 63 20  assert( 0==argc 
2570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 68  );.  assert( zSh
2580: 65 6c 6c 53 74 61 74 69 63 20 29 3b 0a 20 20 55  ellStatic );.  U
2590: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
25a0: 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
25b0: 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b  PARAMETER(argv);
25c0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
25d0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
25e0: 7a 53 68 65 6c 6c 53 74 61 74 69 63 2c 20 2d 31  zShellStatic, -1
25f0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
2600: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2610: 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61   routine reads a
2620: 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72   line of text fr
2630: 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72  om FILE in, stor
2640: 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69  es.** the text i
2650: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
2660: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  d from malloc() 
2670: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
2680: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
2690: 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72  text.  NULL is r
26a0: 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f  eturned at end o
26b0: 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61  f file, or if ma
26c0: 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e  lloc().** fails.
26d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65 20  .**.** If zLine 
26e0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
26f0: 20 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63 65   it is a malloce
2700: 64 20 62 75 66 66 65 72 20 72 65 74 75 72 6e 65  d buffer returne
2710: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65 76  d from.** a prev
2720: 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74 68 69  ious call to thi
2730: 73 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  s routine that m
2740: 61 79 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2f  ay be reused..*/
2750: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f  .static char *lo
2760: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72  cal_getline(char
2770: 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a 69   *zLine, FILE *i
2780: 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20  n){.  int nLine 
2790: 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20 3a  = zLine==0 ? 0 :
27a0: 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   100;.  int n = 
27b0: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
27c0: 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e  {.    if( n+100>
27d0: 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e  nLine ){.      n
27e0: 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b  Line = nLine*2 +
27f0: 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   100;.      zLin
2800: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e  e = realloc(zLin
2810: 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20  e, nLine);.     
2820: 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20   if( zLine==0 ) 
2830: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
2840: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
2850: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
2860: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
2870: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
2880: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
2890: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
28a0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
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 20 20 77 68 69 6c 65 28      }.    while(
28e0: 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b   zLine[n] ) n++;
28f0: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
2900: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
2910: 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20   ){.      n--;. 
2920: 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20       if( n>0 && 
2930: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27  zLine[n-1]=='\r'
2940: 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c   ) n--;.      zL
2950: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
2960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e   }.  return zLin
2980: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  e;.}../*.** Retr
2990: 69 65 76 65 20 61 20 73 69 6e 67 6c 65 20 6c 69  ieve a single li
29a0: 6e 65 20 6f 66 20 69 6e 70 75 74 20 74 65 78 74  ne of input text
29b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30  ..**.** If in==0
29c0: 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   then read from 
29d0: 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20 61  standard input a
29e0: 6e 64 20 70 72 6f 6d 70 74 20 62 65 66 6f 72 65  nd prompt before
29f0: 20 65 61 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49   each line..** I
2a00: 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  f isContinuation
2a10: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
2a20: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72   continuation pr
2a30: 6f 6d 70 74 20 69 73 20 61 70 70 72 6f 70 72 69  ompt is appropri
2a40: 61 74 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e  ate..** If isCon
2a50: 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 7a 65 72  tinuation is zer
2a60: 6f 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e  o, then the main
2a70: 20 70 72 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62   prompt should b
2a80: 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  e used..**.** If
2a90: 20 7a 50 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e   zPrior is not N
2aa0: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ULL then it is a
2ab0: 20 62 75 66 66 65 72 20 66 72 6f 6d 20 61 20 70   buffer from a p
2ac0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69  rior call to thi
2ad0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 68 61  s.** routine tha
2ae0: 74 20 63 61 6e 20 62 65 20 72 65 75 73 65 64 2e  t can be reused.
2af0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
2b00: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73  t is stored in s
2b10: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
2b20: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  om malloc() and 
2b30: 6d 75 73 74 20 65 69 74 68 65 72 0a 2a 2a 20 62  must either.** b
2b40: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
2b50: 61 6c 6c 65 72 20 6f 72 20 65 6c 73 65 20 70 61  aller or else pa
2b60: 73 73 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ssed back into t
2b70: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
2b80: 74 68 65 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72  the.** zPrior ar
2b90: 67 75 6d 65 6e 74 20 66 6f 72 20 72 65 75 73 65  gument for reuse
2ba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
2bb0: 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65   *one_input_line
2bc0: 28 46 49 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20  (FILE *in, char 
2bd0: 2a 7a 50 72 69 6f 72 2c 20 69 6e 74 20 69 73 43  *zPrior, int isC
2be0: 6f 6e 74 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20  ontinuation){.  
2bf0: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20  char *zPrompt;. 
2c00: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a   char *zResult;.
2c10: 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20    if( in!=0 ){. 
2c20: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63     zResult = loc
2c30: 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f  al_getline(zPrio
2c40: 72 2c 20 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  r, in);.  }else{
2c50: 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69  .    zPrompt = i
2c60: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20  sContinuation ? 
2c70: 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a  continuePrompt :
2c80: 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66   mainPrompt;.#if
2c90: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45   defined(HAVE_RE
2ca0: 41 44 4c 49 4e 45 29 0a 20 20 20 20 66 72 65 65  ADLINE).    free
2cb0: 28 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52  (zPrior);.    zR
2cc0: 65 73 75 6c 74 20 3d 20 72 65 61 64 6c 69 6e 65  esult = readline
2cd0: 28 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69  (zPrompt);.    i
2ce0: 66 28 20 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a  f( zResult && *z
2cf0: 52 65 73 75 6c 74 20 29 20 61 64 64 5f 68 69 73  Result ) add_his
2d00: 74 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23  tory(zResult);.#
2d10: 65 6c 73 65 0a 20 20 20 20 70 72 69 6e 74 66 28  else.    printf(
2d20: 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b 0a  "%s", zPrompt);.
2d30: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
2d40: 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  t);.    zResult 
2d50: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
2d60: 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b 0a  zPrior, stdin);.
2d70: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
2d80: 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn zResult;.}..
2d90: 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70  /*.** Shell outp
2da0: 75 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74  ut mode informat
2db0: 69 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20  ion from before 
2dc0: 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 20 0a  ".explain on", .
2dd0: 2a 2a 20 73 61 76 65 64 20 73 6f 20 74 68 61 74  ** saved so that
2de0: 20 69 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f   it can be resto
2df0: 72 65 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e  red by ".explain
2e00: 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66   off".*/.typedef
2e10: 20 73 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64   struct SavedMod
2e20: 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49  eInfo SavedModeI
2e30: 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65  nfo;.struct Save
2e40: 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e  dModeInfo {.  in
2e50: 74 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20  t valid;        
2e60: 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65    /* Is there le
2e70: 67 69 74 20 64 61 74 61 20 69 6e 20 68 65 72 65  git data in here
2e80: 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b  ? */.  int mode;
2e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
2ea0: 64 65 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78  de prior to ".ex
2eb0: 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69  plain on" */.  i
2ec0: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
2ed0: 20 20 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64     /* The ".head
2ee0: 65 72 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f  er" setting prio
2ef0: 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f  r to ".explain o
2f00: 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57  n" */.  int colW
2f10: 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43  idth[100];  /* C
2f20: 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69  olumn widths pri
2f30: 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20  or to ".explain 
2f40: 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  on" */.};../*.**
2f50: 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   State informati
2f60: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74  on about the dat
2f70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2f80: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
2f90: 20 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20   an.** instance 
2fa0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2fb0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74   structure..*/.t
2fc0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68  ypedef struct Sh
2fd0: 65 6c 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74  ellState ShellSt
2fe0: 61 74 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c  ate;.struct Shel
2ff0: 6c 53 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74  lState {.  sqlit
3000: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
3010: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3020: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 63 68 6f 4f  e */.  int echoO
3030: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
3040: 20 54 72 75 65 20 74 6f 20 65 63 68 6f 20 69 6e   True to echo in
3050: 70 75 74 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a  put commands */.
3060: 20 20 69 6e 74 20 61 75 74 6f 45 51 50 3b 20 20    int autoEQP;  
3070: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20           /* Run 
3080: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
3090: 41 4e 20 70 72 69 6f 72 20 74 6f 20 73 65 61 63  AN prior to seac
30a0: 68 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a 20 20  h SQL stmt */.  
30b0: 69 6e 74 20 73 74 61 74 73 4f 6e 3b 20 20 20 20  int statsOn;    
30c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
30d0: 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79  o display memory
30e0: 20 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61   stats before ea
30f0: 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20  ch finalize */. 
3100: 20 69 6e 74 20 73 63 61 6e 73 74 61 74 73 4f 6e   int scanstatsOn
3110: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
3120: 74 6f 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20  to display scan 
3130: 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63  stats before eac
3140: 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20  h finalize */.  
3150: 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20  int outCount;   
3160: 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72 74         /* Revert
3170: 20 74 6f 20 73 74 64 6f 75 74 20 77 68 65 6e 20   to stdout when 
3180: 72 65 61 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f  reaching zero */
3190: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
31a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31b0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64  ber of records d
31c0: 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20  isplayed so far 
31d0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20  */.  FILE *out; 
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
31f0: 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72  rite results her
3200: 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61  e */.  FILE *tra
3210: 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a  ceOut;        /*
3220: 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69   Output for sqli
3230: 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20  te3_trace() */. 
3240: 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
3250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3260: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
3270: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3290: 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73  An output mode s
32a0: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  etting */.  int 
32b0: 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20  writableSchema; 
32c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52     /* True if PR
32d0: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
32e0: 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74  hema=ON */.  int
32f0: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
3300: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
3310: 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  how column names
3320: 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75   in List or Colu
3330: 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  mn mode */.  uns
3340: 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b  igned shellFlgs;
3350: 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
3360: 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lags */.  char *
3370: 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20  zDestTable;     
3380: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74   /* Name of dest
3390: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68  ination table wh
33a0: 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a  en MODE_Insert *
33b0: 2f 0a 20 20 63 68 61 72 20 73 65 70 61 72 61 74  /.  char separat
33c0: 6f 72 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 53 65  or[20];    /* Se
33d0: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
33e0: 72 20 66 6f 72 20 4d 4f 44 45 5f 4c 69 73 74 20  r for MODE_List 
33f0: 2a 2f 0a 20 20 63 68 61 72 20 6e 65 77 6c 69 6e  */.  char newlin
3400: 65 5b 32 30 5d 3b 20 20 20 20 20 20 2f 2a 20 52  e[20];      /* R
3410: 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72 20  ecord separator 
3420: 69 6e 20 4d 4f 44 45 5f 43 73 76 20 2a 2f 0a 20  in MODE_Csv */. 
3430: 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30   int colWidth[10
3440: 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65  0];     /* Reque
3450: 73 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61  sted width of ea
3460: 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69  ch column when i
3470: 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a  n column mode*/.
3480: 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74    int actualWidt
3490: 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75  h[100];  /* Actu
34a0: 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  al width of each
34b0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
34c0: 72 20 6e 75 6c 6c 76 61 6c 75 65 5b 32 30 5d 3b  r nullvalue[20];
34d0: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
34e0: 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20  to print when a 
34f0: 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
3500: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20  from.           
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
3520: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
3530: 0a 20 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f  .  SavedModeInfo
3540: 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 2f 2a 20 48   normalMode;/* H
3550: 6f 6c 64 73 20 74 68 65 20 6d 6f 64 65 20 6a 75  olds the mode ju
3560: 73 74 20 62 65 66 6f 72 65 20 2e 65 78 70 6c 61  st before .expla
3570: 69 6e 20 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20  in ON */.  char 
3580: 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45  outfile[FILENAME
3590: 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61  _MAX]; /* Filena
35a0: 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20  me for *out */. 
35b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
35c0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20  Filename;    /* 
35d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
35e0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
35f0: 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73  har *zFreeOnClos
3600: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  e;         /* Fi
3610: 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65 20 77  lename to free w
3620: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
3630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
3640: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
3650: 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f 20 75  Name of VFS to u
3660: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
3670: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f  stmt *pStmt;   /
3680: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
3690: 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ent if any. */. 
36a0: 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20 20 20   FILE *pLog;    
36b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
36c0: 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65 72 65   log output here
36d0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49 6e 64   */.  int *aiInd
36e0: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ent;         /* 
36f0: 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e 74 73  Array of indents
3700: 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f 45 78   used in MODE_Ex
3710: 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  plain */.  int n
3720: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
3730: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
3740: 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f  ay aiIndent[] */
3750: 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74 3b 20  .  int iIndent; 
3760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3770: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 70  ex of current op
3780: 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   in aiIndent[] *
3790: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  /.};../*.** Thes
37a0: 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65  e are the allowe
37b0: 64 20 73 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75  d shellFlgs valu
37c0: 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  es.*/.#define SH
37d0: 46 4c 47 5f 53 63 72 61 74 63 68 20 20 20 20 20  FLG_Scratch     
37e0: 30 78 30 30 30 30 31 20 20 20 20 20 2f 2a 20 54  0x00001     /* T
37f0: 68 65 20 2d 2d 73 63 72 61 74 63 68 20 6f 70 74  he --scratch opt
3800: 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ion is used */.#
3810: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67  define SHFLG_Pag
3820: 65 63 61 63 68 65 20 20 20 30 78 30 30 30 30 32  ecache   0x00002
3830: 20 20 20 20 20 2f 2a 20 54 68 65 20 2d 2d 70 61       /* The --pa
3840: 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69  gecache option i
3850: 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e  s used */.#defin
3860: 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64  e SHFLG_Lookasid
3870: 65 20 20 20 30 78 30 30 30 30 34 20 20 20 20 20  e   0x00004     
3880: 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  /* Lookaside mem
3890: 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f 0a 0a  ory is used */..
38a0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
38b0: 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65  the allowed mode
38c0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  s..*/.#define MO
38d0: 44 45 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f  DE_Line     0  /
38e0: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72  * One column per
38f0: 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69   line.  Blank li
3900: 6e 65 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72  ne between recor
3910: 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ds */.#define MO
3920: 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f  DE_Column   1  /
3930: 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72  * One record per
3940: 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f   line in neat co
3950: 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65  lumns */.#define
3960: 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32   MODE_List     2
3970: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
3980: 70 65 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20  per line with a 
3990: 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65  separator */.#de
39a0: 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20  fine MODE_Semi  
39b0: 20 20 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73     3  /* Same as
39c0: 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61   MODE_List but a
39d0: 70 70 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63  ppend ";" to eac
39e0: 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e  h line */.#defin
39f0: 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20  e MODE_Html     
3a00: 34 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  4  /* Generate a
3a10: 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f  n XHTML table */
3a20: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e  .#define MODE_In
3a30: 73 65 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e  sert   5  /* Gen
3a40: 65 72 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72  erate SQL "inser
3a50: 74 22 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  t" statements */
3a60: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63  .#define MODE_Tc
3a70: 6c 20 20 20 20 20 20 36 20 20 2f 2a 20 47 65 6e  l      6  /* Gen
3a80: 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20  erate ANSI-C or 
3a90: 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65  TCL quoted eleme
3aa0: 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nts */.#define M
3ab0: 4f 44 45 5f 43 73 76 20 20 20 20 20 20 37 20 20  ODE_Csv      7  
3ac0: 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73  /* Quote strings
3ad0: 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c  , numbers are pl
3ae0: 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ain */.#define M
3af0: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 38 20 20  ODE_Explain  8  
3b00: 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c  /* Like MODE_Col
3b10: 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  umn, but do not 
3b20: 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f  truncate data */
3b30: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
3b40: 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d  har *modeDescr[]
3b50: 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20   = {.  "line",. 
3b60: 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69   "column",.  "li
3b70: 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20  st",.  "semi",. 
3b80: 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65   "html",.  "inse
3b90: 72 74 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20  rt",.  "tcl",.  
3ba0: 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69  "csv",.  "explai
3bb0: 6e 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 75  n",.};../*.** Nu
3bc0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
3bd0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
3be0: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
3bf0: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
3c00: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
3c10: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ]))../*.** Compu
3c20: 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67  te a string leng
3c30: 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74  th that is limit
3c40: 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62  ed to what can b
3c50: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c  e stored in.** l
3c60: 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f 66 20  ower 30 bits of 
3c70: 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  a 32-bit signed 
3c80: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
3c90: 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28  ic int strlen30(
3ca0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
3cb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
3cc0: 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = z;.  while( *
3cd0: 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20  z2 ){ z2++; }.  
3ce0: 72 65 74 75 72 6e 20 30 78 33 66 66 66 66 66 66  return 0x3ffffff
3cf0: 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a  f & (int)(z2 - z
3d00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  );.}../*.** A ca
3d10: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
3d20: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74  qlite3_log() int
3d30: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
3d40: 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28  c void shellLog(
3d50: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
3d60: 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20  iErrCode, const 
3d70: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53  char *zMsg){.  S
3d80: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
3d90: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
3da0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d  ;.  if( p->pLog=
3db0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
3dc0: 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c 20  printf(p->pLog, 
3dd0: 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45 72  "(%d) %s\n", iEr
3de0: 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20 20  rCode, zMsg);.  
3df0: 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29 3b  fflush(p->pLog);
3e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
3e10: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
3e20: 67 20 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64  g as a hex-encod
3e30: 65 64 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31  ed blob (eg. X'1
3e40: 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63  234' ).*/.static
3e50: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78   void output_hex
3e60: 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c  _blob(FILE *out,
3e70: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
3e80: 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a  ob, int nBlob){.
3e90: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
3ea0: 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a  *zBlob = (char *
3eb0: 29 70 42 6c 6f 62 3b 0a 20 20 66 70 72 69 6e 74  )pBlob;.  fprint
3ec0: 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20 66  f(out,"X'");.  f
3ed0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b  or(i=0; i<nBlob;
3ee0: 20 69 2b 2b 29 7b 20 66 70 72 69 6e 74 66 28 6f   i++){ fprintf(o
3ef0: 75 74 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b  ut,"%02x",zBlob[
3f00: 69 5d 26 30 78 66 66 29 3b 20 7d 0a 20 20 66 70  i]&0xff); }.  fp
3f10: 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a  rintf(out,"'");.
3f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
3f30: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
3f40: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
3f50: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
3f60: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
3f70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3f80: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
3f90: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
3fa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
3fb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
3fc0: 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 0a 20 20   nSingle = 0;.  
3fd0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
3fe0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
3ff0: 5d 3d 3d 27 5c 27 27 20 29 20 6e 53 69 6e 67 6c  ]=='\'' ) nSingl
4000: 65 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  e++;.  }.  if( n
4010: 53 69 6e 67 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  Single==0 ){.   
4020: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25   fprintf(out,"'%
4030: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
4040: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
4050: 2c 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65  ,"'");.    while
4060: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f  ( *z ){.      fo
4070: 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a  r(i=0; z[i] && z
4080: 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  [i]!='\''; i++){
4090: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30  }.      if( i==0
40a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
40b0: 6e 74 66 28 6f 75 74 2c 22 27 27 22 29 3b 0a 20  ntf(out,"''");. 
40c0: 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
40d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
40e0: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
40f0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
4100: 2e 2a 73 27 27 22 2c 69 2c 7a 29 3b 0a 20 20 20  .*s''",i,z);.   
4110: 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b 0a 20       z += i+1;. 
4120: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4130: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
4140: 22 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20  "%s",z);.       
4150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4160: 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
4170: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20 7d 0a  f(out,"'");.  }.
4180: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
4190: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
41a0: 20 61 73 20 61 20 71 75 6f 74 65 64 20 61 63 63   as a quoted acc
41b0: 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54  ording to C or T
41c0: 43 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73  CL quoting rules
41d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
41e0: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
41f0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
4200: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e  t char *z){.  un
4210: 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20  signed int c;.  
4220: 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b  fputc('"', out);
4230: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a  .  while( (c = *
4240: 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20  (z++))!=0 ){.   
4250: 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
4260: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
4270: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
4280: 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  (c, out);.    }e
4290: 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29  lse if( c=='"' )
42a0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
42b0: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
42c0: 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b  fputc('"', out);
42d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
42e0: 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20  =='\t' ){.      
42f0: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
4300: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 74  ;.      fputc('t
4310: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
4320: 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29  se if( c=='\n' )
4330: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
4340: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
4350: 66 70 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b  fputc('n', out);
4360: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
4370: 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  =='\r' ){.      
4380: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
4390: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 72  ;.      fputc('r
43a0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
43b0: 73 65 20 69 66 28 20 21 69 73 70 72 69 6e 74 28  se if( !isprint(
43c0: 63 26 30 78 66 66 29 20 29 7b 0a 20 20 20 20 20  c&0xff) ){.     
43d0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
43e0: 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b  \%03o", c&0xff);
43f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4400: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
4410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75  .    }.  }.  fpu
4420: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a  tc('"', out);.}.
4430: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
4440: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77  e given string w
4450: 69 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74  ith characters t
4460: 68 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20  hat are special 
4470: 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70  to.** HTML escap
4480: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
4490: 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73  id output_html_s
44a0: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
44b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
44c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
44d0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
44e0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
44f0: 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69    for(i=0;   z[i
4500: 5d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ] .            &
4510: 26 20 7a 5b 69 5d 21 3d 27 3c 27 20 0a 20 20 20  & z[i]!='<' .   
4520: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
4530: 21 3d 27 26 27 20 0a 20 20 20 20 20 20 20 20 20  !='&' .         
4540: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 20     && z[i]!='>' 
4550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
4560: 7a 5b 69 5d 21 3d 27 5c 22 27 20 0a 20 20 20 20  z[i]!='\"' .    
4570: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
4580: 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\'';.        i
4590: 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e  ++){}.    if( i>
45a0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
45b0: 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c  tf(out,"%.*s",i,
45c0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
45d0: 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20  ( z[i]=='<' ){. 
45e0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
45f0: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
4600: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
4610: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ' ){.      fprin
4620: 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b  tf(out,"&amp;");
4630: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
4640: 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20  [i]=='>' ){.    
4650: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26    fprintf(out,"&
4660: 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gt;");.    }else
4670: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20   if( z[i]=='\"' 
4680: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4690: 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a  (out,"&quot;");.
46a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
46b0: 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  i]=='\'' ){.    
46c0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26    fprintf(out,"&
46d0: 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  #39;");.    }els
46e0: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
46f0: 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69      }.    z += i
4700: 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   + 1;.  }.}../*.
4710: 2a 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f  ** If a field co
4720: 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61  ntains any chara
4730: 63 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20  cter identified 
4740: 62 79 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f  by a 1 in the fo
4750: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79  llowing.** array
4760: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e  , then the strin
4770: 67 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64  g must be quoted
4780: 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61   for CSV..*/.sta
4790: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
47a0: 65 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20  eedCsvQuote[] = 
47b0: 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  {.  1, 1, 1, 1, 
47c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
47d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
47e0: 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c  1, 1,   .  1, 1,
47f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4800: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
4810: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
4820: 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c    1, 0, 1, 0, 0,
4830: 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30   0, 0, 1,   0, 0
4840: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4850: 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20   0, .  0, 0, 0, 
4860: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
4870: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4880: 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30  0, 0, 0, .  0, 0
4890: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
48a0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
48b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20  , 0, 0, 0, 0, . 
48c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
48d0: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
48e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
48f0: 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30  0, .  0, 0, 0, 0
4900: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
4910: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4920: 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c  , 0, 0, .  0, 0,
4930: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4940: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
4950: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 0a 20 20   0, 0, 0, 1, .  
4960: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4970: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
4980: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4990: 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20  ,   .  1, 1, 1, 
49a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
49b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
49c0: 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c  1, 1, 1,   .  1,
49d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
49e0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
49f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4a00: 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c    .  1, 1, 1, 1,
4a10: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
4a20: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
4a30: 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31   1, 1,   .  1, 1
4a40: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
4a50: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
4a60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
4a70: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
4a80: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
4a90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4aa0: 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20  , 1,   .  1, 1, 
4ab0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4ac0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
4ad0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20  1, 1, 1, 1,   . 
4ae0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4af0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
4b00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4b10: 31 2c 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  1,   .};../*.** 
4b20: 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20  Output a single 
4b30: 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63  term of CSV.  Ac
4b40: 74 75 61 6c 6c 79 2c 20 70 2d 3e 73 65 70 61 72  tually, p->separ
4b50: 61 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ator is used for
4b60: 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 6f  .** the separato
4b70: 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  r, which may or 
4b80: 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
4b90: 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75  ma.  p->nullvalu
4ba0: 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c  e is.** the null
4bb0: 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67 73   value.  Strings
4bc0: 20 61 72 65 20 71 75 6f 74 65 64 20 69 66 20 6e   are quoted if n
4bd0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 73  ecessary.  The s
4be0: 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f  eparator.** is o
4bf0: 6e 6c 79 20 69 73 73 75 65 64 20 69 66 20 62 53  nly issued if bS
4c00: 65 70 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ep is true..*/.s
4c10: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
4c20: 74 5f 63 73 76 28 53 68 65 6c 6c 53 74 61 74 65  t_csv(ShellState
4c30: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4c40: 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20  *z, int bSep){. 
4c50: 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e   FILE *out = p->
4c60: 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  out;.  if( z==0 
4c70: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
4c80: 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 76  ut,"%s",p->nullv
4c90: 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  alue);.  }else{.
4ca0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
4cb0: 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e  nt nSep = strlen
4cc0: 33 30 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  30(p->separator)
4cd0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
4ce0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
4cf0: 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74   if( needCsvQuot
4d00: 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[((unsigned cha
4d10: 72 2a 29 7a 29 5b 69 5d 5d 20 0a 20 20 20 20 20  r*)z)[i]] .     
4d20: 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d      || (z[i]==p-
4d30: 3e 73 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26  >separator[0] &&
4d40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
4d50: 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d  nSep==1 || memcm
4d60: 70 28 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f  p(z, p->separato
4d70: 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b  r, nSep)==0)) ){
4d80: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a  .        i = 0;.
4d90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4da0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4db0: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
4dc0: 20 20 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74     putc('"', out
4dd0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
4de0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
4df0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
4e00: 27 22 27 20 29 20 70 75 74 63 28 27 22 27 2c 20  '"' ) putc('"', 
4e10: 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 75  out);.        pu
4e20: 74 63 28 7a 5b 69 5d 2c 20 6f 75 74 29 3b 0a 20  tc(z[i], out);. 
4e30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
4e40: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('"', out);.   
4e50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
4e60: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
4e70: 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   z);.    }.  }. 
4e80: 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20   if( bSep ){.   
4e90: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
4ea0: 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61   "%s", p->separa
4eb0: 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  tor);.  }.}..#if
4ec0: 64 65 66 20 53 49 47 49 4e 54 0a 2f 2a 0a 2a 2a  def SIGINT./*.**
4ed0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
4ee0: 6e 73 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ns when the user
4ef0: 20 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a   presses Ctrl-C.
4f00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
4f10: 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72  nterrupt_handler
4f20: 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20  (int NotUsed){. 
4f30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4f40: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65  R(NotUsed);.  se
4f50: 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20  enInterrupt++;. 
4f60: 20 69 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75   if( seenInterru
4f70: 70 74 3e 32 20 29 20 65 78 69 74 28 31 29 3b 0a  pt>2 ) exit(1);.
4f80: 20 20 69 66 28 20 64 62 20 29 20 73 71 6c 69 74    if( db ) sqlit
4f90: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
4fa0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4fb0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
4fc0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
4fd0: 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a  hat the shell.**
4fe0: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
4ff0: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
5000: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
5010: 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c  ic int shell_cal
5020: 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70  lback(.  void *p
5030: 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  Arg,.  int nArg,
5040: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5050: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
5060: 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  mns */.  char **
5070: 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54 65 78  azArg,    /* Tex
5080: 74 20 6f 66 20 65 61 63 68 20 72 65 73 75 6c 74  t of each result
5090: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
50a0: 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a  r **azCol,    /*
50b0: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   Column names */
50c0: 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65 20 20  .  int *aiType  
50d0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79      /* Column ty
50e0: 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  pes */.){.  int 
50f0: 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  i;.  ShellState 
5100: 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
5110: 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77 69 74 63  *)pArg;..  switc
5120: 68 28 20 70 2d 3e 6d 6f 64 65 20 29 7b 0a 20 20  h( p->mode ){.  
5130: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65    case MODE_Line
5140: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20  : {.      int w 
5150: 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 5;.      if( a
5160: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
5170: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5180: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
5190: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
51a0: 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69  strlen30(azCol[i
51b0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
51c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
51d0: 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b  len>w ) w = len;
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
51f0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20  f( p->cnt++>0 ) 
5200: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
5210: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
5220: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
5230: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
5240: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d  tf(p->out,"%*s =
5250: 20 25 73 5c 6e 22 2c 20 77 2c 20 61 7a 43 6f 6c   %s\n", w, azCol
5260: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
5270: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
5280: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
5290: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llvalue);.      
52a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
52b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
52c0: 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20  DE_Explain:.    
52d0: 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  case MODE_Column
52e0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
52f0: 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20  >cnt++==0 ){.   
5300: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5310: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5320: 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a        int w, n;.
5330: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
5340: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
5350: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
5360: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 63 6f 6c        w = p->col
5370: 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  Width[i];.      
5380: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5390: 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20         w = 0;.  
53a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
53b0: 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a      if( w==0 ){.
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
53d0: 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69  strlen30(azCol[i
53e0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
53f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
5400: 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31  if( w<10 ) w = 1
5410: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0;.            n
5420: 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
5430: 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20  g && azArg[i] ? 
5440: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
5450: 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llvalue);.      
5460: 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20        if( w<n ) 
5470: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  w = n;.         
5480: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
5490: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
54a0: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
54c0: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20  ctualWidth[i] = 
54d0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  w;.          }. 
54e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
54f0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
5500: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
5510: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
5520: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5530: 74 2c 22 25 2a 2e 2a 73 25 73 22 2c 2d 77 2c 2d  t,"%*.*s%s",-w,-
5540: 77 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e  w,azCol[i], i==n
5550: 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20  Arg-1 ? "\n": " 
5560: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ");.           
5570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5580: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
5590: 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c  >out,"%-*.*s%s",
55a0: 77 2c 77 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d  w,w,azCol[i], i=
55b0: 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20  =nArg-1 ? "\n": 
55c0: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  "  ");.         
55d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
55e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
55f0: 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65     if( p->showHe
5600: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
5610: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
5620: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
5630: 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20       int w;.    
5640: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
5650: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
5660: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
5670: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
5680: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b  >actualWidth[i];
5690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
56a0: 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20 2d 77  if( w<0 ) w = -w
56b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
56c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
56d0: 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20      w = 10;.    
56e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
56f0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
5700: 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c  >out,"%-*.*s%s",
5710: 77 2c 77 2c 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  w,w,"-----------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20  --------".      
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20  --------",.     
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
57a0: 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a  ==nArg-1 ? "\n":
57b0: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20   "  ");.        
57c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
57d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
57e0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
57f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5800: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
5810: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
5820: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
5830: 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57  ySize(p->actualW
5840: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
5850: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
5860: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
5870: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5880: 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20       w = 10;.   
5890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
58a0: 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
58b0: 5f 45 78 70 6c 61 69 6e 20 26 26 20 61 7a 41 72  _Explain && azAr
58c0: 67 5b 69 5d 20 26 26 20 73 74 72 6c 65 6e 33 30  g[i] && strlen30
58d0: 28 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a  (azArg[i])>w ){.
58e0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74            w = st
58f0: 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29  rlen30(azArg[i])
5900: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5910: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20      if( i==1 && 
5920: 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70  p->aiIndent && p
5930: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
5940: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64       if( p->iInd
5950: 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29  ent<p->nIndent )
5960: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
5970: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
5980: 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e  *.s", p->aiInden
5990: 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22  t[p->iIndent], "
59a0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
59b0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49 6e            p->iIn
59c0: 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  dent++;.        
59d0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 3c  }.        if( w<
59e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
59f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5a00: 2a 2e 2a 73 25 73 22 2c 2d 77 2c 2d 77 2c 0a 20  *.*s%s",-w,-w,. 
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
5a20: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
5a30: 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c   : p->nullvalue,
5a40: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e   i==nArg-1 ? "\n
5a50: 22 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20  ": "  ");.      
5a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5a70: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5a80: 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77  t,"%-*.*s%s",w,w
5a90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5aa0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
5ab0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c  [i] : p->nullval
5ac0: 75 65 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20  ue, i==nArg-1 ? 
5ad0: 22 5c 6e 22 3a 20 22 20 20 22 29 3b 0a 20 20 20  "\n": "  ");.   
5ae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5af0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5b00: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
5b10: 53 65 6d 69 3a 0a 20 20 20 20 63 61 73 65 20 4d  Semi:.    case M
5b20: 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20  ODE_List: {.    
5b30: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
5b40: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
5b50: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
5b60: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
5b70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
5b80: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5b90: 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69  s%s",azCol[i], i
5ba0: 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 20  ==nArg-1 ? "\n" 
5bb0: 3a 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b  : p->separator);
5bc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5bd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
5be0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
5bf0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5c00: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5c10: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
5c20: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
5c30: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
5c40: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 3b 0a 20 20 20  ->nullvalue;.   
5c50: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5c60: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
5c70: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72         if( i<nAr
5c80: 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g-1 ){.         
5c90: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
5ca0: 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61   "%s", p->separa
5cb0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tor);.        }e
5cc0: 6c 73 65 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d  lse if( p->mode=
5cd0: 3d 4d 4f 44 45 5f 53 65 6d 69 20 29 7b 0a 20 20  =MODE_Semi ){.  
5ce0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
5cf0: 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a  p->out, ";\n");.
5d00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5d10: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
5d20: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
5d30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5d40: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5d50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
5d60: 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20 20  DE_Html: {.     
5d70: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
5d80: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
5d90: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  r ){.        fpr
5da0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
5db0: 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  >");.        for
5dc0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
5dd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  +){.          fp
5de0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
5df0: 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  H>");.          
5e00: 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69  output_html_stri
5e10: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c  ng(p->out, azCol
5e20: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
5e30: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
5e40: 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TH>\n");.     
5e50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72     }.        fpr
5e60: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
5e70: 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  R>\n");.      }.
5e80: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
5e90: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
5ea0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5eb0: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
5ec0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
5ed0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
5ee0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
5ef0: 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 6f  TD>");.        o
5f00: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
5f10: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
5f20: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
5f30: 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20  p->nullvalue);. 
5f40: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
5f50: 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29  ->out,"</TD>\n")
5f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5f70: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
5f80: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
5f90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5fa0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
5fb0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
5fc0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
5fd0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
5fe0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5ff0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
6000: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
6010: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
6020: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
6030: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
6040: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 66    if(i<nArg-1) f
6050: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
6060: 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f  %s", p->separato
6070: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
6080: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
6090: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
60a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
60b0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
60c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
60d0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
60e0: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
60f0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
6100: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
6110: 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29   : p->nullvalue)
6120: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e  ;.        if(i<n
6130: 41 72 67 2d 31 29 20 66 70 72 69 6e 74 66 28 70  Arg-1) fprintf(p
6140: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
6150: 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
6160: 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
6170: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
6180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6190: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
61a0: 5f 43 73 76 3a 20 7b 0a 23 69 66 20 64 65 66 69  _Csv: {.#if defi
61b0: 6e 65 64 28 57 49 4e 33 32 29 20 7c 7c 20 64 65  ned(WIN32) || de
61c0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
61d0: 20 20 20 20 66 66 6c 75 73 68 28 70 2d 3e 6f 75      fflush(p->ou
61e0: 74 29 3b 0a 20 20 20 20 20 20 5f 73 65 74 6d 6f  t);.      _setmo
61f0: 64 65 28 5f 66 69 6c 65 6e 6f 28 70 2d 3e 6f 75  de(_fileno(p->ou
6200: 74 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a  t), _O_BINARY);.
6210: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
6220: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
6230: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
6240: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
6250: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
6260: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
6270: 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d  _csv(p, azCol[i]
6280: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
6290: 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20  , i<nArg-1);.   
62a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
62b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
62c0: 73 22 2c 70 2d 3e 6e 65 77 6c 69 6e 65 29 3b 0a  s",p->newline);.
62d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
62e0: 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20  ( nArg>0 ){.    
62f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6300: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
6310: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
6320: 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e  p, azArg[i], i<n
6330: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
6340: 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  }.        fprint
6350: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 70 2d  f(p->out,"%s",p-
6360: 3e 6e 65 77 6c 69 6e 65 29 3b 0a 20 20 20 20 20  >newline);.     
6370: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57   }.#if defined(W
6380: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
6390: 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20 66  (_WIN32).      f
63a0: 66 6c 75 73 68 28 70 2d 3e 6f 75 74 29 3b 0a 20  flush(p->out);. 
63b0: 20 20 20 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66       _setmode(_f
63c0: 69 6c 65 6e 6f 28 70 2d 3e 6f 75 74 29 2c 20 5f  ileno(p->out), _
63d0: 4f 5f 54 45 58 54 29 3b 0a 23 65 6e 64 69 66 0a  O_TEXT);.#endif.
63e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
63f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
6400: 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20  _Insert: {.     
6410: 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   p->cnt++;.     
6420: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
6430: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 70 72  break;.      fpr
6440: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53  intf(p->out,"INS
6450: 45 52 54 20 49 4e 54 4f 20 25 73 20 56 41 4c 55  ERT INTO %s VALU
6460: 45 53 28 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62  ES(",p->zDestTab
6470: 6c 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  le);.      for(i
6480: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
6490: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
64a0: 7a 53 65 70 20 3d 20 69 3e 30 20 3f 20 22 2c 22  zSep = i>0 ? ","
64b0: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  : "";.        if
64c0: 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20  ( (azArg[i]==0) 
64d0: 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20 61 69  || (aiType && ai
64e0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
64f0: 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
6500: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
6510: 74 2c 22 25 73 4e 55 4c 4c 22 2c 7a 53 65 70 29  t,"%sNULL",zSep)
6520: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
6530: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
6540: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
6550: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  TEXT ){.        
6560: 20 20 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20    if( zSep[0] ) 
6570: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
6580: 25 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20  %s",zSep);.     
6590: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
65a0: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
65b0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
65c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
65d0: 69 54 79 70 65 20 26 26 20 28 61 69 54 79 70 65  iType && (aiType
65e0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
65f0: 47 45 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  GER.            
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 7c 7c 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   || aiType[i]==S
6620: 51 4c 49 54 45 5f 46 4c 4f 41 54 29 20 29 7b 0a  QLITE_FLOAT) ){.
6630: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
6640: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c  f(p->out,"%s%s",
6650: 7a 53 65 70 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  zSep, azArg[i]);
6660: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
6670: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
6680: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
6690: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
66a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
66b0: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
66c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
66d0: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
66e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
66f0: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
6700: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
6710: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
6720: 20 20 20 20 20 20 69 66 28 20 7a 53 65 70 5b 30        if( zSep[0
6730: 5d 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f  ] ) fprintf(p->o
6740: 75 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b 0a 20  ut,"%s",zSep);. 
6750: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
6760: 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c  hex_blob(p->out,
6770: 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a   pBlob, nBlob);.
6780: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6790: 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67  ( isNumber(azArg
67a0: 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  [i], 0) ){.     
67b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
67c0: 6f 75 74 2c 22 25 73 25 73 22 2c 7a 53 65 70 2c  out,"%s%s",zSep,
67d0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
67e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
67f0: 20 20 20 20 20 69 66 28 20 7a 53 65 70 5b 30 5d       if( zSep[0]
6800: 20 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75   ) fprintf(p->ou
6810: 74 2c 22 25 73 22 2c 7a 53 65 70 29 3b 0a 20 20  t,"%s",zSep);.  
6820: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
6830: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
6840: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
6850: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6860: 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
6870: 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a  p->out,");\n");.
6880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6890: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
68a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
68b0: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
68c0: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68   routine that th
68d0: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
68e0: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20  .** invokes for 
68f0: 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75  each row of a qu
6900: 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  ery result..*/.s
6910: 74 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62 61  tatic int callba
6920: 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
6930: 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
6940: 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
6950: 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65  Col){.  /* since
6960: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74   we don't have t
6970: 79 70 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74  ype info, call t
6980: 68 65 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  he shell_callbac
6990: 6b 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  k with a NULL va
69a0: 6c 75 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lue */.  return 
69b0: 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70  shell_callback(p
69c0: 41 72 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67  Arg, nArg, azArg
69d0: 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a  , azCol, NULL);.
69e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
69f0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
6a00: 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  le field of the 
6a10: 53 68 65 6c 6c 53 74 61 74 65 20 73 74 72 75 63  ShellState struc
6a20: 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ture to.** the n
6a30: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6a40: 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20   given.  Escape 
6a50: 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61 63  any quote charac
6a60: 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ters in the.** t
6a70: 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  able name..*/.st
6a80: 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61  atic void set_ta
6a90: 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74  ble_name(ShellSt
6aa0: 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
6ab0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
6ac0: 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 65  t i, n;.  int ne
6ad0: 65 64 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20  edQuote;.  char 
6ae0: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44  *z;..  if( p->zD
6af0: 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  estTable ){.    
6b00: 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62  free(p->zDestTab
6b10: 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73  le);.    p->zDes
6b20: 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  tTable = 0;.  }.
6b30: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
6b40: 20 72 65 74 75 72 6e 3b 0a 20 20 6e 65 65 64 51   return;.  needQ
6b50: 75 6f 74 65 20 3d 20 21 69 73 61 6c 70 68 61 28  uote = !isalpha(
6b60: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 2a  (unsigned char)*
6b70: 7a 4e 61 6d 65 29 20 26 26 20 2a 7a 4e 61 6d 65  zName) && *zName
6b80: 21 3d 27 5f 27 3b 0a 20 20 66 6f 72 28 69 3d 6e  !='_';.  for(i=n
6b90: 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
6ba0: 2b 2c 20 6e 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, n++){.    if(
6bb0: 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67   !isalnum((unsig
6bc0: 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69  ned char)zName[i
6bd0: 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d  ]) && zName[i]!=
6be0: 27 5f 27 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  '_' ){.      nee
6bf0: 64 51 75 6f 74 65 20 3d 20 31 3b 0a 20 20 20 20  dQuote = 1;.    
6c00: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d    if( zName[i]==
6c10: 27 5c 27 27 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  '\'' ) n++;.    
6c20: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  }.  }.  if( need
6c30: 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20 32 3b 0a  Quote ) n += 2;.
6c40: 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61    z = p->zDestTa
6c50: 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b  ble = malloc( n+
6c60: 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  1 );.  if( z==0 
6c70: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
6c80: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75  tderr,"Error: ou
6c90: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
6ca0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
6cb0: 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  }.  n = 0;.  if(
6cc0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e   needQuote ) z[n
6cd0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f  ++] = '\'';.  fo
6ce0: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
6cf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b   i++){.    z[n++
6d00: 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20  ] = zName[i];.  
6d10: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d    if( zName[i]==
6d20: 27 5c 27 27 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  '\'' ) z[n++] = 
6d30: 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20  '\'';.  }.  if( 
6d40: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  needQuote ) z[n+
6d50: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 6e  +] = '\'';.  z[n
6d60: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e  ] = 0;.}../* zIn
6d70: 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
6d80: 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74  nter to a NULL-t
6d90: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
6da0: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
6db0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c  ned.** from mall
6dc0: 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20  oc(), or a NULL 
6dd0: 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73 74 72  pointer. The str
6de0: 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ing pointed to b
6df0: 79 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20  y zAppend is.** 
6e00: 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e  added to zIn, an
6e10: 64 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 74  d the result ret
6e20: 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  urned in memory 
6e30: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
6e40: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20  lloc()..** zIn, 
6e50: 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 4e 55  if it was not NU
6e60: 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a  LL, is freed..**
6e70: 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
6e80: 20 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65   argument, quote
6e90: 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74  , is not '\0', t
6ea0: 68 65 6e 20 69 74 20 69 73 20 75 73 65 64 20 61  hen it is used a
6eb0: 73 20 61 20 0a 2a 2a 20 71 75 6f 74 65 20 63 68  s a .** quote ch
6ec0: 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41 70 70  aracter for zApp
6ed0: 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  end..*/.static c
6ee0: 68 61 72 20 2a 61 70 70 65 6e 64 54 65 78 74 28  har *appendText(
6ef0: 63 68 61 72 20 2a 7a 49 6e 2c 20 63 68 61 72 20  char *zIn, char 
6f00: 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20  const *zAppend, 
6f10: 63 68 61 72 20 71 75 6f 74 65 29 7b 0a 20 20 69  char quote){.  i
6f20: 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b  nt len;.  int i;
6f30: 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d  .  int nAppend =
6f40: 20 73 74 72 6c 65 6e 33 30 28 7a 41 70 70 65 6e   strlen30(zAppen
6f50: 64 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20  d);.  int nIn = 
6f60: 28 7a 49 6e 3f 73 74 72 6c 65 6e 33 30 28 7a 49  (zIn?strlen30(zI
6f70: 6e 29 3a 30 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20  n):0);..  len = 
6f80: 6e 41 70 70 65 6e 64 2b 6e 49 6e 2b 31 3b 0a 20  nAppend+nIn+1;. 
6f90: 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20   if( quote ){.  
6fa0: 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20    len += 2;.    
6fb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65  for(i=0; i<nAppe
6fc0: 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; i++){.      
6fd0: 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d  if( zAppend[i]==
6fe0: 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20  quote ) len++;. 
6ff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 7a 49 6e 20     }.  }..  zIn 
7000: 3d 20 28 63 68 61 72 20 2a 29 72 65 61 6c 6c 6f  = (char *)reallo
7010: 63 28 7a 49 6e 2c 20 6c 65 6e 29 3b 0a 20 20 69  c(zIn, len);.  i
7020: 66 28 20 21 7a 49 6e 20 29 7b 0a 20 20 20 20 72  f( !zIn ){.    r
7030: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
7040: 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20  if( quote ){.   
7050: 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 26 7a   char *zCsr = &z
7060: 49 6e 5b 6e 49 6e 5d 3b 0a 20 20 20 20 2a 7a 43  In[nIn];.    *zC
7070: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
7080: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70    for(i=0; i<nAp
7090: 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pend; i++){.    
70a0: 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70    *zCsr++ = zApp
70b0: 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  end[i];.      if
70c0: 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75  ( zAppend[i]==qu
70d0: 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20  ote ) *zCsr++ = 
70e0: 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  quote;.    }.   
70f0: 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65   *zCsr++ = quote
7100: 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20  ;.    *zCsr++ = 
7110: 27 5c 30 27 3b 0a 20 20 20 20 61 73 73 65 72 74  '\0';.    assert
7120: 28 20 28 7a 43 73 72 2d 7a 49 6e 29 3d 3d 6c 65  ( (zCsr-zIn)==le
7130: 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n );.  }else{.  
7140: 20 20 6d 65 6d 63 70 79 28 26 7a 49 6e 5b 6e 49    memcpy(&zIn[nI
7150: 6e 5d 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70  n], zAppend, nAp
7160: 70 65 6e 64 29 3b 0a 20 20 20 20 7a 49 6e 5b 6c  pend);.    zIn[l
7170: 65 6e 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  en-1] = '\0';.  
7180: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a 49 6e 3b  }..  return zIn;
7190: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  .}.../*.** Execu
71a0: 74 65 20 61 20 71 75 65 72 79 20 73 74 61 74 65  te a query state
71b0: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 67  ment that will g
71c0: 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75 74 70  enerate SQL outp
71d0: 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68  ut.  Print.** th
71e0: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
71f0: 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65  , comma-separate
7200: 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64  d, on a line and
7210: 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73   then add a.** s
7220: 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
7230: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
7240: 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  f that line..**.
7250: 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
7260: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31   of columns is 1
7270: 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e   and that column
7280: 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 22   contains text "
7290: 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  --".** then writ
72a0: 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20  e the semicolon 
72b0: 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  on a separate li
72c0: 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  ne.  That way, i
72d0: 66 20 61 20 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d  f a .** "--" com
72e0: 6d 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20 74  ment occurs at t
72f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74  he end of the st
7300: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d  atement, the com
7310: 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f  ment.** won't co
7320: 6e 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63 6f  nsume the semico
7330: 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  lon terminator..
7340: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75  */.static int ru
7350: 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
7360: 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ry(.  ShellState
7370: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
7380: 2a 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74 20  * Query context 
7390: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
73a0: 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a  *zSelect,     /*
73b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
73c0: 74 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f 6e  t to extract con
73d0: 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tent */.  const 
73e0: 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77 20  char *zFirstRow 
73f0: 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f     /* Print befo
7400: 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66  re first row, if
7410: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
7420: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
7430: 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72  pSelect;.  int r
7440: 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  c;.  int nResult
7450: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
7460: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63  st char *z;.  rc
7470: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
7480: 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65  re_v2(p->db, zSe
7490: 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65  lect, -1, &pSele
74a0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ct, 0);.  if( rc
74b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
74c0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 66  pSelect ){.    f
74d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
74e0: 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64  /**** ERROR: (%d
74f0: 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20  ) %s *****/\n", 
7500: 72 63 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rc, sqlite3_errm
7510: 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
7520: 69 66 28 20 28 72 63 26 30 78 66 66 29 21 3d 53  if( (rc&0xff)!=S
7530: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20  QLITE_CORRUPT ) 
7540: 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  p->nErr++;.    r
7550: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7560: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
7570: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52  p(pSelect);.  nR
7580: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f  esult = sqlite3_
7590: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65  column_count(pSe
75a0: 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  lect);.  while( 
75b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
75c0: 7b 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74  {.    if( zFirst
75d0: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 66 70 72  Row ){.      fpr
75e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
75f0: 22 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20  ", zFirstRow);. 
7600: 20 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d       zFirstRow =
7610: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20   0;.    }.    z 
7620: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
7630: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
7640: 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  xt(pSelect, 0);.
7650: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
7660: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
7670: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65    for(i=1; i<nRe
7680: 73 75 6c 74 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  sult; i++){ .   
7690: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
76a0: 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65  t, ",%s", sqlite
76b0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
76c0: 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20  elect, i));.    
76d0: 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  }.    if( z==0 )
76e0: 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69   z = "";.    whi
76f0: 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30  le( z[0] && (z[0
7700: 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d  ]!='-' || z[1]!=
7710: 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  '-') ) z++;.    
7720: 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  if( z[0] ){.    
7730: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
7740: 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20  , "\n;\n");.    
7750: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
7760: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c  intf(p->out, ";\
7770: 6e 22 29 3b 0a 20 20 20 20 7d 20 20 20 20 0a 20  n");.    }    . 
7780: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7790: 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
77a0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
77b0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65  3_finalize(pSele
77c0: 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ct);.  if( rc!=S
77d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
77e0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
77f0: 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25  "/**** ERROR: (%
7800: 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  d) %s *****/\n",
7810: 20 72 63 2c 20 73 71 6c 69 74 65 33 5f 65 72 72   rc, sqlite3_err
7820: 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
7830: 20 69 66 28 20 28 72 63 26 30 78 66 66 29 21 3d   if( (rc&0xff)!=
7840: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
7850: 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a   p->nErr++;.  }.
7860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7870: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
7880: 70 61 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66  pace and save of
7890: 66 20 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20  f current error 
78a0: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
78b0: 63 20 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72  c char *save_err
78c0: 5f 6d 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20  _msg(.  sqlite3 
78d0: 2a 64 62 20 20 20 20 20 20 20 20 20 20 20 20 2f  *db            /
78e0: 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75  * Database to qu
78f0: 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ery */.){.  int 
7900: 6e 45 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c  nErrMsg = 1+strl
7910: 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72  en30(sqlite3_err
7920: 6d 73 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72  msg(db));.  char
7930: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69   *zErrMsg = sqli
7940: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 45 72 72 4d  te3_malloc(nErrM
7950: 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d  sg);.  if( zErrM
7960: 73 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  sg ){.    memcpy
7970: 28 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  (zErrMsg, sqlite
7980: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45  3_errmsg(db), nE
7990: 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrMsg);.  }.  re
79a0: 74 75 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a  turn zErrMsg;.}.
79b0: 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d  ./*.** Display m
79c0: 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a  emory stats..*/.
79d0: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
79e0: 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69  ay_stats(.  sqli
79f0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
7a00: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
7a10: 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
7a20: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
7a30: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rg,           /*
7a40: 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c   Pointer to Shel
7a50: 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  lState */.  int 
7a60: 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20  bReset          
7a70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7a80: 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
7a90: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
7aa0: 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74  Cur;.  int iHiwt
7ab0: 72 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26  r;..  if( pArg &
7ac0: 26 20 70 41 72 67 2d 3e 6f 75 74 20 29 7b 0a 20  & pArg->out ){. 
7ad0: 20 20 20 0a 20 20 20 20 69 48 69 77 74 72 20 3d     .    iHiwtr =
7ae0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
7af0: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53  sqlite3_status(S
7b00: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d  QLITE_STATUS_MEM
7b10: 4f 52 59 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  ORY_USED, &iCur,
7b20: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
7b30: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
7b40: 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20  Arg->out,.      
7b50: 20 20 20 20 20 20 22 4d 65 6d 6f 72 79 20 55 73        "Memory Us
7b60: 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed:             
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 28              %d (
7b80: 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c 6e 22  max %d) bytes\n"
7b90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
7ba0: 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  ur, iHiwtr);.   
7bb0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
7bc0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
7bd0: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
7be0: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
7bf0: 4e 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  NT, &iCur, &iHiw
7c00: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
7c10: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
7c20: 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f  ut, "Number of O
7c30: 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63  utstanding Alloc
7c40: 61 74 69 6f 6e 73 3a 20 20 20 25 64 20 28 6d 61  ations:   %d (ma
7c50: 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20  x %d)\n",.      
7c60: 20 20 20 20 20 20 69 43 75 72 2c 20 69 48 69 77        iCur, iHiw
7c70: 74 72 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72  tr);.    if( pAr
7c80: 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53  g->shellFlgs & S
7c90: 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29  HFLG_Pagecache )
7ca0: 7b 0a 20 20 20 20 20 20 69 48 69 77 74 72 20 3d  {.      iHiwtr =
7cb0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
7cc0: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
7cd0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50  (SQLITE_STATUS_P
7ce0: 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 26  AGECACHE_USED, &
7cf0: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
7d00: 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 66 70  Reset);.      fp
7d10: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
7d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
7d30: 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
7d40: 20 50 61 67 65 73 20 55 73 65 64 3a 20 20 20 20   Pages Used:    
7d50: 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
7d60: 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
7d70: 20 20 20 20 20 20 20 20 20 69 43 75 72 2c 20 69           iCur, i
7d80: 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Hiwtr);.    }.  
7d90: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
7da0: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
7db0: 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f  3_status(SQLITE_
7dc0: 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
7dd0: 5f 4f 56 45 52 46 4c 4f 57 2c 20 26 69 43 75 72  _OVERFLOW, &iCur
7de0: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
7df0: 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  t);.    fprintf(
7e00: 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
7e10: 20 20 20 20 20 20 20 22 4e 75 6d 62 65 72 20 6f         "Number o
7e20: 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c 6f  f Pcache Overflo
7e30: 77 20 42 79 74 65 73 3a 20 20 20 20 20 25 64 20  w Bytes:     %d 
7e40: 28 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c 6e  (max %d) bytes\n
7e50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
7e60: 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  Cur, iHiwtr);.  
7e70: 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c    if( pArg->shel
7e80: 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 53 63  lFlgs & SHFLG_Sc
7e90: 72 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 69  ratch ){.      i
7ea0: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
7eb0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
7ec0: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
7ed0: 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f 55 53  TATUS_SCRATCH_US
7ee0: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
7ef0: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
7f00: 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d     fprintf(pArg-
7f10: 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66  >out, "Number of
7f20: 20 53 63 72 61 74 63 68 20 41 6c 6c 6f 63 61 74   Scratch Allocat
7f30: 69 6f 6e 73 20 55 73 65 64 3a 20 20 25 64 20 28  ions Used:  %d (
7f40: 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20 20  max %d)\n",.    
7f50: 20 20 20 20 20 20 20 20 20 20 69 43 75 72 2c 20            iCur, 
7f60: 69 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a 20  iHiwtr);.    }. 
7f70: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
7f80: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
7f90: 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45  e3_status(SQLITE
7fa0: 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f  _STATUS_SCRATCH_
7fb0: 4f 56 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c  OVERFLOW, &iCur,
7fc0: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
7fd0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
7fe0: 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20  Arg->out,.      
7ff0: 20 20 20 20 20 20 22 4e 75 6d 62 65 72 20 6f 66        "Number of
8000: 20 53 63 72 61 74 63 68 20 4f 76 65 72 66 6c 6f   Scratch Overflo
8010: 77 20 42 79 74 65 73 3a 20 20 20 20 25 64 20 28  w Bytes:    %d (
8020: 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c 6e 22  max %d) bytes\n"
8030: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
8040: 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  ur, iHiwtr);.   
8050: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
8060: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
8070: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
8080: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a  TATUS_MALLOC_SIZ
8090: 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  E, &iCur, &iHiwt
80a0: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
80b0: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
80c0: 74 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f  t, "Largest Allo
80d0: 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20 20  cation:         
80e0: 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65           %d byte
80f0: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
8100: 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 69    iHiwtr);.    i
8110: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
8120: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  1;.    sqlite3_s
8130: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
8140: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49  TUS_PAGECACHE_SI
8150: 5a 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ZE, &iCur, &iHiw
8160: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
8170: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
8180: 75 74 2c 20 22 4c 61 72 67 65 73 74 20 50 63 61  ut, "Largest Pca
8190: 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20  che Allocation: 
81a0: 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74            %d byt
81b0: 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
81c0: 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
81d0: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
81e0: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
81f0: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
8200: 41 54 55 53 5f 53 43 52 41 54 43 48 5f 53 49 5a  ATUS_SCRATCH_SIZ
8210: 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  E, &iCur, &iHiwt
8220: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
8230: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
8240: 74 2c 20 22 4c 61 72 67 65 73 74 20 53 63 72 61  t, "Largest Scra
8250: 74 63 68 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20  tch Allocation: 
8260: 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65           %d byte
8270: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
8280: 20 20 69 48 69 77 74 72 29 3b 0a 23 69 66 64 65    iHiwtr);.#ifde
8290: 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54 41 43  f YYTRACKMAXSTAC
82a0: 4b 44 45 50 54 48 0a 20 20 20 20 69 48 69 77 74  KDEPTH.    iHiwt
82b0: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
82c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75     sqlite3_statu
82d0: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
82e0: 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20 26 69  PARSER_STACK, &i
82f0: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
8300: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
8310: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 44  tf(pArg->out, "D
8320: 65 65 70 65 73 74 20 50 61 72 73 65 72 20 53 74  eepest Parser St
8330: 61 63 6b 3a 20 20 20 20 20 20 20 20 20 20 20 20  ack:            
8340: 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c      %d (max %d)\
8350: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
8360: 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 23  iCur, iHiwtr);.#
8370: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
8380: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f   pArg && pArg->o
8390: 75 74 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20  ut && db ){.    
83a0: 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46  if( pArg->shellF
83b0: 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b  lgs & SHFLG_Look
83c0: 61 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69  aside ){.      i
83d0: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
83e0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
83f0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
8400: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
8410: 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20  OOKASIDE_USED,. 
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
8440: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
8450: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 41        fprintf(pA
8460: 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73  rg->out, "Lookas
8470: 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20  ide Slots Used: 
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
8490: 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20  d (max %d)\n",. 
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75               iCu
84b0: 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20  r, iHiwtr);.    
84c0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
84d0: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
84e0: 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
84f0: 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20  E_HIT,.         
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
8510: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
8520: 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 66 70  Reset);.      fp
8530: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
8540: 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f 6f   "Successful loo
8550: 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74 73 3a  kaside attempts:
8560: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 48         %d\n", iH
8570: 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  iwtr);.      sql
8580: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
8590: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
85a0: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53  US_LOOKASIDE_MIS
85b0: 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20  S_SIZE,.        
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
85e0: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 66  bReset);.      f
85f0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
8600: 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69  , "Lookaside fai
8610: 6c 75 72 65 73 20 64 75 65 20 74 6f 20 73 69 7a  lures due to siz
8620: 65 3a 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69  e:      %d\n", i
8630: 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
8640: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8650: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
8660: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
8670: 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20 20  SS_FULL,.       
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
86a0: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
86b0: 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  fprintf(pArg->ou
86c0: 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61  t, "Lookaside fa
86d0: 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20 4f 4f  ilures due to OO
86e0: 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20  M:       %d\n", 
86f0: 69 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a 20  iHiwtr);.    }. 
8700: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
8710: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
8720: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
8730: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
8740: 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69 43  _CACHE_USED, &iC
8750: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
8760: 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  set);.    fprint
8770: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
8780: 67 65 72 20 48 65 61 70 20 55 73 61 67 65 3a 20  ger Heap Usage: 
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 69     %d bytes\n",i
87b0: 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
87c0: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
87d0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
87e0: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
87f0: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49  BSTATUS_CACHE_HI
8800: 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  T, &iCur, &iHiwt
8810: 72 2c 20 31 29 3b 0a 20 20 20 20 66 70 72 69 6e  r, 1);.    fprin
8820: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
8830: 61 67 65 20 63 61 63 68 65 20 68 69 74 73 3a 20  age cache hits: 
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
8860: 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
8870: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
8880: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8890: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
88a0: 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20  TUS_CACHE_MISS, 
88b0: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
88c0: 31 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  1);.    fprintf(
88d0: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
88e0: 20 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20   cache misses:  
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 20 0a   %d\n", iCur); .
8910: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
8920: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
8930: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
8940: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
8950: 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26  S_CACHE_WRITE, &
8960: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
8970: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
8980: 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
8990: 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20  cache writes:   
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 20 0a 20  %d\n", iCur); . 
89c0: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
89d0: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
89e0: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
89f0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
8a00: 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69  _SCHEMA_USED, &i
8a10: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
8a20: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
8a30: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
8a40: 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67 65  chema Heap Usage
8a50: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
8a60: 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
8a70: 69 43 75 72 29 3b 20 0a 20 20 20 20 69 48 69 77  iCur); .    iHiw
8a80: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
8a90: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
8aa0: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
8ab0: 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55  _DBSTATUS_STMT_U
8ac0: 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
8ad0: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
8ae0: 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e    fprintf(pArg->
8af0: 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20  out, "Statement 
8b00: 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55  Heap/Lookaside U
8b10: 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62 79  sage:      %d by
8b20: 74 65 73 5c 6e 22 2c 69 43 75 72 29 3b 20 0a 20  tes\n",iCur); . 
8b30: 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26   }..  if( pArg &
8b40: 26 20 70 41 72 67 2d 3e 6f 75 74 20 26 26 20 64  & pArg->out && d
8b50: 62 20 26 26 20 70 41 72 67 2d 3e 70 53 74 6d 74  b && pArg->pStmt
8b60: 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73   ){.    iCur = s
8b70: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
8b80: 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
8b90: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
8ba0: 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c  S_FULLSCAN_STEP,
8bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72  bReset);.    fpr
8be0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
8bf0: 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a  "Fullscan Steps:
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
8c20: 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
8c30: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
8c40: 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
8c50: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
8c60: 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b  S_SORT, bReset);
8c70: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
8c80: 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70  g->out, "Sort Op
8c90: 65 72 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20  erations:       
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
8cb0: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
8cc0: 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
8cd0: 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
8ce0: 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
8cf0: 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
8d00: 44 45 58 2c 62 52 65 73 65 74 29 3b 0a 20 20 20  DEX,bReset);.   
8d10: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
8d20: 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49  ut, "Autoindex I
8d30: 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20  nserts:         
8d40: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
8d50: 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
8d60: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
8d70: 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
8d80: 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
8d90: 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62  TATUS_VM_STEP, b
8da0: 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69  Reset);.    fpri
8db0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
8dc0: 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20  Virtual Machine 
8dd0: 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
8de0: 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
8df0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
8e00: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   0;.}../*.** Dis
8e10: 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e  play scan stats.
8e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8e30: 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74  display_scanstat
8e40: 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
8e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8e60: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8e70: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53   to query */.  S
8e80: 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20  hellState *pArg 
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ea0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
8eb0: 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69  llState */.){.#i
8ec0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8ed0: 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
8ee0: 55 53 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  US.  int i, k, n
8ef0: 2c 20 6d 78 3b 0a 20 20 66 70 72 69 6e 74 66 28  , mx;.  fprintf(
8f00: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
8f10: 2d 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d  ---- scanstats -
8f20: 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d  -------\n");.  m
8f30: 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30  x = 0;.  for(k=0
8f40: 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20  ; k<=mx; k++){. 
8f50: 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f     double rEstLo
8f60: 6f 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f  op = 1.0;.    fo
8f70: 72 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29  r(i=n=0; 1; i++)
8f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8f90: 73 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e  stmt *p = pArg->
8fa0: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c  pStmt;.      sql
8fb0: 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70  ite3_int64 nLoop
8fc0: 2c 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20  , nVisit;.      
8fd0: 64 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20  double rEst;.   
8fe0: 20 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20     int iSid;.   
8ff0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9000: 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69  Explain;.      i
9010: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  f( sqlite3_stmt_
9020: 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
9030: 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
9040: 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26  _NLOOP, (void*)&
9050: 6e 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20  nLoop) ){.      
9060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9080: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
9090: 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
90a0: 53 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28  STAT_SELECTID, (
90b0: 76 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20  void*)&iSid);.  
90c0: 20 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20      if( iSid>mx 
90d0: 29 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20  ) mx = iSid;.   
90e0: 20 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29     if( iSid!=k )
90f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9100: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
9110: 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20       rEstLoop = 
9120: 28 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20  (double)nLoop;. 
9130: 20 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29         if( k>0 )
9140: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
9150: 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75  ut, "-------- su
9160: 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d  bquery %d ------
9170: 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20  -\n", k);.      
9180: 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
9190: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
91a0: 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
91b0: 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
91c0: 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29  _NVISIT, (void*)
91d0: 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20  &nVisit);.      
91e0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
91f0: 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
9200: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
9210: 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
9220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9230: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
9240: 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
9250: 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
9260: 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
9270: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
9280: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70  pArg->out, "Loop
9290: 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20   %2d: %s\n", n, 
92a0: 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  zExplain);.     
92b0: 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73   rEstLoop *= rEs
92c0: 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  t;.      fprintf
92d0: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 0a 20 20 20  (pArg->out, .   
92e0: 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20         "        
92f0: 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52   nLoop=%-8lld nR
9300: 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77  ow=%-8lld estRow
9310: 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c  =%-8lld estRow/L
9320: 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20  oop=%-8g\n",.   
9330: 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56         nLoop, nV
9340: 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69  isit, (sqlite3_i
9350: 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30  nt64)(rEstLoop+0
9360: 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20  .5), rEst.      
9370: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
9380: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
9390: 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  , "-------------
93a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
93b0: 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ");.#endif.}../*
93c0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 7a  .** Parameter az
93d0: 41 72 72 61 79 20 70 6f 69 6e 74 73 20 74 6f 20  Array points to 
93e0: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
93f0: 64 20 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e  d array of strin
9400: 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f 69 6e  gs. zStr.** poin
9410: 74 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 6e  ts to a single n
9420: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
9430: 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 6e 6f 6e  ring. Return non
9440: 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72 0a 2a 2a  -zero if zStr.**
9450: 20 69 73 20 65 71 75 61 6c 2c 20 61 63 63 6f 72   is equal, accor
9460: 64 69 6e 67 20 74 6f 20 73 74 72 63 6d 70 28 29  ding to strcmp()
9470: 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 20  , to any of the 
9480: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
9490: 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rray..** Otherwi
94a0: 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  se, return zero.
94b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
94c0: 74 72 5f 69 6e 5f 61 72 72 61 79 28 63 6f 6e 73  tr_in_array(cons
94d0: 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f  t char *zStr, co
94e0: 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 72  nst char **azArr
94f0: 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ay){.  int i;.  
9500: 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 72 61 79  for(i=0; azArray
9510: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
9520: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 53 74  f( 0==strcmp(zSt
9530: 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d 29 20 29  r, azArray[i]) )
9540: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9550: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
9560: 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  .** If compiled 
9570: 73 74 61 74 65 6d 65 6e 74 20 70 53 71 6c 20 61  statement pSql a
9580: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 6e 20  ppears to be an 
9590: 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e  EXPLAIN statemen
95a0: 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61  t, allocate.** a
95b0: 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
95c0: 53 68 65 6c 6c 53 74 61 74 65 2e 61 69 49 6e 64  ShellState.aiInd
95d0: 65 6e 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  ent[] array with
95e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
95f0: 2a 20 73 70 61 63 65 73 20 65 61 63 68 20 6f 70  * spaces each op
9600: 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20 69  code should be i
9610: 6e 64 65 6e 74 65 64 20 62 65 66 6f 72 65 20 69  ndented before i
9620: 74 20 69 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2a  t is output. .**
9630: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74 69 6e  .** The indentin
9640: 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a  g rules are:.**.
9650: 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
9660: 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  h "Next", "Prev"
9670: 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22 56 50  , "VNext" or "VP
9680: 72 65 76 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  rev" instruction
9690: 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20  , indent.**     
96a0: 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68    all opcodes th
96b0: 61 74 20 6f 63 63 75 72 20 62 65 74 77 65 65 6e  at occur between
96c0: 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64 65 73   the p2 jump des
96d0: 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  tination and the
96e0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20   opcode.**      
96f0: 20 69 74 73 65 6c 66 20 62 79 20 32 20 73 70 61   itself by 2 spa
9700: 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ces..**.**     *
9710: 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74 6f 22   For each "Goto"
9720: 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20 64 65  , if the jump de
9730: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 61 72  stination is ear
9740: 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72 6f 67  lier in the prog
9750: 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ram.**       and
9760: 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a   ends on one of:
9770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59 69 65  .**          Yie
9780: 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65 65 6b  ld  SeekGt  Seek
9790: 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64 20 20  Lt  RowSetRead  
97a0: 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20  Rewind.**       
97b0: 6f 72 20 69 66 20 74 68 65 20 50 31 20 70 61 72  or if the P1 par
97c0: 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20 69 6e  ameter is one in
97d0: 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a  stead of zero,.*
97e0: 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69 6e 64  *       then ind
97f0: 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ent all opcodes 
9800: 62 65 74 77 65 65 6e 20 74 68 65 20 65 61 72 6c  between the earl
9810: 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ier instruction.
9820: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22 47 6f  **       and "Go
9830: 74 6f 22 20 62 79 20 32 20 73 70 61 63 65 73 2e  to" by 2 spaces.
9840: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9850: 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
9860: 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74 65 20  pare(ShellState 
9870: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
9880: 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74   *pSql){.  const
9890: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
98b0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
98c0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
98d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20   const char *z; 
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63   /* Used to chec
9900: 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  k if this is an 
9910: 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74  EXPLAIN */.  int
9920: 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20   *abYield = 0;  
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9940: 54 72 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e  True if op is an
9950: 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69   OP_Yield */.  i
9960: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20  nt nAlloc = 0;  
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9980: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
9990: 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b   of p->aiIndent[
99a0: 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20  ], abYield */.  
99b0: 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20  int iOp;        
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72  /* Index of oper
99e0: 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e  ation in p->aiIn
99f0: 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e  dent[] */..  con
9a00: 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b  st char *azNext[
9a10: 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50  ] = { "Next", "P
9a20: 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22  rev", "VPrev", "
9a30: 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e  VNext", "SorterN
9a40: 65 78 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ext",.          
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 22 4e 65 78 74 49 66 4f 70 65 6e 22 2c 20 22   "NextIfOpen", "
9a70: 50 72 65 76 49 66 4f 70 65 6e 22 2c 20 30 20 7d  PrevIfOpen", 0 }
9a80: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9a90: 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59  azYield[] = { "Y
9aa0: 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c  ield", "SeekLT",
9ab0: 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53   "SeekGT", "RowS
9ac0: 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20  etRead",.       
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30       "Rewind", 0
9af0: 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
9b00: 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22   *azGoto[] = { "
9b10: 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f  Goto", 0 };..  /
9b20: 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20  * Try to figure 
9b30: 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72  out if this is r
9b40: 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e  eally an EXPLAIN
9b50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74   statement. If t
9b60: 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20  his.  ** cannot 
9b70: 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74  be verified, ret
9b80: 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20  urn early.  */. 
9b90: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
9ba0: 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28  sql(pSql);.  if(
9bb0: 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
9bc0: 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b  n;.  for(z=zSql;
9bd0: 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d   *z==' ' || *z==
9be0: 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27  '\t' || *z=='\n'
9bf0: 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20   || *z=='\f' || 
9c00: 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a  *z=='\r'; z++);.
9c10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
9c20: 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61  rnicmp(z, "expla
9c30: 69 6e 22 2c 20 37 29 20 29 20 72 65 74 75 72 6e  in", 7) ) return
9c40: 3b 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20  ;..  for(iOp=0; 
9c50: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
9c60: 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20  te3_step(pSql); 
9c70: 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  iOp++){.    int 
9c80: 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72  i;.    int iAddr
9c90: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
9ca0: 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a  n_int(pSql, 0);.
9cb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9cc0: 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zOp = (const cha
9cd0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
9ce0: 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b  n_text(pSql, 1);
9cf0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20  ..    /* Set p2 
9d00: 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20  to the P2 field 
9d10: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  of the current o
9d20: 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73  pcode. Then, ass
9d30: 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  uming that.    *
9d40: 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72  * p2 is an instr
9d50: 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20  uction address, 
9d60: 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f  set variable p2o
9d70: 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  p to the index o
9d80: 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e  f that.    ** in
9d90: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
9da0: 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61   aiIndent[] arra
9db0: 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d  y. p2 and p2op m
9dc0: 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
9dd0: 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  if.    ** the cu
9de0: 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  rrent instructio
9df0: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73  n is part of a s
9e00: 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72  ub-program gener
9e10: 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a  ated by an.    *
9e20: 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72  * SQL trigger or
9e30: 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a   foreign key.  *
9e40: 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73  /.    int p2 = s
9e50: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
9e60: 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
9e70: 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b  int p2op = (p2 +
9e80: 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a   (iOp-iAddr));..
9e90: 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
9ea0: 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61  p->aiIndent arra
9eb0: 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f  y as required */
9ec0: 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41  .    if( iOp>=nA
9ed0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 6e 41  lloc ){.      nA
9ee0: 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20  lloc += 100;.   
9ef0: 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d     p->aiIndent =
9f00: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
9f10: 65 61 6c 6c 6f 63 28 70 2d 3e 61 69 49 6e 64 65  ealloc(p->aiInde
9f20: 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  nt, nAlloc*sizeo
9f30: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 61  f(int));.      a
9f40: 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73  bYield = (int*)s
9f50: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
9f60: 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73  bYield, nAlloc*s
9f70: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
9f80: 20 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69   }.    abYield[i
9f90: 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72  Op] = str_in_arr
9fa0: 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29  ay(zOp, azYield)
9fb0: 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e  ;.    p->aiInden
9fc0: 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20  t[iOp] = 0;.    
9fd0: 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70  p->nIndent = iOp
9fe0: 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72  +1;..    if( str
9ff0: 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
a000: 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20  zNext) ){.      
a010: 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f  for(i=p2op; i<iO
a020: 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64  p; i++) p->aiInd
a030: 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20  ent[i] += 2;.   
a040: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69   }.    if( str_i
a050: 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47  n_array(zOp, azG
a060: 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e  oto) && p2op<p->
a070: 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20  nIndent.     && 
a080: 28 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c  (abYield[p2op] |
a090: 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  | sqlite3_column
a0a0: 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20  _int(pSql, 2)). 
a0b0: 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28     ){.      for(
a0c0: 69 3d 70 32 6f 70 2b 31 3b 20 69 3c 69 4f 70 3b  i=p2op+1; i<iOp;
a0d0: 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e   i++) p->aiInden
a0e0: 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d  t[i] += 2;.    }
a0f0: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65  .  }..  p->iInde
a100: 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  nt = 0;.  sqlite
a110: 33 5f 66 72 65 65 28 61 62 59 69 65 6c 64 29 3b  3_free(abYield);
a120: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  .  sqlite3_reset
a130: 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (pSql);.}../*.**
a140: 20 46 72 65 65 20 74 68 65 20 61 72 72 61 79 20   Free the array 
a150: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78 70  allocated by exp
a160: 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72  lain_data_prepar
a170: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
a180: 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61  oid explain_data
a190: 5f 64 65 6c 65 74 65 28 53 68 65 6c 6c 53 74 61  _delete(ShellSta
a1a0: 74 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  te *p){.  sqlite
a1b0: 33 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e 64 65  3_free(p->aiInde
a1c0: 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65  nt);.  p->aiInde
a1d0: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e  nt = 0;.  p->nIn
a1e0: 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  dent = 0;.  p->i
a1f0: 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  Indent = 0;.}../
a200: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 73  *.** Execute a s
a210: 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 65 74 20  tatement or set 
a220: 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  of statements.  
a230: 50 72 69 6e 74 20 0a 2a 2a 20 61 6e 79 20 72 65  Print .** any re
a240: 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e  sult rows/column
a250: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
a260: 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64 65 20  he current mode 
a270: 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65 20  .** set via the 
a280: 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
a290: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  k..**.** This is
a2a0: 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f   very similar to
a2b0: 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d   SQLite's built-
a2c0: 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  in sqlite3_exec(
a2d0: 29 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65  ) .** function e
a2e0: 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61  xcept it takes a
a2f0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
a300: 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 0a 2a 2a  ent callback .**
a310: 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61   and callback da
a320: 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ta argument..*/.
a330: 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
a340: 5f 65 78 65 63 28 0a 20 20 73 71 6c 69 74 65 33  _exec(.  sqlite3
a350: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61     /* An open da
a380: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
a390: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20  t char *zSql,   
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20        /* SQL to 
a3c0: 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a  be evaluated */.
a3d0: 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
a3e0: 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
a3f0: 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29  r**,char**,int*)
a400: 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  ,   /* Callback 
a410: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f 74 20          /* (not 
a450: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
a460: 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20 20 53  te3_exec) */.  S
a470: 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a4a0: 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74  ter to ShellStat
a4b0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
a4c0: 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4e0: 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72   /* Error msg wr
a4f0: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
a500: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
a510: 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20  *pStmt = NULL;  
a520: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
a530: 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
a540: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a550: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
a560: 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
a570: 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  */.  int rc2;.  
a580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66  const char *zLef
a590: 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20  tover;          
a5a0: 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f  /* Tail of unpro
a5b0: 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 0a 20  cessed SQL */.. 
a5c0: 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b   if( pzErrMsg ){
a5d0: 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
a5e0: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 77 68   NULL;.  }..  wh
a5f0: 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20  ile( zSql[0] && 
a600: 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63  (SQLITE_OK == rc
a610: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
a620: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
a630: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
a640: 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65  pStmt, &zLeftove
a650: 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  r);.    if( SQLI
a660: 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20  TE_OK != rc ){. 
a670: 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73       if( pzErrMs
a680: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
a690: 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
a6a0: 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
a6b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a6c0: 20 20 20 20 69 66 28 20 21 70 53 74 6d 74 20 29      if( !pStmt )
a6d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69  {.        /* thi
a6e0: 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20  s happens for a 
a6f0: 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65  comment or white
a700: 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20  -space */.      
a710: 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
a720: 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
a730: 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b  e( IsSpace(zSql[
a740: 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
a750: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
a760: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
a770: 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20 70  * save off the p
a780: 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74  repared statment
a790: 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65   handle and rese
a7a0: 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
a7b0: 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b       if( pArg ){
a7c0: 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70  .        pArg->p
a7d0: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
a7e0: 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20        pArg->cnt 
a7f0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
a800: 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20      /* echo the 
a810: 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66  sql statement if
a820: 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20   echo on */.    
a830: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
a840: 72 67 2d 3e 65 63 68 6f 4f 6e 20 29 7b 0a 20 20  rg->echoOn ){.  
a850: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
a860: 20 2a 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c   *zStmtSql = sql
a870: 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
a880: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
a890: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c  (pArg->out, "%s\
a8a0: 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a  n", zStmtSql ? z
a8b0: 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b  StmtSql : zSql);
a8c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
a8d0: 2f 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c  /* Show the EXPL
a8e0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69  AIN QUERY PLAN i
a8f0: 66 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a  f .eqp is on */.
a900: 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
a910: 26 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20  & pArg->autoEQP 
a920: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a930: 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
a940: 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
a950: 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f  *zEQP = sqlite3_
a960: 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e  mprintf("EXPLAIN
a970: 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c   QUERY PLAN %s",
a980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71        sqlite3_sq
a9b0: 6c 28 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 20  l(pStmt));.     
a9c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
a9d0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
a9e0: 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  EQP, -1, &pExpla
a9f0: 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  in, 0);.        
aa00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
aa10: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  K ){.          w
aa20: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
aa30: 65 70 28 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51  ep(pExplain)==SQ
aa40: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
aa50: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
aa60: 70 41 72 67 2d 3e 6f 75 74 2c 22 2d 2d 45 51 50  pArg->out,"--EQP
aa70: 2d 2d 20 25 64 2c 22 2c 20 73 71 6c 69 74 65 33  -- %d,", sqlite3
aa80: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
aa90: 6c 61 69 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  lain, 0));.     
aaa0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
aab0: 41 72 67 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c 20  Arg->out,"%d,", 
aac0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
aad0: 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 29  nt(pExplain, 1))
aae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
aaf0: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
ab00: 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63  "%d,", sqlite3_c
ab10: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
ab20: 69 6e 2c 20 32 29 29 3b 0a 20 20 20 20 20 20 20  in, 2));.       
ab30: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72       fprintf(pAr
ab40: 67 2d 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c 20 73  g->out,"%s\n", s
ab50: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
ab60: 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 29  xt(pExplain, 3))
ab70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ab80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ab90: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
aba0: 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  (pExplain);.    
abb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
abc0: 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a  (zEQP);.      }.
abd0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
abe0: 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72 65 6e   shell is curren
abf0: 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e  tly in ".explain
ac00: 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72 20 74  " mode, gather t
ac10: 68 65 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a  he extra.      *
ac20: 2a 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20  * data required 
ac30: 74 6f 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74  to add indents t
ac40: 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a  o the output.*/.
ac50: 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
ac60: 26 20 70 41 72 67 2d 3e 6d 6f 64 65 3d 3d 4d 4f  & pArg->mode==MO
ac70: 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20  DE_Explain ){.  
ac80: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
ac90: 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c  ta_prepare(pArg,
aca0: 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d   pStmt);.      }
acb0: 0a 0a 20 20 20 20 20 20 2f 2a 20 70 65 72 66 6f  ..      /* perfo
acc0: 72 6d 20 74 68 65 20 66 69 72 73 74 20 73 74 65  rm the first ste
acd0: 70 2e 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65  p.  this will te
ace0: 6c 6c 20 75 73 20 69 66 20 77 65 0a 20 20 20 20  ll us if we.    
acf0: 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75    ** have a resu
ad00: 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e  lt set or not an
ad10: 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73  d how wide it is
ad20: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ad30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
ad40: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
ad50: 20 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20 61   /* if we have a
ad60: 20 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a   result set... *
ad70: 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  /.      if( SQLI
ad80: 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
ad90: 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65          /* if we
ada0: 20 68 61 76 65 20 61 20 63 61 6c 6c 62 61 63 6b   have a callback
adb0: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ... */.        i
adc0: 66 28 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  f( xCallback ){.
add0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6c 6c            /* all
ade0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
adf0: 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61  col name ptr, va
ae00: 6c 75 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70  lue ptr, and typ
ae10: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
ae20: 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65  nt nCol = sqlite
ae30: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
ae40: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
ae50: 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73   void *pData = s
ae60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 33 2a  qlite3_malloc(3*
ae70: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73  nCol*sizeof(cons
ae80: 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20  t char*) + 1);. 
ae90: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 44           if( !pD
aea0: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
aeb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
aec0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
aed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
aee0: 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73     char **azCols
aef0: 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74   = (char **)pDat
af00: 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73  a;      /* Names
af10: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
af20: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ns */.          
af30: 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20    char **azVals 
af40: 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b  = &azCols[nCol];
af50: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
af60: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
af70: 20 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20   int *aiTypes = 
af80: 28 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e  (int *)&azVals[n
af90: 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20  Col]; /* Result 
afa0: 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  types */.       
afb0: 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20       int i, x;. 
afc0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
afd0: 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d  t(sizeof(int) <=
afe0: 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29   sizeof(char *))
aff0: 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ; .            /
b000: 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72 73 20  * save off ptrs 
b010: 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  to column names 
b020: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  */.            f
b030: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
b040: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
b050: 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20      azCols[i] = 
b060: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
b070: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
b080: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
b090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b0a0: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20   do{.           
b0b0: 20 20 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68     /* extract th
b0c0: 65 20 64 61 74 61 20 61 6e 64 20 64 61 74 61 20  e data and data 
b0d0: 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  types */.       
b0e0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
b0f0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 69                ai
b110: 54 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73  Types[i] = x = s
b120: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
b130: 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  pe(pStmt, i);.  
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
b150: 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ( x==SQLITE_BLOB
b160: 20 26 26 20 70 41 72 67 20 26 26 20 70 41 72 67   && pArg && pArg
b170: 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e 73  ->mode==MODE_Ins
b180: 65 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ert ){.         
b190: 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
b1a0: 69 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  i] = "";.       
b1b0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63    azVals[i] = (c
b1e0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
b1f0: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
b200: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
b210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b220: 20 20 20 20 20 20 69 66 28 20 21 61 7a 56 61 6c        if( !azVal
b230: 73 5b 69 5d 20 26 26 20 28 61 69 54 79 70 65 73  s[i] && (aiTypes
b240: 5b 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  [i]!=SQLITE_NULL
b250: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
b260: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
b270: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
b280: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b290: 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a  k; /* from for *
b2a0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
b2b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b2c0: 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a    } /* end for *
b2d0: 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
b2e0: 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20   /* if data and 
b2f0: 74 79 70 65 73 20 65 78 74 72 61 63 74 65 64 20  types extracted 
b300: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20  successfully... 
b310: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
b320: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
b330: 3d 3d 20 72 63 20 29 7b 20 0a 20 20 20 20 20 20  == rc ){ .      
b340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c            /* cal
b350: 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  l the supplied c
b360: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
b370: 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61   result row data
b380: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
b390: 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63      if( xCallbac
b3a0: 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a  k(pArg, nCol, az
b3b0: 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69  Vals, azCols, ai
b3c0: 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20  Types) ){.      
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
b3e0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
b400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b410: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
b420: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
b430: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b440: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b450: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b460: 7d 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f  } while( SQLITE_
b470: 52 4f 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20  ROW == rc );.   
b480: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b490: 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20  _free(pData);.  
b4a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b4b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b4c0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
b4d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
b4e0: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
b4f0: 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
b500: 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57  rc == SQLITE_ROW
b510: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
b520: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 65 78 70      }..      exp
b530: 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
b540: 28 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f  (pArg);..      /
b550: 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74  * print usage st
b560: 61 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20  ats if stats on 
b570: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
b580: 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73  g && pArg->stats
b590: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
b5a0: 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20  splay_stats(db, 
b5b0: 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pArg, 0);.      
b5c0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  }..      /* prin
b5d0: 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20  t loop-counters 
b5e0: 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
b5f0: 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
b600: 20 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73   pArg->scanstats
b610: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
b620: 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28  splay_scanstats(
b630: 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20  db, pArg);.     
b640: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e   }..      /* Fin
b650: 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d  alize the statem
b660: 65 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65  ent just execute
b670: 64 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  d. If this fails
b680: 2c 20 73 61 76 65 20 61 20 0a 20 20 20 20 20 20  , save a .      
b690: 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65  ** copy of the e
b6a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74  rror message. Ot
b6b0: 68 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71  herwise, set zSq
b6c0: 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  l to point to th
b6d0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20  e.      ** next 
b6e0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65  statement to exe
b6f0: 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  cute. */.      r
b700: 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
b710: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
b720: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b730: 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20  TE_NOMEM ) rc = 
b740: 72 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc2;.      if( r
b750: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b760: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a          zSql = z
b770: 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20  Leftover;.      
b780: 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
b790: 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c  (zSql[0]) ) zSql
b7a0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
b7b0: 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a  if( pzErrMsg ){.
b7c0: 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
b7d0: 67 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67  g = save_err_msg
b7e0: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  (db);.      }.. 
b7f0: 20 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61       /* clear sa
b800: 76 65 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20  ved stmt handle 
b810: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
b820: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
b830: 67 2d 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  g->pStmt = NULL;
b840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b850: 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20   } /* end while 
b860: 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  */..  return rc;
b870: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
b880: 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  is a different c
b890: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
b8a0: 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67  used for dumping
b8b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
b8c0: 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69  * Each row recei
b8d0: 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ved by this call
b8e0: 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
b8f0: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a   a table name,.*
b900: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65  * the table type
b910: 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61   ("index" or "ta
b920: 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f  ble") and SQL to
b930: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
b940: 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
b950: 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20  ne should print 
b960: 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20  text sufficient 
b970: 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20  to recreate the 
b980: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
b990: 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61   int dump_callba
b9a0: 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
b9b0: 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
b9c0: 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
b9d0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Col){.  int rc;.
b9e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
b9f0: 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  able;.  const ch
ba00: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e  ar *zType;.  con
ba10: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
ba20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
ba30: 65 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 53 68  epStmt = 0;.  Sh
ba40: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
ba50: 68 65 6c 6c 53 74 61 74 65 20 2a 29 70 41 72 67  hellState *)pArg
ba60: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
ba70: 4d 45 54 45 52 28 61 7a 43 6f 6c 29 3b 0a 20 20  METER(azCol);.  
ba80: 69 66 28 20 6e 41 72 67 21 3d 33 20 29 20 72 65  if( nArg!=3 ) re
ba90: 74 75 72 6e 20 31 3b 0a 20 20 7a 54 61 62 6c 65  turn 1;.  zTable
baa0: 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20 7a   = azArg[0];.  z
bab0: 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  Type = azArg[1];
bac0: 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72 67 5b  .  zSql = azArg[
bad0: 32 5d 3b 0a 20 20 0a 20 20 69 66 28 20 73 74 72  2];.  .  if( str
bae0: 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
baf0: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
bb00: 30 20 29 7b 0a 20 20 20 20 7a 50 72 65 70 53 74  0 ){.    zPrepSt
bb10: 6d 74 20 3d 20 22 44 45 4c 45 54 45 20 46 52 4f  mt = "DELETE FRO
bb20: 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  M sqlite_sequenc
bb30: 65 3b 5c 6e 22 3b 0a 20 20 7d 65 6c 73 65 20 69  e;\n";.  }else i
bb40: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
bb50: 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f  ob("sqlite_stat?
bb60: 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b  ", zTable)==0 ){
bb70: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
bb80: 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71  out, "ANALYZE sq
bb90: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29  lite_master;\n")
bba0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
bbb0: 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  rncmp(zTable, "s
bbc0: 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
bbd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
bbe0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
bbf0: 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54  cmp(zSql, "CREAT
bc00: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22  E VIRTUAL TABLE"
bc10: 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 20)==0 ){.    
bc20: 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20  char *zIns;.    
bc30: 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65  if( !p->writable
bc40: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
bc50: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
bc60: 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
bc70: 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b  _schema=ON;\n");
bc80: 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62  .      p->writab
bc90: 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  leSchema = 1;.  
bca0: 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73    }.    zIns = s
bcb0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
bcc0: 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
bcd0: 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  NTO sqlite_maste
bce0: 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f  r(type,name,tbl_
bcf0: 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71  name,rootpage,sq
bd00: 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55  l)".       "VALU
bd10: 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c  ES('table','%q',
bd20: 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a  '%q',0,'%q');",.
bd30: 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a         zTable, z
bd40: 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20  Table, zSql);.  
bd50: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
bd60: 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73 29 3b  , "%s\n", zIns);
bd70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
bd80: 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65 74  e(zIns);.    ret
bd90: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
bda0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
bdb0: 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71  ut, "%s;\n", zSq
bdc0: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73  l);.  }..  if( s
bdd0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61  trcmp(zType, "ta
bde0: 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
bdf0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
be00: 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  ableInfo = 0;.  
be10: 20 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 20    char *zSelect 
be20: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
be30: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 30 3b 0a 20  TableInfo = 0;. 
be40: 20 20 20 63 68 61 72 20 2a 7a 54 6d 70 20 3d 20     char *zTmp = 
be50: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77 20  0;.    int nRow 
be60: 3d 20 30 3b 0a 20 20 20 0a 20 20 20 20 7a 54 61  = 0;.   .    zTa
be70: 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64  bleInfo = append
be80: 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c  Text(zTableInfo,
be90: 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69   "PRAGMA table_i
bea0: 6e 66 6f 28 22 2c 20 30 29 3b 0a 20 20 20 20 7a  nfo(", 0);.    z
beb0: 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70 70 65  TableInfo = appe
bec0: 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49 6e 66  ndText(zTableInf
bed0: 6f 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b  o, zTable, '"');
bee0: 0a 20 20 20 20 7a 54 61 62 6c 65 49 6e 66 6f 20  .    zTableInfo 
bef0: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 54 61  = appendText(zTa
bf00: 62 6c 65 49 6e 66 6f 2c 20 22 29 3b 22 2c 20 30  bleInfo, ");", 0
bf10: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  );..    rc = sql
bf20: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
bf30: 70 2d 3e 64 62 2c 20 7a 54 61 62 6c 65 49 6e 66  p->db, zTableInf
bf40: 6f 2c 20 2d 31 2c 20 26 70 54 61 62 6c 65 49 6e  o, -1, &pTableIn
bf50: 66 6f 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  fo, 0);.    free
bf60: 28 7a 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20  (zTableInfo);.  
bf70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bf80: 5f 4f 4b 20 7c 7c 20 21 70 54 61 62 6c 65 49 6e  _OK || !pTableIn
bf90: 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  fo ){.      retu
bfa0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
bfb0: 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e   zSelect = appen
bfc0: 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22  dText(zSelect, "
bfd0: 53 45 4c 45 43 54 20 27 49 4e 53 45 52 54 20 49  SELECT 'INSERT I
bfe0: 4e 54 4f 20 27 20 7c 7c 20 22 2c 20 30 29 3b 0a  NTO ' || ", 0);.
bff0: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71 75      /* Always qu
c000: 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ote the table na
c010: 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 61  me, even if it a
c020: 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 75 72  ppears to be pur
c030: 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20  e ascii,.    ** 
c040: 69 6e 20 63 61 73 65 20 69 74 20 69 73 20 61 20  in case it is a 
c050: 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e  keyword. Ex:  IN
c060: 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c 65  SERT INTO "table
c070: 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 7a 54 6d  " ... */.    zTm
c080: 70 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  p = appendText(z
c090: 54 6d 70 2c 20 7a 54 61 62 6c 65 2c 20 27 22 27  Tmp, zTable, '"'
c0a0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 6d 70 20  );.    if( zTmp 
c0b0: 29 7b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63 74  ){.      zSelect
c0c0: 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53   = appendText(zS
c0d0: 65 6c 65 63 74 2c 20 7a 54 6d 70 2c 20 27 5c 27  elect, zTmp, '\'
c0e0: 27 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  ');.      free(z
c0f0: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tmp);.    }.    
c100: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
c110: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 20  Text(zSelect, " 
c120: 7c 7c 20 27 20 56 41 4c 55 45 53 28 27 20 7c 7c  || ' VALUES(' ||
c130: 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d   ", 0);.    rc =
c140: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54   sqlite3_step(pT
c150: 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 77  ableInfo);.    w
c160: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
c170: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f  _ROW ){.      co
c180: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
c190: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
c1a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
c1b0: 65 78 74 28 70 54 61 62 6c 65 49 6e 66 6f 2c 20  ext(pTableInfo, 
c1c0: 31 29 3b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63  1);.      zSelec
c1d0: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
c1e0: 53 65 6c 65 63 74 2c 20 22 71 75 6f 74 65 28 22  Select, "quote("
c1f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 65 6c  , 0);.      zSel
c200: 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74  ect = appendText
c210: 28 7a 53 65 6c 65 63 74 2c 20 7a 54 65 78 74 2c  (zSelect, zText,
c220: 20 27 22 27 29 3b 0a 20 20 20 20 20 20 72 63 20   '"');.      rc 
c230: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
c240: 54 61 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20  TableInfo);.    
c250: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c260: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
c270: 7a 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64  zSelect = append
c280: 54 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 29  Text(zSelect, ")
c290: 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , ", 0);.      }
c2a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53  else{.        zS
c2b0: 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65  elect = appendTe
c2c0: 78 74 28 7a 53 65 6c 65 63 74 2c 20 22 29 20 22  xt(zSelect, ") "
c2d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
c2e0: 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20      nRow++;.    
c2f0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
c300: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 54 61 62  e3_finalize(pTab
c310: 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  leInfo);.    if(
c320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
c330: 7c 20 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  | nRow==0 ){.   
c340: 20 20 20 66 72 65 65 28 7a 53 65 6c 65 63 74 29     free(zSelect)
c350: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
c360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 6c  ;.    }.    zSel
c370: 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74  ect = appendText
c380: 28 7a 53 65 6c 65 63 74 2c 20 22 7c 7c 20 27 29  (zSelect, "|| ')
c390: 27 20 46 52 4f 4d 20 20 22 2c 20 30 29 3b 0a 20  ' FROM  ", 0);. 
c3a0: 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61 70 70     zSelect = app
c3b0: 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63 74 2c  endText(zSelect,
c3c0: 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a 0a   zTable, '"');..
c3d0: 20 20 20 20 72 63 20 3d 20 72 75 6e 5f 74 61 62      rc = run_tab
c3e0: 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  le_dump_query(p,
c3f0: 20 7a 53 65 6c 65 63 74 2c 20 7a 50 72 65 70 53   zSelect, zPrepS
c400: 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tmt);.    if( rc
c410: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
c420: 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63   ){.      zSelec
c430: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
c440: 53 65 6c 65 63 74 2c 20 22 20 4f 52 44 45 52 20  Select, " ORDER 
c450: 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
c460: 30 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61  0);.      run_ta
c470: 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
c480: 2c 20 7a 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  , zSelect, 0);. 
c490: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 7a 53     }.    free(zS
c4a0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65  elect);.  }.  re
c4b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c4c0: 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
c4d0: 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
c4e0: 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
c4f0: 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
c500: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
c510: 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
c520: 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
c530: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
c540: 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
c550: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
c560: 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
c570: 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
c580: 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
c590: 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
c5a0: 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
c5b0: 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
c5c0: 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
c5d0: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20   ShellState *p, 
c5e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c5f0: 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72  Query.){.  int r
c600: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
c610: 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
c620: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
c630: 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c  zQuery, dump_cal
c640: 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
c650: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
c660: 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20  TE_CORRUPT ){.  
c670: 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20    char *zQ2;.   
c680: 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
c690: 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20  n30(zQuery);.   
c6a0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
c6b0: 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50   "/****** CORRUP
c6c0: 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a  TION ERROR *****
c6d0: 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28  **/\n");.    if(
c6e0: 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 66   zErr ){.      f
c6f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
c700: 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a  /****** %s *****
c710: 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  */\n", zErr);.  
c720: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c730: 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a 45  (zErr);.      zE
c740: 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rr = 0;.    }.  
c750: 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28 20    zQ2 = malloc( 
c760: 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20 69  len+100 );.    i
c770: 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74 75  f( zQ2==0 ) retu
c780: 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  rn rc;.    sqlit
c790: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e 2b  e3_snprintf(len+
c7a0: 31 30 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52  100, zQ2, "%s OR
c7b0: 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
c7c0: 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20  C", zQuery);.   
c7d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
c7e0: 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64  ec(p->db, zQ2, d
c7f0: 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ump_callback, p,
c800: 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   &zErr);.    if(
c810: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 70 72   rc ){.      fpr
c820: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
c830: 2a 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20  ***** ERROR: %s 
c840: 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72  ******/\n", zErr
c850: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c860: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c870: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
c880: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c890: 7a 45 72 72 29 3b 0a 20 20 20 20 66 72 65 65 28  zErr);.    free(
c8a0: 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  zQ2);.  }.  retu
c8b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c8c0: 54 65 78 74 20 6f 66 20 61 20 68 65 6c 70 20 6d  Text of a help m
c8d0: 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  essage.*/.static
c8e0: 20 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a   char zHelp[] =.
c8f0: 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20    ".backup ?DB? 
c900: 46 49 4c 45 20 20 20 20 20 20 42 61 63 6b 75 70  FILE      Backup
c910: 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d   DB (default \"m
c920: 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45 5c 6e  ain\") to FILE\n
c930: 22 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66  ".  ".bail on|of
c940: 66 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 70  f           Stop
c950: 20 61 66 74 65 72 20 68 69 74 74 69 6e 67 20 61   after hitting a
c960: 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c  n error.  Defaul
c970: 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 6c 6f  t OFF\n".  ".clo
c980: 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20 20  ne NEWDB        
c990: 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e     Clone data in
c9a0: 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74 68  to NEWDB from th
c9b0: 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
c9c0: 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61 74 61 62  ase\n".  ".datab
c9d0: 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20 20  ases            
c9e0: 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20   List names and 
c9f0: 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65  files of attache
ca00: 64 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a 20  d databases\n". 
ca10: 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20   ".dump ?TABLE? 
ca20: 2e 2e 2e 20 20 20 20 20 20 44 75 6d 70 20 74 68  ...      Dump th
ca30: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 61 6e  e database in an
ca40: 20 53 51 4c 20 74 65 78 74 20 66 6f 72 6d 61 74   SQL text format
ca50: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69  If TABLE specifi
ca80: 65 64 2c 20 6f 6e 6c 79 20 64 75 6d 70 20 74 61  ed, only dump ta
ca90: 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22  bles matching\n"
caa0: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b               LIK
cac0: 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e  E pattern TABLE.
cad0: 5c 6e 22 0a 20 20 22 2e 65 63 68 6f 20 6f 6e 7c  \n".  ".echo on|
cae0: 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 54 75  off           Tu
caf0: 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20  rn command echo 
cb00: 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
cb10: 2e 65 71 70 20 6f 6e 7c 6f 66 66 20 20 20 20 20  .eqp on|off     
cb20: 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20 6f 72         Enable or
cb30: 20 64 69 73 61 62 6c 65 20 61 75 74 6f 6d 61 74   disable automat
cb40: 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ic EXPLAIN QUERY
cb50: 20 50 4c 41 4e 5c 6e 22 0a 20 20 22 2e 65 78 69   PLAN\n".  ".exi
cb60: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
cb70: 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f     Exit this pro
cb80: 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 6c  gram\n".  ".expl
cb90: 61 69 6e 20 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20  ain ?on|off?    
cba0: 20 20 54 75 72 6e 20 6f 75 74 70 75 74 20 6d 6f    Turn output mo
cbb0: 64 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  de suitable for 
cbc0: 45 58 50 4c 41 49 4e 20 6f 6e 20 6f 72 20 6f 66  EXPLAIN on or of
cbd0: 66 2e 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  f.\n".  "       
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbf0: 20 20 57 69 74 68 20 6e 6f 20 61 72 67 73 2c 20    With no args, 
cc00: 69 74 20 74 75 72 6e 73 20 45 58 50 4c 41 49 4e  it turns EXPLAIN
cc10: 20 6f 6e 2e 5c 6e 22 0a 20 20 22 2e 66 75 6c 6c   on.\n".  ".full
cc20: 73 63 68 65 6d 61 20 20 20 20 20 20 20 20 20 20  schema          
cc30: 20 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e    Show schema an
cc40: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
cc50: 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62   sqlite_stat tab
cc60: 6c 65 73 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65  les\n".  ".heade
cc70: 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  rs on|off       
cc80: 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66   Turn display of
cc90: 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f   headers on or o
cca0: 66 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20  ff\n".  ".help  
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 53 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61 67  Show this messag
ccd0: 65 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20  e\n".  ".import 
cce0: 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 49  FILE TABLE     I
ccf0: 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20  mport data from 
cd00: 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c  FILE into TABLE\
cd10: 6e 22 0a 20 20 22 2e 69 6e 64 69 63 65 73 20 3f  n".  ".indices ?
cd20: 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 68 6f  TABLE?       Sho
cd30: 77 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69  w names of all i
cd40: 6e 64 69 63 65 73 5c 6e 22 0a 20 20 22 20 20 20  ndices\n".  "   
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73        If TABLE s
cd70: 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73  pecified, only s
cd80: 68 6f 77 20 69 6e 64 69 63 65 73 20 66 6f 72 20  how indices for 
cd90: 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20  tables\n".  "   
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20 4c        matching L
cdc0: 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
cdd0: 45 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51 4c  E.\n".#ifdef SQL
cde0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
cdf0: 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46  CE.  ".iotrace F
ce00: 49 4c 45 20 20 20 20 20 20 20 20 20 20 45 6e 61  ILE          Ena
ce10: 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74  ble I/O diagnost
ce20: 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49  ic logging to FI
ce30: 4c 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 23 69 66  LE\n".#endif.#if
ce40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ce50: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
ce60: 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45    ".load FILE ?E
ce70: 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64 20 61  NTRY?     Load a
ce80: 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72  n extension libr
ce90: 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  ary\n".#endif.  
cea0: 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20  ".log FILE|off  
ceb0: 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67          Turn log
cec0: 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  ging on or off. 
ced0: 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64   FILE can be std
cee0: 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a 20 20  err/stdout\n".  
cef0: 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42  ".mode MODE ?TAB
cf00: 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75 74 70  LE?     Set outp
cf10: 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20 4d 4f  ut mode where MO
cf20: 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22  DE is one of:\n"
cf30: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73 76               csv
cf50: 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61        Comma-sepa
cf60: 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a  rated values\n".
cf70: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
cf90: 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65  mn   Left-aligne
cfa0: 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65  d columns.  (See
cfb0: 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20 22 20   .width)\n".  " 
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20 20 20          html    
cfe0: 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f   HTML <table> co
cff0: 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  de\n".  "       
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69    insert   SQL i
d020: 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  nsert statements
d030: 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20 20   for TABLE\n".  
d040: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
d050: 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 20 20            line  
d060: 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72     One value per
d070: 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20 20 20   line\n".  "    
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d090: 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 56 61       list     Va
d0a0: 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62  lues delimited b
d0b0: 79 20 2e 73 65 70 61 72 61 74 6f 72 20 73 74 72  y .separator str
d0c0: 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ing\n".  "      
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d     tabs     Tab-
d0f0: 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
d100: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73  tcl      TCL lis
d130: 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20 20  t elements\n".  
d140: 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49  ".nullvalue STRI
d150: 4e 47 20 20 20 20 20 20 55 73 65 20 53 54 52 49  NG      Use STRI
d160: 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e  NG in place of N
d170: 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20  ULL values\n".  
d180: 22 2e 6f 6e 63 65 20 46 49 4c 45 4e 41 4d 45 20  ".once FILENAME 
d190: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 66          Output f
d1a0: 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20  or the next SQL 
d1b0: 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20  command only to 
d1c0: 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e  FILENAME\n".  ".
d1d0: 6f 70 65 6e 20 3f 46 49 4c 45 4e 41 4d 45 3f 20  open ?FILENAME? 
d1e0: 20 20 20 20 20 20 43 6c 6f 73 65 20 65 78 69 73        Close exis
d1f0: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e  ting database an
d200: 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 4e 41 4d  d reopen FILENAM
d210: 45 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74 20  E\n".  ".output 
d220: 3f 46 49 4c 45 4e 41 4d 45 3f 20 20 20 20 20 53  ?FILENAME?     S
d230: 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49  end output to FI
d240: 4c 45 4e 41 4d 45 20 6f 72 20 73 74 64 6f 75 74  LENAME or stdout
d250: 5c 6e 22 0a 20 20 22 2e 70 72 69 6e 74 20 53 54  \n".  ".print ST
d260: 52 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20 50 72  RING...       Pr
d270: 69 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49  int literal STRI
d280: 4e 47 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74  NG\n".  ".prompt
d290: 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20   MAIN CONTINUE  
d2a0: 52 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e  Replace the stan
d2b0: 64 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a  dard prompts\n".
d2c0: 20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20    ".quit        
d2d0: 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74            Exit t
d2e0: 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20  his program\n". 
d2f0: 20 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45   ".read FILENAME
d300: 20 20 20 20 20 20 20 20 20 45 78 65 63 75 74 65           Execute
d310: 20 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45   SQL in FILENAME
d320: 5c 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72 65 20  \n".  ".restore 
d330: 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 52 65  ?DB? FILE     Re
d340: 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  store content of
d350: 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d   DB (default \"m
d360: 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45  ain\") from FILE
d370: 5c 6e 22 0a 20 20 22 2e 73 61 76 65 20 46 49 4c  \n".  ".save FIL
d380: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72  E             Wr
d390: 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  ite in-memory da
d3a0: 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45  tabase into FILE
d3b0: 5c 6e 22 0a 20 20 22 2e 73 63 61 6e 73 74 61 74  \n".  ".scanstat
d3c0: 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 54 75  s on|off      Tu
d3d0: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  rn sqlite3_stmt_
d3e0: 73 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65 74  scanstatus() met
d3f0: 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e  rics on or off\n
d400: 22 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 54 41  ".  ".schema ?TA
d410: 42 4c 45 3f 20 20 20 20 20 20 20 20 53 68 6f 77  BLE?        Show
d420: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
d430: 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 20 20 20  ements\n".  "   
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73        If TABLE s
d460: 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73  pecified, only s
d470: 68 6f 77 20 74 61 62 6c 65 73 20 6d 61 74 63 68  how tables match
d480: 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ing\n".  "      
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20     LIKE pattern 
d4b0: 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 73 65  TABLE.\n".  ".se
d4c0: 70 61 72 61 74 6f 72 20 53 54 52 49 4e 47 20 3f  parator STRING ?
d4d0: 4e 4c 3f 20 43 68 61 6e 67 65 20 73 65 70 61 72  NL? Change separ
d4e0: 61 74 6f 72 20 75 73 65 64 20 62 79 20 6f 75 74  ator used by out
d4f0: 70 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d  put mode and .im
d500: 70 6f 72 74 5c 6e 22 0a 20 20 22 20 20 20 20 20  port\n".  "     
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 4e 4c 20 69 73 20 74 68 65 20 65 6e      NL is the en
d530: 64 2d 6f 66 2d 6c 69 6e 65 20 6d 61 72 6b 20 66  d-of-line mark f
d540: 6f 72 20 43 53 56 5c 6e 22 0a 20 20 22 2e 73 68  or CSV\n".  ".sh
d550: 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  ell CMD ARGS... 
d560: 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53      Run CMD ARGS
d570: 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20  ... in a system 
d580: 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e 73 68 6f  shell\n".  ".sho
d590: 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
d5a0: 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72     Show the curr
d5b0: 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76  ent values for v
d5c0: 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 5c  arious settings\
d5d0: 6e 22 0a 20 20 22 2e 73 74 61 74 73 20 6f 6e 7c  n".  ".stats on|
d5e0: 6f 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72  off          Tur
d5f0: 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66  n stats on or of
d600: 66 5c 6e 22 0a 20 20 22 2e 73 79 73 74 65 6d 20  f\n".  ".system 
d610: 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 52  CMD ARGS...    R
d620: 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69  un CMD ARGS... i
d630: 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c  n a system shell
d640: 5c 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f  \n".  ".tables ?
d650: 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69  TABLE?        Li
d660: 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c  st names of tabl
d670: 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69    If TABLE speci
d6a0: 66 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20  fied, only list 
d6b0: 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c  tables matching\
d6c0: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
d6e0: 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
d6f0: 45 2e 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75  E.\n".  ".timeou
d700: 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20  t MS            
d710: 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b  Try opening lock
d720: 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53  ed tables for MS
d730: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22   milliseconds\n"
d740: 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66  .  ".timer on|of
d750: 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  f          Turn 
d760: 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20  SQL timer on or 
d770: 6f 66 66 5c 6e 22 0a 20 20 22 2e 74 72 61 63 65  off\n".  ".trace
d780: 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20   FILE|off       
d790: 20 4f 75 74 70 75 74 20 65 61 63 68 20 53 51 4c   Output each SQL
d7a0: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74   statement as it
d7b0: 20 69 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e 76   is run\n".  ".v
d7c0: 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20  fsname ?AUX?    
d7d0: 20 20 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e       Print the n
d7e0: 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 73  ame of the VFS s
d7f0: 74 61 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64 74  tack\n".  ".widt
d800: 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20  h NUM1 NUM2 ... 
d810: 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64    Set column wid
d820: 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e  ths for \"column
d830: 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20 20 22 20 20  \" mode\n".  "  
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 20 20 20 4e 65 67 61 74 69 76 65 20         Negative 
d860: 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73  values right-jus
d870: 74 69 66 79 5c 6e 22 0a 3b 0a 0a 2f 2a 20 46 6f  tify\n".;../* Fo
d880: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
d890: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
d8a0: 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c  ocess_input(Shel
d8b0: 6c 53 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20  lState *p, FILE 
d8c0: 2a 69 6e 29 3b 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  *in);./*.** Impl
d8d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
d8e0: 65 20 22 72 65 61 64 66 69 6c 65 28 58 29 22 20  e "readfile(X)" 
d8f0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
d900: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
d910: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65  t.** of the file
d920: 20 6e 61 6d 65 64 20 58 20 69 73 20 72 65 61 64   named X is read
d930: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 61 73   and returned as
d940: 20 61 20 42 4c 4f 42 2e 20 20 4e 55 4c 4c 20 69   a BLOB.  NULL i
d950: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66  s returned.** if
d960: 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
d970: 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73 20 75  ot exist or is u
d980: 6e 72 65 61 64 61 62 6c 65 2e 0a 2a 2f 0a 73 74  nreadable..*/.st
d990: 61 74 69 63 20 76 6f 69 64 20 72 65 61 64 66 69  atic void readfi
d9a0: 6c 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  leFunc(.  sqlite
d9b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
d9c0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
d9d0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
d9e0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
d9f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
da00: 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 6c 6f 6e   FILE *in;.  lon
da10: 67 20 6e 49 6e 3b 0a 20 20 76 6f 69 64 20 2a 70  g nIn;.  void *p
da20: 42 75 66 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20  Buf;..  zName = 
da30: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
da40: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
da50: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
da60: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
da70: 6e 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  n;.  in = fopen(
da80: 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20  zName, "rb");.  
da90: 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
daa0: 72 6e 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20  rn;.  fseek(in, 
dab0: 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  0, SEEK_END);.  
dac0: 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b  nIn = ftell(in);
dad0: 0a 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20  .  rewind(in);. 
dae0: 20 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f   pBuf = sqlite3_
daf0: 6d 61 6c 6c 6f 63 28 20 6e 49 6e 20 29 3b 0a 20  malloc( nIn );. 
db00: 20 69 66 28 20 70 42 75 66 20 26 26 20 31 3d 3d   if( pBuf && 1==
db10: 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c  fread(pBuf, nIn,
db20: 20 31 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 73   1, in) ){.    s
db30: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
db40: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 42 75 66  ob(context, pBuf
db50: 2c 20 6e 49 6e 2c 20 73 71 6c 69 74 65 33 5f 66  , nIn, sqlite3_f
db60: 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ree);.  }else{. 
db70: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
db80: 70 42 75 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c  pBuf);.  }.  fcl
db90: 6f 73 65 28 69 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ose(in);.}../*.*
dba0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
dbb0: 20 6f 66 20 74 68 65 20 22 77 72 69 74 65 66 69   of the "writefi
dbc0: 6c 65 28 58 2c 59 29 22 20 53 51 4c 20 66 75 6e  le(X,Y)" SQL fun
dbd0: 63 74 69 6f 6e 2e 20 20 54 68 65 20 61 72 67 75  ction.  The argu
dbe0: 6d 65 6e 74 20 59 0a 2a 2a 20 69 73 20 77 72 69  ment Y.** is wri
dbf0: 74 74 65 6e 20 69 6e 74 6f 20 66 69 6c 65 20 58  tten into file X
dc00: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
dc10: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 69   bytes written i
dc20: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 4f 72 0a  s returned.  Or.
dc30: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
dc40: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
dc50: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 73 75 63   goes wrong, suc
dc60: 68 20 61 73 20 62 65 69 6e 67 20 75 6e 61 62 6c  h as being unabl
dc70: 65 20 74 6f 20 6f 70 65 6e 0a 2a 2a 20 66 69 6c  e to open.** fil
dc80: 65 20 58 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  e X for writing.
dc90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dca0: 77 72 69 74 65 66 69 6c 65 46 75 6e 63 28 0a 20  writefileFunc(. 
dcb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
dcc0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
dcd0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
dce0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
dcf0: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20  .  FILE *out;.  
dd00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
dd10: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72   sqlite3_int64 r
dd20: 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
dd30: 2a 7a 46 69 6c 65 3b 0a 0a 20 20 7a 46 69 6c 65  *zFile;..  zFile
dd40: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
dd50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
dd60: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
dd70: 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 20 72 65  f( zFile==0 ) re
dd80: 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 6f  turn;.  out = fo
dd90: 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77 62 22 29  pen(zFile, "wb")
dda0: 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29  ;.  if( out==0 )
ddb0: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 28   return;.  z = (
ddc0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
ddd0: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
dde0: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[1]);.  if( z
ddf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
de00: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
de10: 72 63 20 3d 20 66 77 72 69 74 65 28 7a 2c 20 31  rc = fwrite(z, 1
de20: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
de30: 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 2c 20  bytes(argv[1]), 
de40: 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f  out);.  }.  fclo
de50: 73 65 28 6f 75 74 29 3b 0a 20 20 73 71 6c 69 74  se(out);.  sqlit
de60: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
de70: 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 7d 0a  context, rc);.}.
de80: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
de90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
dea0: 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73   open.  If it is
deb0: 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20   not, then open 
dec0: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64  it.  If.** the d
ded0: 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f  atabase fails to
dee0: 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20   open, print an 
def0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e  error message an
df00: 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  d exit..*/.stati
df10: 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53  c void open_db(S
df20: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
df30: 74 20 6b 65 65 70 41 6c 69 76 65 29 7b 0a 20 20  t keepAlive){.  
df40: 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
df50: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74      sqlite3_init
df60: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 73 71  ialize();.    sq
df70: 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44  lite3_open(p->zD
df80: 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
df90: 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 70 2d 3e  b);.    db = p->
dfa0: 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 20 26  db;.    if( db &
dfb0: 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
dfc0: 65 28 64 62 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e(db)==SQLITE_OK
dfd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
dfe0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
dff0: 6e 28 64 62 2c 20 22 73 68 65 6c 6c 73 74 61 74  n(db, "shellstat
e000: 69 63 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55  ic", 0, SQLITE_U
e010: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
e020: 20 20 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e    shellstaticFun
e030: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  c, 0, 0);.    }.
e040: 20 20 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c      if( db==0 ||
e050: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
e060: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 20  te3_errcode(db) 
e070: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
e080: 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
e090: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
e0a0: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
e0b0: 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
e0c0: 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
e0d0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
e0e0: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28  (db));.      if(
e0f0: 20 6b 65 65 70 41 6c 69 76 65 20 29 20 72 65 74   keepAlive ) ret
e100: 75 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28  urn;.      exit(
e110: 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  1);.    }.#ifnde
e120: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
e130: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
e140: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
e150: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
e160: 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66  ->db, 1);.#endif
e170: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
e180: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
e190: 20 22 72 65 61 64 66 69 6c 65 22 2c 20 31 2c 20   "readfile", 1, 
e1a0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
e1d0: 66 69 6c 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b  fileFunc, 0, 0);
e1e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
e1f0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
e200: 20 22 77 72 69 74 65 66 69 6c 65 22 2c 20 32 2c   "writefile", 2,
e210: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
e220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69               wri
e240: 74 65 66 69 6c 65 46 75 6e 63 2c 20 30 2c 20 30  tefileFunc, 0, 0
e250: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
e260: 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74  Do C-language st
e270: 79 6c 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a  yle dequoting..*
e280: 2a 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e  *.**    \t    ->
e290: 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20   tab.**    \n   
e2a0: 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20   -> newline.**  
e2b0: 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
e2c0: 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
e2d0: 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20   \"    -> ".**  
e2e0: 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69    \NNN  -> ascii
e2f0: 20 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69   character NNN i
e300: 6e 20 6f 63 74 61 6c 0a 2a 2a 20 20 20 20 5c 5c  n octal.**    \\
e310: 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68      -> backslash
e320: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e330: 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
e340: 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  hes(char *z){.  
e350: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
e360: 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   c;.  while( *z 
e370: 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b  && *z!='\\' ) z+
e380: 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
e390: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
e3a0: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, j++){.    if
e3b0: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
e3c0: 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
e3d0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6e 27 20       if( c=='n' 
e3e0: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
e3f0: 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \n';.      }else
e400: 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20   if( c=='t' ){. 
e410: 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b         c = '\t';
e420: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e430: 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20   c=='r' ){.     
e440: 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20     c = '\r';.   
e450: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
e460: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\\' ){.        
e470: 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20  c = '\\';.      
e480: 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30 27  }else if( c>='0'
e490: 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20   && c<='7' ){.  
e4a0: 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a        c -= '0';.
e4b0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
e4c0: 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31  1]>='0' && z[i+1
e4d0: 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  ]<='7' ){.      
e4e0: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
e4f0: 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20     c = (c<<3) + 
e500: 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  z[i] - '0';.    
e510: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
e520: 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c  >='0' && z[i+1]<
e530: 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
e540: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
e550: 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20       c = (c<<3) 
e560: 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20  + z[i] - '0';.  
e570: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e580: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e590: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a  }.    z[j] = c;.
e5a0: 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29 20    }.  if( j<i ) 
e5b0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  z[j] = 0;.}../*.
e5c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
e5d0: 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64 65 63  lue of a hexadec
e5e0: 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74  imal digit.  Ret
e5f0: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e  urn -1 if the in
e600: 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20  put.** is not a 
e610: 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74  hex digit..*/.st
e620: 61 74 69 63 20 69 6e 74 20 68 65 78 44 69 67 69  atic int hexDigi
e630: 74 56 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a  tValue(char c){.
e640: 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20    if( c>='0' && 
e650: 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20  c<='9' ) return 
e660: 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63  c - '0';.  if( c
e670: 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20  >='a' && c<='f' 
e680: 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27  ) return c - 'a'
e690: 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d   + 10;.  if( c>=
e6a0: 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20  'A' && c<='F' ) 
e6b0: 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b  return c - 'A' +
e6c0: 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31   10;.  return -1
e6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
e6e0: 70 72 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20  pret zArg as an 
e6f0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70  integer value, p
e700: 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73 75 66  ossibly with suf
e710: 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fixes..*/.static
e720: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
e730: 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73  ntegerValue(cons
e740: 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
e750: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76   sqlite3_int64 v
e760: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63   = 0;.  static c
e770: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 68  onst struct { ch
e780: 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74  ar *zSuffix; int
e790: 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b   iMult; } aMult[
e7a0: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42  ] = {.    { "KiB
e7b0: 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  ", 1024 },.    {
e7c0: 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32   "MiB", 1024*102
e7d0: 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22  4 },.    { "GiB"
e7e0: 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34  , 1024*1024*1024
e7f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20   },.    { "KB", 
e800: 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22   1000 },.    { "
e810: 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c  MB",  1000000 },
e820: 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30  .    { "GB",  10
e830: 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
e840: 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c  { "K",   1000 },
e850: 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30  .    { "M",   10
e860: 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22  00000 },.    { "
e870: 47 22 2c 20 20 20 31 30 30 30 30 30 30 30 30 30  G",   1000000000
e880: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
e890: 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20  ;.  int isNeg = 
e8a0: 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d  0;.  if( zArg[0]
e8b0: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e  =='-' ){.    isN
e8c0: 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67  eg = 1;.    zArg
e8d0: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ++;.  }else if( 
e8e0: 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a  zArg[0]=='+' ){.
e8f0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a      zArg++;.  }.
e900: 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
e910: 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27  0' && zArg[1]=='
e920: 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b  x' ){.    int x;
e930: 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a  .    zArg += 2;.
e940: 20 20 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20      while( (x = 
e950: 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41  hexDigitValue(zA
e960: 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20  rg[0]))>=0 ){.  
e970: 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b      v = (v<<4) +
e980: 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b   x;.      zArg++
e990: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
e9a0: 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69  .    while( IsDi
e9b0: 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a  git(zArg[0]) ){.
e9c0: 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b        v = v*10 +
e9d0: 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a   zArg[0] - '0';.
e9e0: 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20        zArg++;.  
e9f0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
ea00: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
ea10: 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Mult); i++){.   
ea20: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
ea30: 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53  icmp(aMult[i].zS
ea40: 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20  uffix, zArg)==0 
ea50: 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d  ){.      v *= aM
ea60: 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20  ult[i].iMult;.  
ea70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ea80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73  .  }.  return is
ea90: 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a  Neg? -v : v;.}..
eaa0: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
eab0: 7a 41 72 67 20 61 73 20 65 69 74 68 65 72 20 61  zArg as either a
eac0: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62  n integer or a b
ead0: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52  oolean value.  R
eae0: 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20  eturn 1 or 0.** 
eaf0: 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c  for TRUE and FAL
eb00: 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  SE.  Return the 
eb10: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 66  integer value if
eb20: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
eb30: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c  .static int bool
eb40: 65 61 6e 56 61 6c 75 65 28 63 68 61 72 20 2a 7a  eanValue(char *z
eb50: 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Arg){.  int i;. 
eb60: 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30   if( zArg[0]=='0
eb70: 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78  ' && zArg[1]=='x
eb80: 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32  ' ){.    for(i=2
eb90: 3b 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28  ; hexDigitValue(
eba0: 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b  zArg[i])>=0; i++
ebb0: 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ){}.  }else{.   
ebc0: 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69   for(i=0; zArg[i
ebd0: 5d 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69  ]>='0' && zArg[i
ebe0: 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20  ]<='9'; i++){}. 
ebf0: 20 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20   }.  if( i>0 && 
ec00: 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74  zArg[i]==0 ) ret
ec10: 75 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65  urn (int)(intege
ec20: 72 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30  rValue(zArg) & 0
ec30: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66  xffffffff);.  if
ec40: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
ec50: 70 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30  p(zArg, "on")==0
ec60: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
ec70: 63 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d  cmp(zArg,"yes")=
ec80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ec90: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
eca0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
ecb0: 72 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c  rg, "off")==0 ||
ecc0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
ecd0: 28 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29  (zArg,"no")==0 )
ece0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ecf0: 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 73 74    }.  fprintf(st
ed00: 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f  derr, "ERROR: No
ed10: 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  t a boolean valu
ed20: 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d  e: \"%s\". Assum
ed30: 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a  ing \"no\".\n",.
ed40: 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b            zArg);
ed50: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ed60: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
ed70: 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75  utput file, assu
ed80: 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73  ming it is not s
ed90: 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a  tderr or stdout.
eda0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
edb0: 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
edc0: 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28  (FILE *f){.  if(
edd0: 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20   f && f!=stdout 
ede0: 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20 66  && f!=stderr ) f
edf0: 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a  close(f);.}../*.
ee00: 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61  ** Try to open a
ee10: 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20  n output file.  
ee20: 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f   The names "stdo
ee30: 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72 22  ut" and "stderr"
ee40: 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a   are.** recogniz
ee50: 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69  ed and do the ri
ee60: 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c  ght thing.  NULL
ee70: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
ee80: 74 68 65 20 6f 75 74 70 75 74 20 0a 2a 2a 20 66  the output .** f
ee90: 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22  ilename is "off"
eea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45  ..*/.static FILE
eeb0: 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70   *output_file_op
eec0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
eed0: 46 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66  File){.  FILE *f
eee0: 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
eef0: 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d  File,"stdout")==
ef00: 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64  0 ){.    f = std
ef10: 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  out;.  }else if(
ef20: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22   strcmp(zFile, "
ef30: 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
ef40: 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20     f = stderr;. 
ef50: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
ef60: 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d  p(zFile, "off")=
ef70: 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b  =0 ){.    f = 0;
ef80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20  .  }else{.    f 
ef90: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
efa0: 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d  wb");.    if( f=
efb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
efc0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
efd0: 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
efe0: 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
eff0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
f000: 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn f;.}../*.*
f010: 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  * A routine for 
f020: 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20  handling output 
f030: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61  from sqlite3_tra
f040: 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ce()..*/.static 
f050: 76 6f 69 64 20 73 71 6c 5f 74 72 61 63 65 5f 63  void sql_trace_c
f060: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
f070: 72 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rg, const char *
f080: 7a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20  z){.  FILE *f = 
f090: 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20 69  (FILE*)pArg;.  i
f0a0: 66 28 20 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( f ){.    int 
f0b0: 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  i = (int)strlen(
f0c0: 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  z);.    while( i
f0d0: 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 3b  >0 && z[i-1]==';
f0e0: 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ i--; }.    
f0f0: 66 70 72 69 6e 74 66 28 66 2c 20 22 25 2e 2a 73  fprintf(f, "%.*s
f100: 3b 5c 6e 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d  ;\n", i, z);.  }
f110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f  .}../*.** A no-o
f120: 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  p routine that r
f130: 75 6e 73 20 77 69 74 68 20 74 68 65 20 22 2e 62  uns with the ".b
f140: 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63  reakpoint" doc-c
f150: 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20 69 73  ommand.  This is
f160: 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73 70 6f  .** a useful spo
f170: 74 20 74 6f 20 73 65 74 20 61 20 64 65 62 75 67  t to set a debug
f180: 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a  ger breakpoint..
f190: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
f1a0: 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  est_breakpoint(v
f1b0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
f1c0: 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20  nt nCall = 0;.  
f1d0: 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  nCall++;.}../*.*
f1e0: 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73 65 64  * An object used
f1f0: 20 74 6f 20 72 65 61 64 20 61 20 43 53 56 20 66   to read a CSV f
f200: 69 6c 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ile.*/.typedef s
f210: 74 72 75 63 74 20 43 53 56 52 65 61 64 65 72 20  truct CSVReader 
f220: 43 53 56 52 65 61 64 65 72 3b 0a 73 74 72 75 63  CSVReader;.struc
f230: 74 20 43 53 56 52 65 61 64 65 72 20 7b 0a 20 20  t CSVReader {.  
f240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
f250: 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
f260: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
f270: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20  .  FILE *in;    
f280: 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
f290: 68 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d  he CSV text from
f2a0: 20 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65   this input stre
f2b0: 61 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  am */.  char *z;
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f2d0: 63 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20  ccumulated text 
f2e0: 66 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20  for a field */. 
f2f0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
f300: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f310: 66 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a  f bytes in z */.
f320: 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20    int nAlloc;   
f330: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
f340: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d  llocated for z[]
f350: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b   */.  int nLine;
f360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
f370: 72 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  rent line number
f380: 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b   */.  int cTerm;
f390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
f3a0: 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
f3b0: 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20  inated the most 
f3c0: 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a  recent field */.
f3d0: 20 20 69 6e 74 20 63 53 65 70 61 72 61 74 6f 72    int cSeparator
f3e0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 70  ;     /* The sep
f3f0: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
f400: 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29  .  (Usually ",")
f410: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e   */.};../* Appen
f420: 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  d a single byte 
f430: 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63  to z[] */.static
f440: 20 76 6f 69 64 20 63 73 76 5f 61 70 70 65 6e 64   void csv_append
f450: 5f 63 68 61 72 28 43 53 56 52 65 61 64 65 72 20  _char(CSVReader 
f460: 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66  *p, int c){.  if
f470: 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c  ( p->n+1>=p->nAl
f480: 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41  loc ){.    p->nA
f490: 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f  lloc += p->nAllo
f4a0: 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e  c + 100;.    p->
f4b0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  z = sqlite3_real
f4c0: 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  loc(p->z, p->nAl
f4d0: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
f4e0: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  >z==0 ){.      f
f4f0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
f500: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
f510: 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  );.      exit(1)
f520: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
f530: 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68  >z[p->n++] = (ch
f540: 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64  ar)c;.}../* Read
f550: 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20   a single field 
f560: 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f  of CSV text.  Co
f570: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 72 66  mpatible with rf
f580: 63 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64  c4180 and extend
f590: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f  ed.** with the o
f5a0: 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20  ption of having 
f5b0: 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65  a separator othe
f5c0: 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a  r than ","..**.*
f5d0: 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d  *   +  Input com
f5e0: 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a  es from p->in..*
f5f0: 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73  *   +  Store res
f600: 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20  ults in p->z of 
f610: 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70  length p->n.  Sp
f620: 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a  ace to hold p->z
f630: 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66   comes.**      f
f640: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
f650: 6f 63 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  oc()..**   +  Us
f660: 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65  e p->cSep as the
f670: 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
f680: 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e   default is ",".
f690: 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72  .**   +  Keep tr
f6a0: 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20  ack of the line 
f6b0: 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69  number in p->nLi
f6c0: 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72  ne..**   +  Stor
f6d0: 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  e the character 
f6e0: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20  that terminates 
f6f0: 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e  the field in p->
f700: 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a  cTerm.  Store.**
f710: 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64        EOF on end
f720: 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b  -of-file..**   +
f730: 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20    Report syntax 
f740: 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72  errors on stderr
f750: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
f760: 2a 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69  *csv_read_one_fi
f770: 65 6c 64 28 43 53 56 52 65 61 64 65 72 20 2a 70  eld(CSVReader *p
f780: 29 7b 0a 20 20 69 6e 74 20 63 2c 20 70 63 2c 20  ){.  int c, pc, 
f790: 70 70 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20  ppc;.  int cSep 
f7a0: 3d 20 70 2d 3e 63 53 65 70 61 72 61 74 6f 72 3b  = p->cSeparator;
f7b0: 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63  .  p->n = 0;.  c
f7c0: 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
f7d0: 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c  .  if( c==EOF ||
f7e0: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29   seenInterrupt )
f7f0: 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  {.    p->cTerm =
f800: 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e   EOF;.    return
f810: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d   0;.  }.  if( c=
f820: 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='"' ){.    int 
f830: 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e  startLine = p->n
f840: 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51  Line;.    int cQ
f850: 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63  uote = c;.    pc
f860: 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20   = ppc = 0;.    
f870: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
f880: 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
f890: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  n);.      if( c=
f8a0: 3d 27 5c 6e 27 20 29 20 70 2d 3e 6e 4c 69 6e 65  ='\n' ) p->nLine
f8b0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
f8c0: 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20  =cQuote ){.     
f8d0: 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74     if( pc==cQuot
f8e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
f8f0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
f900: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
f910: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f920: 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20     if( (c==cSep 
f930: 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
f940: 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 27 5c 6e        || (c=='\n
f950: 27 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  ' && pc==cQuote)
f960: 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 27  .       || (c=='
f970: 5c 6e 27 20 26 26 20 70 63 3d 3d 27 5c 72 27 20  \n' && pc=='\r' 
f980: 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a  && ppc==cQuote).
f990: 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f         || (c==EO
f9a0: 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  F && pc==cQuote)
f9b0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
f9c0: 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77    do{ p->n--; }w
f9d0: 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d  hile( p->z[p->n]
f9e0: 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20  !=cQuote );.    
f9f0: 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63      p->cTerm = c
fa00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
fa10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
fa20: 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26  f( pc==cQuote &&
fa30: 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20   c!='\r' ){.    
fa40: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
fa50: 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73  rr, "%s:%d: unes
fa60: 63 61 70 65 64 20 25 63 20 63 68 61 72 61 63 74  caped %c charact
fa70: 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  er\n",.         
fa80: 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
fa90: 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74   p->nLine, cQuot
faa0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
fab0: 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a    if( c==EOF ){.
fac0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
fad0: 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
fae0: 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d  unterminated %c-
faf0: 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c  quoted field\n",
fb00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fb10: 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74   p->zFile, start
fb20: 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20  Line, cQuote);. 
fb30: 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20         p->cTerm 
fb40: 3d 20 45 4f 46 3b 0a 20 20 20 20 20 20 20 20 62  = EOF;.        b
fb50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
fb60: 20 20 20 20 63 73 76 5f 61 70 70 65 6e 64 5f 63      csv_append_c
fb70: 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
fb80: 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20   ppc = pc;.     
fb90: 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20   pc = c;.    }. 
fba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
fbb0: 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
fbc0: 63 53 65 70 20 26 26 20 63 21 3d 27 5c 6e 27 20  cSep && c!='\n' 
fbd0: 29 7b 0a 20 20 20 20 20 20 63 73 76 5f 61 70 70  ){.      csv_app
fbe0: 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
fbf0: 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
fc00: 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  p->in);.    }.  
fc10: 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b    if( c=='\n' ){
fc20: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b  .      p->nLine+
fc30: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
fc40: 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e  n>0 && p->z[p->n
fc50: 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e  -1]=='\r' ) p->n
fc60: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  --;.    }.    p-
fc70: 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a  >cTerm = c;.  }.
fc80: 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e    if( p->z ) p->
fc90: 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72  z[p->n] = 0;.  r
fca0: 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f  eturn p->z;.}../
fcb0: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e  *.** Try to tran
fcc0: 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74 61  sfer data for ta
fcd0: 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20  ble zTable.  If 
fce0: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
fcf0: 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67   while.** moving
fd00: 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f   forward, try to
fd10: 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20   go backwards.  
fd20: 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f  The backwards mo
fd30: 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20  vement won't.** 
fd40: 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54  work for WITHOUT
fd50: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a   ROWID tables..*
fd60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
fd70: 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20  yToCloneData(.  
fd80: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
fd90: 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
fda0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fdb0: 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74  Table.){.  sqlit
fdc0: 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20  e3_stmt *pQuery 
fdd0: 3d 20 30 3b 20 0a 20 20 73 71 6c 69 74 65 33 5f  = 0; .  sqlite3_
fde0: 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
fdf0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
fe00: 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  y = 0;.  char *z
fe10: 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e  Insert = 0;.  in
fe20: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
fe30: 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c  , n;.  int nTabl
fe40: 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
fe50: 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b  zTable);.  int k
fe60: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20   = 0;.  int cnt 
fe70: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  = 0;.  const int
fe80: 20 73 70 69 6e 52 61 74 65 20 3d 20 31 30 30 30   spinRate = 1000
fe90: 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73  0;..  zQuery = s
fea0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
feb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
fec0: 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  %w\"", zTable);.
fed0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
fee0: 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
fef0: 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
ff00: 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20  uery, 0);.  if( 
ff10: 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rc ){.    fprint
ff20: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
ff30: 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
ff40: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
ff50: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
ff60: 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
ff70: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
ff80: 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
ff90: 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
ffa0: 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
ffb0: 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  fer;.  }.  n = s
ffc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
ffd0: 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a  unt(pQuery);.  z
ffe0: 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Insert = sqlite3
fff0: 5f 6d 61 6c 6c 6f 63 28 32 30 30 20 2b 20 6e 54  _malloc(200 + nT
10000 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69  able + n*3);.  i
10010 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 7b  f( zInsert==0 ){
10020 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
10030 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  err, "out of mem
10040 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ory\n");.    got
10050 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b  o end_data_xfer;
10060 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
10070 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62  nprintf(200+nTab
10080 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20  le,zInsert,.    
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
100a0 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
100b0 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c   INTO \"%s\" VAL
100c0 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b  UES(?", zTable);
100d0 0a 20 20 69 20 3d 20 28 69 6e 74 29 73 74 72 6c  .  i = (int)strl
100e0 65 6e 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66  en(zInsert);.  f
100f0 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=1; j<n; j++
10100 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 49  ){.    memcpy(zI
10110 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32  nsert+i, ",?", 2
10120 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20  );.    i += 2;. 
10130 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73   }.  memcpy(zIns
10140 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b  ert+i, ");", 3);
10150 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10160 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77 44 62  prepare_v2(newDb
10170 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26  , zInsert, -1, &
10180 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 69  pInsert, 0);.  i
10190 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72  f( rc ){.    fpr
101a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
101b0 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
101c0 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
101d0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
101e0 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
101f0 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
10200 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  sg(newDb),.     
10210 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
10220 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
10230 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f  a_xfer;.  }.  fo
10240 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29  r(k=0; k<2; k++)
10250 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  {.    while( (rc
10260 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
10270 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
10280 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f  _ROW ){.      fo
10290 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
102a0 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
102b0 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
102c0 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29  _type(pQuery, i)
102d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
102e0 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
102f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
10300 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
10310 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20  pInsert, i+1);. 
10320 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
10330 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10340 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
10350 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
10360 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10370 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49  e3_bind_int64(pI
10380 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
10390 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
103a0 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
103b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
103c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
103d0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
103e0 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
103f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
10400 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65  ind_double(pInse
10410 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
10420 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
10430 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
10440 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10460 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
10470 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
10480 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
10490 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69  _text(pInsert, i
104a0 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
104d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
104e0 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  t(pQuery,i),.   
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51            -1, SQ
10510 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
10520 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10530 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10540 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
10550 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
10560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
10570 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
10580 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
10590 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72  olumn_blob(pQuer
105a0 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
105e0 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29  _bytes(pQuery,i)
105f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
10620 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
10630 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10640 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
10660 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * End for */.   
10670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10680 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
10690 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
106a0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
106b0 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d  LITE_ROW && rc!=
106c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
106d0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
106e0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64  tderr, "Error %d
106f0 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
10700 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
10710 65 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20  e(newDb),.      
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
10740 28 6e 65 77 44 62 29 29 3b 0a 20 20 20 20 20 20  (newDb));.      
10750 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
10760 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a  reset(pInsert);.
10770 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
10780 20 20 20 69 66 28 20 28 63 6e 74 25 73 70 69 6e     if( (cnt%spin
10790 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Rate)==0 ){.    
107a0 20 20 20 20 70 72 69 6e 74 66 28 22 25 63 5c 62      printf("%c\b
107b0 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74 2f  ", "|/-\\"[(cnt/
107c0 73 70 69 6e 52 61 74 65 29 25 34 5d 29 3b 0a 20  spinRate)%4]);. 
107d0 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74         fflush(st
107e0 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dout);.      }. 
107f0 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68 69 6c     } /* End whil
10800 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  e */.    if( rc=
10810 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 62  =SQLITE_DONE ) b
10820 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  reak;.    sqlite
10830 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
10840 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  y);.    sqlite3_
10850 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20  free(zQuery);.  
10860 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
10870 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
10880 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
10890 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20   ORDER BY rowid 
108a0 44 45 53 43 3b 22 2c 0a 20 20 20 20 20 20 20 20  DESC;",.        
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 20 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a 20 20       zTable);.  
108d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
108e0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
108f0 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
10900 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  uery, 0);.    if
10910 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 70  ( rc ){.      fp
10920 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
10930 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73  arning: cannot s
10940 74 65 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77  tep \"%s\" backw
10950 61 72 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  ards", zTable);.
10960 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10970 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f   }.  } /* End fo
10980 72 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e  r(k=0...) */..en
10990 64 5f 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73  d_data_xfer:.  s
109a0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
109b0 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  pQuery);.  sqlit
109c0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73  e3_finalize(pIns
109d0 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ert);.  sqlite3_
109e0 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20  free(zQuery);.  
109f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e  sqlite3_free(zIn
10a00 73 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  sert);.}.../*.**
10a10 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72   Try to transfer
10a20 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
10a30 20 73 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74   schema that mat
10a40 63 68 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a  ch zWhere.  For.
10a50 2a 2a 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76  ** each row, inv
10a60 6f 6b 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f  oke xForEach() o
10a70 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66  n the object def
10a80 69 6e 65 64 20 62 79 20 74 68 61 74 20 72 6f 77  ined by that row
10a90 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
10aa0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
10ab0 77 68 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72  while moving for
10ac0 77 61 72 64 20 74 68 72 6f 75 67 68 20 74 68 65  ward through the
10ad0 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  .** sqlite_maste
10ae0 72 20 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61  r table, try aga
10af0 69 6e 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61  in moving backwa
10b00 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rds..*/.static v
10b10 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63  oid tryToCloneSc
10b20 68 65 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61  hema(.  ShellSta
10b30 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33  te *p,.  sqlite3
10b40 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74   *newDb,.  const
10b50 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20   char *zWhere,. 
10b60 20 76 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68   void (*xForEach
10b70 29 28 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71  )(ShellState*,sq
10b80 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61  lite3*,const cha
10b90 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  r*).){.  sqlite3
10ba0 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20  _stmt *pQuery = 
10bb0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
10bc0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
10bd0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
10be0 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  d char *zName;. 
10bf0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
10c00 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
10c10 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
10c20 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c  ..  zQuery = sql
10c30 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
10c40 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46  LECT name, sql F
10c50 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
10c60 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
10c80 57 48 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72  WHERE %s", zWher
10c90 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
10ca0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
10cb0 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
10cc0 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
10cd0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70  if( rc ){.    fp
10ce0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
10cf0 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e  rror: (%d) %s on
10d00 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10d20 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
10d30 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
10d40 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
10d50 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
10d60 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
10d70 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
10d80 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d  schema_xfer;.  }
10d90 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20  .  while( (rc = 
10da0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75  sqlite3_step(pQu
10db0 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ery))==SQLITE_RO
10dc0 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  W ){.    zName =
10dd0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10de0 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b  text(pQuery, 0);
10df0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
10e00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
10e10 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20  pQuery, 1);.    
10e20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c  printf("%s... ",
10e30 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28   zName); fflush(
10e40 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c  stdout);.    sql
10e50 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
10e60 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53   (const char*)zS
10e70 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d  ql, 0, 0, &zErrM
10e80 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  sg);.    if( zEr
10e90 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70  rMsg ){.      fp
10ea0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
10eb0 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
10ec0 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
10ed0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
10ee0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
10ef0 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
10f00 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
10f10 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
10f20 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
10f30 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
10f40 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
10f50 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
10f60 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
10f70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10f80 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
10f90 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
10fa0 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
10fb0 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
10fc0 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
10fd0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
10fe0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
10ff0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
11000 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
11030 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
11040 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
11050 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
11060 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
11070 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
11080 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
11090 63 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  c ){.      fprin
110a0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
110b0 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25  r: (%d) %s on [%
110c0 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
110e0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
110f0 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
11100 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
11110 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
11120 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
11130 79 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  y);.      goto e
11140 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a  nd_schema_xfer;.
11150 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
11160 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73   (rc = sqlite3_s
11170 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51  tep(pQuery))==SQ
11180 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
11190 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
111a0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
111b0 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  uery, 0);.      
111c0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  zSql = sqlite3_c
111d0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
111e0 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 72 69  y, 1);.      pri
111f0 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e  ntf("%s... ", zN
11200 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64  ame); fflush(std
11210 6f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  out);.      sqli
11220 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
11230 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71  (const char*)zSq
11240 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73  l, 0, 0, &zErrMs
11250 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45  g);.      if( zE
11260 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
11270 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
11280 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c   "Error: %s\nSQL
11290 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d  : [%s]\n", zErrM
112a0 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  sg, zSql);.     
112b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
112c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
112d0 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
112e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
112f0 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20   xForEach ){.   
11300 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c       xForEach(p,
11310 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63   newDb, (const c
11320 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20  har*)zName);.   
11330 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
11340 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20  f("done\n");.   
11350 20 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d   }.  }.end_schem
11360 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65  a_xfer:.  sqlite
11370 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
11380 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  y);.  sqlite3_fr
11390 65 65 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f  ee(zQuery);.}../
113a0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
113b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
113c0 6d 65 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54  med "zNewDb".  T
113d0 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73  ry to recover as
113e0 20 6d 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f   much informatio
113f0 6e 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65  n.** as possible
11400 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
11410 20 64 61 74 61 62 61 73 65 20 28 77 68 69 63 68   database (which
11420 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70   might be corrup
11430 74 29 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a  t) and write it.
11440 2a 2a 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a  ** into zNewDb..
11450 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
11460 72 79 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53  ryToClone(ShellS
11470 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
11480 68 61 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20  har *zNewDb){.  
11490 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
114a0 33 20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20  3 *newDb = 0;.  
114b0 69 66 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44  if( access(zNewD
114c0 62 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  b,0)==0 ){.    f
114d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
114e0 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72 65  File \"%s\" alre
114f0 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20  ady exists.\n", 
11500 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72 65 74  zNewDb);.    ret
11510 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
11520 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65  sqlite3_open(zNe
11530 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20  wDb, &newDb);.  
11540 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70  if( rc ){.    fp
11550 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
11560 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74  annot create out
11570 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73  put database: %s
11580 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11590 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
115a0 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65  newDb));.  }else
115b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
115c0 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
115d0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
115e0 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  a=ON;", 0, 0, 0)
115f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
11600 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e  ec(newDb, "BEGIN
11610 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c   EXCLUSIVE;", 0,
11620 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54   0, 0);.    tryT
11630 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
11640 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61  newDb, "type='ta
11650 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e  ble'", tryToClon
11660 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54  eData);.    tryT
11670 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
11680 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74  newDb, "type!='t
11690 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20  able'", 0);.    
116a0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
116b0 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30  Db, "COMMIT;", 0
116c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
116d0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
116e0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
116f0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
11700 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
11710 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65  sqlite3_close(ne
11720 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  wDb);.}../*.** C
11730 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74  hange the output
11740 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74   file back to st
11750 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
11760 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74  oid output_reset
11770 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
11780 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c  .  if( p->outfil
11790 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 20 20 20  e[0]=='|' ){.   
117a0 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b   pclose(p->out);
117b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75  .  }else{.    ou
117c0 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28  tput_file_close(
117d0 70 2d 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 70  p->out);.  }.  p
117e0 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30  ->outfile[0] = 0
117f0 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64  ;.  p->out = std
11800 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  out;.}../*.** If
11810 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62   an input line b
11820 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74  egins with "." t
11830 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  hen invoke this 
11840 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72  routine to.** pr
11850 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e  ocess that line.
11860 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
11870 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65  on error, 2 to e
11880 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72  xit, and 0 other
11890 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
118a0 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  int do_meta_comm
118b0 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  and(char *zLine,
118c0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b   ShellState *p){
118d0 0a 20 20 69 6e 74 20 69 20 3d 20 31 3b 0a 20 20  .  int i = 1;.  
118e0 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20  int nArg = 0;.  
118f0 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20  int n, c;.  int 
11900 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rc = 0;.  char *
11910 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f 2a  azArg[50];..  /*
11920 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74   Parse the input
11930 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e   line into token
11940 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
11950 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 6e 41 72   zLine[i] && nAr
11960 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72  g<ArraySize(azAr
11970 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  g) ){.    while(
11980 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 69   IsSpace(zLine[i
11990 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
119a0 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 30   if( zLine[i]==0
119b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
119c0 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 27 27  ( zLine[i]=='\''
119d0 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 22   || zLine[i]=='"
119e0 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ' ){.      int d
119f0 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 69 2b 2b  elim = zLine[i++
11a00 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  ];.      azArg[n
11a10 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
11a20 69 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  i];.      while(
11a30 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69   zLine[i] && zLi
11a40 6e 65 5b 69 5d 21 3d 64 65 6c 69 6d 20 29 7b 20  ne[i]!=delim ){ 
11a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69  .        if( zLi
11a60 6e 65 5b 69 5d 3d 3d 27 5c 5c 27 20 26 26 20 64  ne[i]=='\\' && d
11a70 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69  elim=='"' && zLi
11a80 6e 65 5b 69 2b 31 5d 21 3d 30 20 29 20 69 2b 2b  ne[i+1]!=0 ) i++
11a90 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 20 0a  ;.        i++; .
11aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11ab0 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 64 65 6c 69  ( zLine[i]==deli
11ac0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  m ){.        zLi
11ad0 6e 65 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  ne[i++] = 0;.   
11ae0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
11af0 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f  elim=='"' ) reso
11b00 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
11b10 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a  azArg[nArg-1]);.
11b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11b30 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d   azArg[nArg++] =
11b40 20 26 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20   &zLine[i];.    
11b50 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69    while( zLine[i
11b60 5d 20 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c  ] && !IsSpace(zL
11b70 69 6e 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  ine[i]) ){ i++; 
11b80 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  }.      if( zLin
11b90 65 5b 69 5d 20 29 20 7a 4c 69 6e 65 5b 69 2b 2b  e[i] ) zLine[i++
11ba0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73  ] = 0;.      res
11bb0 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
11bc0 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b  (azArg[nArg-1]);
11bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11be0 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70   Process the inp
11bf0 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  ut line..  */.  
11c00 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65  if( nArg==0 ) re
11c10 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f  turn 0; /* no to
11c20 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a  kens, no error *
11c30 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  /.  n = strlen30
11c40 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20  (azArg[0]);.  c 
11c50 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20  = azArg[0][0];. 
11c60 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20   if( (c=='b' && 
11c70 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
11c80 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75  azArg[0], "backu
11c90 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c  p", n)==0).   ||
11ca0 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33   (c=='s' && n>=3
11cb0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
11cc0 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29  g[0], "save", n)
11cd0 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ==0).  ){.    co
11ce0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
11cf0 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ile = 0;.    con
11d00 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
11d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
11d20 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Dest;.    sqlite
11d30 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
11d40 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  p;.    int j;.  
11d50 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72    for(j=1; j<nAr
11d60 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; j++){.      c
11d70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
11d80 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  zArg[j];.      i
11d90 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
11da0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
11db0 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [0]=='-' ) z++;.
11dc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70          /* No op
11dd0 74 69 6f 6e 73 20 74 6f 20 70 72 6f 63 65 73 73  tions to process
11de0 20 61 74 20 74 68 69 73 20 74 69 6d 65 20 2a 2f   at this time */
11df0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
11e00 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
11e10 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
11e20 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41  tion: %s\n", azA
11e30 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[j]);.        
11e40 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
11e50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
11e60 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d  e if( zDestFile=
11e70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
11e80 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  estFile = azArg[
11e90 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  j];.      }else 
11ea0 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
11eb0 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44 65 73        zDb = zDes
11ec0 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a  tFile;.        z
11ed0 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67  DestFile = azArg
11ee0 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [j];.      }else
11ef0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
11f00 66 28 73 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d  f(stderr, "too m
11f10 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  any arguments to
11f20 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20   .backup\n");.  
11f30 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
11f40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11f50 20 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d    if( zDestFile=
11f60 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
11f70 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73  ntf(stderr, "mis
11f80 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72  sing FILENAME ar
11f90 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75  gument on .backu
11fa0 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  p\n");.      ret
11fb0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
11fc0 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44   if( zDb==0 ) zD
11fd0 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
11fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
11ff0 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44  n(zDestFile, &pD
12000 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  est);.    if( rc
12010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12020 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
12030 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
12040 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
12050 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a  n", zDestFile);.
12060 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
12070 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
12080 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
12090 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
120a0 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70   0);.    pBackup
120b0 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
120c0 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d  p_init(pDest, "m
120d0 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62  ain", p->db, zDb
120e0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
120f0 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  up==0 ){.      f
12100 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
12110 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
12120 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
12130 73 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  st));.      sqli
12140 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
12150 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
12160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
12170 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65  e(  (rc = sqlite
12180 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42  3_backup_step(pB
12190 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c  ackup,100))==SQL
121a0 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73  ITE_OK ){}.    s
121b0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
121c0 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
121d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
121e0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
121f0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
12200 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
12210 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
12220 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
12230 65 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a  errmsg(pDest));.
12240 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
12250 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
12260 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
12270 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
12280 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
12290 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
122a0 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29   "bail", n)==0 )
122b0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
122c0 32 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f  2 ){.      bail_
122d0 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65  on_error = boole
122e0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
122f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12300 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
12310 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69  rr, "Usage: .bai
12320 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  l on|off\n");.  
12330 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
12340 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  }.  }else..  /* 
12350 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64  The undocumented
12360 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63   ".breakpoint" c
12370 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20  ommand causes a 
12380 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f  call to the no-o
12390 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e  p.  ** routine n
123a0 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70  amed test_breakp
123b0 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69  oint()..  */.  i
123c0 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
123d0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
123e0 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69  rg[0], "breakpoi
123f0 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
12400 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e    test_breakpoin
12410 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  t();.  }else..  
12420 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74  if( c=='c' && st
12430 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
12440 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29  "clone", n)==0 )
12450 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
12460 32 20 29 7b 0a 20 20 20 20 20 20 74 72 79 54 6f  2 ){.      tryTo
12470 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31  Clone(p, azArg[1
12480 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
12490 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
124a0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c  err, "Usage: .cl
124b0 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29  one FILENAME\n")
124c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
124d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
124e0 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
124f0 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
12500 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73  Arg[0], "databas
12510 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
12520 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
12530 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
12540 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70  rMsg = 0;.    op
12550 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
12560 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
12570 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
12580 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
12590 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 64 61  ader = 1;.    da
125a0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  ta.mode = MODE_C
125b0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 64 61 74 61 2e  olumn;.    data.
125c0 63 6f 6c 57 69 64 74 68 5b 30 5d 20 3d 20 33 3b  colWidth[0] = 3;
125d0 0a 20 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64  .    data.colWid
125e0 74 68 5b 31 5d 20 3d 20 31 35 3b 0a 20 20 20 20  th[1] = 15;.    
125f0 64 61 74 61 2e 63 6f 6c 57 69 64 74 68 5b 32 5d  data.colWidth[2]
12600 20 3d 20 35 38 3b 0a 20 20 20 20 64 61 74 61 2e   = 58;.    data.
12610 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  cnt = 0;.    sql
12620 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
12630 20 22 50 52 41 47 4d 41 20 64 61 74 61 62 61 73   "PRAGMA databas
12640 65 5f 6c 69 73 74 3b 20 22 2c 20 63 61 6c 6c 62  e_list; ", callb
12650 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
12660 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
12670 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
12680 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
12690 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
126a0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
126b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
126c0 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
126d0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
126e0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26  ..  if( c=='d' &
126f0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
12700 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d  0], "dump", n)==
12710 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
12720 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 57  (p, 0);.    /* W
12730 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
12740 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65 20 63   a "dump", the c
12750 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61 70 70  ontent might app
12760 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65 72 0a  ear in an order.
12770 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63 61 75      ** which cau
12780 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  ses immediate fo
12790 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
127a0 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f 6c  aints to be viol
127b0 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f 20  ated..    ** So 
127c0 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67 6e 2d  disable foreign-
127d0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  key constraint e
127e0 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70 72  nforcement to pr
127f0 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e 20  event problems. 
12800 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  */.    if( nArg!
12810 3d 31 20 26 26 20 6e 41 72 67 21 3d 32 20 29 7b  =1 && nArg!=2 ){
12820 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
12830 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
12840 64 75 6d 70 20 3f 4c 49 4b 45 2d 50 41 54 54 45  dump ?LIKE-PATTE
12850 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  RN?\n");.      r
12860 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
12870 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
12880 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  xit;.    }.    f
12890 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
128a0 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
128b0 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20  eys=OFF;\n");.  
128c0 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
128d0 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43  , "BEGIN TRANSAC
128e0 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70  TION;\n");.    p
128f0 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
12900 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
12910 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
12920 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50  AVEPOINT dump; P
12930 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
12940 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c  chema=ON", 0, 0,
12950 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72   0);.    p->nErr
12960 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
12970 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg==1 ){.      r
12980 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
12990 75 65 72 79 28 70 2c 20 0a 20 20 20 20 20 20 20  uery(p, .       
129a0 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
129b0 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
129c0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
129d0 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
129e0 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
129f0 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  pe=='table' AND 
12a00 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65  name!='sqlite_se
12a10 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29  quence'".      )
12a20 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65  ;.      run_sche
12a30 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  ma_dump_query(p,
12a40 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43   .        "SELEC
12a50 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
12a60 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
12a70 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
12a80 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c  WHERE name=='sql
12a90 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
12aa0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75       );.      ru
12ab0 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
12ac0 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
12ad0 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
12ae0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
12af0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
12b00 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
12b10 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c  ype IN ('index',
12b20 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27  'trigger','view'
12b30 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  )", 0.      );. 
12b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b50 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
12b60 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
12b70 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 68 65  +){.        zShe
12b80 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67  llStatic = azArg
12b90 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 72 75 6e  [i];.        run
12ba0 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
12bb0 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 20 20  ry(p,.          
12bc0 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
12bd0 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
12be0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
12bf0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62         "WHERE tb
12c00 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c  l_name LIKE shel
12c10 6c 73 74 61 74 69 63 28 29 20 41 4e 44 20 74 79  lstatic() AND ty
12c20 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20 20  pe=='table'".   
12c30 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71         "  AND sq
12c40 6c 20 4e 4f 54 20 4e 55 4c 4c 22 29 3b 0a 20 20  l NOT NULL");.  
12c50 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f        run_table_
12c60 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
12c70 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
12c80 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
12c90 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
12ca0 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
12cb0 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
12cc0 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e    "  AND type IN
12cd0 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
12ce0 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  er','view')".   
12cf0 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62         "  AND tb
12d00 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c  l_name LIKE shel
12d10 6c 73 74 61 74 69 63 28 29 22 2c 20 30 0a 20 20  lstatic()", 0.  
12d20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
12d30 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20   zShellStatic = 
12d40 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
12d50 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74  .    if( p->writ
12d60 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20  ableSchema ){.  
12d70 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
12d80 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
12d90 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
12da0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
12db0 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
12dc0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
12dd0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
12de0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
12df0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
12e00 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
12e10 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
12e20 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b  , "RELEASE dump;
12e30 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
12e40 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
12e50 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f 4c 4c   p->nErr ? "ROLL
12e60 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20  BACK; -- due to 
12e70 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43 4f 4d  errors\n" : "COM
12e80 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  MIT;\n");.  }els
12e90 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  e..  if( c=='e' 
12ea0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
12eb0 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d  [0], "echo", n)=
12ec0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
12ed0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70  rg==2 ){.      p
12ee0 2d 3e 65 63 68 6f 4f 6e 20 3d 20 62 6f 6f 6c 65  ->echoOn = boole
12ef0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
12f00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12f10 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
12f20 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 63 68  rr, "Usage: .ech
12f30 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  o on|off\n");.  
12f40 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
12f50 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
12f60 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
12f70 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71  mp(azArg[0], "eq
12f80 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
12f90 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
12fa0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
12fb0 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
12fc0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
12fd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
12fe0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
12ff0 67 65 3a 20 2e 65 71 70 20 6f 6e 7c 6f 66 66 5c  ge: .eqp on|off\
13000 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
13010 31 3b 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 65  1;.    }   .  }e
13020 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
13030 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
13040 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e  rg[0], "exit", n
13050 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
13060 6e 41 72 67 3e 31 20 26 26 20 28 72 63 20 3d 20  nArg>1 && (rc = 
13070 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
13080 65 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20  e(azArg[1]))!=0 
13090 29 20 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20  ) exit(rc);.    
130a0 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a  rc = 2;.  }else.
130b0 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
130c0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
130d0 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29  ], "explain", n)
130e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  ==0 ){.    int v
130f0 61 6c 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 62  al = nArg>=2 ? b
13100 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
13110 67 5b 31 5d 29 20 3a 20 31 3b 0a 20 20 20 20 69  g[1]) : 1;.    i
13120 66 28 76 61 6c 20 3d 3d 20 31 29 20 7b 0a 20 20  f(val == 1) {.  
13130 20 20 20 20 69 66 28 21 70 2d 3e 6e 6f 72 6d 61      if(!p->norma
13140 6c 4d 6f 64 65 2e 76 61 6c 69 64 29 20 7b 0a 20  lMode.valid) {. 
13150 20 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c         p->normal
13160 4d 6f 64 65 2e 76 61 6c 69 64 20 3d 20 31 3b 0a  Mode.valid = 1;.
13170 20 20 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61          p->norma
13180 6c 4d 6f 64 65 2e 6d 6f 64 65 20 3d 20 70 2d 3e  lMode.mode = p->
13190 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 70 2d  mode;.        p-
131a0 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e 73 68 6f 77  >normalMode.show
131b0 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77  Header = p->show
131c0 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20  Header;.        
131d0 6d 65 6d 63 70 79 28 70 2d 3e 6e 6f 72 6d 61 6c  memcpy(p->normal
131e0 4d 6f 64 65 2e 63 6f 6c 57 69 64 74 68 2c 70 2d  Mode.colWidth,p-
131f0 3e 63 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66  >colWidth,sizeof
13200 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a  (p->colWidth));.
13210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
13220 20 57 65 20 63 6f 75 6c 64 20 70 75 74 20 74 68   We could put th
13230 69 73 20 63 6f 64 65 20 75 6e 64 65 72 20 74 68  is code under th
13240 65 20 21 70 2d 3e 65 78 70 6c 61 69 6e 56 61 6c  e !p->explainVal
13250 69 64 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 64  id.      ** cond
13260 69 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74  ition so that it
13270 20 64 6f 65 73 20 6e 6f 74 20 65 78 65 63 75 74   does not execut
13280 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  e if we are alre
13290 61 64 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ady in.      ** 
132a0 65 78 70 6c 61 69 6e 20 6d 6f 64 65 2e 20 48 6f  explain mode. Ho
132b0 77 65 76 65 72 2c 20 61 6c 77 61 79 73 20 65 78  wever, always ex
132c0 65 63 75 74 69 6e 67 20 69 74 20 61 6c 6c 6f 77  ecuting it allow
132d0 73 20 75 73 20 61 6e 20 65 61 73 79 0a 20 20 20  s us an easy.   
132e0 20 20 20 2a 2a 20 77 61 73 20 74 6f 20 72 65 73     ** was to res
132f0 65 74 20 74 6f 20 65 78 70 6c 61 69 6e 20 6d 6f  et to explain mo
13300 64 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 75  de in case the u
13310 73 65 72 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ser previously. 
13320 20 20 20 20 20 2a 2a 20 64 69 64 20 61 6e 20 2e       ** did an .
13330 65 78 70 6c 61 69 6e 20 66 6f 6c 6c 6f 77 65 64  explain followed
13340 20 62 79 20 61 20 2e 77 69 64 74 68 2c 20 2e 6d   by a .width, .m
13350 6f 64 65 20 6f 72 20 2e 68 65 61 64 65 72 0a 20  ode or .header. 
13360 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e       ** command.
13370 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13380 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  p->mode = MODE_E
13390 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d  xplain;.      p-
133a0 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b  >showHeader = 1;
133b0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  .      memset(p-
133c0 3e 63 6f 6c 57 69 64 74 68 2c 30 2c 73 69 7a 65  >colWidth,0,size
133d0 6f 66 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29  of(p->colWidth))
133e0 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69  ;.      p->colWi
133f0 64 74 68 5b 30 5d 20 3d 20 34 3b 20 20 20 20 20  dth[0] = 4;     
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13410 61 64 64 72 20 2a 2f 0a 20 20 20 20 20 20 70 2d  addr */.      p-
13420 3e 63 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20 31  >colWidth[1] = 1
13430 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
13440 20 20 20 2f 2a 20 6f 70 63 6f 64 65 20 2a 2f 0a     /* opcode */.
13450 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74        p->colWidt
13460 68 5b 32 5d 20 3d 20 34 3b 20 20 20 20 20 20 20  h[2] = 4;       
13470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
13480 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c   */.      p->col
13490 57 69 64 74 68 5b 33 5d 20 3d 20 34 3b 20 20 20  Width[3] = 4;   
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
134b0 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 2d  * P2 */.      p-
134c0 3e 63 6f 6c 57 69 64 74 68 5b 34 5d 20 3d 20 34  >colWidth[4] = 4
134d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
134e0 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
134f0 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 35 5d    p->colWidth[5]
13500 20 3d 20 31 33 3b 20 20 20 20 20 20 20 20 20 20   = 13;          
13510 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
13520 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74        p->colWidt
13530 68 5b 36 5d 20 3d 20 32 3b 20 20 20 20 20 20 20  h[6] = 2;       
13540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35             /* P5
13550 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c   */.      p->col
13560 57 69 64 74 68 5b 37 5d 20 3d 20 31 33 3b 20 20  Width[7] = 13;  
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20  /* Comment */.  
13590 20 20 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e 6e    }else if (p->n
135a0 6f 72 6d 61 6c 4d 6f 64 65 2e 76 61 6c 69 64 29  ormalMode.valid)
135b0 20 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d   {.      p->norm
135c0 61 6c 4d 6f 64 65 2e 76 61 6c 69 64 20 3d 20 30  alMode.valid = 0
135d0 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  ;.      p->mode 
135e0 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e  = p->normalMode.
135f0 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mode;.      p->s
13600 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 6e  howHeader = p->n
13610 6f 72 6d 61 6c 4d 6f 64 65 2e 73 68 6f 77 48 65  ormalMode.showHe
13620 61 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ader;.      memc
13630 70 79 28 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 70  py(p->colWidth,p
13640 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e 63 6f 6c  ->normalMode.col
13650 57 69 64 74 68 2c 73 69 7a 65 6f 66 28 70 2d 3e  Width,sizeof(p->
13660 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20 20 20  colWidth));.    
13670 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
13680 20 63 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63   c=='f' && strnc
13690 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75  mp(azArg[0], "fu
136a0 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30  llschema", n)==0
136b0 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61   ){.    ShellSta
136c0 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  te data;.    cha
136d0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
136e0 20 20 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20      int doStats 
136f0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 0;.    if( nAr
13700 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  g!=1 ){.      fp
13710 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
13720 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d  sage: .fullschem
13730 61 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  a\n");.      rc 
13740 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
13750 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
13760 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  t;.    }.    ope
13770 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
13780 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c  memcpy(&data, p,
13790 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a   sizeof(data));.
137a0 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
137b0 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74  der = 0;.    dat
137c0 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65  a.mode = MODE_Se
137d0 6d 69 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  mi;.    rc = sql
137e0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
137f0 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
13800 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20  sql FROM".      
13810 20 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20   "  (SELECT sql 
13820 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20  sql, type type, 
13830 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d  tbl_name tbl_nam
13840 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f  e, name name, ro
13850 77 69 64 20 78 22 0a 20 20 20 20 20 20 20 22 20  wid x".       " 
13860 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f      FROM sqlite_
13870 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c  master UNION ALL
13880 22 0a 20 20 20 20 20 20 20 22 20 20 20 53 45 4c  ".       "   SEL
13890 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74  ECT sql, type, t
138a0 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
138b0 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65  owid FROM sqlite
138c0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a  _temp_master) ".
138d0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
138e0 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73  pe!='meta' AND s
138f0 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e  ql NOTNULL AND n
13900 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
13910 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20  lite_%' ".      
13920 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
13930 22 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61  ",.       callba
13940 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
13950 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Msg.    );.    i
13960 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13970 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13980 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
13990 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
139a0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
139b0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
139c0 20 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64     "SELECT rowid
139d0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
139e0 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
139f0 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
13a00 20 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74   GLOB 'sqlite_st
13a10 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20  at[134]'",.     
13a20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
13a30 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
13a40 64 6f 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65  doStats = sqlite
13a50 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
13a60 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20  QLITE_ROW;.     
13a70 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
13a80 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  e(pStmt);.    }.
13a90 20 20 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d      if( doStats=
13aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
13ab0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20  ntf(p->out, "/* 
13ac0 4e 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20 61  No STAT tables a
13ad0 76 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b  vailable */\n");
13ae0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13af0 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
13b00 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  , "ANALYZE sqlit
13b10 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20  e_master;\n");. 
13b20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
13b30 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  c(p->db, "SELECT
13b40 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   'ANALYZE sqlite
13b50 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20 20 20  _master'",.     
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
13b70 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
13b80 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
13b90 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
13ba0 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64  _Insert;.      d
13bb0 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d  ata.zDestTable =
13bc0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b   "sqlite_stat1";
13bd0 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65  .      shell_exe
13be0 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  c(p->db, "SELECT
13bf0 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73   * FROM sqlite_s
13c00 74 61 74 31 22 2c 0a 20 20 20 20 20 20 20 20 20  tat1",.         
13c10 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61          shell_ca
13c20 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a  llback, &data,&z
13c30 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64  ErrMsg);.      d
13c40 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d  ata.zDestTable =
13c50 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b   "sqlite_stat3";
13c60 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65  .      shell_exe
13c70 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  c(p->db, "SELECT
13c80 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73   * FROM sqlite_s
13c90 74 61 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20  tat3",.         
13ca0 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61          shell_ca
13cb0 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a  llback, &data,&z
13cc0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64  ErrMsg);.      d
13cd0 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d  ata.zDestTable =
13ce0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 3b   "sqlite_stat4";
13cf0 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65  .      shell_exe
13d00 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  c(p->db, "SELECT
13d10 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73   * FROM sqlite_s
13d20 74 61 74 34 22 2c 0a 20 20 20 20 20 20 20 20 20  tat4",.         
13d30 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61          shell_ca
13d40 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
13d50 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
13d60 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
13d70 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
13d80 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20  master;\n");.   
13d90 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
13da0 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e  ( c=='h' && strn
13db0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68  cmp(azArg[0], "h
13dc0 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29  eaders", n)==0 )
13dd0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
13de0 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  2 ){.      p->sh
13df0 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65  owHeader = boole
13e00 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
13e10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13e20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
13e30 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61  rr, "Usage: .hea
13e40 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  ders on|off\n");
13e50 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
13e60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
13e70 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74  if( c=='h' && st
13e80 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
13e90 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b  "help", n)==0 ){
13ea0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
13eb0 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 65 6c 70  out, "%s", zHelp
13ec0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
13ed0 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
13ee0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
13ef0 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  mport", n)==0 ){
13f00 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
13f10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
13f20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
13f30 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
13f40 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
13f50 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
13f60 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
13f70 6c 65 20 74 6f 20 65 78 74 72 61 20 63 6f 6e 74  le to extra cont
13f80 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ent from */.    
13f90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
13fa0 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41  tmt = NULL; /* A
13fb0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13fc0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13fe0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
13ff0 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
14000 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
14010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14020 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14030 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
14040 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
14050 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
14060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
14070 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
14080 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74    int needCommit
14090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
140a0 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20   True to COMMIT 
140b0 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65  or ROLLBACK at e
140c0 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  nd */.    int nS
140d0 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
140e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
140f0 6f 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 73  of bytes in p->s
14100 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20  eparator[] */.  
14110 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14130 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
14140 74 20 2a 2f 0a 20 20 20 20 43 53 56 52 65 61 64  t */.    CSVRead
14150 65 72 20 73 43 73 76 3b 20 20 20 20 20 20 20 20  er sCsv;        
14160 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63       /* Reader c
14170 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 69 6e  ontext */.    in
14180 74 20 28 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c  t (*xCloser)(FIL
14190 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20 50 72 6f  E*);      /* Pro
141a0 63 65 64 75 72 65 20 74 6f 20 63 6c 6f 73 65 20  cedure to close 
141b0 74 68 33 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  th3 connection *
141c0 2f 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  /..    if( nArg!
141d0 3d 33 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =3 ){.      fpri
141e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
141f0 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45  ge: .import FILE
14200 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20   TABLE\n");.    
14210 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
14220 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
14230 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72      zFile = azAr
14240 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65  g[1];.    zTable
14250 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20   = azArg[2];.   
14260 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d   seenInterrupt =
14270 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   0;.    memset(&
14280 73 43 73 76 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sCsv, 0, sizeof(
14290 73 43 73 76 29 29 3b 0a 20 20 20 20 6f 70 65 6e  sCsv));.    open
142a0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e  _db(p, 0);.    n
142b0 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
142c0 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  ->separator);.  
142d0 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
142e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
142f0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e  tderr, "Error: n
14300 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f  on-null separato
14310 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
14320 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
14330 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
14340 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20  .    if( nSep>1 
14350 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
14360 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
14370 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72   multi-character
14380 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20   separators not 
14390 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20  allowed".       
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
143b0 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b   for import\n");
143c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
143d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 73 76 2e  .    }.    sCsv.
143e0 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20  zFile = zFile;. 
143f0 20 20 20 73 43 73 76 2e 6e 4c 69 6e 65 20 3d 20     sCsv.nLine = 
14400 31 3b 0a 20 20 20 20 69 66 28 20 73 43 73 76 2e  1;.    if( sCsv.
14410 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  zFile[0]=='|' ){
14420 0a 20 20 20 20 20 20 73 43 73 76 2e 69 6e 20 3d  .      sCsv.in =
14430 20 70 6f 70 65 6e 28 73 43 73 76 2e 7a 46 69 6c   popen(sCsv.zFil
14440 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20 20 20  e+1, "r");.     
14450 20 73 43 73 76 2e 7a 46 69 6c 65 20 3d 20 22 3c   sCsv.zFile = "<
14460 70 69 70 65 3e 22 3b 0a 20 20 20 20 20 20 78 43  pipe>";.      xC
14470 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a  loser = pclose;.
14480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14490 20 73 43 73 76 2e 69 6e 20 3d 20 66 6f 70 65 6e   sCsv.in = fopen
144a0 28 73 43 73 76 2e 7a 46 69 6c 65 2c 20 22 72 62  (sCsv.zFile, "rb
144b0 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  ");.      xClose
144c0 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20  r = fclose;.    
144d0 7d 0a 20 20 20 20 69 66 28 20 73 43 73 76 2e 69  }.    if( sCsv.i
144e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  n==0 ){.      fp
144f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
14500 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
14510 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  n \"%s\"\n", zFi
14520 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  le);.      retur
14530 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
14540 43 73 76 2e 63 53 65 70 61 72 61 74 6f 72 20 3d  Csv.cSeparator =
14550 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30 5d   p->separator[0]
14560 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
14570 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
14580 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 73 22 2c  LECT * FROM %s",
14590 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
145a0 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
145b0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
145c0 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
145d0 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
145e0 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76      xCloser(sCsv
145f0 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  .in);.      retu
14600 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
14610 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
14620 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
14630 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
14640 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
14650 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
14660 0a 20 20 20 20 63 73 76 5f 61 70 70 65 6e 64 5f  .    csv_append_
14670 63 68 61 72 28 26 73 43 73 76 2c 20 30 29 3b 20  char(&sCsv, 0); 
14680 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
14690 73 43 73 76 2e 7a 20 69 73 20 61 6c 6c 6f 63 61  sCsv.z is alloca
146a0 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ted */.    if( r
146b0 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  c && sqlite3_str
146c0 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20 74 61  glob("no such ta
146d0 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74 65 33  ble: *", sqlite3
146e0 5f 65 72 72 6d 73 67 28 64 62 29 29 3d 3d 30 20  _errmsg(db))==0 
146f0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
14700 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Create = sqlite3
14710 5f 6d 70 72 69 6e 74 66 28 22 43 52 45 41 54 45  _mprintf("CREATE
14720 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62   TABLE %s", zTab
14730 6c 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  le);.      char 
14740 63 53 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20  cSep = '(';.    
14750 20 20 77 68 69 6c 65 28 20 63 73 76 5f 72 65 61    while( csv_rea
14760 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 26 73 43 73  d_one_field(&sCs
14770 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  v) ){.        zC
14780 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  reate = sqlite3_
14790 6d 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20  mprintf("%z%c\n 
147a0 20 5c 22 25 73 5c 22 20 54 45 58 54 22 2c 20 7a   \"%s\" TEXT", z
147b0 43 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43  Create, cSep, sC
147c0 73 76 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63  sv.z);.        c
147d0 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  Sep = ',';.     
147e0 20 20 20 69 66 28 20 73 43 73 76 2e 63 54 65 72     if( sCsv.cTer
147f0 6d 21 3d 73 43 73 76 2e 63 53 65 70 61 72 61 74  m!=sCsv.cSeparat
14800 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
14810 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53    }.      if( cS
14820 65 70 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  ep=='(' ){.     
14830 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14840 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
14850 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
14860 43 73 76 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Csv.z);.        
14870 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29  xCloser(sCsv.in)
14880 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
14890 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d  f(stderr,"%s: em
148a0 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 73  pty file\n", sCs
148b0 76 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  v.zFile);.      
148c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
148d0 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74    }.      zCreat
148e0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
148f0 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72  ntf("%z\n)", zCr
14900 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20  eate);.      rc 
14910 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
14920 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30  ->db, zCreate, 0
14930 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
14940 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65  qlite3_free(zCre
14950 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
14960 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  rc ){.        fp
14970 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
14980 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e  REATE TABLE %s(.
14990 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ..) failed: %s\n
149a0 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20  ", zTable,.     
149b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
149c0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
149d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
149e0 66 72 65 65 28 73 43 73 76 2e 7a 29 3b 0a 20 20  free(sCsv.z);.  
149f0 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
14a00 73 76 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  sv.in);.        
14a10 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
14a20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
14a30 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
14a40 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
14a50 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
14a60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
14a70 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
14a80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
14a90 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
14aa0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
14ab0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
14ac0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
14ad0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
14ae0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
14af0 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69    xCloser(sCsv.i
14b00 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
14b10 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43   1;.    }.    nC
14b20 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
14b30 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
14b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
14b50 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
14b60 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
14b70 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
14b80 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20  return 0; /* no 
14b90 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f  columns, no erro
14ba0 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20  r */.    zSql = 
14bb0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
14bc0 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e  nByte*2 + 20 + n
14bd0 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
14be0 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
14bf0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14c00 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
14c10 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
14c20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76 2e     xCloser(sCsv.
14c30 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
14c40 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
14c50 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
14c60 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20  nByte+20, zSql, 
14c70 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25  "INSERT INTO \"%
14c80 77 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a  w\" VALUES(?", z
14c90 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
14ca0 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
14cb0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
14cc0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
14cd0 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
14ce0 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
14cf0 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
14d00 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
14d10 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
14d20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
14d30 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
14d40 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
14d50 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
14d60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14d70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
14d80 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
14d90 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
14da0 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
14db0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
14dc0 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73      if (pStmt) s
14dd0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
14de0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 78 43  pStmt);.      xC
14df0 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29 3b 0a  loser(sCsv.in);.
14e00 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
14e10 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f      }.    needCo
14e20 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 67  mmit = sqlite3_g
14e30 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62  et_autocommit(db
14e40 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43  );.    if( needC
14e50 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f  ommit ) sqlite3_
14e60 65 78 65 63 28 64 62 2c 20 22 42 45 47 49 4e 22  exec(db, "BEGIN"
14e70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
14e80 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 74  do{.      int st
14e90 61 72 74 4c 69 6e 65 20 3d 20 73 43 73 76 2e 6e  artLine = sCsv.n
14ea0 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
14eb0 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
14ec0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
14ed0 2a 7a 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e  *z = csv_read_on
14ee0 65 5f 66 69 65 6c 64 28 26 73 43 73 76 29 3b 0a  e_field(&sCsv);.
14ef0 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30          if( z==0
14f00 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b   && i==0 ) break
14f10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14f20 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
14f30 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53  t, i+1, z, -1, S
14f40 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14f50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
14f60 6e 43 6f 6c 2d 31 20 26 26 20 73 43 73 76 2e 63  nCol-1 && sCsv.c
14f70 54 65 72 6d 21 3d 73 43 73 76 2e 63 53 65 70 61  Term!=sCsv.cSepa
14f80 72 61 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  rator ){.       
14f90 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
14fa0 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63  r, "%s:%d: expec
14fb0 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62  ted %d columns b
14fc0 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a  ut found %d - ".
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 20 20 20 20 20 20 20 20 22 66 69 6c 6c 69            "filli
14ff0 6e 67 20 74 68 65 20 72 65 73 74 20 77 69 74 68  ng the rest with
15000 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20   NULL\n",.      
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 20 20 73 43 73 76 2e 7a 46 69 6c 65 2c 20      sCsv.zFile, 
15030 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c  startLine, nCol,
15040 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
15050 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
15060 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20 29  while( i<=nCol )
15070 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  { sqlite3_bind_n
15080 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20 69  ull(pStmt, i); i
15090 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  ++; }.        }.
150a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
150b0 28 20 73 43 73 76 2e 63 54 65 72 6d 3d 3d 73 43  ( sCsv.cTerm==sC
150c0 73 76 2e 63 53 65 70 61 72 61 74 6f 72 20 29 7b  sv.cSeparator ){
150d0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
150e0 20 20 20 20 20 20 20 63 73 76 5f 72 65 61 64 5f         csv_read_
150f0 6f 6e 65 5f 66 69 65 6c 64 28 26 73 43 73 76 29  one_field(&sCsv)
15100 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
15110 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28  .        }while(
15120 20 73 43 73 76 2e 63 54 65 72 6d 3d 3d 73 43 73   sCsv.cTerm==sCs
15130 76 2e 63 53 65 70 61 72 61 74 6f 72 20 29 3b 0a  v.cSeparator );.
15140 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15150 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
15160 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
15170 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64  mns but found %d
15180 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78               "ex
151a0 74 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e 22 2c  tras ignored\n",
151b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
151c0 20 20 20 20 20 20 20 20 20 73 43 73 76 2e 7a 46           sCsv.zF
151d0 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
151e0 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20 20 20  nCol, i);.      
151f0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e  }.      if( i>=n
15200 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
15210 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
15220 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
15230 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
15240 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Stmt);.        i
15250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
15270 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
15280 73 3a 25 64 3a 20 49 4e 53 45 52 54 20 66 61 69  s:%d: INSERT fai
15290 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 43 73 76  led: %s\n", sCsv
152a0 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  .zFile, startLin
152b0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
152c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
152d0 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
152e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
152f0 7d 77 68 69 6c 65 28 20 73 43 73 76 2e 63 54 65  }while( sCsv.cTe
15300 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20  rm!=EOF );..    
15310 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29  xCloser(sCsv.in)
15320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
15330 65 65 28 73 43 73 76 2e 7a 29 3b 0a 20 20 20 20  ee(sCsv.z);.    
15340 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
15350 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
15360 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71   needCommit ) sq
15370 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
15380 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30  COMMIT", 0, 0, 0
15390 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
153a0 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
153b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
153c0 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 20 29  ndices", n)==0 )
153d0 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  {.    ShellState
153e0 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
153f0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
15400 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
15410 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
15420 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
15430 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
15440 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
15450 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f    data.mode = MO
15460 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  DE_List;.    if(
15470 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nArg==1 ){.    
15480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
15490 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
154a0 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
154b0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
154c0 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
154d0 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
154e0 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49   AND name NOT LI
154f0 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a  KE 'sqlite_%' ".
15500 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41          "UNION A
15510 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45  LL ".        "SE
15520 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
15530 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
15540 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
15550 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
15560 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ".        "ORDER
15570 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20   BY 1",.        
15580 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
15590 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20   &zErrMsg.      
155a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
155b0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
155c0 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d    zShellStatic =
155d0 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20   azArg[1];.     
155e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
155f0 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  ec(p->db,.      
15600 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46    "SELECT name F
15610 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
15620 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
15630 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
15640 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  AND tbl_name LIK
15650 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20  E shellstatic() 
15660 22 0a 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e  ".        "UNION
15670 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22   ALL ".        "
15680 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
15690 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
156a0 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
156b0 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
156c0 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c  ' AND tbl_name L
156d0 49 4b 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28  IKE shellstatic(
156e0 29 20 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44  ) ".        "ORD
156f0 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
15700 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
15710 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20  a, &zErrMsg.    
15720 20 20 29 3b 0a 20 20 20 20 20 20 7a 53 68 65 6c    );.      zShel
15730 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20  lStatic = 0;.   
15740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
15750 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
15760 73 61 67 65 3a 20 2e 69 6e 64 69 63 65 73 20 3f  sage: .indices ?
15770 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
15780 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
15790 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
157a0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
157b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72     }.    if( zEr
157c0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70  rMsg ){.      fp
157d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
157e0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
157f0 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
15800 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
15810 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
15820 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
15830 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  c != SQLITE_OK )
15840 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
15850 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 71  stderr,"Error: q
15860 75 65 72 79 69 6e 67 20 73 71 6c 69 74 65 5f 6d  uerying sqlite_m
15870 61 73 74 65 72 20 61 6e 64 20 73 71 6c 69 74 65  aster and sqlite
15880 5f 74 65 6d 70 5f 6d 61 73 74 65 72 5c 6e 22 29  _temp_master\n")
15890 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
158a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
158b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
158c0 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 69 66  BLE_IOTRACE.  if
158d0 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
158e0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
158f0 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  otrace", n)==0 )
15900 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
15910 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61  d (*sqlite3IoTra
15920 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ce)(const char*,
15930 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69   ...);.    if( i
15940 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72 61 63  otrace && iotrac
15950 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f  e!=stdout ) fclo
15960 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20  se(iotrace);.   
15970 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20   iotrace = 0;.  
15980 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a    if( nArg<2 ){.
15990 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
159a0 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  race = 0;.    }e
159b0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
159c0 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30  zArg[1], "-")==0
159d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
159e0 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61  3IoTrace = iotra
159f0 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20  cePrintf;.      
15a00 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74  iotrace = stdout
15a10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15a20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70     iotrace = fop
15a30 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22  en(azArg[1], "w"
15a40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74  );.      if( iot
15a50 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  race==0 ){.     
15a60 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
15a70 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
15a80 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
15a90 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
15aa0 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
15ab0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ace = 0;.       
15ac0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
15ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
15ae0 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69  lite3IoTrace = i
15af0 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20  otracePrintf;.  
15b00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
15b10 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  lse.#endif..#ifn
15b20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15b30 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
15b40 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73   if( c=='l' && s
15b50 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
15b60 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29   "load", n)==0 )
15b70 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
15b80 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b   *zFile, *zProc;
15b90 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
15ba0 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
15bb0 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
15bc0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
15bd0 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49  "Usage: .load FI
15be0 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c  LE ?ENTRYPOINT?\
15bf0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
15c00 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
15c10 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
15c20 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65  .    }.    zFile
15c30 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
15c40 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33   zProc = nArg>=3
15c50 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b   ? azArg[2] : 0;
15c60 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
15c70 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
15c80 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
15c90 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65  ion(p->db, zFile
15ca0 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73  , zProc, &zErrMs
15cb0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
15cc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15cd0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
15ce0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
15cf0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
15d00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
15d10 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
15d20 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
15d30 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
15d40 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72  f( c=='l' && str
15d50 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
15d60 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  log", n)==0 ){. 
15d70 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
15d80 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
15d90 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
15da0 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  .log FILENAME\n"
15db0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
15dc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15dd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
15de0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
15df0 20 20 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c        output_fil
15e00 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29  e_close(p->pLog)
15e10 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20  ;.      p->pLog 
15e20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70  = output_file_op
15e30 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  en(zFile);.    }
15e40 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
15e50 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d  c=='m' && strncm
15e60 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64  p(azArg[0], "mod
15e70 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
15e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
15e90 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  de = nArg>=2 ? a
15ea0 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20  zArg[1] : "";.  
15eb0 20 20 69 6e 74 20 6e 32 20 3d 20 28 69 6e 74 29    int n2 = (int)
15ec0 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3b 0a 20  strlen(zMode);. 
15ed0 20 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64     int c2 = zMod
15ee0 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 32  e[0];.    if( c2
15ef0 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26  =='l' && n2>2 &&
15f00 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
15f10 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30  ],"lines",n2)==0
15f20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
15f30 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20  e = MODE_Line;. 
15f40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
15f50 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='c' && strncmp(
15f60 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e  azArg[1],"column
15f70 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  s",n2)==0 ){.   
15f80 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
15f90 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65  E_Column;.    }e
15fa0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20  lse if( c2=='l' 
15fb0 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63  && n2>2 && strnc
15fc0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73  mp(azArg[1],"lis
15fd0 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
15fe0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
15ff0 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73  E_List;.    }els
16000 65 20 69 66 28 20 63 32 3d 3d 27 68 27 20 26 26  e if( c2=='h' &&
16010 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
16020 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20  ],"html",n2)==0 
16030 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
16040 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
16050 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
16060 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  't' && strncmp(a
16070 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32  zArg[1],"tcl",n2
16080 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
16090 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c  >mode = MODE_Tcl
160a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
160b0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
160c0 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 2c 20 70  p->separator), p
160d0 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20 22 20 22  ->separator, " "
160e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
160f0 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e   c2=='c' && strn
16100 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73  cmp(azArg[1],"cs
16110 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  v",n2)==0 ){.   
16120 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
16130 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c  E_Csv;.      sql
16140 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
16150 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f  zeof(p->separato
16160 72 29 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72  r), p->separator
16170 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71  , ",");.      sq
16180 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
16190 69 7a 65 6f 66 28 70 2d 3e 6e 65 77 6c 69 6e 65  izeof(p->newline
161a0 29 2c 20 70 2d 3e 6e 65 77 6c 69 6e 65 2c 20 22  ), p->newline, "
161b0 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73  \r\n");.    }els
161c0 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26  e if( c2=='t' &&
161d0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
161e0 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20  ],"tabs",n2)==0 
161f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
16200 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
16210 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
16220 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73  intf(sizeof(p->s
16230 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65  eparator), p->se
16240 70 61 72 61 74 6f 72 2c 20 22 5c 74 22 29 3b 0a  parator, "\t");.
16250 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
16260 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
16270 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72  (azArg[1],"inser
16280 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
16290 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
162a0 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20  E_Insert;.      
162b0 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70  set_table_name(p
162c0 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72  , nArg>=3 ? azAr
162d0 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b  g[2] : "table");
162e0 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20  .    }else {.   
162f0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16300 72 2c 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73  r,"Error: mode s
16310 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
16320 20 22 0a 20 20 20 20 20 20 20 20 20 22 63 6f 6c   ".         "col
16330 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73  umn csv html ins
16340 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20 74 61  ert line list ta
16350 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20  bs tcl\n");.    
16360 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
16370 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
16380 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70  =='n' && strncmp
16390 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c  (azArg[0], "null
163a0 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  value", n)==0 ){
163b0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
163c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
163d0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
163e0 66 28 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 2c  f(p->nullvalue),
163f0 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 0a 20   p->nullvalue,. 
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16410 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69        "%.*s", (i
16420 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
16430 6e 75 6c 6c 76 61 6c 75 65 29 2d 31 2c 20 61 7a  nullvalue)-1, az
16440 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
16450 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  se{.      fprint
16460 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
16470 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52  : .nullvalue STR
16480 49 4e 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ING\n");.      r
16490 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
164a0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
164b0 6f 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  o' && strncmp(az
164c0 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c 20  Arg[0], "open", 
164d0 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29 7b  n)==0 && n>=2 ){
164e0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 73 61  .    sqlite3 *sa
164f0 76 65 64 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  vedDb = p->db;. 
16500 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16510 53 61 76 65 64 46 69 6c 65 6e 61 6d 65 20 3d 20  SavedFilename = 
16520 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 0a  p->zDbFilename;.
16530 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46 69      char *zNewFi
16540 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
16550 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 69  p->db = 0;.    i
16560 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  f( nArg>=2 ){.  
16570 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
16580 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  me = zNewFilenam
16590 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
165a0 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b  ntf("%s", azArg[
165b0 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  1]);.    }.    o
165c0 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b 0a 20 20  pen_db(p, 1);.  
165d0 20 20 69 66 28 20 70 2d 3e 64 62 21 3d 30 20 29    if( p->db!=0 )
165e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
165f0 63 6c 6f 73 65 28 73 61 76 65 64 44 62 29 3b 0a  close(savedDb);.
16600 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16610 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f  ee(p->zFreeOnClo
16620 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 46  se);.      p->zF
16630 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65  reeOnClose = zNe
16640 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7d  wFilename;.    }
16650 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
16660 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c  te3_free(zNewFil
16670 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  ename);.      p-
16680 3e 64 62 20 3d 20 73 61 76 65 64 44 62 3b 0a 20  >db = savedDb;. 
16690 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
166a0 61 6d 65 20 3d 20 7a 53 61 76 65 64 46 69 6c 65  ame = zSavedFile
166b0 6e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  name;.    }.  }e
166c0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f  lse..  if( c=='o
166d0 27 0a 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70  '.   && (strncmp
166e0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70  (azArg[0], "outp
166f0 75 74 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20 73 74  ut", n)==0 || st
16700 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
16710 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 0a 20  "once", n)==0). 
16720 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
16730 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e 41 72 67  ar *zFile = nArg
16740 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
16750 20 22 73 74 64 6f 75 74 22 3b 0a 20 20 20 20 69   "stdout";.    i
16760 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20  f( nArg>2 ){.   
16770 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16780 72 2c 20 22 55 73 61 67 65 3a 20 2e 25 73 20 46  r, "Usage: .%s F
16790 49 4c 45 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  ILE\n", azArg[0]
167a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
167b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
167c0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
167d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31     }.    if( n>1
167e0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
167f0 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29  g[0], "once", n)
16800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
16810 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
16820 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16830 72 2c 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65  r, "Usage: .once
16840 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20   FILE\n");.     
16850 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
16860 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
16870 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
16880 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43   }.      p->outC
16890 6f 75 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65  ount = 2;.    }e
168a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  lse{.      p->ou
168b0 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tCount = 0;.    
168c0 7d 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73  }.    output_res
168d0 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  et(p);.    if( z
168e0 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a  File[0]=='|' ){.
168f0 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70        p->out = p
16900 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20  open(zFile + 1, 
16910 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "w");.      if( 
16920 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  p->out==0 ){.   
16930 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
16940 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e  err,"Error: cann
16950 6f 74 20 6f 70 65 6e 20 70 69 70 65 20 5c 22 25  ot open pipe \"%
16960 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20  s\"\n", zFile + 
16970 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f  1);.        p->o
16980 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  ut = stdout;.   
16990 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
169a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
169b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
169c0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74  tf(sizeof(p->out
169d0 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c  file), p->outfil
169e0 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b  e, "%s", zFile);
169f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
16a00 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  se{.      p->out
16a10 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f   = output_file_o
16a20 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  pen(zFile);.    
16a30 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20    if( p->out==0 
16a40 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
16a50 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66  trcmp(zFile,"off
16a60 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")!=0 ){.       
16a70 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16a80 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  r,"Error: cannot
16a90 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73 5c 22   write to \"%s\"
16aa0 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  \n", zFile);.   
16ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
16ac0 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
16ad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
16ae0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
16af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
16b00 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
16b10 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f  ->outfile), p->o
16b20 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46  utfile, "%s", zF
16b30 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
16b40 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
16b50 66 28 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d  f( c=='p' && n>=
16b60 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
16b70 72 67 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20  rg[0], "print", 
16b80 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  n)==0 ){.    int
16b90 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
16ba0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
16bb0 20 20 20 20 20 69 66 28 20 69 3e 31 20 29 20 66       if( i>1 ) f
16bc0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
16bd0 20 22 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e   ");.      fprin
16be0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
16bf0 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
16c00 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d  }.    fprintf(p-
16c10 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d  >out, "\n");.  }
16c20 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
16c30 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  p' && strncmp(az
16c40 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22  Arg[0], "prompt"
16c50 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
16c60 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a  f( nArg >= 2) {.
16c70 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 6d 61        strncpy(ma
16c80 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31  inPrompt,azArg[1
16c90 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  ],(int)ArraySize
16ca0 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b  (mainPrompt)-1);
16cb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
16cc0 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20  Arg >= 3) {.    
16cd0 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e    strncpy(contin
16ce0 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32  uePrompt,azArg[2
16cf0 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  ],(int)ArraySize
16d00 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29  (continuePrompt)
16d10 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -1);.    }.  }el
16d20 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71 27  se..  if( c=='q'
16d30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
16d40 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29  g[0], "quit", n)
16d50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
16d60 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  2;.  }else..  if
16d70 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33  ( c=='r' && n>=3
16d80 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
16d90 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29  g[0], "read", n)
16da0 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==0 ){.    FILE 
16db0 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e 41  *alt;.    if( nA
16dc0 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 66  rg!=2 ){.      f
16dd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
16de0 55 73 61 67 65 3a 20 2e 72 65 61 64 20 46 49 4c  Usage: .read FIL
16df0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
16e00 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
16e10 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
16e20 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 74  t;.    }.    alt
16e30 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31   = fopen(azArg[1
16e40 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66  ], "rb");.    if
16e50 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( alt==0 ){.    
16e60 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
16e70 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20  ,"Error: cannot 
16e80 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
16e90 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
16ea0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
16eb0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
16ec0 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20  rocess_input(p, 
16ed0 61 6c 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f  alt);.      fclo
16ee0 73 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20  se(alt);.    }. 
16ef0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
16f00 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='r' && n>=3 && 
16f10 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
16f20 2c 20 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d  , "restore", n)=
16f30 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
16f40 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a  char *zSrcFile;.
16f50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16f60 7a 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  zDb;.    sqlite3
16f70 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69   *pSrc;.    sqli
16f80 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
16f90 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69  kup;.    int nTi
16fa0 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20  meout = 0;..    
16fb0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
16fc0 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
16fd0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
16fe0 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
16ff0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67    }else if( nArg
17000 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72  ==3 ){.      zSr
17010 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d  cFile = azArg[2]
17020 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a  ;.      zDb = az
17030 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73  Arg[1];.    }els
17040 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
17050 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
17060 20 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46   .restore ?DB? F
17070 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ILE\n");.      r
17080 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
17090 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
170a0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  xit;.    }.    r
170b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
170c0 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63  (zSrcFile, &pSrc
170d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
170e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
170f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
17100 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
17110 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
17120 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20   zSrcFile);.    
17130 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
17140 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
17150 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
17160 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
17170 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
17180 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
17190 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53  t(p->db, zDb, pS
171a0 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20  rc, "main");.   
171b0 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
171c0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
171d0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
171e0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
171f0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
17200 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
17210 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20  ose(pSrc);.     
17220 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
17230 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
17240 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
17250 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
17260 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  0))==SQLITE_OK. 
17270 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d           || rc==
17280 53 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a  SQLITE_BUSY  ){.
17290 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
172a0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
172b0 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75       if( nTimeou
172c0 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b  t++ >= 3 ) break
172d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
172e0 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20  3_sleep(100);.  
172f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17300 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66  sqlite3_backup_f
17310 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a  inish(pBackup);.
17320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17330 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
17340 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c   rc = 0;.    }el
17350 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
17360 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51  E_BUSY || rc==SQ
17370 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  LITE_LOCKED ){. 
17380 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
17390 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75  err, "Error: sou
173a0 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73 20  rce database is 
173b0 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  busy\n");.      
173c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
173d0 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
173e0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
173f0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
17400 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
17410 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
17420 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
17430 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 7d  close(pSrc);.  }
17440 65 6c 73 65 0a 0a 0a 20 20 69 66 28 20 63 3d 3d  else...  if( c==
17450 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
17460 7a 41 72 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74  zArg[0], "scanst
17470 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
17480 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
17490 7b 0a 20 20 20 20 20 20 70 2d 3e 73 63 61 6e 73  {.      p->scans
174a0 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e  tatsOn = boolean
174b0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
174c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
174d0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
174e0 53 54 41 54 55 53 0a 20 20 20 20 20 20 66 70 72  STATUS.      fpr
174f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61  intf(stderr, "Wa
17500 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61 74  rning: .scanstat
17510 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
17520 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e  in this build.\n
17530 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ");.#endif.    }
17540 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
17550 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
17560 67 65 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6f  ge: .scanstats o
17570 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
17580 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
17590 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
175a0 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
175b0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d  azArg[0], "schem
175c0 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  a", n)==0 ){.   
175d0 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61   ShellState data
175e0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
175f0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65  Msg = 0;.    ope
17600 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
17610 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c  memcpy(&data, p,
17620 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a   sizeof(data));.
17630 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
17640 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74  der = 0;.    dat
17650 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65  a.mode = MODE_Se
17660 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  mi;.    if( nArg
17670 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==2 ){.      int
17680 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
17690 30 3b 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20  0; azArg[1][i]; 
176a0 69 2b 2b 29 20 61 7a 41 72 67 5b 31 5d 5b 69 5d  i++) azArg[1][i]
176b0 20 3d 20 54 6f 4c 6f 77 65 72 28 61 7a 41 72 67   = ToLower(azArg
176c0 5b 31 5d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  [1][i]);.      i
176d0 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
176e0 31 5d 2c 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  1],"sqlite_maste
176f0 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
17700 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76    char *new_argv
17710 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32  [2], *new_colv[2
17720 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61  ];.        new_a
17730 72 67 76 5b 30 5d 20 3d 20 22 43 52 45 41 54 45  rgv[0] = "CREATE
17740 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61   TABLE sqlite_ma
17750 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20 20  ster (\n".      
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17770 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22  "  type text,\n"
17780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17790 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74         "  name t
177a0 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
177c0 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c   tbl_name text,\
177d0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
177e0 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74           "  root
177f0 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22  page integer,\n"
17800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17810 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74 65         "  sql te
17820 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  xt\n".          
17830 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22 3b              ")";
17840 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67  .        new_arg
17850 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
17860 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20    new_colv[0] = 
17870 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e  "sql";.        n
17880 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a  ew_colv[1] = 0;.
17890 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
178a0 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61  (&data, 1, new_a
178b0 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a  rgv, new_colv);.
178c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
178d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
178e0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
178f0 7a 41 72 67 5b 31 5d 2c 22 73 71 6c 69 74 65 5f  zArg[1],"sqlite_
17900 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3d 3d 30  temp_master")==0
17910 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
17920 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
17930 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
17940 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
17950 20 3d 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   = "CREATE TEMP 
17960 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 74 65 6d  TABLE sqlite_tem
17970 70 5f 6d 61 73 74 65 72 20 28 5c 6e 22 0a 20 20  p_master (\n".  
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78 74      "  type text
179a0 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
179b0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e 61             "  na
179c0 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65    "  tbl_name te
179f0 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
17a10 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65 72  rootpage integer
17a20 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
17a30 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73 71             "  sq
17a40 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20 20  l text\n".      
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 22 29 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  ")";.        new
17a70 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20  _argv[1] = 0;.  
17a80 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30        new_colv[0
17a90 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20 20  ] = "sql";.     
17aa0 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d     new_colv[1] =
17ab0 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c 6c   0;.        call
17ac0 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e  back(&data, 1, n
17ad0 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c  ew_argv, new_col
17ae0 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  v);.        rc =
17af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17b00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17b10 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20   zShellStatic = 
17b20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
17b30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
17b40 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  xec(p->db,.     
17b50 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
17b60 20 46 52 4f 4d 20 22 0a 20 20 20 20 20 20 20 20   FROM ".        
17b70 20 20 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c    "  (SELECT sql
17b80 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c   sql, type type,
17b90 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61   tbl_name tbl_na
17ba0 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72  me, name name, r
17bb0 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20 20 20  owid x".        
17bc0 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73 71 6c    "     FROM sql
17bd0 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e  ite_master UNION
17be0 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20   ALL".          
17bf0 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20  "   SELECT sql, 
17c00 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
17c10 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d  name, rowid FROM
17c20 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
17c30 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 20 20  ter) ".         
17c40 20 22 57 48 45 52 45 20 6c 6f 77 65 72 28 74 62   "WHERE lower(tb
17c50 6c 5f 6e 61 6d 65 29 20 4c 49 4b 45 20 73 68 65  l_name) LIKE she
17c60 6c 6c 73 74 61 74 69 63 28 29 22 0a 20 20 20 20  llstatic()".    
17c70 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 79 70        "  AND typ
17c80 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71  e!='meta' AND sq
17c90 6c 20 4e 4f 54 4e 55 4c 4c 20 22 0a 20 20 20 20  l NOTNULL ".    
17ca0 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
17cb0 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 20  rowid",.        
17cc0 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
17cd0 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
17ce0 20 20 20 20 20 20 7a 53 68 65 6c 6c 53 74 61 74        zShellStat
17cf0 69 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ic = 0;.      }.
17d00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41      }else if( nA
17d10 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg==1 ){.      r
17d20 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
17d30 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
17d40 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
17d50 4d 20 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  M ".         "  
17d60 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c  (SELECT sql sql,
17d70 20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f   type type, tbl_
17d80 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  name tbl_name, n
17d90 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20  ame name, rowid 
17da0 78 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 20  x".         "   
17db0 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61    FROM sqlite_ma
17dc0 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a  ster UNION ALL".
17dd0 20 20 20 20 20 20 20 20 20 22 20 20 20 53 45 4c           "   SEL
17de0 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74  ECT sql, type, t
17df0 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
17e00 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65  owid FROM sqlite
17e10 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a  _temp_master) ".
17e20 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
17e30 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44  type!='meta' AND
17e40 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44   sql NOTNULL AND
17e50 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
17e60 73 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20  sqlite_%' ".    
17e70 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 72       "ORDER BY r
17e80 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 20 20  owid",.         
17e90 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
17ea0 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20   &zErrMsg.      
17eb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17ec0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17ed0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63 68  rr, "Usage: .sch
17ee0 65 6d 61 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  ema ?LIKE-PATTER
17ef0 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  N?\n");.      rc
17f00 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
17f10 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
17f20 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  it;.    }.    if
17f30 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
17f40 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
17f50 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
17f60 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
17f70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
17f80 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
17f90 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
17fa0 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54 45  if( rc != SQLITE
17fb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70 72  _OK ){.      fpr
17fc0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
17fd0 6f 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68  or: querying sch
17fe0 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c  ema information\
17ff0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
18000 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
18010 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
18020 7d 0a 20 20 7d 65 6c 73 65 0a 0a 0a 23 69 66 20  }.  }else...#if 
18030 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
18040 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
18050 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
18060 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20 69 66  ELECTTRACE).  if
18070 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31  ( c=='s' && n==1
18080 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  1 && strncmp(azA
18090 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63 74 74 72  rg[0], "selecttr
180a0 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ace", n)==0 ){. 
180b0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
180c0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
180d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
180e0 65 63 74 54 72 61 63 65 20 3d 20 6e 41 72 67 3e  ectTrace = nArg>
180f0 3d 32 20 3f 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  =2 ? booleanValu
18100 65 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 78  e(azArg[1]) : 0x
18110 66 66 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ff;.  }else.#end
18120 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
18130 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e  TE_DEBUG.  /* Un
18140 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61  documented comma
18150 6e 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  nds for internal
18160 20 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65   testing.  Subje
18170 63 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a  ct to change.  *
18180 2a 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65  * without notice
18190 2e 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73  . */.  if( c=='s
181a0 27 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74  ' && n>=10 && st
181b0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
181c0 22 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d  "selftest-", 9)=
181d0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  =0 ){.    if( st
181e0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39  rncmp(azArg[0]+9
181f0 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39  , "boolean", n-9
18200 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
18210 74 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f  t i, v;.      fo
18220 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
18230 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d  ++){.        v =
18240 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
18250 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
18260 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
18270 20 22 25 73 3a 20 25 64 20 30 78 25 78 5c 6e 22   "%s: %d 0x%x\n"
18280 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76 2c 20 76  , azArg[i], v, v
18290 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
182a0 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
182b0 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 69 6e  (azArg[0]+9, "in
182c0 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d 3d 30 20  teger", n-9)==0 
182d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
182e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b  sqlite3_int64 v;
182f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
18300 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
18310 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
18320 32 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 76 20  200];.        v 
18330 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  = integerValue(a
18340 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
18350 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
18360 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
18370 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c 64 20 30  zBuf,"%s: %lld 0
18380 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41 72 67 5b  x%llx\n", azArg[
18390 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20 20 20 20  i],v,v);.       
183a0 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
183b0 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20   "%s", zBuf);.  
183c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
183d0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
183e0 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
183f0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
18400 65 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d 30  eparator", n)==0
18410 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
18420 3c 32 20 7c 7c 20 6e 41 72 67 3e 33 20 29 7b 0a  <2 || nArg>3 ){.
18430 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
18440 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
18450 65 70 61 72 61 74 6f 72 20 53 45 50 41 52 41 54  eparator SEPARAT
18460 4f 52 20 3f 4e 45 57 4c 49 4e 45 3f 5c 6e 22 29  OR ?NEWLINE?\n")
18470 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
18480 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
18490 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg>=2 ){.      s
184a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
184b0 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70 61 72 61  sizeof(p->separa
184c0 74 6f 72 29 2c 20 70 2d 3e 73 65 70 61 72 61 74  tor), p->separat
184d0 6f 72 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  or, azArg[1]);. 
184e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
184f0 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 73 71  g>=3 ){.      sq
18500 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
18510 69 7a 65 6f 66 28 70 2d 3e 6e 65 77 6c 69 6e 65  izeof(p->newline
18520 29 2c 20 70 2d 3e 6e 65 77 6c 69 6e 65 2c 20 61  ), p->newline, a
18530 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[2]);.    }.
18540 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
18550 3d 3d 27 73 27 0a 20 20 20 26 26 20 28 73 74 72  =='s'.   && (str
18560 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
18570 73 68 65 6c 6c 22 2c 20 6e 29 3d 3d 30 20 7c 7c  shell", n)==0 ||
18580 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
18590 5d 2c 22 73 79 73 74 65 6d 22 2c 6e 29 3d 3d 30  ],"system",n)==0
185a0 29 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ).  ){.    char 
185b0 2a 7a 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69  *zCmd;.    int i
185c0 2c 20 78 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  , x;.    if( nAr
185d0 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 66 70 72  g<2 ){.      fpr
185e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
185f0 61 67 65 3a 20 2e 73 79 73 74 65 6d 20 43 4f 4d  age: .system COM
18600 4d 41 4e 44 5c 6e 22 29 3b 0a 20 20 20 20 20 20  MAND\n");.      
18610 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
18620 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
18630 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
18640 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zCmd = sqlite3_m
18650 70 72 69 6e 74 66 28 73 74 72 63 68 72 28 61 7a  printf(strchr(az
18660 41 72 67 5b 31 5d 2c 27 20 27 29 3d 3d 30 3f 22  Arg[1],' ')==0?"
18670 25 73 22 3a 22 5c 22 25 73 5c 22 22 2c 20 61 7a  %s":"\"%s\"", az
18680 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72  Arg[1]);.    for
18690 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=2; i<nArg; i+
186a0 2b 29 7b 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d  +){.      zCmd =
186b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
186c0 28 73 74 72 63 68 72 28 61 7a 41 72 67 5b 69 5d  (strchr(azArg[i]
186d0 2c 27 20 27 29 3d 3d 30 3f 22 25 7a 20 25 73 22  ,' ')==0?"%z %s"
186e0 3a 22 25 7a 20 5c 22 25 73 5c 22 22 2c 0a 20 20  :"%z \"%s\"",.  
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18700 20 20 20 20 20 20 20 20 20 20 20 7a 43 6d 64 2c             zCmd,
18710 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
18720 7d 0a 20 20 20 20 78 20 3d 20 73 79 73 74 65 6d  }.    x = system
18730 28 7a 43 6d 64 29 3b 0a 20 20 20 20 73 71 6c 69  (zCmd);.    sqli
18740 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a  te3_free(zCmd);.
18750 20 20 20 20 69 66 28 20 78 20 29 20 66 70 72 69      if( x ) fpri
18760 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 79 73  ntf(stderr, "Sys
18770 74 65 6d 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75  tem command retu
18780 72 6e 73 20 25 64 5c 6e 22 2c 20 78 29 3b 0a 20  rns %d\n", x);. 
18790 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
187a0 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
187b0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77 22  azArg[0], "show"
187c0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
187d0 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41  nt i;.    if( nA
187e0 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 66  rg!=1 ){.      f
187f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
18800 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c 6e 22 29  Usage: .show\n")
18810 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
18820 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
18830 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
18840 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
18850 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25  p->out,"%9.9s: %
18860 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 20 70 2d 3e  s\n","echo", p->
18870 65 63 68 6f 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20  echoOn ? "on" : 
18880 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69  "off");.    fpri
18890 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39  ntf(p->out,"%9.9
188a0 73 3a 20 25 73 5c 6e 22 2c 22 65 71 70 22 2c 20  s: %s\n","eqp", 
188b0 70 2d 3e 61 75 74 6f 45 51 50 20 3f 20 22 6f 6e  p->autoEQP ? "on
188c0 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20  " : "off");.    
188d0 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
188e0 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 65 78  %9.9s: %s\n","ex
188f0 70 6c 61 69 6e 22 2c 20 70 2d 3e 6e 6f 72 6d 61  plain", p->norma
18900 6c 4d 6f 64 65 2e 76 61 6c 69 64 20 3f 20 22 6f  lMode.valid ? "o
18910 6e 22 20 3a 22 6f 66 66 22 29 3b 0a 20 20 20 20  n" :"off");.    
18920 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
18930 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 68 65  %9.9s: %s\n","he
18940 61 64 65 72 73 22 2c 20 70 2d 3e 73 68 6f 77 48  aders", p->showH
18950 65 61 64 65 72 20 3f 20 22 6f 6e 22 20 3a 20 22  eader ? "on" : "
18960 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  off");.    fprin
18970 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73  tf(p->out,"%9.9s
18980 3a 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20  : %s\n","mode", 
18990 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64  modeDescr[p->mod
189a0 65 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  e]);.    fprintf
189b0 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20  (p->out,"%9.9s: 
189c0 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b  ", "nullvalue");
189d0 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f  .      output_c_
189e0 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70  string(p->out, p
189f0 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20  ->nullvalue);.  
18a00 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
18a10 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ut, "\n");.    f
18a20 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
18a30 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74  9.9s: %s\n","out
18a40 70 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  put",.          
18a50 20 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75    strlen30(p->ou
18a60 74 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66  tfile) ? p->outf
18a70 69 6c 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b  ile : "stdout");
18a80 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
18a90 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22  out,"%9.9s: ", "
18aa0 73 65 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20  separator");.   
18ab0 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
18ac0 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 73 65  ng(p->out, p->se
18ad0 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
18ae0 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
18af0 20 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75   ");.      outpu
18b00 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  t_c_string(p->ou
18b10 74 2c 20 70 2d 3e 6e 65 77 6c 69 6e 65 29 3b 0a  t, p->newline);.
18b20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
18b30 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  >out, "\n");.   
18b40 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
18b50 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22 2c 22 73  "%9.9s: %s\n","s
18b60 74 61 74 73 22 2c 20 70 2d 3e 73 74 61 74 73 4f  tats", p->statsO
18b70 6e 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22  n ? "on" : "off"
18b80 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
18b90 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c  ->out,"%9.9s: ",
18ba0 22 77 69 64 74 68 22 29 3b 0a 20 20 20 20 66 6f  "width");.    fo
18bb0 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74 29 41 72  r (i=0;i<(int)Ar
18bc0 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69  raySize(p->colWi
18bd0 64 74 68 29 20 26 26 20 70 2d 3e 63 6f 6c 57 69  dth) && p->colWi
18be0 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69 2b 2b 29  dth[i] != 0;i++)
18bf0 20 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   {.      fprintf
18c00 28 70 2d 3e 6f 75 74 2c 22 25 64 20 22 2c 70 2d  (p->out,"%d ",p-
18c10 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 29 3b 0a 20  >colWidth[i]);. 
18c20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
18c30 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  (p->out,"\n");. 
18c40 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
18c50 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
18c60 61 7a 41 72 67 5b 30 5d 2c 20 22 73 74 61 74 73  azArg[0], "stats
18c70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
18c80 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
18c90 20 20 20 20 20 70 2d 3e 73 74 61 74 73 4f 6e 20       p->statsOn 
18ca0 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
18cb0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
18cc0 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  lse{.      fprin
18cd0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
18ce0 65 3a 20 2e 73 74 61 74 73 20 6f 6e 7c 6f 66 66  e: .stats on|off
18cf0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
18d00 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
18d10 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20  e..  if( c=='t' 
18d20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  && n>1 && strncm
18d30 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 61 62  p(azArg[0], "tab
18d40 6c 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  les", n)==0 ){. 
18d50 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
18d60 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72  *pStmt;.    char
18d70 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20 20   **azResult;.   
18d80 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c 6f   int nRow, nAllo
18d90 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  c;.    char *zSq
18da0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
18db0 69 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  i;.    open_db(p
18dc0 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  , 0);.    rc = s
18dd0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
18de0 32 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  2(p->db, "PRAGMA
18df0 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c   database_list",
18e00 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
18e10 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
18e20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7a 53 71  turn rc;.    zSq
18e30 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
18e40 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
18e50 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
18e60 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
18e70 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79        " WHERE ty
18e80 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27  pe IN ('table','
18e90 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20 20  view')".        
18ea0 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  "   AND name NOT
18eb0 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 25   LIKE 'sqlite_%%
18ec0 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 20 41  '".        "   A
18ed0 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22  ND name LIKE ?1"
18ee0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  );.    while( sq
18ef0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
18f00 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
18f10 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
18f20 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 28 63 6f  r *zDbName = (co
18f30 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
18f40 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
18f50 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  tmt, 1);.      i
18f60 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c  f( zDbName==0 ||
18f70 20 73 74 72 63 6d 70 28 7a 44 62 4e 61 6d 65 2c   strcmp(zDbName,
18f80 22 6d 61 69 6e 22 29 3d 3d 30 20 29 20 63 6f 6e  "main")==0 ) con
18f90 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
18fa0 20 73 74 72 63 6d 70 28 7a 44 62 4e 61 6d 65 2c   strcmp(zDbName,
18fb0 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "temp")==0 ){.  
18fc0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
18fd0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18ff0 25 7a 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20  %z UNION ALL ". 
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19010 22 53 45 4c 45 43 54 20 27 74 65 6d 70 2e 27 20  "SELECT 'temp.' 
19020 7c 7c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  || name FROM sql
19030 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
19040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19050 20 20 22 20 57 48 45 52 45 20 74 79 70 65 20 49    " WHERE type I
19060 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77  N ('table','view
19070 27 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')".            
19080 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d       "   AND nam
19090 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
190a0 74 65 5f 25 25 27 22 0a 20 20 20 20 20 20 20 20  te_%%'".        
190b0 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44           "   AND
190c0 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c 20   name LIKE ?1", 
190d0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zSql);.      }el
190e0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c  se{.        zSql
190f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
19100 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
19110 20 20 20 20 20 22 25 7a 20 55 4e 49 4f 4e 20 41       "%z UNION A
19120 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  LL ".           
19130 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 27 25        "SELECT '%
19140 71 2e 27 20 7c 7c 20 6e 61 6d 65 20 46 52 4f 4d  q.' || name FROM
19150 20 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d   \"%w\".sqlite_m
19160 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
19170 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
19180 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27  type IN ('table'
19190 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20  ,'view')".      
191a0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41             "   A
191b0 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45  ND name NOT LIKE
191c0 20 27 73 71 6c 69 74 65 5f 25 25 27 22 0a 20 20   'sqlite_%%'".  
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
191e0 20 20 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45     AND name LIKE
191f0 20 3f 31 22 2c 20 7a 53 71 6c 2c 20 7a 44 62 4e   ?1", zSql, zDbN
19200 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  ame, zDbName);. 
19210 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19220 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
19230 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53  e(pStmt);.    zS
19240 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
19250 69 6e 74 66 28 22 25 7a 20 4f 52 44 45 52 20 42  intf("%z ORDER B
19260 59 20 31 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  Y 1", zSql);.   
19270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
19280 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
19290 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
192a0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
192b0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
192c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
192d0 6e 20 72 63 3b 0a 20 20 20 20 6e 52 6f 77 20 3d  n rc;.    nRow =
192e0 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20   nAlloc = 0;.   
192f0 20 61 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20   azResult = 0;. 
19300 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29 7b     if( nArg>1 ){
19310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
19320 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
19330 31 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d 31 2c  1, azArg[1], -1,
19340 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
19350 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  T);.    }else{. 
19360 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
19370 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
19380 20 22 25 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45   "%", -1, SQLITE
19390 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
193a0 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
193b0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
193c0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
193d0 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 3d 6e 41      if( nRow>=nA
193e0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
193f0 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a 20 20  char **azNew;.  
19400 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 6e 41        int n = nA
19410 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20  lloc*2 + 10;.   
19420 20 20 20 20 20 61 7a 4e 65 77 20 3d 20 73 71 6c       azNew = sql
19430 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 52  ite3_realloc(azR
19440 65 73 75 6c 74 2c 20 73 69 7a 65 6f 66 28 61 7a  esult, sizeof(az
19450 52 65 73 75 6c 74 5b 30 5d 29 2a 6e 29 3b 0a 20  Result[0])*n);. 
19460 20 20 20 20 20 20 20 69 66 28 20 61 7a 4e 65 77         if( azNew
19470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
19480 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
19490 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
194a0 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
194b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
194c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
194d0 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 20 20 20  Alloc = n;.     
194e0 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 61 7a     azResult = az
194f0 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
19500 20 20 20 61 7a 52 65 73 75 6c 74 5b 6e 52 6f 77     azResult[nRow
19510 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
19520 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
19530 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
19540 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  tmt, 0));.      
19550 69 66 28 20 61 7a 52 65 73 75 6c 74 5b 6e 52 6f  if( azResult[nRo
19560 77 5d 20 29 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  w] ) nRow++;.   
19570 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
19580 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 20  inalize(pStmt); 
19590 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28 20         .    if( 
195a0 6e 52 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRow>0 ){.      
195b0 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e 20  int len, maxlen 
195c0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
195d0 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  , j;.      int n
195e0 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e 74  PrintCol, nPrint
195f0 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Row;.      for(i
19600 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20 69 2b 2b 29  =0; i<nRow; i++)
19610 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
19620 73 74 72 6c 65 6e 33 30 28 61 7a 52 65 73 75 6c  strlen30(azResul
19630 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t[i]);.        i
19640 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20  f( len>maxlen ) 
19650 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20  maxlen = len;.  
19660 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 50 72 69      }.      nPri
19670 6e 74 43 6f 6c 20 3d 20 38 30 2f 28 6d 61 78 6c  ntCol = 80/(maxl
19680 65 6e 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28  en+2);.      if(
19690 20 6e 50 72 69 6e 74 43 6f 6c 3c 31 20 29 20 6e   nPrintCol<1 ) n
196a0 50 72 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20 20  PrintCol = 1;.  
196b0 20 20 20 20 6e 50 72 69 6e 74 52 6f 77 20 3d 20      nPrintRow = 
196c0 28 6e 52 6f 77 20 2b 20 6e 50 72 69 6e 74 43 6f  (nRow + nPrintCo
196d0 6c 20 2d 20 31 29 2f 6e 50 72 69 6e 74 43 6f 6c  l - 1)/nPrintCol
196e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
196f0 20 69 3c 6e 50 72 69 6e 74 52 6f 77 3b 20 69 2b   i<nPrintRow; i+
19700 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +){.        for(
19710 6a 3d 69 3b 20 6a 3c 6e 52 6f 77 3b 20 6a 2b 3d  j=i; j<nRow; j+=
19720 6e 50 72 69 6e 74 52 6f 77 29 7b 0a 20 20 20 20  nPrintRow){.    
19730 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 70 20        char *zSp 
19740 3d 20 6a 3c 6e 50 72 69 6e 74 52 6f 77 20 3f 20  = j<nPrintRow ? 
19750 22 22 20 3a 20 22 20 20 22 3b 0a 20 20 20 20 20  "" : "  ";.     
19760 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
19770 6f 75 74 2c 20 22 25 73 25 2d 2a 73 22 2c 20 7a  out, "%s%-*s", z
19780 53 70 2c 20 6d 61 78 6c 65 6e 2c 20 61 7a 52 65  Sp, maxlen, azRe
19790 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65 73 75  sult[j] ? azResu
197a0 6c 74 5b 6a 5d 3a 22 22 29 3b 0a 20 20 20 20 20  lt[j]:"");.     
197b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72     }.        fpr
197c0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
197d0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
197e0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
197f0 69 69 3c 6e 52 6f 77 3b 20 69 69 2b 2b 29 20 73  ii<nRow; ii++) s
19800 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 52 65  qlite3_free(azRe
19810 73 75 6c 74 5b 69 69 5d 29 3b 0a 20 20 20 20 73  sult[ii]);.    s
19820 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 52 65  qlite3_free(azRe
19830 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  sult);.  }else..
19840 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20    if( c=='t' && 
19850 6e 3e 3d 38 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=8 && strncmp(
19860 61 7a 41 72 67 5b 30 5d 2c 20 22 74 65 73 74 63  azArg[0], "testc
19870 74 72 6c 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  trl", n)==0 && n
19880 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 73 74  Arg>=2 ){.    st
19890 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
198a0 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74  t {.       const
198b0 20 63 68 61 72 20 2a 7a 43 74 72 6c 4e 61 6d 65   char *zCtrlName
198c0 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61  ;   /* Name of a
198d0 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 20 6f 70   test-control op
198e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 69  tion */.       i
198f0 6e 74 20 63 74 72 6c 43 6f 64 65 3b 20 20 20 20  nt ctrlCode;    
19900 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
19910 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74  er code for that
19920 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d   option */.    }
19930 20 61 43 74 72 6c 5b 5d 20 3d 20 7b 0a 20 20 20   aCtrl[] = {.   
19940 20 20 20 7b 20 22 70 72 6e 67 5f 73 61 76 65 22     { "prng_save"
19950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
19960 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
19970 4e 47 5f 53 41 56 45 20 20 20 20 20 20 20 20 20  NG_SAVE         
19980 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
19990 22 70 72 6e 67 5f 72 65 73 74 6f 72 65 22 2c 20  "prng_restore", 
199a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
199b0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
199c0 53 54 4f 52 45 20 20 20 20 20 20 20 20 20 20 20  STORE           
199d0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67  },.      { "prng
199e0 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20 20 20  _reset",        
199f0 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
19a00 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 20 20  TRL_PRNG_RESET  
19a10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
19a20 20 20 20 20 7b 20 22 62 69 74 76 65 63 5f 74 65      { "bitvec_te
19a30 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 53  st",           S
19a40 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
19a50 49 54 56 45 43 5f 54 45 53 54 20 20 20 20 20 20  ITVEC_TEST      
19a60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
19a70 20 22 66 61 75 6c 74 5f 69 6e 73 74 61 6c 6c 22   "fault_install"
19a80 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
19a90 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f  _TESTCTRL_FAULT_
19aa0 49 4e 53 54 41 4c 4c 20 20 20 20 20 20 20 20 20  INSTALL         
19ab0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 62 65 6e   },.      { "ben
19ac0 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68 6f 6f 6b 73  ign_malloc_hooks
19ad0 22 2c 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ",   SQLITE_TEST
19ae0 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c  CTRL_BENIGN_MALL
19af0 4f 43 5f 48 4f 4f 4b 53 20 20 20 20 7d 2c 0a 20  OC_HOOKS    },. 
19b00 20 20 20 20 20 7b 20 22 70 65 6e 64 69 6e 67 5f       { "pending_
19b10 62 79 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  byte",          
19b20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19b30 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
19b40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
19b50 7b 20 22 61 73 73 65 72 74 22 2c 20 20 20 20 20  { "assert",     
19b60 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
19b70 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
19b80 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
19b90 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 6c    },.      { "al
19ba0 77 61 79 73 22 2c 20 20 20 20 20 20 20 20 20 20  ways",          
19bb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
19bc0 54 43 54 52 4c 5f 41 4c 57 41 59 53 20 20 20 20  TCTRL_ALWAYS    
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
19be0 20 20 20 20 20 20 7b 20 22 72 65 73 65 72 76 65        { "reserve
19bf0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
19c00 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19c10 5f 52 45 53 45 52 56 45 20 20 20 20 20 20 20 20  _RESERVE        
19c20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
19c30 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   { "optimization
19c40 73 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  s",         SQLI
19c50 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
19c60 4d 49 5a 41 54 49 4f 4e 53 20 20 20 20 20 20 20  MIZATIONS       
19c70 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 69     },.      { "i
19c80 73 6b 65 79 77 6f 72 64 22 2c 20 20 20 20 20 20  skeyword",      
19c90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
19ca0 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
19cc0 0a 20 20 20 20 20 20 7b 20 22 73 63 72 61 74 63  .      { "scratc
19cd0 68 6d 61 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  hmalloc",       
19ce0 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
19cf0 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 20  L_SCRATCHMALLOC 
19d00 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
19d10 20 20 7b 20 22 62 79 74 65 6f 72 64 65 72 22 2c    { "byteorder",
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
19d30 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54  ITE_TESTCTRL_BYT
19d40 45 4f 52 44 45 52 20 20 20 20 20 20 20 20 20 20  EORDER          
19d50 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20      },.    };.  
19d60 20 20 69 6e 74 20 74 65 73 74 63 74 72 6c 20 3d    int testctrl =
19d70 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 72 63 20   -1;.    int rc 
19d80 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20  = 0;.    int i, 
19d90 6e 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  n;.    open_db(p
19da0 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 63 6f  , 0);..    /* co
19db0 6e 76 65 72 74 20 74 65 73 74 63 74 72 6c 20 74  nvert testctrl t
19dc0 65 78 74 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61  ext option to va
19dd0 6c 75 65 2e 20 61 6c 6c 6f 77 20 61 6e 79 20 75  lue. allow any u
19de0 6e 69 71 75 65 20 70 72 65 66 69 78 0a 20 20 20  nique prefix.   
19df0 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6f   ** of the optio
19e00 6e 20 6e 61 6d 65 2c 20 6f 72 20 61 20 6e 75 6d  n name, or a num
19e10 65 72 69 63 61 6c 20 76 61 6c 75 65 2e 20 2a 2f  erical value. */
19e20 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  .    n = strlen3
19e30 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  0(azArg[1]);.   
19e40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74   for(i=0; i<(int
19e50 29 28 73 69 7a 65 6f 66 28 61 43 74 72 6c 29 2f  )(sizeof(aCtrl)/
19e60 73 69 7a 65 6f 66 28 61 43 74 72 6c 5b 30 5d 29  sizeof(aCtrl[0])
19e70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
19e80 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  f( strncmp(azArg
19e90 5b 31 5d 2c 20 61 43 74 72 6c 5b 69 5d 2e 7a 43  [1], aCtrl[i].zC
19ea0 74 72 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 29  trlName, n)==0 )
19eb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65  {.        if( te
19ec0 73 74 63 74 72 6c 3c 30 20 29 7b 0a 20 20 20 20  stctrl<0 ){.    
19ed0 20 20 20 20 20 20 74 65 73 74 63 74 72 6c 20 3d        testctrl =
19ee0 20 61 43 74 72 6c 5b 69 5d 2e 63 74 72 6c 43 6f   aCtrl[i].ctrlCo
19ef0 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  de;.        }els
19f00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  e{.          fpr
19f10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d  intf(stderr, "am
19f20 62 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 20 6e  biguous option n
19f30 61 6d 65 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  ame: \"%s\"\n", 
19f40 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
19f50 20 20 20 20 20 74 65 73 74 63 74 72 6c 20 3d 20       testctrl = 
19f60 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  -1;.          br
19f70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
19f80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19f90 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20   if( testctrl<0 
19fa0 29 20 74 65 73 74 63 74 72 6c 20 3d 20 28 69 6e  ) testctrl = (in
19fb0 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
19fc0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66  zArg[1]);.    if
19fd0 28 20 28 74 65 73 74 63 74 72 6c 3c 53 51 4c 49  ( (testctrl<SQLI
19fe0 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 49 52 53  TE_TESTCTRL_FIRS
19ff0 54 29 20 7c 7c 20 28 74 65 73 74 63 74 72 6c 3e  T) || (testctrl>
1a000 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a010 4c 41 53 54 29 20 29 7b 0a 20 20 20 20 20 20 66  LAST) ){.      f
1a020 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
1a030 72 72 6f 72 3a 20 69 6e 76 61 6c 69 64 20 74 65  rror: invalid te
1a040 73 74 63 74 72 6c 20 6f 70 74 69 6f 6e 3a 20 25  stctrl option: %
1a050 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  s\n", azArg[1]);
1a060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a070 20 20 73 77 69 74 63 68 28 74 65 73 74 63 74 72    switch(testctr
1a080 6c 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  l){..        /* 
1a090 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1a0a0 74 72 6f 6c 28 69 6e 74 2c 20 64 62 2c 20 69 6e  trol(int, db, in
1a0b0 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  t) */.        ca
1a0c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1a0d0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
1a0e0 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
1a0f0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
1a100 45 53 45 52 56 45 3a 20 20 20 20 20 20 20 20 20  ESERVE:         
1a110 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69      .          i
1a120 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20  f( nArg==3 ){.  
1a130 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
1a140 74 20 3d 20 28 69 6e 74 29 73 74 72 74 6f 6c 28  t = (int)strtol(
1a150 61 7a 41 72 67 5b 32 5d 2c 20 30 2c 20 30 29 3b  azArg[2], 0, 0);
1a160 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
1a170 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a180 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
1a190 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c 20  estctrl, p->db, 
1a1a0 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
1a1b0 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
1a1c0 2c 20 22 25 64 20 28 30 78 25 30 38 78 29 5c 6e  , "%d (0x%08x)\n
1a1d0 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20 20 20 20  ", rc, rc);.    
1a1e0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
1a1f0 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
1a200 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
1a210 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20 74 61  : testctrl %s ta
1a220 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  kes a single int
1a230 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20   option\n",.    
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a250 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
1a260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a270 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
1a280 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
1a290 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 29 20 2a 2f  _control(int) */
1a2a0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1a2b0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1a2c0 4e 47 5f 53 41 56 45 3a 0a 20 20 20 20 20 20 20  NG_SAVE:.       
1a2d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1a2e0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
1a2f0 52 45 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  RE:.        case
1a300 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1a310 5f 50 52 4e 47 5f 52 45 53 45 54 3a 0a 20 20 20  _PRNG_RESET:.   
1a320 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1a330 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
1a340 44 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20 69  DER:.          i
1a350 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
1a360 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a370 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1a380 72 6f 6c 28 74 65 73 74 63 74 72 6c 29 3b 0a 20  rol(testctrl);. 
1a390 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
1a3a0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28  tf(p->out, "%d (
1a3b0 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c 20  0x%08x)\n", rc, 
1a3c0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rc);.          }
1a3d0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1a3e0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1a3f0 72 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63  rr,"Error: testc
1a400 74 72 6c 20 25 73 20 74 61 6b 65 73 20 6e 6f 20  trl %s takes no 
1a410 6f 70 74 69 6f 6e 73 5c 6e 22 2c 20 61 7a 41 72  options\n", azAr
1a420 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[1]);.         
1a430 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
1a440 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ak;..        /* 
1a450 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1a460 74 72 6f 6c 28 69 6e 74 2c 20 75 69 6e 74 29 20  trol(int, uint) 
1a470 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  */.        case 
1a480 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a490 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 20 20  PENDING_BYTE:   
1a4a0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
1a4b0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
1a4c0 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
1a4d0 6e 65 64 20 69 6e 74 20 6f 70 74 20 3d 20 28 75  ned int opt = (u
1a4e0 6e 73 69 67 6e 65 64 20 69 6e 74 29 69 6e 74 65  nsigned int)inte
1a4f0 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  gerValue(azArg[2
1a500 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
1a510 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
1a520 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
1a530 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20  rl, opt);.      
1a540 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
1a550 3e 6f 75 74 2c 20 22 25 64 20 28 30 78 25 30 38  >out, "%d (0x%08
1a560 78 29 5c 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a  x)\n", rc, rc);.
1a570 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1a580 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
1a590 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
1a5a0 72 72 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25  rror: testctrl %
1a5b0 73 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  s takes a single
1a5c0 20 75 6e 73 69 67 6e 65 64 22 0a 20 20 20 20 20   unsigned".     
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5e0 20 20 20 20 20 20 22 20 69 6e 74 20 6f 70 74 69        " int opti
1a5f0 6f 6e 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  on\n", azArg[1])
1a600 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1a610 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a620 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
1a630 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
1a640 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 69  t_control(int, i
1a650 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  nt) */.        c
1a660 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1a670 54 52 4c 5f 41 53 53 45 52 54 3a 20 20 20 20 20  TRL_ASSERT:     
1a680 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
1a690 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1a6a0 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 20  STCTRL_ALWAYS:  
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
1a6c0 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
1a6d0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =3 ){.          
1a6e0 20 20 69 6e 74 20 6f 70 74 20 3d 20 62 6f 6f 6c    int opt = bool
1a6f0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  eanValue(azArg[2
1a700 5d 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ]);        .    
1a710 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a720 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1a730 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29  l(testctrl, opt)
1a740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
1a750 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1a760 64 20 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72  d (0x%08x)\n", r
1a770 63 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  c, rc);.        
1a780 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1a790 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
1a7a0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 74 65  tderr,"Error: te
1a7b0 73 74 63 74 72 6c 20 25 73 20 74 61 6b 65 73 20  stctrl %s takes 
1a7c0 61 20 73 69 6e 67 6c 65 20 69 6e 74 20 6f 70 74  a single int opt
1a7d0 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ion\n",.        
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7f0 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20      azArg[1]);. 
1a800 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a810 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1a820 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1a830 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
1a840 2c 20 63 68 61 72 20 2a 29 20 2a 2f 0a 23 69 66  , char *) */.#if
1a850 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  def SQLITE_N_KEY
1a860 57 4f 52 44 0a 20 20 20 20 20 20 20 20 63 61 73  WORD.        cas
1a870 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1a880 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 20 20 20  L_ISKEYWORD:    
1a890 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
1a8a0 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
1a8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
1a8c0 73 74 20 63 68 61 72 20 2a 6f 70 74 20 3d 20 61  st char *opt = a
1a8d0 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20  zArg[2];        
1a8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1a8f0 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
1a900 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c  ontrol(testctrl,
1a910 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20   opt);.         
1a920 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
1a930 74 2c 20 22 25 64 20 28 30 78 25 30 38 78 29 5c  t, "%d (0x%08x)\
1a940 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20 20 20  n", rc, rc);.   
1a950 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
1a960 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
1a970 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
1a980 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20 74  r: testctrl %s t
1a990 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 63 68  akes a single ch
1a9a0 61 72 20 2a 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a  ar * option\n",.
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
1a9d0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[1]);.         
1a9e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
1a9f0 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ak;.#endif..    
1aa00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1aa10 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f  TESTCTRL_BITVEC_
1aa20 54 45 53 54 3a 20 20 20 20 20 20 20 20 20 0a 20  TEST:         . 
1aa30 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1aa40 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c  TE_TESTCTRL_FAUL
1aa50 54 5f 49 4e 53 54 41 4c 4c 3a 20 20 20 20 20 20  T_INSTALL:      
1aa60 20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53   .        case S
1aa70 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1aa80 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
1aa90 4b 53 3a 20 0a 20 20 20 20 20 20 20 20 63 61 73  KS: .        cas
1aaa0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1aab0 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a  L_SCRATCHMALLOC:
1aac0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
1aad0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
1aae0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1aaf0 72 2c 22 45 72 72 6f 72 3a 20 43 4c 49 20 73 75  r,"Error: CLI su
1ab00 70 70 6f 72 74 20 66 6f 72 20 74 65 73 74 63 74  pport for testct
1ab10 72 6c 20 25 73 20 6e 6f 74 20 69 6d 70 6c 65 6d  rl %s not implem
1ab20 65 6e 74 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ented\n",.      
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
1ab40 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[1]);.         
1ab50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1ab60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
1ab70 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e   if( c=='t' && n
1ab80 3e 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >4 && strncmp(az
1ab90 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65 6f 75 74  Arg[0], "timeout
1aba0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
1abb0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
1abc0 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
1abd0 74 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 6e  timeout(p->db, n
1abe0 41 72 67 3e 3d 32 20 3f 20 28 69 6e 74 29 69 6e  Arg>=2 ? (int)in
1abf0 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
1ac00 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c  [1]) : 0);.  }el
1ac10 73 65 0a 20 20 20 20 0a 20 20 69 66 28 20 63 3d  se.    .  if( c=
1ac20 3d 27 74 27 20 26 26 20 6e 3e 3d 35 20 26 26 20  ='t' && n>=5 && 
1ac30 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
1ac40 2c 20 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30  , "timer", n)==0
1ac50 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
1ac60 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 65 6e 61  ==2 ){.      ena
1ac70 62 6c 65 54 69 6d 65 72 20 3d 20 62 6f 6f 6c 65  bleTimer = boole
1ac80 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
1ac90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 6e 61  );.      if( ena
1aca0 62 6c 65 54 69 6d 65 72 20 26 26 20 21 48 41 53  bleTimer && !HAS
1acb0 5f 54 49 4d 45 52 20 29 7b 0a 20 20 20 20 20 20  _TIMER ){.      
1acc0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1acd0 2c 20 22 45 72 72 6f 72 3a 20 74 69 6d 65 72 20  , "Error: timer 
1ace0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  not available on
1acf0 20 74 68 69 73 20 73 79 73 74 65 6d 2e 5c 6e 22   this system.\n"
1ad00 29 3b 0a 20 20 20 20 20 20 20 20 65 6e 61 62 6c  );.        enabl
1ad10 65 54 69 6d 65 72 20 3d 20 30 3b 0a 20 20 20 20  eTimer = 0;.    
1ad20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1ad30 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1ad40 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 74 69  err, "Usage: .ti
1ad50 6d 65 72 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  mer on|off\n");.
1ad60 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
1ad70 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 20 20 0a 20    }.  }else.  . 
1ad80 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73   if( c=='t' && s
1ad90 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
1ada0 20 22 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20   "trace", n)==0 
1adb0 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
1adc0 2c 20 30 29 3b 0a 20 20 20 20 6f 75 74 70 75 74  , 0);.    output
1add0 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 74  _file_close(p->t
1ade0 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20 69 66  raceOut);.    if
1adf0 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
1ae00 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1ae10 72 2c 20 22 55 73 61 67 65 3a 20 2e 74 72 61 63  r, "Usage: .trac
1ae20 65 20 46 49 4c 45 7c 6f 66 66 5c 6e 22 29 3b 0a  e FILE|off\n");.
1ae30 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
1ae40 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
1ae50 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
1ae60 7d 0a 20 20 20 20 70 2d 3e 74 72 61 63 65 4f 75  }.    p->traceOu
1ae70 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  t = output_file_
1ae80 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  open(azArg[1]);.
1ae90 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1aea0 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
1aeb0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1aec0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1aed0 5f 50 4f 49 4e 54 29 0a 20 20 20 20 69 66 28 20  _POINT).    if( 
1aee0 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d 30 20 29  p->traceOut==0 )
1aef0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1af00 74 72 61 63 65 28 70 2d 3e 64 62 2c 20 30 2c 20  trace(p->db, 0, 
1af10 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1af20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
1af30 63 65 28 70 2d 3e 64 62 2c 20 73 71 6c 5f 74 72  ce(p->db, sql_tr
1af40 61 63 65 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2d  ace_callback, p-
1af50 3e 74 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20  >traceOut);.    
1af60 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
1af70 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
1af80 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
1af90 0a 20 20 69 66 28 20 63 3d 3d 27 75 27 20 26 26  .  if( c=='u' &&
1afa0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
1afb0 5d 2c 20 22 75 73 65 72 22 2c 20 6e 29 3d 3d 30  ], "user", n)==0
1afc0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
1afd0 3c 32 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  <2 ){.      fpri
1afe0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
1aff0 67 65 3a 20 2e 75 73 65 72 20 53 55 42 43 4f 4d  ge: .user SUBCOM
1b000 4d 41 4e 44 20 2e 2e 2e 5c 6e 22 29 3b 0a 20 20  MAND ...\n");.  
1b010 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
1b020 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
1b030 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
1b040 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
1b050 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
1b060 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 6f 67 69  p(azArg[1],"logi
1b070 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
1b080 69 66 28 20 6e 41 72 67 21 3d 34 20 29 7b 0a 20  if( nArg!=4 ){. 
1b090 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
1b0a0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
1b0b0 75 73 65 72 20 6c 6f 67 69 6e 20 55 53 45 52 20  user login USER 
1b0c0 50 41 53 53 57 4f 52 44 5c 6e 22 29 3b 0a 20 20  PASSWORD\n");.  
1b0d0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
1b0e0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
1b0f0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
1b100 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1b110 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75   sqlite3_user_au
1b120 74 68 65 6e 74 69 63 61 74 65 28 70 2d 3e 64 62  thenticate(p->db
1b130 2c 20 61 7a 41 72 67 5b 32 5d 2c 20 61 7a 41 72  , azArg[2], azAr
1b140 67 5b 33 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  g[3],.          
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b160 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 73            (int)s
1b170 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33 5d 29 29  trlen(azArg[3]))
1b180 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1b190 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1b1a0 66 28 73 74 64 65 72 72 2c 20 22 41 75 74 68 65  f(stderr, "Authe
1b1b0 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ntication failed
1b1c0 20 66 6f 72 20 75 73 65 72 20 25 73 5c 6e 22 2c   for user %s\n",
1b1d0 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20   azArg[2]);.    
1b1e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
1b1f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1b200 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
1b210 5d 2c 22 61 64 64 22 29 3d 3d 30 20 29 7b 0a 20  ],"add")==0 ){. 
1b220 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 35       if( nArg!=5
1b230 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
1b240 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
1b250 67 65 3a 20 2e 75 73 65 72 20 61 64 64 20 55 53  ge: .user add US
1b260 45 52 20 50 41 53 53 57 4f 52 44 20 49 53 41 44  ER PASSWORD ISAD
1b270 4d 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  MIN\n");.       
1b280 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
1b290 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
1b2a0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
1b2b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1b2c0 74 65 33 5f 75 73 65 72 5f 61 64 64 28 70 2d 3e  te3_user_add(p->
1b2d0 64 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20  db, azArg[2],.  
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
1b300 33 5d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  3], (int)strlen(
1b310 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20  azArg[3]),.     
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 56 61         booleanVa
1b340 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a  lue(azArg[4]));.
1b350 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1b360 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1b370 73 74 64 65 72 72 2c 20 22 55 73 65 72 2d 41 64  stderr, "User-Ad
1b380 64 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c  d failed: %d\n",
1b390 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63   rc);.        rc
1b3a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1b3b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1b3c0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 65 64 69  mp(azArg[1],"edi
1b3d0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
1b3e0 69 66 28 20 6e 41 72 67 21 3d 35 20 29 7b 0a 20  if( nArg!=5 ){. 
1b3f0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
1b400 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
1b410 75 73 65 72 20 65 64 69 74 20 55 53 45 52 20 50  user edit USER P
1b420 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 5c  ASSWORD ISADMIN\
1b430 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
1b440 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
1b450 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
1b460 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
1b470 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1b480 75 73 65 72 5f 63 68 61 6e 67 65 28 70 2d 3e 64  user_change(p->d
1b490 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20  b, azArg[2],.   
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
1b4c0 5b 33 5d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  [3], (int)strlen
1b4d0 28 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20  (azArg[3]),.    
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61            boolea
1b500 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29  nValue(azArg[4])
1b510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1b520 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1b530 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 72  tf(stderr, "User
1b540 2d 45 64 69 74 20 66 61 69 6c 65 64 3a 20 25 64  -Edit failed: %d
1b550 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
1b560 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
1b570 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1b580 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
1b590 22 64 65 6c 65 74 65 22 29 3d 3d 30 20 29 7b 0a  "delete")==0 ){.
1b5a0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d        if( nArg!=
1b5b0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  3 ){.        fpr
1b5c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
1b5d0 61 67 65 3a 20 2e 75 73 65 72 20 64 65 6c 65 74  age: .user delet
1b5e0 65 20 55 53 45 52 5c 6e 22 29 3b 0a 20 20 20 20  e USER\n");.    
1b5f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
1b600 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
1b610 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
1b620 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
1b630 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65  qlite3_user_dele
1b640 74 65 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67 5b  te(p->db, azArg[
1b650 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  2]);.      if( r
1b660 63 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  c ){.        fpr
1b670 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
1b680 65 72 2d 44 65 6c 65 74 65 20 66 61 69 6c 65 64  er-Delete failed
1b690 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  : %d\n", rc);.  
1b6a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
1b6b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1b6c0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
1b6d0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
1b6e0 75 73 65 72 20 6c 6f 67 69 6e 7c 61 64 64 7c 65  user login|add|e
1b6f0 64 69 74 7c 64 65 6c 65 74 65 20 2e 2e 2e 5c 6e  dit|delete ...\n
1b700 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
1b710 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
1b720 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
1b730 20 20 20 20 7d 20 20 20 20 0a 20 20 7d 65 6c 73      }    .  }els
1b740 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1b750 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
1b760 43 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 69 66 28  CATION */..  if(
1b770 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63   c=='v' && strnc
1b780 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 65  mp(azArg[0], "ve
1b790 72 73 69 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b  rsion", n)==0 ){
1b7a0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
1b7b0 6f 75 74 2c 20 22 53 51 4c 69 74 65 20 25 73 20  out, "SQLite %s 
1b7c0 25 73 5c 6e 22 20 2f 2a 65 78 74 72 61 2d 76 65  %s\n" /*extra-ve
1b7d0 72 73 69 6f 6e 2d 69 6e 66 6f 2a 2f 2c 0a 20 20  rsion-info*/,.  
1b7e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
1b7f0 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c 69  bversion(), sqli
1b800 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
1b810 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
1b820 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d  c=='v' && strncm
1b830 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66 73  p(azArg[0], "vfs
1b840 6e 61 6d 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  name", n)==0 ){.
1b850 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b860 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d 3d  zDbName = nArg==
1b870 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
1b880 6d 61 69 6e 22 3b 0a 20 20 20 20 63 68 61 72 20  main";.    char 
1b890 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20  *zVfsName = 0;. 
1b8a0 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a     if( p->db ){.
1b8b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
1b8c0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
1b8d0 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54  , zDbName, SQLIT
1b8e0 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c  E_FCNTL_VFSNAME,
1b8f0 20 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20   &zVfsName);.   
1b900 20 20 20 69 66 28 20 7a 56 66 73 4e 61 6d 65 20     if( zVfsName 
1b910 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1b920 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
1b930 22 2c 20 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  ", zVfsName);.  
1b940 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1b950 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  ee(zVfsName);.  
1b960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1b970 6c 73 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  lse..#if defined
1b980 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
1b990 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1b9a0 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
1b9b0 43 45 29 0a 20 20 69 66 28 20 63 3d 3d 27 77 27  CE).  if( c=='w'
1b9c0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
1b9d0 67 5b 30 5d 2c 20 22 77 68 65 72 65 74 72 61 63  g[0], "wheretrac
1b9e0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
1b9f0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1ba00 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20  te3WhereTrace;. 
1ba10 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54     sqlite3WhereT
1ba20 72 61 63 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  race = nArg>=2 ?
1ba30 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
1ba40 41 72 67 5b 31 5d 29 20 3a 20 30 78 66 66 3b 0a  Arg[1]) : 0xff;.
1ba50 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
1ba60 20 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20    if( c=='w' && 
1ba70 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
1ba80 2c 20 22 77 69 64 74 68 22 2c 20 6e 29 3d 3d 30  , "width", n)==0
1ba90 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20   ){.    int j;. 
1baa0 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3c     assert( nArg<
1bab0 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67  =ArraySize(azArg
1bac0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  ) );.    for(j=1
1bad0 3b 20 6a 3c 6e 41 72 67 20 26 26 20 6a 3c 41 72  ; j<nArg && j<Ar
1bae0 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69  raySize(p->colWi
1baf0 64 74 68 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  dth); j++){.    
1bb00 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 6a 2d    p->colWidth[j-
1bb10 31 5d 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  1] = (int)intege
1bb20 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 6a 5d 29  rValue(azArg[j])
1bb30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
1bb40 0a 20 20 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  .  {.    fprintf
1bb50 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1bb60 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64   unknown command
1bb70 20 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75   or invalid argu
1bb80 6d 65 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22  ments: ".      "
1bb90 20 5c 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c   \"%s\". Enter \
1bba0 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c  ".help\" for hel
1bbb0 70 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  p\n", azArg[0]);
1bbc0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
1bbd0 0a 0a 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  ..meta_command_e
1bbe0 78 69 74 3a 0a 20 20 69 66 28 20 70 2d 3e 6f 75  xit:.  if( p->ou
1bbf0 74 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 70 2d  tCount ){.    p-
1bc00 3e 6f 75 74 43 6f 75 6e 74 2d 2d 3b 0a 20 20 20  >outCount--;.   
1bc10 20 69 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e 74   if( p->outCount
1bc20 3d 3d 30 20 29 20 6f 75 74 70 75 74 5f 72 65 73  ==0 ) output_res
1bc30 65 74 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  et(p);.  }.  ret
1bc40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bc50 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1bc60 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 63 63 75  a semicolon occu
1bc70 72 73 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74  rs anywhere in t
1bc80 68 65 20 66 69 72 73 74 20 4e 20 63 68 61 72 61  he first N chara
1bc90 63 74 65 72 73 0a 2a 2a 20 6f 66 20 73 74 72 69  cters.** of stri
1bca0 6e 67 20 7a 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69  ng z[]..*/.stati
1bcb0 63 20 69 6e 74 20 6c 69 6e 65 5f 63 6f 6e 74 61  c int line_conta
1bcc0 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63 6f  ins_semicolon(co
1bcd0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
1bce0 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   N){.  int i;.  
1bcf0 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
1bd00 2b 29 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  +){  if( z[i]=='
1bd10 3b 27 20 29 20 72 65 74 75 72 6e 20 31 3b 20 7d  ;' ) return 1; }
1bd20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1bd30 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65  /*.** Test to se
1bd40 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e 73  e if a line cons
1bd50 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
1bd60 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f 0a   whitespace..*/.
1bd70 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c 5f  static int _all_
1bd80 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73 74  whitespace(const
1bd90 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f 72   char *z){.  for
1bda0 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  (; *z; z++){.   
1bdb0 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 30   if( IsSpace(z[0
1bdc0 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ]) ) continue;. 
1bdd0 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26     if( *z=='/' &
1bde0 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20  & z[1]=='*' ){. 
1bdf0 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
1be00 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
1be10 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d  (*z!='*' || z[1]
1be20 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d  !='/') ){ z++; }
1be30 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30  .      if( *z==0
1be40 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1be50 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f     z++;.      co
1be60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1be70 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26    if( *z=='-' &&
1be80 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[1]=='-' ){.  
1be90 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20      z += 2;.    
1bea0 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
1beb0 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20  z!='\n' ){ z++; 
1bec0 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
1bed0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1bee0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1bef0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
1bf00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
1bf10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1bf20 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 69  n TRUE if the li
1bf30 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20 61  ne typed in is a
1bf40 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65  n SQL command te
1bf50 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a  rminator other.*
1bf60 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f  * than a semi-co
1bf70 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65  lon.  The SQL Se
1bf80 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20  rver style "go" 
1bf90 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72  command is under
1bfa0 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74  stood.** as is t
1bfb0 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a  he Oracle "/"..*
1bfc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e  /.static int lin
1bfd0 65 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72  e_is_command_ter
1bfe0 6d 69 6e 61 74 6f 72 28 63 6f 6e 73 74 20 63 68  minator(const ch
1bff0 61 72 20 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77 68  ar *zLine){.  wh
1c000 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69  ile( IsSpace(zLi
1c010 6e 65 5b 30 5d 29 20 29 7b 20 7a 4c 69 6e 65 2b  ne[0]) ){ zLine+
1c020 2b 3b 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  +; };.  if( zLin
1c030 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61 6c  e[0]=='/' && _al
1c040 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c  l_whitespace(&zL
1c050 69 6e 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20 72  ine[1]) ){.    r
1c060 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72 61  eturn 1;  /* Ora
1c070 63 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  cle */.  }.  if(
1c080 20 54 6f 4c 6f 77 65 72 28 7a 4c 69 6e 65 5b 30   ToLower(zLine[0
1c090 5d 29 3d 3d 27 67 27 20 26 26 20 54 6f 4c 6f 77  ])=='g' && ToLow
1c0a0 65 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27 6f  er(zLine[1])=='o
1c0b0 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 5f 61  '.         && _a
1c0c0 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a  ll_whitespace(&z
1c0d0 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20 20  Line[2]) ){.    
1c0e0 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53 51  return 1;  /* SQ
1c0f0 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d 0a  L Server */.  }.
1c100 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1c110 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1c120 20 69 66 20 7a 53 71 6c 20 69 73 20 61 20 63 6f   if zSql is a co
1c130 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
1c140 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 66 61  ment.  Return fa
1c150 6c 73 65 20 69 66 20 69 74 0a 2a 2a 20 65 6e 64  lse if it.** end
1c160 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  s in the middle 
1c170 6f 66 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  of a string lite
1c180 72 61 6c 20 6f 72 20 43 2d 73 74 79 6c 65 20 63  ral or C-style c
1c190 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  omment..*/.stati
1c1a0 63 20 69 6e 74 20 6c 69 6e 65 5f 69 73 5f 63 6f  c int line_is_co
1c1b0 6d 70 6c 65 74 65 28 63 68 61 72 20 2a 7a 53 71  mplete(char *zSq
1c1c0 6c 2c 20 69 6e 74 20 6e 53 71 6c 29 7b 0a 20 20  l, int nSql){.  
1c1d0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 7a 53  int rc;.  if( zS
1c1e0 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ql==0 ) return 1
1c1f0 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d  ;.  zSql[nSql] =
1c200 20 27 3b 27 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71   ';';.  zSql[nSq
1c210 6c 2b 31 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d  l+1] = 0;.  rc =
1c220 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
1c230 65 28 7a 53 71 6c 29 3b 0a 20 20 7a 53 71 6c 5b  e(zSql);.  zSql[
1c240 6e 53 71 6c 5d 20 3d 20 30 3b 0a 20 20 72 65 74  nSql] = 0;.  ret
1c250 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c260 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   Read input from
1c270 20 2a 69 6e 20 61 6e 64 20 70 72 6f 63 65 73 73   *in and process
1c280 20 69 74 2e 20 20 49 66 20 2a 69 6e 3d 3d 30 20   it.  If *in==0 
1c290 74 68 65 6e 20 69 6e 70 75 74 0a 2a 2a 20 69 73  then input.** is
1c2a0 20 69 6e 74 65 72 61 63 74 69 76 65 20 2d 20 74   interactive - t
1c2b0 68 65 20 75 73 65 72 20 69 73 20 74 79 70 69 6e  he user is typin
1c2c0 67 20 69 74 20 69 74 2e 20 20 4f 74 68 65 72 77  g it it.  Otherw
1c2d0 69 73 65 2c 20 69 6e 70 75 74 0a 2a 2a 20 69 73  ise, input.** is
1c2e0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 66   coming from a f
1c2f0 69 6c 65 20 6f 72 20 64 65 76 69 63 65 2e 20 20  ile or device.  
1c300 41 20 70 72 6f 6d 70 74 20 69 73 20 69 73 73 75  A prompt is issu
1c310 65 64 20 61 6e 64 20 68 69 73 74 6f 72 79 0a 2a  ed and history.*
1c320 2a 20 69 73 20 73 61 76 65 64 20 6f 6e 6c 79 20  * is saved only 
1c330 69 66 20 69 6e 70 75 74 20 69 73 20 69 6e 74 65  if input is inte
1c340 72 61 63 74 69 76 65 2e 20 20 41 6e 20 69 6e 74  ractive.  An int
1c350 65 72 72 75 70 74 20 73 69 67 6e 61 6c 20 77 69  errupt signal wi
1c360 6c 6c 0a 2a 2a 20 63 61 75 73 65 20 74 68 69 73  ll.** cause this
1c370 20 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 69 74   routine to exit
1c380 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 75 6e   immediately, un
1c390 6c 65 73 73 20 69 6e 70 75 74 20 69 73 20 69 6e  less input is in
1c3a0 74 65 72 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a  teractive..**.**
1c3b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1c3c0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
1c3d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
1c3e0 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53  ess_input(ShellS
1c3f0 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69  tate *p, FILE *i
1c400 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e  n){.  char *zLin
1c410 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1c420 2f 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 70 75  /* A single inpu
1c430 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  t line */.  char
1c440 20 2a 7a 53 71 6c 20 3d 20 30 3b 20 20 20 20 20   *zSql = 0;     
1c450 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c        /* Accumul
1c460 61 74 65 64 20 53 51 4c 20 74 65 78 74 20 2a 2f  ated SQL text */
1c470 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20  .  int nLine;   
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c490 4c 65 6e 67 74 68 20 6f 66 20 63 75 72 72 65 6e  Length of curren
1c4a0 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  t line */.  int 
1c4b0 6e 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  nSql = 0;       
1c4c0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1c4d0 66 20 7a 53 71 6c 5b 5d 20 75 73 65 64 20 2a 2f  f zSql[] used */
1c4e0 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
1c4f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1c500 41 6c 6c 6f 63 61 74 65 64 20 7a 53 71 6c 5b 5d  Allocated zSql[]
1c510 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20   space */.  int 
1c520 6e 53 71 6c 50 72 69 6f 72 20 3d 20 30 3b 20 20  nSqlPrior = 0;  
1c530 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1c540 66 20 7a 53 71 6c 5b 5d 20 75 73 65 64 20 62 79  f zSql[] used by
1c550 20 70 72 69 6f 72 20 6c 69 6e 65 20 2a 2f 0a 20   prior line */. 
1c560 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 20   char *zErrMsg; 
1c570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
1c580 72 6f 72 20 6d 65 73 73 61 67 65 20 72 65 74 75  ror message retu
1c590 72 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  rned */.  int rc
1c5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c5b0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
1c5c0 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6e  e */.  int errCn
1c5d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1c5e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
1c5f0 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  rors seen */.  i
1c600 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20  nt lineno = 0;  
1c610 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1c620 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
1c630 2a 2f 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  */.  int startli
1c640 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ne = 0;        /
1c650 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
1c660 72 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65  r start of curre
1c670 6e 74 20 69 6e 70 75 74 20 2a 2f 0a 0a 20 20 77  nt input */..  w
1c680 68 69 6c 65 28 20 65 72 72 43 6e 74 3d 3d 30 20  hile( errCnt==0 
1c690 7c 7c 20 21 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f  || !bail_on_erro
1c6a0 72 20 7c 7c 20 28 69 6e 3d 3d 30 20 26 26 20 73  r || (in==0 && s
1c6b0 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
1c6c0 69 76 65 29 20 29 7b 0a 20 20 20 20 66 66 6c 75  ive) ){.    fflu
1c6d0 73 68 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  sh(p->out);.    
1c6e0 7a 4c 69 6e 65 20 3d 20 6f 6e 65 5f 69 6e 70 75  zLine = one_inpu
1c6f0 74 5f 6c 69 6e 65 28 69 6e 2c 20 7a 4c 69 6e 65  t_line(in, zLine
1c700 2c 20 6e 53 71 6c 3e 30 29 3b 0a 20 20 20 20 69  , nSql>0);.    i
1c710 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20  f( zLine==0 ){. 
1c720 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69       /* End of i
1c730 6e 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  nput */.      if
1c740 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72  ( stdin_is_inter
1c750 61 63 74 69 76 65 20 29 20 70 72 69 6e 74 66 28  active ) printf(
1c760 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  "\n");.      bre
1c770 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
1c780 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  ( seenInterrupt 
1c790 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 21  ){.      if( in!
1c7a0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1c7b0 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
1c7c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  = 0;.    }.    l
1c7d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
1c7e0 20 6e 53 71 6c 3d 3d 30 20 26 26 20 5f 61 6c 6c   nSql==0 && _all
1c7f0 5f 77 68 69 74 65 73 70 61 63 65 28 7a 4c 69 6e  _whitespace(zLin
1c800 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  e) ){.      if( 
1c810 70 2d 3e 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e  p->echoOn ) prin
1c820 74 66 28 22 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65  tf("%s\n", zLine
1c830 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
1c840 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1c850 20 7a 4c 69 6e 65 20 26 26 20 7a 4c 69 6e 65 5b   zLine && zLine[
1c860 30 5d 3d 3d 27 2e 27 20 26 26 20 6e 53 71 6c 3d  0]=='.' && nSql=
1c870 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1c880 70 2d 3e 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e  p->echoOn ) prin
1c890 74 66 28 22 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65  tf("%s\n", zLine
1c8a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 6f  );.      rc = do
1c8b0 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c  _meta_command(zL
1c8c0 69 6e 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  ine, p);.      i
1c8d0 66 28 20 72 63 3d 3d 32 20 29 7b 20 2f 2a 20 65  f( rc==2 ){ /* e
1c8e0 78 69 74 20 72 65 71 75 65 73 74 65 64 20 2a 2f  xit requested */
1c8f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c900 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c910 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  rc ){.        er
1c920 72 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rCnt++;.      }.
1c930 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1c940 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 69      }.    if( li
1c950 6e 65 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65  ne_is_command_te
1c960 72 6d 69 6e 61 74 6f 72 28 7a 4c 69 6e 65 29 20  rminator(zLine) 
1c970 26 26 20 6c 69 6e 65 5f 69 73 5f 63 6f 6d 70 6c  && line_is_compl
1c980 65 74 65 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20  ete(zSql, nSql) 
1c990 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1c9a0 7a 4c 69 6e 65 2c 22 3b 22 2c 32 29 3b 0a 20 20  zLine,";",2);.  
1c9b0 20 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20    }.    nLine = 
1c9c0 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b  strlen30(zLine);
1c9d0 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 2b 6e 4c  .    if( nSql+nL
1c9e0 69 6e 65 2b 32 3e 3d 6e 41 6c 6c 6f 63 20 29 7b  ine+2>=nAlloc ){
1c9f0 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20  .      nAlloc = 
1ca00 6e 53 71 6c 2b 6e 4c 69 6e 65 2b 31 30 30 3b 0a  nSql+nLine+100;.
1ca10 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72 65 61        zSql = rea
1ca20 6c 6c 6f 63 28 7a 53 71 6c 2c 20 6e 41 6c 6c 6f  lloc(zSql, nAllo
1ca30 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53  c);.      if( zS
1ca40 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ql==0 ){.       
1ca50 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1ca60 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
1ca70 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
1ca80 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
1ca90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
1caa0 53 71 6c 50 72 69 6f 72 20 3d 20 6e 53 71 6c 3b  SqlPrior = nSql;
1cab0 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3d 3d 30  .    if( nSql==0
1cac0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
1cad0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1cae0 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 49 73 53 70  zLine[i] && IsSp
1caf0 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69  ace(zLine[i]); i
1cb00 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
1cb10 72 74 28 20 6e 41 6c 6c 6f 63 3e 30 20 26 26 20  rt( nAlloc>0 && 
1cb20 7a 53 71 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  zSql!=0 );.     
1cb30 20 6d 65 6d 63 70 79 28 7a 53 71 6c 2c 20 7a 4c   memcpy(zSql, zL
1cb40 69 6e 65 2b 69 2c 20 6e 4c 69 6e 65 2b 31 2d 69  ine+i, nLine+1-i
1cb50 29 3b 0a 20 20 20 20 20 20 73 74 61 72 74 6c 69  );.      startli
1cb60 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20  ne = lineno;.   
1cb70 20 20 20 6e 53 71 6c 20 3d 20 6e 4c 69 6e 65 2d     nSql = nLine-
1cb80 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
1cb90 20 20 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b 2b 5d      zSql[nSql++]
1cba0 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 6d   = '\n';.      m
1cbb0 65 6d 63 70 79 28 7a 53 71 6c 2b 6e 53 71 6c 2c  emcpy(zSql+nSql,
1cbc0 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 2b 31 29   zLine, nLine+1)
1cbd0 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 2b 3d 20  ;.      nSql += 
1cbe0 6e 4c 69 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  nLine;.    }.   
1cbf0 20 69 66 28 20 6e 53 71 6c 20 26 26 20 6c 69 6e   if( nSql && lin
1cc00 65 5f 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63  e_contains_semic
1cc10 6f 6c 6f 6e 28 26 7a 53 71 6c 5b 6e 53 71 6c 50  olon(&zSql[nSqlP
1cc20 72 69 6f 72 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c  rior], nSql-nSql
1cc30 50 72 69 6f 72 29 0a 20 20 20 20 20 20 20 20 20  Prior).         
1cc40 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1cc50 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29  3_complete(zSql)
1cc60 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74   ){.      p->cnt
1cc70 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e   = 0;.      open
1cc80 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 20  _db(p, 0);.     
1cc90 20 42 45 47 49 4e 5f 54 49 4d 45 52 3b 0a 20 20   BEGIN_TIMER;.  
1cca0 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65      rc = shell_e
1ccb0 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  xec(p->db, zSql,
1ccc0 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
1ccd0 20 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   p, &zErrMsg);. 
1cce0 20 20 20 20 20 45 4e 44 5f 54 49 4d 45 52 3b 0a       END_TIMER;.
1ccf0 20 20 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20        if( rc || 
1cd00 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
1cd10 20 20 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b     char zPrefix[
1cd20 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  100];.        if
1cd30 28 20 69 6e 21 3d 30 20 7c 7c 20 21 73 74 64 69  ( in!=0 || !stdi
1cd40 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
1cd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1cd60 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1cd70 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20  izeof(zPrefix), 
1cd80 7a 50 72 65 66 69 78 2c 20 0a 20 20 20 20 20 20  zPrefix, .      
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cda0 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 65 61       "Error: nea
1cdb0 72 20 6c 69 6e 65 20 25 64 3a 22 2c 20 73 74 61  r line %d:", sta
1cdc0 72 74 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  rtline);.       
1cdd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cde0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1cdf0 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69  tf(sizeof(zPrefi
1ce00 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 45 72  x), zPrefix, "Er
1ce10 72 6f 72 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  ror:");.        
1ce20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45  }.        if( zE
1ce30 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20  rrMsg!=0 ){.    
1ce40 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1ce50 64 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c  derr, "%s %s\n",
1ce60 20 7a 50 72 65 66 69 78 2c 20 7a 45 72 72 4d 73   zPrefix, zErrMs
1ce70 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  g);.          sq
1ce80 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
1ce90 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  sg);.          z
1cea0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
1ceb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cec0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1ced0 65 72 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20  err, "%s %s\n", 
1cee0 7a 50 72 65 66 69 78 2c 20 73 71 6c 69 74 65 33  zPrefix, sqlite3
1cef0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
1cf00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cf10 20 20 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20 20     errCnt++;.   
1cf20 20 20 20 7d 0a 20 20 20 20 20 20 6e 53 71 6c 20     }.      nSql 
1cf30 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1cf40 2d 3e 6f 75 74 43 6f 75 6e 74 20 29 7b 0a 20 20  ->outCount ){.  
1cf50 20 20 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73        output_res
1cf60 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  et(p);.        p
1cf70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a  ->outCount = 0;.
1cf80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1cf90 65 20 69 66 28 20 6e 53 71 6c 20 26 26 20 5f 61  e if( nSql && _a
1cfa0 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53  ll_whitespace(zS
1cfb0 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ql) ){.      if(
1cfc0 20 70 2d 3e 65 63 68 6f 4f 6e 20 29 20 70 72 69   p->echoOn ) pri
1cfd0 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 53 71 6c  ntf("%s\n", zSql
1cfe0 29 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20  );.      nSql = 
1cff0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
1d000 66 28 20 6e 53 71 6c 20 29 7b 0a 20 20 20 20 69  f( nSql ){.    i
1d010 66 28 20 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70  f( !_all_whitesp
1d020 61 63 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20  ace(zSql) ){.   
1d030 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1d040 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e 63 6f 6d  r, "Error: incom
1d050 70 6c 65 74 65 20 53 51 4c 3a 20 25 73 5c 6e 22  plete SQL: %s\n"
1d060 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 65  , zSql);.      e
1d070 72 72 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  rrCnt++;.    }. 
1d080 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20     free(zSql);. 
1d090 20 7d 0a 20 20 66 72 65 65 28 7a 4c 69 6e 65 29   }.  free(zLine)
1d0a0 3b 0a 20 20 72 65 74 75 72 6e 20 65 72 72 43 6e  ;.  return errCn
1d0b0 74 3e 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  t>0;.}../*.** Re
1d0c0 74 75 72 6e 20 61 20 70 61 74 68 6e 61 6d 65 20  turn a pathname 
1d0d0 77 68 69 63 68 20 69 73 20 74 68 65 20 75 73 65  which is the use
1d0e0 72 27 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f  r's home directo
1d0f0 72 79 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74 75  ry.  A.** 0 retu
1d100 72 6e 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20  rn indicates an 
1d110 65 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69  error of some ki
1d120 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  nd..*/.static ch
1d130 61 72 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64 69  ar *find_home_di
1d140 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
1d150 63 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72  c char *home_dir
1d160 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 68   = NULL;.  if( h
1d170 6f 6d 65 5f 64 69 72 20 29 20 72 65 74 75 72 6e  ome_dir ) return
1d180 20 68 6f 6d 65 5f 64 69 72 3b 0a 0a 23 69 66 20   home_dir;..#if 
1d190 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  !defined(_WIN32)
1d1a0 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e   && !defined(WIN
1d1b0 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  32) && !defined(
1d1c0 5f 57 49 4e 33 32 5f 57 43 45 29 20 5c 0a 20 20  _WIN32_WCE) \.  
1d1d0 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f     && !defined(_
1d1e0 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69  _RTP__) && !defi
1d1f0 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29  ned(_WRS_KERNEL)
1d200 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
1d210 70 61 73 73 77 64 20 2a 70 77 65 6e 74 3b 0a 20  passwd *pwent;. 
1d220 20 20 20 75 69 64 5f 74 20 75 69 64 20 3d 20 67     uid_t uid = g
1d230 65 74 75 69 64 28 29 3b 0a 20 20 20 20 69 66 28  etuid();.    if(
1d240 20 28 70 77 65 6e 74 3d 67 65 74 70 77 75 69 64   (pwent=getpwuid
1d250 28 75 69 64 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (uid)) != NULL) 
1d260 7b 0a 20 20 20 20 20 20 68 6f 6d 65 5f 64 69 72  {.      home_dir
1d270 20 3d 20 70 77 65 6e 74 2d 3e 70 77 5f 64 69 72   = pwent->pw_dir
1d280 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1d290 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1d2a0 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 2f 2a  _WIN32_WCE).  /*
1d2b0 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d   Windows CE (arm
1d2c0 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65  -wince-mingw32ce
1d2d0 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70  -gcc) does not p
1d2e0 72 6f 76 69 64 65 20 67 65 74 65 6e 76 28 29 0a  rovide getenv().
1d2f0 20 20 20 2a 2f 0a 20 20 68 6f 6d 65 5f 64 69 72     */.  home_dir
1d300 20 3d 20 22 2f 22 3b 0a 23 65 6c 73 65 0a 0a 23   = "/";.#else..#
1d310 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
1d320 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
1d330 4e 33 32 29 0a 20 20 69 66 20 28 21 68 6f 6d 65  N32).  if (!home
1d340 5f 64 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65  _dir) {.    home
1d350 5f 64 69 72 20 3d 20 67 65 74 65 6e 76 28 22 55  _dir = getenv("U
1d360 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20  SERPROFILE");.  
1d370 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 20 28  }.#endif..  if (
1d380 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20  !home_dir) {.   
1d390 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65 74 65   home_dir = gete
1d3a0 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20 20 7d 0a  nv("HOME");.  }.
1d3b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
1d3c0 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
1d3d0 57 49 4e 33 32 29 0a 20 20 69 66 20 28 21 68 6f  WIN32).  if (!ho
1d3e0 6d 65 5f 64 69 72 29 20 7b 0a 20 20 20 20 63 68  me_dir) {.    ch
1d3f0 61 72 20 2a 7a 44 72 69 76 65 2c 20 2a 7a 50 61  ar *zDrive, *zPa
1d400 74 68 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  th;.    int n;. 
1d410 20 20 20 7a 44 72 69 76 65 20 3d 20 67 65 74 65     zDrive = gete
1d420 6e 76 28 22 48 4f 4d 45 44 52 49 56 45 22 29 3b  nv("HOMEDRIVE");
1d430 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 67 65 74  .    zPath = get
1d440 65 6e 76 28 22 48 4f 4d 45 50 41 54 48 22 29 3b  env("HOMEPATH");
1d450 0a 20 20 20 20 69 66 28 20 7a 44 72 69 76 65 20  .    if( zDrive 
1d460 26 26 20 7a 50 61 74 68 20 29 7b 0a 20 20 20 20  && zPath ){.    
1d470 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
1d480 44 72 69 76 65 29 20 2b 20 73 74 72 6c 65 6e 33  Drive) + strlen3
1d490 30 28 7a 50 61 74 68 29 20 2b 20 31 3b 0a 20 20  0(zPath) + 1;.  
1d4a0 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 6d      home_dir = m
1d4b0 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20  alloc( n );.    
1d4c0 20 20 69 66 28 20 68 6f 6d 65 5f 64 69 72 3d 3d    if( home_dir==
1d4d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1d4e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1d4f0 69 6e 74 66 28 6e 2c 20 68 6f 6d 65 5f 64 69 72  intf(n, home_dir
1d500 2c 20 22 25 73 25 73 22 2c 20 7a 44 72 69 76 65  , "%s%s", zDrive
1d510 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , zPath);.      
1d520 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b  return home_dir;
1d530 0a 20 20 20 20 7d 0a 20 20 20 20 68 6f 6d 65 5f  .    }.    home_
1d540 64 69 72 20 3d 20 22 63 3a 5c 5c 22 3b 0a 20 20  dir = "c:\\";.  
1d550 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
1d560 20 2f 2a 20 21 5f 57 49 4e 33 32 5f 57 43 45 20   /* !_WIN32_WCE 
1d570 2a 2f 0a 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64  */..  if( home_d
1d580 69 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  ir ){.    int n 
1d590 3d 20 73 74 72 6c 65 6e 33 30 28 68 6f 6d 65 5f  = strlen30(home_
1d5a0 64 69 72 29 20 2b 20 31 3b 0a 20 20 20 20 63 68  dir) + 1;.    ch
1d5b0 61 72 20 2a 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20  ar *z = malloc( 
1d5c0 6e 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29  n );.    if( z )
1d5d0 20 6d 65 6d 63 70 79 28 7a 2c 20 68 6f 6d 65 5f   memcpy(z, home_
1d5e0 64 69 72 2c 20 6e 29 3b 0a 20 20 20 20 68 6f 6d  dir, n);.    hom
1d5f0 65 5f 64 69 72 20 3d 20 7a 3b 0a 20 20 7d 0a 0a  e_dir = z;.  }..
1d600 20 20 72 65 74 75 72 6e 20 68 6f 6d 65 5f 64 69    return home_di
1d610 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1d620 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
1d630 66 69 6c 65 20 67 69 76 65 6e 20 62 79 20 73 71  file given by sq
1d640 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64 65 2e  literc_override.
1d650 20 20 4f 72 20 69 66 20 74 68 61 74 0a 2a 2a 20    Or if that.** 
1d660 70 61 72 61 6d 65 74 65 72 20 69 73 20 4e 55 4c  parameter is NUL
1d670 4c 2c 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72  L, take input fr
1d680 6f 6d 20 7e 2f 2e 73 71 6c 69 74 65 72 63 0a 2a  om ~/.sqliterc.*
1d690 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
1d6a0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1d6b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1d6c0 20 70 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72   process_sqliter
1d6d0 63 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  c(.  ShellState 
1d6e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1d6f0 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
1d700 61 74 69 6f 6e 20 64 61 74 61 20 2a 2f 0a 20 20  ation data */.  
1d710 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1d720 74 65 72 63 5f 6f 76 65 72 72 69 64 65 20 20 20  terc_override   
1d730 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6e 66 69  /* Name of confi
1d740 67 20 66 69 6c 65 2e 20 4e 55 4c 4c 20 74 6f 20  g file. NULL to 
1d750 75 73 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 29  use default */.)
1d760 7b 0a 20 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64  {.  char *home_d
1d770 69 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 6e  ir = NULL;.  con
1d780 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 72  st char *sqliter
1d790 63 20 3d 20 73 71 6c 69 74 65 72 63 5f 6f 76 65  c = sqliterc_ove
1d7a0 72 72 69 64 65 3b 0a 20 20 63 68 61 72 20 2a 7a  rride;.  char *z
1d7b0 42 75 66 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20  Buf = 0;.  FILE 
1d7c0 2a 69 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e  *in = NULL;.  in
1d7d0 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 69 66 20  t rc = 0;..  if 
1d7e0 28 73 71 6c 69 74 65 72 63 20 3d 3d 20 4e 55 4c  (sqliterc == NUL
1d7f0 4c 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69  L) {.    home_di
1d800 72 20 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69  r = find_home_di
1d810 72 28 29 3b 0a 20 20 20 20 69 66 28 20 68 6f 6d  r();.    if( hom
1d820 65 5f 64 69 72 3d 3d 30 20 29 7b 0a 23 69 66 20  e_dir==0 ){.#if 
1d830 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f  !defined(__RTP__
1d840 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
1d850 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 20 20 20  RS_KERNEL).     
1d860 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1d870 22 25 73 3a 20 45 72 72 6f 72 3a 20 63 61 6e 6e  "%s: Error: cann
1d880 6f 74 20 6c 6f 63 61 74 65 20 79 6f 75 72 20 68  ot locate your h
1d890 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 5c 6e 22  ome directory\n"
1d8a0 2c 20 41 72 67 76 30 29 3b 0a 23 65 6e 64 69 66  , Argv0);.#endif
1d8b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1d8c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d8d0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
1d8e0 0a 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69  .    zBuf = sqli
1d8f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
1d900 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f  .sqliterc",home_
1d910 64 69 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dir);.    sqlite
1d920 72 63 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  rc = zBuf;.  }. 
1d930 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c 69   in = fopen(sqli
1d940 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69 66  terc,"rb");.  if
1d950 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  ( in ){.    if( 
1d960 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
1d970 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 66 70  tive ){.      fp
1d980 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 2d 2d  rintf(stderr,"--
1d990 20 4c 6f 61 64 69 6e 67 20 72 65 73 6f 75 72 63   Loading resourc
1d9a0 65 73 20 66 72 6f 6d 20 25 73 5c 6e 22 2c 73 71  es from %s\n",sq
1d9b0 6c 69 74 65 72 63 29 3b 0a 20 20 20 20 7d 0a 20  literc);.    }. 
1d9c0 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f     rc = process_
1d9d0 69 6e 70 75 74 28 70 2c 69 6e 29 3b 0a 20 20 20  input(p,in);.   
1d9e0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d   fclose(in);.  }
1d9f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1da00 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  zBuf);.  return 
1da10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f  rc;.}../*.** Sho
1da20 77 20 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d 6d  w available comm
1da30 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73  and line options
1da40 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1da50 20 63 68 61 72 20 7a 4f 70 74 69 6f 6e 73 5b 5d   char zOptions[]
1da60 20 3d 20 0a 20 20 22 20 20 20 2d 62 61 69 6c 20   = .  "   -bail 
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1da80 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e  top after hittin
1da90 67 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20 20  g an error\n".  
1daa0 22 20 20 20 2d 62 61 74 63 68 20 20 20 20 20 20  "   -batch      
1dab0 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 20 62           force b
1dac0 61 74 63 68 20 49 2f 4f 5c 6e 22 0a 20 20 22 20  atch I/O\n".  " 
1dad0 20 20 2d 63 6f 6c 75 6d 6e 20 20 20 20 20 20 20    -column       
1dae0 20 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75         set outpu
1daf0 74 20 6d 6f 64 65 20 74 6f 20 27 63 6f 6c 75 6d  t mode to 'colum
1db00 6e 27 5c 6e 22 0a 20 20 22 20 20 20 2d 63 6d 64  n'\n".  "   -cmd
1db10 20 43 4f 4d 4d 41 4e 44 20 20 20 20 20 20 20 20   COMMAND        
1db20 20 72 75 6e 20 5c 22 43 4f 4d 4d 41 4e 44 5c 22   run \"COMMAND\"
1db30 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20   before reading 
1db40 73 74 64 69 6e 5c 6e 22 0a 20 20 22 20 20 20 2d  stdin\n".  "   -
1db50 63 73 76 20 20 20 20 20 20 20 20 20 20 20 20 20  csv             
1db60 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d      set output m
1db70 6f 64 65 20 74 6f 20 27 63 73 76 27 5c 6e 22 0a  ode to 'csv'\n".
1db80 20 20 22 20 20 20 2d 65 63 68 6f 20 20 20 20 20    "   -echo     
1db90 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
1dba0 20 63 6f 6d 6d 61 6e 64 73 20 62 65 66 6f 72 65   commands before
1dbb0 20 65 78 65 63 75 74 69 6f 6e 5c 6e 22 0a 20 20   execution\n".  
1dbc0 22 20 20 20 2d 69 6e 69 74 20 46 49 4c 45 4e 41  "   -init FILENA
1dbd0 4d 45 20 20 20 20 20 20 20 72 65 61 64 2f 70 72  ME       read/pr
1dbe0 6f 63 65 73 73 20 6e 61 6d 65 64 20 66 69 6c 65  ocess named file
1dbf0 5c 6e 22 0a 20 20 22 20 20 20 2d 5b 6e 6f 5d 68  \n".  "   -[no]h
1dc00 65 61 64 65 72 20 20 20 20 20 20 20 20 20 20 74  eader          t
1dc10 75 72 6e 20 68 65 61 64 65 72 73 20 6f 6e 20 6f  urn headers on o
1dc20 72 20 6f 66 66 5c 6e 22 0a 23 69 66 20 64 65 66  r off\n".#if def
1dc30 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1dc40 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64  LE_MEMSYS3) || d
1dc50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1dc60 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20  ABLE_MEMSYS5).  
1dc70 22 20 20 20 2d 68 65 61 70 20 53 49 5a 45 20 20  "   -heap SIZE  
1dc80 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66           Size of
1dc90 20 68 65 61 70 20 66 6f 72 20 6d 65 6d 73 79 73   heap for memsys
1dca0 33 20 6f 72 20 6d 65 6d 73 79 73 35 5c 6e 22 0a  3 or memsys5\n".
1dcb0 23 65 6e 64 69 66 0a 20 20 22 20 20 20 2d 68 65  #endif.  "   -he
1dcc0 6c 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lp              
1dcd0 20 20 73 68 6f 77 20 74 68 69 73 20 6d 65 73 73    show this mess
1dce0 61 67 65 5c 6e 22 0a 20 20 22 20 20 20 2d 68 74  age\n".  "   -ht
1dcf0 6d 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ml              
1dd00 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64    set output mod
1dd10 65 20 74 6f 20 48 54 4d 4c 5c 6e 22 0a 20 20 22  e to HTML\n".  "
1dd20 20 20 20 2d 69 6e 74 65 72 61 63 74 69 76 65 20     -interactive 
1dd30 20 20 20 20 20 20 20 20 66 6f 72 63 65 20 69 6e          force in
1dd40 74 65 72 61 63 74 69 76 65 20 49 2f 4f 5c 6e 22  teractive I/O\n"
1dd50 0a 20 20 22 20 20 20 2d 6c 69 6e 65 20 20 20 20  .  "   -line    
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1dd70 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27  output mode to '
1dd80 6c 69 6e 65 27 5c 6e 22 0a 20 20 22 20 20 20 2d  line'\n".  "   -
1dd90 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
1dda0 20 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d      set output m
1ddb0 6f 64 65 20 74 6f 20 27 6c 69 73 74 27 5c 6e 22  ode to 'list'\n"
1ddc0 0a 20 20 22 20 20 20 2d 6c 6f 6f 6b 61 73 69 64  .  "   -lookasid
1ddd0 65 20 53 49 5a 45 20 4e 20 20 20 20 75 73 65 20  e SIZE N    use 
1dde0 4e 20 65 6e 74 72 69 65 73 20 6f 66 20 53 5a 20  N entries of SZ 
1ddf0 62 79 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 61 73  bytes for lookas
1de00 69 64 65 20 6d 65 6d 6f 72 79 5c 6e 22 0a 20 20  ide memory\n".  
1de10 22 20 20 20 2d 6d 6d 61 70 20 4e 20 20 20 20 20  "   -mmap N     
1de20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
1de30 20 6d 6d 61 70 20 73 69 7a 65 20 73 65 74 20 74   mmap size set t
1de40 6f 20 4e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51  o N\n".#ifdef SQ
1de50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54  LITE_ENABLE_MULT
1de60 49 50 4c 45 58 0a 20 20 22 20 20 20 2d 6d 75 6c  IPLEX.  "   -mul
1de70 74 69 70 6c 65 78 20 20 20 20 20 20 20 20 20 20  tiplex          
1de80 20 65 6e 61 62 6c 65 20 74 68 65 20 6d 75 6c 74   enable the mult
1de90 69 70 6c 65 78 6f 72 20 56 46 53 5c 6e 22 0a 23  iplexor VFS\n".#
1dea0 65 6e 64 69 66 0a 20 20 22 20 20 20 2d 6e 65 77  endif.  "   -new
1deb0 6c 69 6e 65 20 53 45 50 20 20 20 20 20 20 20 20  line SEP        
1dec0 20 73 65 74 20 6e 65 77 6c 69 6e 65 20 63 68 61   set newline cha
1ded0 72 61 63 74 65 72 28 73 29 20 66 6f 72 20 43 53  racter(s) for CS
1dee0 56 5c 6e 22 0a 20 20 22 20 20 20 2d 6e 75 6c 6c  V\n".  "   -null
1def0 76 61 6c 75 65 20 54 45 58 54 20 20 20 20 20 20  value TEXT      
1df00 73 65 74 20 74 65 78 74 20 73 74 72 69 6e 67 20  set text string 
1df10 66 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  for NULL values.
1df20 20 44 65 66 61 75 6c 74 20 27 27 5c 6e 22 0a 20   Default ''\n". 
1df30 20 22 20 20 20 2d 70 61 67 65 63 61 63 68 65 20   "   -pagecache 
1df40 53 49 5a 45 20 4e 20 20 20 20 75 73 65 20 4e 20  SIZE N    use N 
1df50 73 6c 6f 74 73 20 6f 66 20 53 5a 20 62 79 74 65  slots of SZ byte
1df60 73 20 65 61 63 68 20 66 6f 72 20 70 61 67 65 20  s each for page 
1df70 63 61 63 68 65 20 6d 65 6d 6f 72 79 5c 6e 22 0a  cache memory\n".
1df80 20 20 22 20 20 20 2d 73 63 72 61 74 63 68 20 53    "   -scratch S
1df90 49 5a 45 20 4e 20 20 20 20 20 20 75 73 65 20 4e  IZE N      use N
1dfa0 20 73 6c 6f 74 73 20 6f 66 20 53 5a 20 62 79 74   slots of SZ byt
1dfb0 65 73 20 65 61 63 68 20 66 6f 72 20 73 63 72 61  es each for scra
1dfc0 74 63 68 20 6d 65 6d 6f 72 79 5c 6e 22 0a 20 20  tch memory\n".  
1dfd0 22 20 20 20 2d 73 65 70 61 72 61 74 6f 72 20 53  "   -separator S
1dfe0 45 50 20 20 20 20 20 20 20 73 65 74 20 6f 75 74  EP       set out
1dff0 70 75 74 20 66 69 65 6c 64 20 73 65 70 61 72 61  put field separa
1e000 74 6f 72 2e 20 44 65 66 61 75 6c 74 3a 20 27 7c  tor. Default: '|
1e010 27 5c 6e 22 0a 20 20 22 20 20 20 2d 73 74 61 74  '\n".  "   -stat
1e020 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1e030 70 72 69 6e 74 20 6d 65 6d 6f 72 79 20 73 74 61  print memory sta
1e040 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66  ts before each f
1e050 69 6e 61 6c 69 7a 65 5c 6e 22 0a 20 20 22 20 20  inalize\n".  "  
1e060 20 2d 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20   -version       
1e070 20 20 20 20 20 20 73 68 6f 77 20 53 51 4c 69 74        show SQLit
1e080 65 20 76 65 72 73 69 6f 6e 5c 6e 22 0a 20 20 22  e version\n".  "
1e090 20 20 20 2d 76 66 73 20 4e 41 4d 45 20 20 20 20     -vfs NAME    
1e0a0 20 20 20 20 20 20 20 20 75 73 65 20 4e 41 4d 45          use NAME
1e0b0 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   as the default 
1e0c0 56 46 53 5c 6e 22 0a 23 69 66 64 65 66 20 53 51  VFS\n".#ifdef SQ
1e0d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54  LITE_ENABLE_VFST
1e0e0 52 41 43 45 0a 20 20 22 20 20 20 2d 76 66 73 74  RACE.  "   -vfst
1e0f0 72 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20  race            
1e100 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 6f  enable tracing o
1e110 66 20 61 6c 6c 20 56 46 53 20 63 61 6c 6c 73 5c  f all VFS calls\
1e120 6e 22 0a 23 65 6e 64 69 66 0a 3b 0a 73 74 61 74  n".#endif.;.stat
1e130 69 63 20 76 6f 69 64 20 75 73 61 67 65 28 69 6e  ic void usage(in
1e140 74 20 73 68 6f 77 44 65 74 61 69 6c 29 7b 0a 20  t showDetail){. 
1e150 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1e160 0a 20 20 20 20 20 20 22 55 73 61 67 65 3a 20 25  .      "Usage: %
1e170 73 20 5b 4f 50 54 49 4f 4e 53 5d 20 46 49 4c 45  s [OPTIONS] FILE
1e180 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22 20 20 0a  NAME [SQL]\n"  .
1e190 20 20 20 20 20 20 22 46 49 4c 45 4e 41 4d 45 20        "FILENAME 
1e1a0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
1e1b0 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
1e1c0 65 2e 20 41 20 6e 65 77 20 64 61 74 61 62 61 73  e. A new databas
1e1d0 65 20 69 73 20 63 72 65 61 74 65 64 5c 6e 22 0a  e is created\n".
1e1e0 20 20 20 20 20 20 22 69 66 20 74 68 65 20 66 69        "if the fi
1e1f0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76  le does not prev
1e200 69 6f 75 73 6c 79 20 65 78 69 73 74 2e 5c 6e 22  iously exist.\n"
1e210 2c 20 41 72 67 76 30 29 3b 0a 20 20 69 66 28 20  , Argv0);.  if( 
1e220 73 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a 20 20  showDetail ){.  
1e230 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1e240 2c 20 22 4f 50 54 49 4f 4e 53 20 69 6e 63 6c 75  , "OPTIONS inclu
1e250 64 65 3a 5c 6e 25 73 22 2c 20 7a 4f 70 74 69 6f  de:\n%s", zOptio
1e260 6e 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ns);.  }else{.  
1e270 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1e280 2c 20 22 55 73 65 20 74 68 65 20 2d 68 65 6c 70  , "Use the -help
1e290 20 6f 70 74 69 6f 6e 20 66 6f 72 20 61 64 64 69   option for addi
1e2a0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1e2b0 6f 6e 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 65 78  on\n");.  }.  ex
1e2c0 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(1);.}../*.** 
1e2d0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
1e2e0 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
1e2f0 20 69 6e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74   in data.*/.stat
1e300 69 63 20 76 6f 69 64 20 6d 61 69 6e 5f 69 6e 69  ic void main_ini
1e310 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 64 61  t(ShellState *da
1e320 74 61 29 20 7b 0a 20 20 6d 65 6d 73 65 74 28 64  ta) {.  memset(d
1e330 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ata, 0, sizeof(*
1e340 64 61 74 61 29 29 3b 0a 20 20 64 61 74 61 2d 3e  data));.  data->
1e350 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
1e360 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2d  ;.  memcpy(data-
1e370 3e 73 65 70 61 72 61 74 6f 72 2c 22 7c 22 2c 20  >separator,"|", 
1e380 32 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  2);.  memcpy(dat
1e390 61 2d 3e 6e 65 77 6c 69 6e 65 2c 22 5c 72 5c 6e  a->newline,"\r\n
1e3a0 22 2c 20 33 29 3b 0a 20 20 64 61 74 61 2d 3e 73  ", 3);.  data->s
1e3b0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
1e3c0 20 64 61 74 61 2d 3e 73 68 65 6c 6c 46 6c 67 73   data->shellFlgs
1e3d0 20 3d 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69   = SHFLG_Lookasi
1e3e0 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  de;.  sqlite3_co
1e3f0 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
1e400 49 47 5f 55 52 49 2c 20 31 29 3b 0a 20 20 73 71  IG_URI, 1);.  sq
1e410 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
1e420 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20  ITE_CONFIG_LOG, 
1e430 73 68 65 6c 6c 4c 6f 67 2c 20 64 61 74 61 29 3b  shellLog, data);
1e440 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
1e450 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
1e460 4d 55 4c 54 49 54 48 52 45 41 44 29 3b 0a 20 20  MULTITHREAD);.  
1e470 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1e480 28 73 69 7a 65 6f 66 28 6d 61 69 6e 50 72 6f 6d  (sizeof(mainProm
1e490 70 74 29 2c 20 6d 61 69 6e 50 72 6f 6d 70 74 2c  pt), mainPrompt,
1e4a0 22 73 71 6c 69 74 65 3e 20 22 29 3b 0a 20 20 73  "sqlite> ");.  s
1e4b0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1e4c0 73 69 7a 65 6f 66 28 63 6f 6e 74 69 6e 75 65 50  sizeof(continueP
1e4d0 72 6f 6d 70 74 29 2c 20 63 6f 6e 74 69 6e 75 65  rompt), continue
1e4e0 50 72 6f 6d 70 74 2c 22 20 20 20 2e 2e 2e 3e 20  Prompt,"   ...> 
1e4f0 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  ");.}../*.** Out
1e500 70 75 74 20 74 65 78 74 20 74 6f 20 74 68 65 20  put text to the 
1e510 63 6f 6e 73 6f 6c 65 20 69 6e 20 61 20 66 6f 6e  console in a fon
1e520 74 20 74 68 61 74 20 61 74 74 72 61 63 74 73 20  t that attracts 
1e530 65 78 74 72 61 20 61 74 74 65 6e 74 69 6f 6e 2e  extra attention.
1e540 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  .*/.#ifdef _WIN3
1e550 32 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  2.static void pr
1e560 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74 20 63 68  intBold(const ch
1e570 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 48 41  ar *zText){.  HA
1e580 4e 44 4c 45 20 6f 75 74 20 3d 20 47 65 74 53 74  NDLE out = GetSt
1e590 64 48 61 6e 64 6c 65 28 53 54 44 5f 4f 55 54 50  dHandle(STD_OUTP
1e5a0 55 54 5f 48 41 4e 44 4c 45 29 3b 0a 20 20 43 4f  UT_HANDLE);.  CO
1e5b0 4e 53 4f 4c 45 5f 53 43 52 45 45 4e 5f 42 55 46  NSOLE_SCREEN_BUF
1e5c0 46 45 52 5f 49 4e 46 4f 20 64 65 66 61 75 6c 74  FER_INFO default
1e5d0 53 63 72 65 65 6e 49 6e 66 6f 3b 0a 20 20 47 65  ScreenInfo;.  Ge
1e5e0 74 43 6f 6e 73 6f 6c 65 53 63 72 65 65 6e 42 75  tConsoleScreenBu
1e5f0 66 66 65 72 49 6e 66 6f 28 6f 75 74 2c 20 26 64  fferInfo(out, &d
1e600 65 66 61 75 6c 74 53 63 72 65 65 6e 49 6e 66 6f  efaultScreenInfo
1e610 29 3b 0a 20 20 53 65 74 43 6f 6e 73 6f 6c 65 54  );.  SetConsoleT
1e620 65 78 74 41 74 74 72 69 62 75 74 65 28 6f 75 74  extAttribute(out
1e630 2c 0a 20 20 20 20 20 20 20 20 20 46 4f 52 45 47  ,.         FOREG
1e640 52 4f 55 4e 44 5f 52 45 44 7c 46 4f 52 45 47 52  ROUND_RED|FOREGR
1e650 4f 55 4e 44 5f 49 4e 54 45 4e 53 49 54 59 0a 20  OUND_INTENSITY. 
1e660 20 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73   );.  printf("%s
1e670 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20 53 65 74  ", zText);.  Set
1e680 43 6f 6e 73 6f 6c 65 54 65 78 74 41 74 74 72 69  ConsoleTextAttri
1e690 62 75 74 65 28 6f 75 74 2c 20 64 65 66 61 75 6c  bute(out, defaul
1e6a0 74 53 63 72 65 65 6e 49 6e 66 6f 2e 77 41 74 74  tScreenInfo.wAtt
1e6b0 72 69 62 75 74 65 73 29 3b 0a 7d 0a 23 65 6c 73  ributes);.}.#els
1e6c0 65 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  e.static void pr
1e6d0 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74 20 63 68  intBold(const ch
1e6e0 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 70 72  ar *zText){.  pr
1e6f0 69 6e 74 66 28 22 5c 30 33 33 5b 31 6d 25 73 5c  intf("\033[1m%s\
1e700 30 33 33 5b 30 6d 22 2c 20 7a 54 65 78 74 29 3b  033[0m", zText);
1e710 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1e720 20 47 65 74 20 74 68 65 20 61 72 67 75 6d 65 6e   Get the argumen
1e730 74 20 74 6f 20 61 6e 20 2d 2d 6f 70 74 69 6f 6e  t to an --option
1e740 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  .  Throw an erro
1e750 72 20 61 6e 64 20 64 69 65 20 69 66 20 6e 6f 20  r and die if no 
1e760 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61  argument.** is a
1e770 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  vailable..*/.sta
1e780 74 69 63 20 63 68 61 72 20 2a 63 6d 64 6c 69 6e  tic char *cmdlin
1e790 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 69  e_option_value(i
1e7a0 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
1e7b0 61 72 67 76 2c 20 69 6e 74 20 69 29 7b 0a 20 20  argv, int i){.  
1e7c0 69 66 28 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20  if( i==argc ){. 
1e7d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1e7e0 72 2c 20 22 25 73 3a 20 45 72 72 6f 72 3a 20 6d  r, "%s: Error: m
1e7f0 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
1e800 74 6f 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  to %s\n",.      
1e810 20 20 20 20 20 20 61 72 67 76 5b 30 5d 2c 20 61        argv[0], a
1e820 72 67 76 5b 61 72 67 63 2d 31 5d 29 3b 0a 20 20  rgv[argc-1]);.  
1e830 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
1e840 20 72 65 74 75 72 6e 20 61 72 67 76 5b 69 5d 3b   return argv[i];
1e850 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74  .}..int main(int
1e860 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1e870 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  gv){.  char *zEr
1e880 72 4d 73 67 20 3d 20 30 3b 0a 20 20 53 68 65 6c  rMsg = 0;.  Shel
1e890 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 63  lState data;.  c
1e8a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 69 74  onst char *zInit
1e8b0 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  File = 0;.  char
1e8c0 20 2a 7a 46 69 72 73 74 43 6d 64 20 3d 20 30 3b   *zFirstCmd = 0;
1e8d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1e8e0 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 77 61  rc = 0;.  int wa
1e8f0 72 6e 49 6e 6d 65 6d 6f 72 79 44 62 20 3d 20 30  rnInmemoryDb = 0
1e900 3b 0a 0a 23 69 66 20 55 53 45 5f 53 59 53 54 45  ;..#if USE_SYSTE
1e910 4d 5f 53 51 4c 49 54 45 2b 30 21 3d 31 0a 20 20  M_SQLITE+0!=1.  
1e920 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74  if( strcmp(sqlit
1e930 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c 53 51  e3_sourceid(),SQ
1e940 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 29 21  LITE_SOURCE_ID)!
1e950 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1e960 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74  f(stderr, "SQLit
1e970 65 20 68 65 61 64 65 72 20 61 6e 64 20 73 6f 75  e header and sou
1e980 72 63 65 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d  rce version mism
1e990 61 74 63 68 5c 6e 25 73 5c 6e 25 73 5c 6e 22 2c  atch\n%s\n%s\n",
1e9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1e9b0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
1e9c0 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49   SQLITE_SOURCE_I
1e9d0 44 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  D);.    exit(1);
1e9e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 41 72  .  }.#endif.  Ar
1e9f0 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20  gv0 = argv[0];. 
1ea00 20 6d 61 69 6e 5f 69 6e 69 74 28 26 64 61 74 61   main_init(&data
1ea10 29 3b 0a 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e  );.  stdin_is_in
1ea20 74 65 72 61 63 74 69 76 65 20 3d 20 69 73 61 74  teractive = isat
1ea30 74 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  ty(0);..  /* Mak
1ea40 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
1ea50 20 76 61 6c 69 64 20 73 69 67 6e 61 6c 20 68 61   valid signal ha
1ea60 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20 62 65 66  ndler early, bef
1ea70 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  ore anything.  *
1ea80 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e 65 2e 0a  * else is done..
1ea90 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 49 47 49    */.#ifdef SIGI
1eaa0 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 49  NT.  signal(SIGI
1eab0 4e 54 2c 20 69 6e 74 65 72 72 75 70 74 5f 68 61  NT, interrupt_ha
1eac0 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  ndler);.#endif..
1ead0 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 69 74 69    /* Do an initi
1eae0 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  al pass through 
1eaf0 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
1eb00 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 6f 63   argument to loc
1eb10 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d  ate.  ** the nam
1eb20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1eb30 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 61 6d 65  e file, the name
1eb40 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1eb50 7a 61 74 69 6f 6e 20 66 69 6c 65 2c 0a 20 20 2a  zation file,.  *
1eb60 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
1eb70 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 61  e alternative ma
1eb80 6c 6c 6f 63 20 68 65 61 70 2c 0a 20 20 2a 2a 20  lloc heap,.  ** 
1eb90 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 63 6f  and the first co
1eba0 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 75 74 65  mmand to execute
1ebb0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31  ..  */.  for(i=1
1ebc0 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
1ebd0 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
1ebe0 20 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20   z = argv[i];.  
1ebf0 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20    if( z[0]!='-' 
1ec00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61 74  ){.      if( dat
1ec10 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30  a.zDbFilename==0
1ec20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61   ){.        data
1ec30 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a  .zDbFilename = z
1ec40 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
1ec50 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
1ec60 20 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64 3d    if( zFirstCmd=
1ec70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  =0 ){.        zF
1ec80 69 72 73 74 43 6d 64 20 3d 20 7a 3b 0a 20 20 20  irstCmd = z;.   
1ec90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1eca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
1ecb0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
1ecc0 20 45 72 72 6f 72 3a 20 74 6f 6f 20 6d 61 6e 79   Error: too many
1ecd0 20 6f 70 74 69 6f 6e 73 3a 20 5c 22 25 73 5c 22   options: \"%s\"
1ece0 5c 6e 22 2c 20 41 72 67 76 30 2c 20 61 72 67 76  \n", Argv0, argv
1ecf0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 66 70 72 69  [i]);.      fpri
1ed00 6e 74 66 28 73 74 64 65 72 72 2c 22 55 73 65 20  ntf(stderr,"Use 
1ed10 2d 68 65 6c 70 20 66 6f 72 20 61 20 6c 69 73 74  -help for a list
1ed20 20 6f 66 20 6f 70 74 69 6f 6e 73 2e 5c 6e 22 29   of options.\n")
1ed30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1ed40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ed50 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
1ed60 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1ed70 7a 2c 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d  z,"-separator")=
1ed80 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 63 6d  =0.     || strcm
1ed90 70 28 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22  p(z,"-nullvalue"
1eda0 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72  )==0.     || str
1edb0 63 6d 70 28 7a 2c 22 2d 6e 65 77 6c 69 6e 65 22  cmp(z,"-newline"
1edc0 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72  )==0.     || str
1edd0 63 6d 70 28 7a 2c 22 2d 63 6d 64 22 29 3d 3d 30  cmp(z,"-cmd")==0
1ede0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 28 76  .    ){.      (v
1edf0 6f 69 64 29 63 6d 64 6c 69 6e 65 5f 6f 70 74 69  oid)cmdline_opti
1ee00 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 20 61  on_value(argc, a
1ee10 72 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20 20 7d  rgv, ++i);.    }
1ee20 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1ee30 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b  z,"-init")==0 ){
1ee40 0a 20 20 20 20 20 20 7a 49 6e 69 74 46 69 6c 65  .      zInitFile
1ee50 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f   = cmdline_optio
1ee60 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 20 61 72  n_value(argc, ar
1ee70 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20 20 7d 65  gv, ++i);.    }e
1ee80 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1ee90 2c 22 2d 62 61 74 63 68 22 29 3d 3d 30 20 29 7b  ,"-batch")==0 ){
1eea0 0a 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  .      /* Need t
1eeb0 6f 20 63 68 65 63 6b 20 66 6f 72 20 62 61 74 63  o check for batc
1eec0 68 20 6d 6f 64 65 20 68 65 72 65 20 74 6f 20 73  h mode here to s
1eed0 6f 20 77 65 20 63 61 6e 20 61 76 6f 69 64 20 70  o we can avoid p
1eee0 72 69 6e 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  rinting.      **
1eef0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 61 6c 20 6d   informational m
1ef00 65 73 73 61 67 65 73 20 28 6c 69 6b 65 20 66 72  essages (like fr
1ef10 6f 6d 20 70 72 6f 63 65 73 73 5f 73 71 6c 69 74  om process_sqlit
1ef20 65 72 63 29 20 62 65 66 6f 72 65 20 0a 20 20 20  erc) before .   
1ef30 20 20 20 2a 2a 20 77 65 20 64 6f 20 74 68 65 20     ** we do the 
1ef40 61 63 74 75 61 6c 20 70 72 6f 63 65 73 73 69 6e  actual processin
1ef50 67 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6c  g of arguments l
1ef60 61 74 65 72 20 69 6e 20 61 20 73 65 63 6f 6e 64  ater in a second
1ef70 20 70 61 73 73 2e 0a 20 20 20 20 20 20 2a 2f 0a   pass..      */.
1ef80 20 20 20 20 20 20 73 74 64 69 6e 5f 69 73 5f 69        stdin_is_i
1ef90 6e 74 65 72 61 63 74 69 76 65 20 3d 20 30 3b 0a  nteractive = 0;.
1efa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1efb0 72 63 6d 70 28 7a 2c 22 2d 68 65 61 70 22 29 3d  rcmp(z,"-heap")=
1efc0 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
1efd0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1efe0 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
1eff0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1f000 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 20  E_MEMSYS5).     
1f010 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 69   const char *zSi
1f020 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
1f030 33 5f 69 6e 74 36 34 20 73 7a 48 65 61 70 3b 0a  3_int64 szHeap;.
1f040 0a 20 20 20 20 20 20 7a 53 69 7a 65 20 3d 20 63  .      zSize = c
1f050 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61  mdline_option_va
1f060 6c 75 65 28 61 72 67 63 2c 20 61 72 67 76 2c 20  lue(argc, argv, 
1f070 2b 2b 69 29 3b 0a 20 20 20 20 20 20 73 7a 48 65  ++i);.      szHe
1f080 61 70 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75  ap = integerValu
1f090 65 28 7a 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  e(zSize);.      
1f0a0 69 66 28 20 73 7a 48 65 61 70 3e 30 78 37 66 66  if( szHeap>0x7ff
1f0b0 66 30 30 30 30 20 29 20 73 7a 48 65 61 70 20 3d  f0000 ) szHeap =
1f0c0 20 30 78 37 66 66 66 30 30 30 30 3b 0a 20 20 20   0x7fff0000;.   
1f0d0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69     sqlite3_confi
1f0e0 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
1f0f0 48 45 41 50 2c 20 6d 61 6c 6c 6f 63 28 28 69 6e  HEAP, malloc((in
1f100 74 29 73 7a 48 65 61 70 29 2c 20 28 69 6e 74 29  t)szHeap), (int)
1f110 73 7a 48 65 61 70 2c 20 36 34 29 3b 0a 23 65 6e  szHeap, 64);.#en
1f120 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
1f130 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73 63 72  ( strcmp(z,"-scr
1f140 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  atch")==0 ){.   
1f150 20 20 20 69 6e 74 20 6e 2c 20 73 7a 3b 0a 20 20     int n, sz;.  
1f160 20 20 20 20 73 7a 20 3d 20 28 69 6e 74 29 69 6e      sz = (int)in
1f170 74 65 67 65 72 56 61 6c 75 65 28 63 6d 64 6c 69  tegerValue(cmdli
1f180 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
1f190 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b  argc,argv,++i));
1f1a0 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3e 34 30  .      if( sz>40
1f1b0 30 30 30 30 20 29 20 73 7a 20 3d 20 34 30 30 30  0000 ) sz = 4000
1f1c0 30 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  00;.      if( sz
1f1d0 3c 32 35 30 30 20 29 20 73 7a 20 3d 20 32 35 30  <2500 ) sz = 250
1f1e0 30 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e  0;.      n = (in
1f1f0 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63  t)integerValue(c
1f200 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61  mdline_option_va
1f210 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b  lue(argc,argv,++
1f220 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  i));.      if( n
1f230 3e 31 30 20 29 20 6e 20 3d 20 31 30 3b 0a 20 20  >10 ) n = 10;.  
1f240 20 20 20 20 69 66 28 20 6e 3c 31 20 29 20 6e 20      if( n<1 ) n 
1f250 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
1f260 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
1f270 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 2c  _CONFIG_SCRATCH,
1f280 20 6d 61 6c 6c 6f 63 28 6e 2a 73 7a 2b 31 29 2c   malloc(n*sz+1),
1f290 20 73 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 64   sz, n);.      d
1f2a0 61 74 61 2e 73 68 65 6c 6c 46 6c 67 73 20 7c 3d  ata.shellFlgs |=
1f2b0 20 53 48 46 4c 47 5f 53 63 72 61 74 63 68 3b 0a   SHFLG_Scratch;.
1f2c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1f2d0 72 63 6d 70 28 7a 2c 22 2d 70 61 67 65 63 61 63  rcmp(z,"-pagecac
1f2e0 68 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  he")==0 ){.     
1f2f0 20 69 6e 74 20 6e 2c 20 73 7a 3b 0a 20 20 20 20   int n, sz;.    
1f300 20 20 73 7a 20 3d 20 28 69 6e 74 29 69 6e 74 65    sz = (int)inte
1f310 67 65 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65  gerValue(cmdline
1f320 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72  _option_value(ar
1f330 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20  gc,argv,++i));. 
1f340 20 20 20 20 20 69 66 28 20 73 7a 3e 37 30 30 30       if( sz>7000
1f350 30 20 29 20 73 7a 20 3d 20 37 30 30 30 30 3b 0a  0 ) sz = 70000;.
1f360 20 20 20 20 20 20 69 66 28 20 73 7a 3c 38 30 30        if( sz<800
1f370 20 29 20 73 7a 20 3d 20 38 30 30 3b 0a 20 20 20   ) sz = 800;.   
1f380 20 20 20 6e 20 3d 20 28 69 6e 74 29 69 6e 74 65     n = (int)inte
1f390 67 65 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65  gerValue(cmdline
1f3a0 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72  _option_value(ar
1f3b0 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20  gc,argv,++i));. 
1f3c0 20 20 20 20 20 69 66 28 20 6e 3c 31 30 20 29 20       if( n<10 ) 
1f3d0 6e 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 73 71  n = 10;.      sq
1f3e0 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
1f3f0 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43  ITE_CONFIG_PAGEC
1f400 41 43 48 45 2c 20 6d 61 6c 6c 6f 63 28 6e 2a 73  ACHE, malloc(n*s
1f410 7a 2b 31 29 2c 20 73 7a 2c 20 6e 29 3b 0a 20 20  z+1), sz, n);.  
1f420 20 20 20 20 64 61 74 61 2e 73 68 65 6c 6c 46 6c      data.shellFl
1f430 67 73 20 7c 3d 20 53 48 46 4c 47 5f 50 61 67 65  gs |= SHFLG_Page
1f440 63 61 63 68 65 3b 0a 20 20 20 20 7d 65 6c 73 65  cache;.    }else
1f450 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1f460 6c 6f 6f 6b 61 73 69 64 65 22 29 3d 3d 30 20 29  lookaside")==0 )
1f470 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 2c 20 73  {.      int n, s
1f480 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 28 69  z;.      sz = (i
1f490 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
1f4a0 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
1f4b0 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b  alue(argc,argv,+
1f4c0 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +i));.      if( 
1f4d0 73 7a 3c 30 20 29 20 73 7a 20 3d 20 30 3b 0a 20  sz<0 ) sz = 0;. 
1f4e0 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 69 6e       n = (int)in
1f4f0 74 65 67 65 72 56 61 6c 75 65 28 63 6d 64 6c 69  tegerValue(cmdli
1f500 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
1f510 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b  argc,argv,++i));
1f520 0a 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29  .      if( n<0 )
1f530 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71   n = 0;.      sq
1f540 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
1f550 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
1f560 53 49 44 45 2c 20 73 7a 2c 20 6e 29 3b 0a 20 20  SIDE, sz, n);.  
1f570 20 20 20 20 69 66 28 20 73 7a 2a 6e 3d 3d 30 20      if( sz*n==0 
1f580 29 20 64 61 74 61 2e 73 68 65 6c 6c 46 6c 67 73  ) data.shellFlgs
1f590 20 26 3d 20 7e 53 48 46 4c 47 5f 4c 6f 6f 6b 61   &= ~SHFLG_Looka
1f5a0 73 69 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  side;.#ifdef SQL
1f5b0 49 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52  ITE_ENABLE_VFSTR
1f5c0 41 43 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ACE.    }else if
1f5d0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73  ( strcmp(z,"-vfs
1f5e0 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
1f5f0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 76      extern int v
1f600 66 73 74 72 61 63 65 5f 72 65 67 69 73 74 65 72  fstrace_register
1f610 28 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  (.         const
1f620 20 63 68 61 72 20 2a 7a 54 72 61 63 65 4e 61 6d   char *zTraceNam
1f630 65 2c 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 73  e,.         cons
1f640 74 20 63 68 61 72 20 2a 7a 4f 6c 64 56 66 73 4e  t char *zOldVfsN
1f650 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 69 6e  ame,.         in
1f660 74 20 28 2a 78 4f 75 74 29 28 63 6f 6e 73 74 20  t (*xOut)(const 
1f670 63 68 61 72 2a 2c 76 6f 69 64 2a 29 2c 0a 20 20  char*,void*),.  
1f680 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4f 75         void *pOu
1f690 74 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 69  tArg,.         i
1f6a0 6e 74 20 6d 61 6b 65 44 65 66 61 75 6c 74 0a 20  nt makeDefault. 
1f6b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 76 66       );.      vf
1f6c0 73 74 72 61 63 65 5f 72 65 67 69 73 74 65 72 28  strace_register(
1f6d0 22 74 72 61 63 65 22 2c 30 2c 28 69 6e 74 28 2a  "trace",0,(int(*
1f6e0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 76 6f  )(const char*,vo
1f6f0 69 64 2a 29 29 66 70 75 74 73 2c 73 74 64 65 72  id*))fputs,stder
1f700 72 2c 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  r,1);.#endif.#if
1f710 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1f720 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 20 20  E_MULTIPLEX.    
1f730 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1f740 28 7a 2c 22 2d 6d 75 6c 74 69 70 6c 65 78 22 29  (z,"-multiplex")
1f750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 78 74  ==0 ){.      ext
1f760 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1f770 6d 75 6c 74 69 70 6c 65 5f 69 6e 69 74 69 61 6c  multiple_initial
1f780 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ize(const char*,
1f790 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
1f7a0 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e  te3_multiplex_in
1f7b0 69 74 69 61 6c 69 7a 65 28 30 2c 20 31 29 3b 0a  itialize(0, 1);.
1f7c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1f7d0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1f7e0 6d 6d 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mmap")==0 ){.   
1f7f0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1f800 20 73 7a 20 3d 20 69 6e 74 65 67 65 72 56 61 6c   sz = integerVal
1f810 75 65 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f  ue(cmdline_optio
1f820 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67  n_value(argc,arg
1f830 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 73  v,++i));.      s
1f840 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
1f850 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
1f860 5f 53 49 5a 45 2c 20 73 7a 2c 20 73 7a 29 3b 0a  _SIZE, sz, sz);.
1f870 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1f880 72 63 6d 70 28 7a 2c 22 2d 76 66 73 22 29 3d 3d  rcmp(z,"-vfs")==
1f890 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1f8a0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73  e3_vfs *pVfs = s
1f8b0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1f8c0 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
1f8d0 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b  alue(argc,argv,+
1f8e0 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +i));.      if( 
1f8f0 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
1f900 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
1f910 73 74 65 72 28 70 56 66 73 2c 20 31 29 3b 0a 20  ster(pVfs, 1);. 
1f920 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f930 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1f940 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 56 46 53  rr, "no such VFS
1f950 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 72 67  : \"%s\"\n", arg
1f960 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 65  v[i]);.        e
1f970 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
1f980 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1f990 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65  data.zDbFilename
1f9a0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
1f9b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
1f9c0 59 44 42 0a 20 20 20 20 64 61 74 61 2e 7a 44 62  YDB.    data.zDb
1f9d0 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d  Filename = ":mem
1f9e0 6f 72 79 3a 22 3b 0a 20 20 20 20 77 61 72 6e 49  ory:";.    warnI
1f9f0 6e 6d 65 6d 6f 72 79 44 62 20 3d 20 61 72 67 63  nmemoryDb = argc
1fa00 3d 3d 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66  ==1;.#else.    f
1fa10 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
1fa20 73 3a 20 45 72 72 6f 72 3a 20 6e 6f 20 64 61 74  s: Error: no dat
1fa30 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 73  abase filename s
1fa40 70 65 63 69 66 69 65 64 5c 6e 22 2c 20 41 72 67  pecified\n", Arg
1fa50 76 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  v0);.    return 
1fa60 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  1;.#endif.#ifdef
1fa70 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 44 42   SQLITE_SHELL_DB
1fa80 4e 41 4d 45 5f 50 52 4f 43 0a 20 20 20 20 7b 20  NAME_PROC.    { 
1fa90 65 78 74 65 72 6e 20 76 6f 69 64 20 53 51 4c 49  extern void SQLI
1faa0 54 45 5f 53 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f  TE_SHELL_DBNAME_
1fab0 50 52 4f 43 28 63 6f 6e 73 74 20 63 68 61 72 2a  PROC(const char*
1fac0 2a 29 3b 0a 20 20 20 20 20 20 53 51 4c 49 54 45  *);.      SQLITE
1fad0 5f 53 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52  _SHELL_DBNAME_PR
1fae0 4f 43 28 26 64 61 74 61 2e 7a 44 62 46 69 6c 65  OC(&data.zDbFile
1faf0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 77 61 72  name);.      war
1fb00 6e 49 6e 6d 65 6d 6f 72 79 44 62 20 3d 20 30 3b  nInmemoryDb = 0;
1fb10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1fb20 64 61 74 61 2e 6f 75 74 20 3d 20 73 74 64 6f 75  data.out = stdou
1fb30 74 3b 0a 0a 20 20 2f 2a 20 47 6f 20 61 68 65 61  t;..  /* Go ahea
1fb40 64 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 64  d and open the d
1fb50 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
1fb60 69 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  it already exist
1fb70 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  s.  If the.  ** 
1fb80 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
1fb90 69 73 74 2c 20 64 65 6c 61 79 20 6f 70 65 6e 69  ist, delay openi
1fba0 6e 67 20 69 74 2e 20 20 54 68 69 73 20 70 72 65  ng it.  This pre
1fbb0 76 65 6e 74 73 20 65 6d 70 74 79 20 64 61 74 61  vents empty data
1fbc0 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20  base.  ** files 
1fbd0 66 72 6f 6d 20 62 65 69 6e 67 20 63 72 65 61 74  from being creat
1fbe0 65 64 20 69 66 20 61 20 75 73 65 72 20 6d 69 73  ed if a user mis
1fbf0 74 79 70 65 73 20 74 68 65 20 64 61 74 61 62 61  types the databa
1fc00 73 65 20 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  se name argument
1fc10 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 71 6c  .  ** to the sql
1fc20 69 74 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  ite command-line
1fc30 20 74 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66   tool..  */.  if
1fc40 28 20 61 63 63 65 73 73 28 64 61 74 61 2e 7a 44  ( access(data.zD
1fc50 62 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30  bFilename, 0)==0
1fc60 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
1fc70 26 64 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 0a  &data, 0);.  }..
1fc80 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
1fc90 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1fca0 66 69 6c 65 20 69 66 20 74 68 65 72 65 20 69 73  file if there is
1fcb0 20 6f 6e 65 2e 20 20 49 66 20 6e 6f 20 2d 69 6e   one.  If no -in
1fcc0 69 74 20 6f 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  it option.  ** i
1fcd0 73 20 67 69 76 65 6e 20 6f 6e 20 74 68 65 20 63  s given on the c
1fce0 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 6c 6f 6f  ommand line, loo
1fcf0 6b 20 66 6f 72 20 61 20 66 69 6c 65 20 6e 61 6d  k for a file nam
1fd00 65 64 20 7e 2f 2e 73 71 6c 69 74 65 72 63 20 61  ed ~/.sqliterc a
1fd10 6e 64 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 70  nd.  ** try to p
1fd20 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a  rocess it..  */.
1fd30 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 73    rc = process_s
1fd40 71 6c 69 74 65 72 63 28 26 64 61 74 61 2c 7a 49  qliterc(&data,zI
1fd50 6e 69 74 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  nitFile);.  if( 
1fd60 72 63 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rc>0 ){.    retu
1fd70 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
1fd80 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64 20 70   Make a second p
1fd90 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
1fda0 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
1fdb0 75 6d 65 6e 74 20 61 6e 64 20 73 65 74 0a 20 20  ument and set.  
1fdc0 2a 2a 20 6f 70 74 69 6f 6e 73 2e 20 20 54 68 69  ** options.  Thi
1fdd0 73 20 73 65 63 6f 6e 64 20 70 61 73 73 20 69 73  s second pass is
1fde0 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 61   delayed until a
1fdf0 66 74 65 72 20 74 68 65 20 69 6e 69 74 69 61 6c  fter the initial
1fe00 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 66 69 6c  ization.  ** fil
1fe10 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 73  e is processed s
1fe20 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6d 6d 61  o that the comma
1fe30 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
1fe40 73 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65 0a  s will override.
1fe50 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 69 6e    ** settings in
1fe60 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1fe70 69 6f 6e 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ion file..  */. 
1fe80 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
1fe90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
1fea0 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20   *z = argv[i];. 
1feb0 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27     if( z[0]!='-'
1fec0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1fed0 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29   if( z[1]=='-' )
1fee0 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
1fef0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74   strcmp(z,"-init
1ff00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
1ff10 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
1ff20 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68 74 6d  ( strcmp(z,"-htm
1ff30 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
1ff40 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
1ff50 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  _Html;.    }else
1ff60 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1ff70 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  list")==0 ){.   
1ff80 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d     data.mode = M
1ff90 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 7d 65  ODE_List;.    }e
1ffa0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1ffb0 2c 22 2d 6c 69 6e 65 22 29 3d 3d 30 20 29 7b 0a  ,"-line")==0 ){.
1ffc0 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
1ffd0 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20  = MODE_Line;.   
1ffe0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1fff0 70 28 7a 2c 22 2d 63 6f 6c 75 6d 6e 22 29 3d 3d  p(z,"-column")==
20000 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
20010 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75  mode = MODE_Colu
20020 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  mn;.    }else if
20030 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 73 76  ( strcmp(z,"-csv
20040 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
20050 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
20060 43 73 76 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  Csv;.      memcp
20070 79 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72  y(data.separator
20080 2c 22 2c 22 2c 32 29 3b 0a 20 20 20 20 7d 65 6c  ,",",2);.    }el
20090 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
200a0 22 2d 73 65 70 61 72 61 74 6f 72 22 29 3d 3d 30  "-separator")==0
200b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
200c0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
200d0 66 28 64 61 74 61 2e 73 65 70 61 72 61 74 6f 72  f(data.separator
200e0 29 2c 20 64 61 74 61 2e 73 65 70 61 72 61 74 6f  ), data.separato
200f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
20100 20 20 20 20 20 20 20 20 20 20 22 25 73 22 2c 63            "%s",c
20110 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61  mdline_option_va
20120 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b  lue(argc,argv,++
20130 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i));.    }else i
20140 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 65  f( strcmp(z,"-ne
20150 77 6c 69 6e 65 22 29 3d 3d 30 20 29 7b 0a 20 20  wline")==0 ){.  
20160 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
20170 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61  intf(sizeof(data
20180 2e 6e 65 77 6c 69 6e 65 29 2c 20 64 61 74 61 2e  .newline), data.
20190 6e 65 77 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  newline,.       
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 22 25 73 22 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74  "%s",cmdline_opt
201c0 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61  ion_value(argc,a
201d0 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 7d  rgv,++i));.    }
201e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
201f0 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75 65 22 29 3d  z,"-nullvalue")=
20200 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
20210 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
20220 65 6f 66 28 64 61 74 61 2e 6e 75 6c 6c 76 61 6c  eof(data.nullval
20230 75 65 29 2c 20 64 61 74 61 2e 6e 75 6c 6c 76 61  ue), data.nullva
20240 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lue,.           
20250 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 22              "%s"
20260 2c 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f  ,cmdline_option_
20270 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c  value(argc,argv,
20280 2b 2b 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ++i));.    }else
20290 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
202a0 68 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20  header")==0 ){. 
202b0 20 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65       data.showHe
202c0 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65  ader = 1;.    }e
202d0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
202e0 2c 22 2d 6e 6f 68 65 61 64 65 72 22 29 3d 3d 30  ,"-noheader")==0
202f0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73   ){.      data.s
20300 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
20310 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
20320 63 6d 70 28 7a 2c 22 2d 65 63 68 6f 22 29 3d 3d  cmp(z,"-echo")==
20330 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
20340 65 63 68 6f 4f 6e 20 3d 20 31 3b 0a 20 20 20 20  echoOn = 1;.    
20350 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
20360 28 7a 2c 22 2d 65 71 70 22 29 3d 3d 30 20 29 7b  (z,"-eqp")==0 ){
20370 0a 20 20 20 20 20 20 64 61 74 61 2e 61 75 74 6f  .      data.auto
20380 45 51 50 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  EQP = 1;.    }el
20390 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
203a0 22 2d 73 74 61 74 73 22 29 3d 3d 30 20 29 7b 0a  "-stats")==0 ){.
203b0 20 20 20 20 20 20 64 61 74 61 2e 73 74 61 74 73        data.stats
203c0 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  On = 1;.    }els
203d0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
203e0 2d 73 63 61 6e 73 74 61 74 73 22 29 3d 3d 30 20  -scanstats")==0 
203f0 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 73 63  ){.      data.sc
20400 61 6e 73 74 61 74 73 4f 6e 20 3d 20 31 3b 0a 20  anstatsOn = 1;. 
20410 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
20420 63 6d 70 28 7a 2c 22 2d 62 61 69 6c 22 29 3d 3d  cmp(z,"-bail")==
20430 30 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f  0 ){.      bail_
20440 6f 6e 5f 65 72 72 6f 72 20 3d 20 31 3b 0a 20 20  on_error = 1;.  
20450 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
20460 6d 70 28 7a 2c 22 2d 76 65 72 73 69 6f 6e 22 29  mp(z,"-version")
20470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69  ==0 ){.      pri
20480 6e 74 66 28 22 25 73 20 25 73 5c 6e 22 2c 20 73  ntf("%s %s\n", s
20490 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
204a0 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75  n(), sqlite3_sou
204b0 72 63 65 69 64 28 29 29 3b 0a 20 20 20 20 20 20  rceid());.      
204c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
204d0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
204e0 2c 22 2d 69 6e 74 65 72 61 63 74 69 76 65 22 29  ,"-interactive")
204f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 64  ==0 ){.      std
20500 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
20510 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
20520 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
20530 62 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20  batch")==0 ){.  
20540 20 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74      stdin_is_int
20550 65 72 61 63 74 69 76 65 20 3d 20 30 3b 0a 20 20  eractive = 0;.  
20560 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
20570 6d 70 28 7a 2c 22 2d 68 65 61 70 22 29 3d 3d 30  mp(z,"-heap")==0
20580 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
20590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
205a0 63 6d 70 28 7a 2c 22 2d 73 63 72 61 74 63 68 22  cmp(z,"-scratch"
205b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
205c0 3d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  =2;.    }else if
205d0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 70 61 67  ( strcmp(z,"-pag
205e0 65 63 61 63 68 65 22 29 3d 3d 30 20 29 7b 0a 20  ecache")==0 ){. 
205f0 20 20 20 20 20 69 2b 3d 32 3b 0a 20 20 20 20 7d       i+=2;.    }
20600 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
20610 7a 2c 22 2d 6c 6f 6f 6b 61 73 69 64 65 22 29 3d  z,"-lookaside")=
20620 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 3d 32  =0 ){.      i+=2
20630 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
20640 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 6d 61 70 22  strcmp(z,"-mmap"
20650 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
20660 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
20670 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 22   strcmp(z,"-vfs"
20680 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
20690 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
206a0 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52 41 43 45  _ENABLE_VFSTRACE
206b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
206c0 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 74 72 61  trcmp(z,"-vfstra
206d0 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
206e0 20 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 23 69 66   i++;.#endif.#if
206f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20700 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 20 20  E_MULTIPLEX.    
20710 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
20720 28 7a 2c 22 2d 6d 75 6c 74 69 70 6c 65 78 22 29  (z,"-multiplex")
20730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
20740 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
20750 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
20760 22 2d 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20  "-help")==0 ){. 
20770 20 20 20 20 20 75 73 61 67 65 28 31 29 3b 0a 20       usage(1);. 
20780 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
20790 63 6d 70 28 7a 2c 22 2d 63 6d 64 22 29 3d 3d 30  cmp(z,"-cmd")==0
207a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d   ){.      if( i=
207b0 3d 61 72 67 63 2d 31 20 29 20 62 72 65 61 6b 3b  =argc-1 ) break;
207c0 0a 20 20 20 20 20 20 7a 20 3d 20 63 6d 64 6c 69  .      z = cmdli
207d0 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
207e0 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 3b 0a  argc,argv,++i);.
207f0 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
20800 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  '.' ){.        r
20810 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  c = do_meta_comm
20820 61 6e 64 28 7a 2c 20 26 64 61 74 61 29 3b 0a 20  and(z, &data);. 
20830 20 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26         if( rc &&
20840 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29   bail_on_error )
20850 20 72 65 74 75 72 6e 20 72 63 3d 3d 32 20 3f 20   return rc==2 ? 
20860 30 20 3a 20 72 63 3b 0a 20 20 20 20 20 20 7d 65  0 : rc;.      }e
20870 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 70 65  lse{.        ope
20880 6e 5f 64 62 28 26 64 61 74 61 2c 20 30 29 3b 0a  n_db(&data, 0);.
20890 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65          rc = she
208a0 6c 6c 5f 65 78 65 63 28 64 61 74 61 2e 64 62 2c  ll_exec(data.db,
208b0 20 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61   z, shell_callba
208c0 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
208d0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Msg);.        if
208e0 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a  ( zErrMsg!=0 ){.
208f0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
20900 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
20910 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
20920 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
20930 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29 20  bail_on_error ) 
20940 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f 20 72  return rc!=0 ? r
20950 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c : 1;.        }
20960 65 6c 73 65 20 69 66 28 20 72 63 21 3d 30 20 29  else if( rc!=0 )
20970 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
20980 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
20990 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 6f  r: unable to pro
209a0 63 65 73 73 20 53 51 4c 20 5c 22 25 73 5c 22 5c  cess SQL \"%s\"\
209b0 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
209c0 20 20 69 66 28 20 62 61 69 6c 5f 6f 6e 5f 65 72    if( bail_on_er
209d0 72 6f 72 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ror ) return rc;
209e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
209f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
20a00 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
20a10 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 75  rr,"%s: Error: u
20a20 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
20a30 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20 7a 29 3b  s\n", Argv0, z);
20a40 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
20a50 74 64 65 72 72 2c 22 55 73 65 20 2d 68 65 6c 70  tderr,"Use -help
20a60 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 6f   for a list of o
20a70 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20  ptions.\n");.   
20a80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20a90 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 46   }.  }..  if( zF
20aa0 69 72 73 74 43 6d 64 20 29 7b 0a 20 20 20 20 2f  irstCmd ){.    /
20ab0 2a 20 52 75 6e 20 6a 75 73 74 20 74 68 65 20 63  * Run just the c
20ac0 6f 6d 6d 61 6e 64 20 74 68 61 74 20 66 6f 6c 6c  ommand that foll
20ad0 6f 77 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ows the database
20ae0 20 6e 61 6d 65 0a 20 20 20 20 2a 2f 0a 20 20 20   name.    */.   
20af0 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64 5b 30   if( zFirstCmd[0
20b00 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
20b10 72 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d  rc = do_meta_com
20b20 6d 61 6e 64 28 7a 46 69 72 73 74 43 6d 64 2c 20  mand(zFirstCmd, 
20b30 26 64 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  &data);.      if
20b40 28 20 72 63 3d 3d 32 20 29 20 72 63 20 3d 20 30  ( rc==2 ) rc = 0
20b50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20b60 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61     open_db(&data
20b70 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
20b80 20 73 68 65 6c 6c 5f 65 78 65 63 28 64 61 74 61   shell_exec(data
20b90 2e 64 62 2c 20 7a 46 69 72 73 74 43 6d 64 2c 20  .db, zFirstCmd, 
20ba0 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
20bb0 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
20bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72  ;.      if( zErr
20bd0 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Msg!=0 ){.      
20be0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
20bf0 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
20c00 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
20c10 20 20 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f    return rc!=0 ?
20c20 20 72 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d   rc : 1;.      }
20c30 65 6c 73 65 20 69 66 28 20 72 63 21 3d 30 20 29  else if( rc!=0 )
20c40 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
20c50 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
20c60 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63 65   unable to proce
20c70 73 73 20 53 51 4c 20 5c 22 25 73 5c 22 5c 6e 22  ss SQL \"%s\"\n"
20c80 2c 20 7a 46 69 72 73 74 43 6d 64 29 3b 0a 20 20  , zFirstCmd);.  
20c90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
20cc0 75 6e 20 63 6f 6d 6d 61 6e 64 73 20 72 65 63 65  un commands rece
20cd0 69 76 65 64 20 66 72 6f 6d 20 73 74 61 6e 64 61  ived from standa
20ce0 72 64 20 69 6e 70 75 74 0a 20 20 20 20 2a 2f 0a  rd input.    */.
20cf0 20 20 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73      if( stdin_is
20d00 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a  _interactive ){.
20d10 20 20 20 20 20 20 63 68 61 72 20 2a 7a 48 6f 6d        char *zHom
20d20 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e;.      char *z
20d30 48 69 73 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  History = 0;.   
20d40 20 20 20 69 6e 74 20 6e 48 69 73 74 6f 72 79 3b     int nHistory;
20d50 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 0a 20  .      printf(. 
20d60 20 20 20 20 20 20 20 22 53 51 4c 69 74 65 20 76         "SQLite v
20d70 65 72 73 69 6f 6e 20 25 73 20 25 2e 31 39 73 5c  ersion %s %.19s\
20d80 6e 22 20 2f 2a 65 78 74 72 61 2d 76 65 72 73 69  n" /*extra-versi
20d90 6f 6e 2d 69 6e 66 6f 2a 2f 0a 20 20 20 20 20 20  on-info*/.      
20da0 20 20 22 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70    "Enter \".help
20db0 5c 22 20 66 6f 72 20 75 73 61 67 65 20 68 69 6e  \" for usage hin
20dc0 74 73 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ts.\n",.        
20dd0 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
20de0 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f  on(), sqlite3_so
20df0 75 72 63 65 69 64 28 29 0a 20 20 20 20 20 20 29  urceid().      )
20e00 3b 0a 20 20 20 20 20 20 69 66 28 20 77 61 72 6e  ;.      if( warn
20e10 49 6e 6d 65 6d 6f 72 79 44 62 20 29 7b 0a 20 20  InmemoryDb ){.  
20e20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 43 6f        printf("Co
20e30 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 22 29 3b  nnected to a ");
20e40 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 42 6f  .        printBo
20e50 6c 64 28 22 74 72 61 6e 73 69 65 6e 74 20 69 6e  ld("transient in
20e60 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
20e70 22 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e  ");.        prin
20e80 74 66 28 22 2e 5c 6e 55 73 65 20 5c 22 2e 6f 70  tf(".\nUse \".op
20e90 65 6e 20 46 49 4c 45 4e 41 4d 45 5c 22 20 74 6f  en FILENAME\" to
20ea0 20 72 65 6f 70 65 6e 20 6f 6e 20 61 20 22 0a 20   reopen on a ". 
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
20ec0 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
20ed0 73 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  se.\n");.      }
20ee0 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66  .      zHome = f
20ef0 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a  ind_home_dir();.
20f00 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 20        if( zHome 
20f10 29 7b 0a 20 20 20 20 20 20 20 20 6e 48 69 73 74  ){.        nHist
20f20 6f 72 79 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ory = strlen30(z
20f30 48 6f 6d 65 29 20 2b 20 32 30 3b 0a 20 20 20 20  Home) + 20;.    
20f40 20 20 20 20 69 66 28 20 28 7a 48 69 73 74 6f 72      if( (zHistor
20f50 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69 73 74  y = malloc(nHist
20f60 6f 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ory))!=0 ){.    
20f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
20f80 70 72 69 6e 74 66 28 6e 48 69 73 74 6f 72 79 2c  printf(nHistory,
20f90 20 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f 2e 73   zHistory,"%s/.s
20fa0 71 6c 69 74 65 5f 68 69 73 74 6f 72 79 22 2c 20  qlite_history", 
20fb0 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zHome);.        
20fc0 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 64 65  }.      }.#if de
20fd0 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c  fined(HAVE_READL
20fe0 49 4e 45 29 0a 20 20 20 20 20 20 69 66 28 20 7a  INE).      if( z
20ff0 48 69 73 74 6f 72 79 20 29 20 72 65 61 64 5f 68  History ) read_h
21000 69 73 74 6f 72 79 28 7a 48 69 73 74 6f 72 79 29  istory(zHistory)
21010 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
21020 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75  c = process_inpu
21030 74 28 26 64 61 74 61 2c 20 30 29 3b 0a 20 20 20  t(&data, 0);.   
21040 20 20 20 69 66 28 20 7a 48 69 73 74 6f 72 79 20     if( zHistory 
21050 29 7b 0a 20 20 20 20 20 20 20 20 73 74 69 66 6c  ){.        stifl
21060 65 5f 68 69 73 74 6f 72 79 28 31 30 30 29 3b 0a  e_history(100);.
21070 20 20 20 20 20 20 20 20 77 72 69 74 65 5f 68 69          write_hi
21080 73 74 6f 72 79 28 7a 48 69 73 74 6f 72 79 29 3b  story(zHistory);
21090 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 48  .        free(zH
210a0 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 7d  istory);.      }
210b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
210c0 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69    rc = process_i
210d0 6e 70 75 74 28 26 64 61 74 61 2c 20 73 74 64 69  nput(&data, stdi
210e0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
210f0 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 26  set_table_name(&
21100 64 61 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20  data, 0);.  if( 
21110 64 61 74 61 2e 64 62 20 29 7b 0a 20 20 20 20 73  data.db ){.    s
21120 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 61 74  qlite3_close(dat
21130 61 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  a.db);.  }.  sql
21140 69 74 65 33 5f 66 72 65 65 28 64 61 74 61 2e 7a  ite3_free(data.z
21150 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 20 0a 20  FreeOnClose); . 
21160 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.