/ Hex Artifact Content
Login

Artifact 18ee8bbe9502d8848072dc2eddd1ea09254ba494:


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 20 4c 50 46 49 4c  PFILETIME, LPFIL
11f0: 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ETIME, LPFILETIM
1200: 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54 50 52  E);.static GETPR
1210: 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f 63 65  OCTIMES getProce
1220: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20 4e 55  ssTimesAddr = NU
1230: 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  LL;../*.** Check
1240: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 68 61   to see if we ha
1250: 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f 72 74  ve timer support
1260: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 6e  .  Return 1 if n
1270: 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75 70 70  ecessary.** supp
1280: 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20 66 6f  ort found (or fo
1290: 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79 29 2e  und previously).
12a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
12b0: 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  asTimer(void){. 
12c0: 20 69 66 28 20 67 65 74 50 72 6f 63 65 73 73 54   if( getProcessT
12d0: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
12e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 65 6c  return 1;.  } el
12f0: 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65 74 50  se {.    /* GetP
1300: 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20 69 73  rocessTimes() is
1310: 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  n't supported in
1320: 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d 65 20   WIN95 and some 
1330: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 76 65  other Windows ve
1340: 72 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 53  rsions..    ** S
1350: 65 65 20 69 66 20 74 68 65 20 76 65 72 73 69 6f  ee if the versio
1360: 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  n we are running
1370: 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e 64 20   on has it, and 
1380: 69 66 20 69 74 20 64 6f 65 73 2c 20 73 61 76 65  if it does, save
1390: 20 6f 66 66 0a 20 20 20 20 2a 2a 20 61 20 70 6f   off.    ** a po
13a0: 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e 64 20  inter to it and 
13b0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
13c0: 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ess handle..    
13d0: 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73 73 20  */.    hProcess 
13e0: 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  = GetCurrentProc
13f0: 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28 20 68  ess();.    if( h
1400: 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20 20 20  Process ){.     
1410: 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e 73 74   HINSTANCE hinst
1420: 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72  Lib = LoadLibrar
1430: 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c 33 32  y(TEXT("Kernel32
1440: 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20 20 69  .dll"));.      i
1450: 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e 73 74  f( NULL != hinst
1460: 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20 20 67  Lib ){.        g
1470: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
1480: 64 72 20 3d 20 28 47 45 54 50 52 4f 43 54 49 4d  dr = (GETPROCTIM
1490: 45 53 29 20 47 65 74 50 72 6f 63 41 64 64 72 65  ES) GetProcAddre
14a0: 73 73 28 68 69 6e 73 74 4c 69 62 2c 20 22 47 65  ss(hinstLib, "Ge
14b0: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 22 29 3b  tProcessTimes");
14c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e 55 4c  .        if( NUL
14d0: 4c 20 21 3d 20 67 65 74 50 72 6f 63 65 73 73 54  L != getProcessT
14e0: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
14f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1510: 20 20 46 72 65 65 4c 69 62 72 61 72 79 28 68 69    FreeLibrary(hi
1520: 6e 73 74 4c 69 62 29 3b 20 0a 20 20 20 20 20 20  nstLib); .      
1530: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1540: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1550: 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e   Begin timing an
1560: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74   operation.*/.st
1570: 61 74 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54  atic void beginT
1580: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
1590: 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26  ( enableTimer &&
15a0: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
15b0: 41 64 64 72 20 29 7b 0a 20 20 20 20 46 49 4c 45  Addr ){.    FILE
15c0: 54 49 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c  TIME ftCreation,
15d0: 20 66 74 45 78 69 74 3b 0a 20 20 20 20 67 65 74   ftExit;.    get
15e0: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
15f0: 28 68 50 72 6f 63 65 73 73 2c 20 26 66 74 43 72  (hProcess, &ftCr
1600: 65 61 74 69 6f 6e 2c 20 26 66 74 45 78 69 74 2c  eation, &ftExit,
1610: 20 26 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c   &ftKernelBegin,
1620: 20 26 66 74 55 73 65 72 42 65 67 69 6e 29 3b 0a   &ftUserBegin);.
1630: 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69 6e 20      ftWallBegin 
1640: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
1650: 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20   }.}../* Return 
1660: 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f  the difference o
1670: 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45 20 73  f two FILETIME s
1680: 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e 64  tructs in second
1690: 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  s */.static doub
16a0: 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49 4c 45  le timeDiff(FILE
16b0: 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20 46 49  TIME *pStart, FI
16c0: 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b 0a 20  LETIME *pEnd){. 
16d0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36   sqlite_int64 i6
16e0: 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71 6c 69  4Start = *((sqli
16f0: 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53 74 61  te_int64 *) pSta
1700: 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e  rt);.  sqlite_in
1710: 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a 28 28  t64 i64End = *((
1720: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29 20  sqlite_int64 *) 
1730: 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pEnd);.  return 
1740: 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34 45 6e  (double) ((i64En
1750: 64 20 2d 20 69 36 34 53 74 61 72 74 29 20 2f 20  d - i64Start) / 
1760: 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a  10000000.0);.}..
1770: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
1780: 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a  timing results..
1790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
17a0: 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  ndTimer(void){. 
17b0: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
17c0: 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54 69   && getProcessTi
17d0: 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20 46 49  mesAddr){.    FI
17e0: 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69 6f  LETIME ftCreatio
17f0: 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b 65 72  n, ftExit, ftKer
1800: 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72 45 6e  nelEnd, ftUserEn
1810: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  d;.    sqlite3_i
1820: 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64 20 3d  nt64 ftWallEnd =
1830: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1840: 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65    getProcessTime
1850: 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 20  sAddr(hProcess, 
1860: 26 66 74 43 72 65 61 74 69 6f 6e 2c 20 26 66 74  &ftCreation, &ft
1870: 45 78 69 74 2c 20 26 66 74 4b 65 72 6e 65 6c 45  Exit, &ftKernelE
1880: 6e 64 2c 20 26 66 74 55 73 65 72 45 6e 64 29 3b  nd, &ftUserEnd);
1890: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e  .    printf("Run
18a0: 20 54 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66   Time: real %.3f
18b0: 20 75 73 65 72 20 25 66 20 73 79 73 20 25 66 5c   user %f sys %f\
18c0: 6e 22 2c 0a 20 20 20 20 20 20 20 28 66 74 57 61  n",.       (ftWa
18d0: 6c 6c 45 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65  llEnd - ftWallBe
18e0: 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20  gin)*0.001,.    
18f0: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 55     timeDiff(&ftU
1900: 73 65 72 42 65 67 69 6e 2c 20 26 66 74 55 73 65  serBegin, &ftUse
1910: 72 45 6e 64 29 2c 0a 20 20 20 20 20 20 20 74 69  rEnd),.       ti
1920: 6d 65 44 69 66 66 28 26 66 74 4b 65 72 6e 65 6c  meDiff(&ftKernel
1930: 42 65 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c  Begin, &ftKernel
1940: 45 6e 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64  End));.  }.}..#d
1950: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
1960: 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23  R beginTimer().#
1970: 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52  define END_TIMER
1980: 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66   endTimer().#def
1990: 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 68 61  ine HAS_TIMER ha
19a0: 73 54 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a  sTimer()..#else.
19b0: 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49  #define BEGIN_TI
19c0: 4d 45 52 20 0a 23 64 65 66 69 6e 65 20 45 4e 44  MER .#define END
19d0: 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20 48  _TIMER.#define H
19e0: 41 53 5f 54 49 4d 45 52 20 30 0a 23 65 6e 64 69  AS_TIMER 0.#endi
19f0: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f  f../*.** Used to
1a00: 20 70 72 65 76 65 6e 74 20 77 61 72 6e 69 6e 67   prevent warning
1a10: 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70  s about unused p
1a20: 61 72 61 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65  arameters.*/.#de
1a30: 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52 41  fine UNUSED_PARA
1a40: 4d 45 54 45 52 28 78 29 20 28 76 6f 69 64 29 28  METER(x) (void)(
1a50: 78 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  x)../*.** If the
1a60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20   following flag 
1a70: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d  is set, then com
1a80: 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73  mand execution s
1a90: 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72  tops.** at an er
1aa0: 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ror if we are no
1ab0: 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a  t interactive..*
1ac0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 69  /.static int bai
1ad0: 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a  l_on_error = 0;.
1ae0: 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74  ./*.** Threat st
1af0: 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61  din as an intera
1b00: 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20 74  ctive input if t
1b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1b20: 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65  iable.** is true
1b30: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  .  Otherwise, as
1b40: 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f  sume stdin is co
1b50: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c  nnected to a fil
1b60: 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74  e or pipe..*/.st
1b70: 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69  atic int stdin_i
1b80: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
1b90: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  1;../*.** The fo
1ba0: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f  llowing is the o
1bb0: 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62  pen SQLite datab
1bc0: 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20  ase.  We make a 
1bd0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
1be0: 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73 74  is database a st
1bf0: 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f  atic variable so
1c00: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
1c10: 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74  accessed.** by t
1c20: 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65  he SIGINT handle
1c30: 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64  r to interrupt d
1c40: 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73 69  atabase processi
1c50: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ng..*/.static sq
1c60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a  lite3 *db = 0;..
1c70: 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e  /*.** True if an
1c80: 20 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74   interrupt (Cont
1c90: 72 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20  rol-C) has been 
1ca0: 72 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61  received..*/.sta
1cb0: 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74  tic volatile int
1cc0: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d   seenInterrupt =
1cd0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   0;../*.** This 
1ce0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f  is the name of o
1cf0: 75 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69  ur program. It i
1d00: 73 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c  s set in main(),
1d10: 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75   used.** in a nu
1d20: 6d 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c  mber of other pl
1d30: 61 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72  aces, mostly for
1d40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
1d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1d60: 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *Argv0;../*.** P
1d70: 72 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49  rompt strings. I
1d80: 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61  nitialized in ma
1d90: 69 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74  in. Settable wit
1da0: 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d  h.**   .prompt m
1db0: 61 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a  ain continue.*/.
1dc0: 73 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e  static char main
1dd0: 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20  Prompt[20];     
1de0: 2f 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72  /* First line pr
1df0: 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22  ompt. default: "
1e00: 73 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74  sqlite> "*/.stat
1e10: 69 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65  ic char continue
1e20: 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43  Prompt[20]; /* C
1e30: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d  ontinuation prom
1e40: 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20  pt. default: "  
1e50: 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a   ...> " */../*.*
1e60: 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72 61 63  * Write I/O trac
1e70: 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  es to the follow
1e80: 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23  ing stream..*/.#
1e90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ea0: 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74  BLE_IOTRACE.stat
1eb0: 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65  ic FILE *iotrace
1ec0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1ed0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ee0: 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69 6e   works like prin
1ef0: 74 66 20 69 6e 20 74 68 61 74 20 69 74 73 20 66  tf in that its f
1f00: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1f10: 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72   a.** format str
1f20: 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71 75 65  ing and subseque
1f30: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  nt arguments are
1f40: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75   values to be su
1f50: 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69 6e 20  bstituted.** in 
1f60: 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65 6c 64  place of % field
1f70: 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f  s.  The result o
1f80: 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 68 69  f formatting thi
1f90: 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 77  s string.** is w
1fa0: 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72 61 63  ritten to iotrac
1fb0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
1fc0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1fd0: 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  CE.static void i
1fe0: 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f 6e  otracePrintf(con
1ff0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2000: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2010: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
2020: 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d  .  if( iotrace==
2030: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  0 ) return;.  va
2040: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
2050: 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  at);.  z = sqlit
2060: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72  e3_vmprintf(zFor
2070: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
2080: 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74  nd(ap);.  fprint
2090: 66 28 69 6f 74 72 61 63 65 2c 20 22 25 73 22 2c  f(iotrace, "%s",
20a0: 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   z);.  sqlite3_f
20b0: 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  ree(z);.}.#endif
20c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  .../*.** Determi
20d0: 6e 65 73 20 69 66 20 61 20 73 74 72 69 6e 67 20  nes if a string 
20e0: 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6e  is a number of n
20f0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
2100: 74 20 69 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74  t isNumber(const
2110: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72   char *z, int *r
2120: 65 61 6c 6e 75 6d 29 7b 0a 20 20 69 66 28 20 2a  ealnum){.  if( *
2130: 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b  z=='-' || *z=='+
2140: 27 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 21  ' ) z++;.  if( !
2150: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20  IsDigit(*z) ){. 
2160: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2170: 0a 20 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 72 65  .  z++;.  if( re
2180: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
2190: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 49   = 0;.  while( I
21a0: 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b  sDigit(*z) ){ z+
21b0: 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  +; }.  if( *z=='
21c0: 2e 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  .' ){.    z++;. 
21d0: 20 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28     if( !IsDigit(
21e0: 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  *z) ) return 0;.
21f0: 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67      while( IsDig
2200: 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d  it(*z) ){ z++; }
2210: 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  .    if( realnum
2220: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b   ) *realnum = 1;
2230: 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  .  }.  if( *z=='
2240: 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b  e' || *z=='E' ){
2250: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
2260: 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d  ( *z=='+' || *z=
2270: 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
2280: 69 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29  if( !IsDigit(*z)
2290: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
22a0: 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28   while( IsDigit(
22b0: 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  *z) ){ z++; }.  
22c0: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
22d0: 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20  *realnum = 1;.  
22e0: 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30  }.  return *z==0
22f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f  ;.}../*.** A glo
2300: 62 61 6c 20 63 68 61 72 2a 20 61 6e 64 20 61 6e  bal char* and an
2310: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f   SQL function to
2320: 20 61 63 63 65 73 73 20 69 74 73 20 63 75 72 72   access its curr
2330: 65 6e 74 20 76 61 6c 75 65 20 0a 2a 2a 20 66 72  ent value .** fr
2340: 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 53 51 4c  om within an SQL
2350: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
2360: 20 70 72 6f 67 72 61 6d 20 75 73 65 64 20 74 6f   program used to
2370: 20 75 73 65 20 74 68 65 20 0a 2a 2a 20 73 71 6c   use the .** sql
2380: 69 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  ite_exec_printf(
2390: 29 20 41 50 49 20 74 6f 20 73 75 62 73 74 69 74  ) API to substit
23a0: 75 65 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f  ue a string into
23b0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
23c0: 74 2e 0a 2a 2a 20 54 68 65 20 63 6f 72 72 65 63  t..** The correc
23d0: 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 69 73  t way to do this
23e0: 20 77 69 74 68 20 73 71 6c 69 74 65 33 20 69 73   with sqlite3 is
23f0: 20 74 6f 20 75 73 65 20 74 68 65 20 62 69 6e 64   to use the bind
2400: 20 41 50 49 2c 20 62 75 74 0a 2a 2a 20 73 69 6e   API, but.** sin
2410: 63 65 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20  ce the shell is 
2420: 62 75 69 6c 74 20 61 72 6f 75 6e 64 20 74 68 65  built around the
2430: 20 63 61 6c 6c 62 61 63 6b 20 70 61 72 61 64 69   callback paradi
2440: 67 6d 20 69 74 20 77 6f 75 6c 64 20 62 65 20 61  gm it would be a
2450: 20 6c 6f 74 0a 2a 2a 20 6f 66 20 77 6f 72 6b 2e   lot.** of work.
2460: 20 49 6e 73 74 65 61 64 20 6a 75 73 74 20 75 73   Instead just us
2470: 65 20 74 68 69 73 20 68 61 63 6b 2c 20 77 68 69  e this hack, whi
2480: 63 68 20 69 73 20 71 75 69 74 65 20 68 61 72 6d  ch is quite harm
2490: 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
24a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 68 65  const char *zShe
24b0: 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b 0a 73 74  llStatic = 0;.st
24c0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 73  atic void shells
24d0: 74 61 74 69 63 46 75 6e 63 28 0a 20 20 73 71 6c  taticFunc(.  sql
24e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
24f0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
2500: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
2510: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 61  ue **argv.){.  a
2520: 73 73 65 72 74 28 20 30 3d 3d 61 72 67 63 20 29  ssert( 0==argc )
2530: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 53 68 65  ;.  assert( zShe
2540: 6c 6c 53 74 61 74 69 63 20 29 3b 0a 20 20 55 4e  llStatic );.  UN
2550: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
2560: 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
2570: 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a  ARAMETER(argv);.
2580: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2590: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
25a0: 53 68 65 6c 6c 53 74 61 74 69 63 2c 20 2d 31 2c  ShellStatic, -1,
25b0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
25c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
25d0: 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20  routine reads a 
25e0: 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f  line of text fro
25f0: 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65  m FILE in, store
2600: 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e  s.** the text in
2610: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
2620: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
2630: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nd returns a poi
2640: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74  nter.** to the t
2650: 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65  ext.  NULL is re
2660: 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66  turned at end of
2670: 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c   file, or if mal
2680: 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a  loc().** fails..
2690: 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65 20 69  **.** If zLine i
26a0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
26b0: 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63 65 64  it is a malloced
26c0: 20 62 75 66 66 65 72 20 72 65 74 75 72 6e 65 64   buffer returned
26d0: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65 76 69   from.** a previ
26e0: 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ous call to this
26f0: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61   routine that ma
2700: 79 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a  y be reused..*/.
2710: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63  static char *loc
2720: 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20  al_getline(char 
2730: 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a 69 6e  *zLine, FILE *in
2740: 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d  ){.  int nLine =
2750: 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20 3a 20   zLine==0 ? 0 : 
2760: 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  100;.  int n = 0
2770: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
2780: 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e  .    if( n+100>n
2790: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Line ){.      nL
27a0: 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20  ine = nLine*2 + 
27b0: 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  100;.      zLine
27c0: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
27d0: 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
27e0: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
27f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
2800: 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c     if( fgets(&zL
2810: 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20  ine[n], nLine - 
2820: 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n, in)==0 ){.   
2830: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
2840: 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e         free(zLin
2850: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
2860: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
2870: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
2880: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2890: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
28a0: 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a  zLine[n] ) n++;.
28b0: 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a      if( n>0 && z
28c0: 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20  Line[n-1]=='\n' 
28d0: 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  ){.      n--;.  
28e0: 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a      if( n>0 && z
28f0: 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27 20  Line[n-1]=='\r' 
2900: 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69  ) n--;.      zLi
2910: 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[n] = 0;.     
2920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2930: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65  }.  return zLine
2940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
2950: 65 76 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e  eve a single lin
2960: 65 20 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e  e of input text.
2970: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20  .**.** If in==0 
2980: 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73  then read from s
2990: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e  tandard input an
29a0: 64 20 70 72 6f 6d 70 74 20 62 65 66 6f 72 65 20  d prompt before 
29b0: 65 61 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66  each line..** If
29c0: 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20   isContinuation 
29d0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20  is true, then a 
29e0: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f  continuation pro
29f0: 6d 70 74 20 69 73 20 61 70 70 72 6f 70 72 69 61  mpt is appropria
2a00: 74 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74  te..** If isCont
2a10: 69 6e 75 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f  inuation is zero
2a20: 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20  , then the main 
2a30: 70 72 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62 65  prompt should be
2a40: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
2a50: 7a 50 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55  zPrior is not NU
2a60: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  LL then it is a 
2a70: 62 75 66 66 65 72 20 66 72 6f 6d 20 61 20 70 72  buffer from a pr
2a80: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ior call to this
2a90: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 68 61 74  .** routine that
2aa0: 20 63 61 6e 20 62 65 20 72 65 75 73 65 64 2e 0a   can be reused..
2ab0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
2ac0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70   is stored in sp
2ad0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
2ae0: 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  m malloc() and m
2af0: 75 73 74 20 65 69 74 68 65 72 0a 2a 2a 20 62 65  ust either.** be
2b00: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
2b10: 6c 6c 65 72 20 6f 72 20 65 6c 73 65 20 70 61 73  ller or else pas
2b20: 73 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  sed back into th
2b30: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
2b40: 68 65 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67  he.** zPrior arg
2b50: 75 6d 65 6e 74 20 66 6f 72 20 72 65 75 73 65 2e  ument for reuse.
2b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
2b70: 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28  *one_input_line(
2b80: 46 49 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a  FILE *in, char *
2b90: 7a 50 72 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f  zPrior, int isCo
2ba0: 6e 74 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63  ntinuation){.  c
2bb0: 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20  har *zPrompt;.  
2bc0: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20  char *zResult;. 
2bd0: 20 69 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20   if( in!=0 ){.  
2be0: 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61    zResult = loca
2bf0: 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72  l_getline(zPrior
2c00: 2c 20 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , in);.  }else{.
2c10: 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73      zPrompt = is
2c20: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63  Continuation ? c
2c30: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20  ontinuePrompt : 
2c40: 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20  mainPrompt;.#if 
2c50: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
2c60: 44 4c 49 4e 45 29 0a 20 20 20 20 66 72 65 65 28  DLINE).    free(
2c70: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
2c80: 73 75 6c 74 20 3d 20 72 65 61 64 6c 69 6e 65 28  sult = readline(
2c90: 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66  zPrompt);.    if
2ca0: 28 20 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52  ( zResult && *zR
2cb0: 65 73 75 6c 74 20 29 20 61 64 64 5f 68 69 73 74  esult ) add_hist
2cc0: 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23 65  ory(zResult);.#e
2cd0: 6c 73 65 0a 20 20 20 20 70 72 69 6e 74 66 28 22  lse.    printf("
2ce0: 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b 0a 20  %s", zPrompt);. 
2cf0: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
2d00: 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  );.    zResult =
2d10: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a   local_getline(z
2d20: 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b 0a 23  Prior, stdin);.#
2d30: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
2d40: 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn zResult;.}../
2d50: 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70 75  *.** Shell outpu
2d60: 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69  t mode informati
2d70: 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20 22  on from before "
2d80: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 20 0a 2a  .explain on", .*
2d90: 2a 20 73 61 76 65 64 20 73 6f 20 74 68 61 74 20  * saved so that 
2da0: 69 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  it can be restor
2db0: 65 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e 20  ed by ".explain 
2dc0: 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66 20  off".*/.typedef 
2dd0: 73 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65  struct SavedMode
2de0: 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49 6e  Info SavedModeIn
2df0: 66 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65 64  fo;.struct Saved
2e00: 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74  ModeInfo {.  int
2e10: 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20   valid;         
2e20: 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67   /* Is there leg
2e30: 69 74 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f  it data in here?
2e40: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
2e60: 65 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  e prior to ".exp
2e70: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
2e80: 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20  t showHeader;   
2e90: 20 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64 65    /* The ".heade
2ea0: 72 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f 72  r" setting prior
2eb0: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
2ec0: 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69  " */.  int colWi
2ed0: 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43 6f  dth[100];  /* Co
2ee0: 6c 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69 6f  lumn widths 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 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  n" */.};../*.** 
2f10: 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  State informatio
2f20: 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61  n about the data
2f30: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2f40: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
2f50: 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  an.** instance o
2f60: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2f70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
2f80: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
2f90: 6c 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61  llState ShellSta
2fa0: 74 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c  te;.struct Shell
2fb0: 53 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65  State {.  sqlite
2fc0: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2fd0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2fe0: 20 2a 2f 0a 20 20 69 6e 74 20 65 63 68 6f 4f 6e   */.  int echoOn
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3000: 54 72 75 65 20 74 6f 20 65 63 68 6f 20 69 6e 70  True to echo inp
3010: 75 74 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 20  ut commands */. 
3020: 20 69 6e 74 20 61 75 74 6f 45 51 50 3b 20 20 20   int autoEQP;   
3030: 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 45          /* Run E
3040: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
3050: 4e 20 70 72 69 6f 72 20 74 6f 20 73 65 61 63 68  N prior to seach
3060: 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a 20 20 69   SQL stmt */.  i
3070: 6e 74 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20  nt statsOn;     
3080: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
3090: 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20   display memory 
30a0: 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63  stats before eac
30b0: 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20  h finalize */.  
30c0: 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20  int outCount;   
30d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72 74         /* Revert
30e0: 20 74 6f 20 73 74 64 6f 75 74 20 77 68 65 6e 20   to stdout when 
30f0: 72 65 61 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f  reaching zero */
3100: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3120: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64  ber of records d
3130: 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20  isplayed so far 
3140: 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20  */.  FILE *out; 
3150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
3160: 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72  rite results her
3170: 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61  e */.  FILE *tra
3180: 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a  ceOut;        /*
3190: 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69   Output for sqli
31a0: 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20  te3_trace() */. 
31b0: 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
31c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
31d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
31e0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3200: 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73  An output mode s
3210: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  etting */.  int 
3220: 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20  writableSchema; 
3230: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52     /* True if PR
3240: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
3250: 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74  hema=ON */.  int
3260: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
3270: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
3280: 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  how column names
3290: 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75   in List or Colu
32a0: 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  mn mode */.  uns
32b0: 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b  igned shellFlgs;
32c0: 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
32d0: 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lags */.  char *
32e0: 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20  zDestTable;     
32f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74   /* Name of dest
3300: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68  ination table wh
3310: 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a  en MODE_Insert *
3320: 2f 0a 20 20 63 68 61 72 20 73 65 70 61 72 61 74  /.  char separat
3330: 6f 72 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 53 65  or[20];    /* Se
3340: 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
3350: 72 20 66 6f 72 20 4d 4f 44 45 5f 4c 69 73 74 20  r for MODE_List 
3360: 2a 2f 0a 20 20 63 68 61 72 20 6e 65 77 6c 69 6e  */.  char newlin
3370: 65 5b 32 30 5d 3b 20 20 20 20 20 20 2f 2a 20 52  e[20];      /* R
3380: 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72 20  ecord separator 
3390: 69 6e 20 4d 4f 44 45 5f 43 73 76 20 2a 2f 0a 20  in MODE_Csv */. 
33a0: 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30   int colWidth[10
33b0: 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65  0];     /* Reque
33c0: 73 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61  sted width of ea
33d0: 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69  ch column when i
33e0: 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a  n column mode*/.
33f0: 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74    int actualWidt
3400: 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75  h[100];  /* Actu
3410: 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  al width of each
3420: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
3430: 72 20 6e 75 6c 6c 76 61 6c 75 65 5b 32 30 5d 3b  r nullvalue[20];
3440: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
3450: 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20  to print when a 
3460: 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
3470: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20  from.           
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
3490: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
34a0: 0a 20 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f  .  SavedModeInfo
34b0: 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 2f 2a 20 48   normalMode;/* H
34c0: 6f 6c 64 73 20 74 68 65 20 6d 6f 64 65 20 6a 75  olds the mode ju
34d0: 73 74 20 62 65 66 6f 72 65 20 2e 65 78 70 6c 61  st before .expla
34e0: 69 6e 20 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20  in ON */.  char 
34f0: 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45  outfile[FILENAME
3500: 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61  _MAX]; /* Filena
3510: 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20  me for *out */. 
3520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
3530: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20  Filename;    /* 
3540: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
3550: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
3560: 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73  har *zFreeOnClos
3570: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  e;         /* Fi
3580: 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65 20 77  lename to free w
3590: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
35a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
35b0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
35c0: 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f 20 75  Name of VFS to u
35d0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
35e0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f  stmt *pStmt;   /
35f0: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
3600: 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ent if any. */. 
3610: 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20 20 20   FILE *pLog;    
3620: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
3630: 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65 72 65   log output here
3640: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49 6e 64   */.  int *aiInd
3650: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ent;         /* 
3660: 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e 74 73  Array of indents
3670: 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f 45 78   used in MODE_Ex
3680: 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  plain */.  int n
3690: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
36a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
36b0: 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f  ay aiIndent[] */
36c0: 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74 3b 20  .  int iIndent; 
36d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
36e0: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 70  ex of current op
36f0: 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   in aiIndent[] *
3700: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  /.};../*.** Thes
3710: 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65  e are the allowe
3720: 64 20 73 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75  d shellFlgs valu
3730: 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  es.*/.#define SH
3740: 46 4c 47 5f 53 63 72 61 74 63 68 20 20 20 20 20  FLG_Scratch     
3750: 30 78 30 30 30 30 31 20 20 20 20 20 2f 2a 20 54  0x00001     /* T
3760: 68 65 20 2d 2d 73 63 72 61 74 63 68 20 6f 70 74  he --scratch opt
3770: 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ion is used */.#
3780: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67  define SHFLG_Pag
3790: 65 63 61 63 68 65 20 20 20 30 78 30 30 30 30 32  ecache   0x00002
37a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 2d 2d 70 61       /* The --pa
37b0: 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69  gecache option i
37c0: 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e  s used */.#defin
37d0: 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64  e SHFLG_Lookasid
37e0: 65 20 20 20 30 78 30 30 30 30 34 20 20 20 20 20  e   0x00004     
37f0: 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  /* Lookaside mem
3800: 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f 0a 0a  ory is used */..
3810: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
3820: 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65  the allowed mode
3830: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  s..*/.#define MO
3840: 44 45 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f  DE_Line     0  /
3850: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72  * One column per
3860: 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69   line.  Blank li
3870: 6e 65 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72  ne between recor
3880: 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ds */.#define MO
3890: 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f  DE_Column   1  /
38a0: 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72  * One record per
38b0: 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f   line in neat co
38c0: 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65  lumns */.#define
38d0: 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32   MODE_List     2
38e0: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
38f0: 70 65 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20  per line with a 
3900: 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65  separator */.#de
3910: 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20  fine MODE_Semi  
3920: 20 20 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73     3  /* Same as
3930: 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61   MODE_List but a
3940: 70 70 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63  ppend ";" to eac
3950: 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e  h line */.#defin
3960: 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20  e MODE_Html     
3970: 34 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  4  /* Generate a
3980: 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f  n XHTML table */
3990: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e  .#define MODE_In
39a0: 73 65 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e  sert   5  /* Gen
39b0: 65 72 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72  erate SQL "inser
39c0: 74 22 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  t" statements */
39d0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63  .#define MODE_Tc
39e0: 6c 20 20 20 20 20 20 36 20 20 2f 2a 20 47 65 6e  l      6  /* Gen
39f0: 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20  erate ANSI-C or 
3a00: 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65  TCL quoted eleme
3a10: 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nts */.#define M
3a20: 4f 44 45 5f 43 73 76 20 20 20 20 20 20 37 20 20  ODE_Csv      7  
3a30: 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73  /* Quote strings
3a40: 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c  , numbers are pl
3a50: 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ain */.#define M
3a60: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 38 20 20  ODE_Explain  8  
3a70: 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c  /* Like MODE_Col
3a80: 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  umn, but do not 
3a90: 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f  truncate data */
3aa0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
3ab0: 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d  har *modeDescr[]
3ac0: 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20   = {.  "line",. 
3ad0: 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69   "column",.  "li
3ae0: 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20  st",.  "semi",. 
3af0: 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65   "html",.  "inse
3b00: 72 74 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20  rt",.  "tcl",.  
3b10: 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69  "csv",.  "explai
3b20: 6e 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 75  n",.};../*.** Nu
3b30: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
3b40: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
3b50: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
3b60: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
3b70: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
3b80: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ]))../*.** Compu
3b90: 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67  te a string leng
3ba0: 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74  th that is limit
3bb0: 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62  ed to what can b
3bc0: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c  e stored in.** l
3bd0: 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f 66 20  ower 30 bits of 
3be0: 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  a 32-bit signed 
3bf0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
3c00: 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28  ic int strlen30(
3c10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
3c20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
3c30: 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = z;.  while( *
3c40: 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20  z2 ){ z2++; }.  
3c50: 72 65 74 75 72 6e 20 30 78 33 66 66 66 66 66 66  return 0x3ffffff
3c60: 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a  f & (int)(z2 - z
3c70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  );.}../*.** A ca
3c80: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
3c90: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74  qlite3_log() int
3ca0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
3cb0: 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28  c void shellLog(
3cc0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
3cd0: 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20  iErrCode, const 
3ce0: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53  char *zMsg){.  S
3cf0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
3d00: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
3d10: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d  ;.  if( p->pLog=
3d20: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
3d30: 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c 20  printf(p->pLog, 
3d40: 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45 72  "(%d) %s\n", iEr
3d50: 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20 20  rCode, zMsg);.  
3d60: 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29 3b  fflush(p->pLog);
3d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
3d80: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
3d90: 67 20 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64  g as a hex-encod
3da0: 65 64 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31  ed blob (eg. X'1
3db0: 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63  234' ).*/.static
3dc0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78   void output_hex
3dd0: 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c  _blob(FILE *out,
3de0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
3df0: 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a  ob, int nBlob){.
3e00: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
3e10: 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a  *zBlob = (char *
3e20: 29 70 42 6c 6f 62 3b 0a 20 20 66 70 72 69 6e 74  )pBlob;.  fprint
3e30: 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20 66  f(out,"X'");.  f
3e40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b  or(i=0; i<nBlob;
3e50: 20 69 2b 2b 29 7b 20 66 70 72 69 6e 74 66 28 6f   i++){ fprintf(o
3e60: 75 74 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b  ut,"%02x",zBlob[
3e70: 69 5d 26 30 78 66 66 29 3b 20 7d 0a 20 20 66 70  i]&0xff); }.  fp
3e80: 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a  rintf(out,"'");.
3e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
3ea0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
3eb0: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
3ec0: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
3ed0: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
3ee0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3ef0: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
3f00: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
3f10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
3f20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
3f30: 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 0a 20 20   nSingle = 0;.  
3f40: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
3f50: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
3f60: 5d 3d 3d 27 5c 27 27 20 29 20 6e 53 69 6e 67 6c  ]=='\'' ) nSingl
3f70: 65 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  e++;.  }.  if( n
3f80: 53 69 6e 67 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  Single==0 ){.   
3f90: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25   fprintf(out,"'%
3fa0: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
3fb0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
3fc0: 2c 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65  ,"'");.    while
3fd0: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f  ( *z ){.      fo
3fe0: 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 7a  r(i=0; z[i] && z
3ff0: 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  [i]!='\''; i++){
4000: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30  }.      if( i==0
4010: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
4020: 6e 74 66 28 6f 75 74 2c 22 27 27 22 29 3b 0a 20  ntf(out,"''");. 
4030: 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
4040: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
4050: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
4060: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
4070: 2e 2a 73 27 27 22 2c 69 2c 7a 29 3b 0a 20 20 20  .*s''",i,z);.   
4080: 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b 0a 20       z += i+1;. 
4090: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
40a0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
40b0: 22 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20  "%s",z);.       
40c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
40d0: 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
40e0: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 20 20 7d 0a  f(out,"'");.  }.
40f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
4100: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
4110: 20 61 73 20 61 20 71 75 6f 74 65 64 20 61 63 63   as a quoted acc
4120: 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54  ording to C or T
4130: 43 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73  CL quoting rules
4140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4150: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
4160: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
4170: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e  t char *z){.  un
4180: 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20  signed int c;.  
4190: 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b  fputc('"', out);
41a0: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a  .  while( (c = *
41b0: 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20  (z++))!=0 ){.   
41c0: 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
41d0: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
41e0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
41f0: 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  (c, out);.    }e
4200: 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29  lse if( c=='"' )
4210: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
4220: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
4230: 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b  fputc('"', out);
4240: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
4250: 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20  =='\t' ){.      
4260: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
4270: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 74  ;.      fputc('t
4280: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
4290: 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29  se if( c=='\n' )
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 6e 27 2c 20 6f 75 74 29 3b  fputc('n', 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 72 27 20 29 7b 0a 20 20 20 20 20 20  =='\r' ){.      
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 72  ;.      fputc('r
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 21 69 73 70 72 69 6e 74 28  se if( !isprint(
4330: 63 26 30 78 66 66 29 20 29 7b 0a 20 20 20 20 20  c&0xff) ){.     
4340: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
4350: 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b  \%03o", c&0xff);
4360: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4370: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
4380: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75  .    }.  }.  fpu
4390: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a  tc('"', out);.}.
43a0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
43b0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77  e given string w
43c0: 69 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74  ith characters t
43d0: 68 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20  hat are special 
43e0: 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70  to.** HTML escap
43f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
4400: 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73  id output_html_s
4410: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
4420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
4430: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4440: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
4450: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
4460: 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69    for(i=0;   z[i
4470: 5d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ] .            &
4480: 26 20 7a 5b 69 5d 21 3d 27 3c 27 20 0a 20 20 20  & z[i]!='<' .   
4490: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
44a0: 21 3d 27 26 27 20 0a 20 20 20 20 20 20 20 20 20  !='&' .         
44b0: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 20     && z[i]!='>' 
44c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
44d0: 7a 5b 69 5d 21 3d 27 5c 22 27 20 0a 20 20 20 20  z[i]!='\"' .    
44e0: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
44f0: 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\'';.        i
4500: 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e  ++){}.    if( i>
4510: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
4520: 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c  tf(out,"%.*s",i,
4530: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
4540: 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20  ( z[i]=='<' ){. 
4550: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
4560: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
4570: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
4580: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ' ){.      fprin
4590: 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b  tf(out,"&amp;");
45a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
45b0: 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20  [i]=='>' ){.    
45c0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26    fprintf(out,"&
45d0: 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gt;");.    }else
45e0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20   if( z[i]=='\"' 
45f0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4600: 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a  (out,"&quot;");.
4610: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
4620: 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  i]=='\'' ){.    
4630: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26    fprintf(out,"&
4640: 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  #39;");.    }els
4650: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
4660: 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69      }.    z += i
4670: 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   + 1;.  }.}../*.
4680: 2a 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f  ** If a field co
4690: 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61  ntains any chara
46a0: 63 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20  cter identified 
46b0: 62 79 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f  by a 1 in the fo
46c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79  llowing.** array
46d0: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e  , then the strin
46e0: 67 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64  g must be quoted
46f0: 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61   for CSV..*/.sta
4700: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
4710: 65 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20  eedCsvQuote[] = 
4720: 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  {.  1, 1, 1, 1, 
4730: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
4740: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4750: 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c  1, 1,   .  1, 1,
4760: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4770: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
4780: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a   1, 1, 1, 1,   .
4790: 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c    1, 0, 1, 0, 0,
47a0: 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30   0, 0, 1,   0, 0
47b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
47c0: 20 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20   0, .  0, 0, 0, 
47d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
47e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
47f0: 30 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30  0, 0, 0, .  0, 0
4800: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
4810: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
4820: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20  , 0, 0, 0, 0, . 
4830: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4840: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
4850: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
4860: 30 2c 20 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30  0, .  0, 0, 0, 0
4870: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
4880: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
4890: 2c 20 30 2c 20 30 2c 20 0a 20 20 30 2c 20 30 2c  , 0, 0, .  0, 0,
48a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
48b0: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
48c0: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 0a 20 20   0, 0, 0, 1, .  
48d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
48e0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
48f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4900: 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20  ,   .  1, 1, 1, 
4910: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
4920: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4930: 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c  1, 1, 1,   .  1,
4940: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4950: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
4960: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4970: 20 20 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c    .  1, 1, 1, 1,
4980: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
4990: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
49a0: 20 31 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31   1, 1,   .  1, 1
49b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
49c0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
49d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
49e0: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
49f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
4a00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4a10: 2c 20 31 2c 20 20 20 0a 20 20 31 2c 20 31 2c 20  , 1,   .  1, 1, 
4a20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
4a30: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
4a40: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 0a 20  1, 1, 1, 1,   . 
4a50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4a60: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
4a70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
4a80: 31 2c 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  1,   .};../*.** 
4a90: 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20  Output a single 
4aa0: 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63  term of CSV.  Ac
4ab0: 74 75 61 6c 6c 79 2c 20 70 2d 3e 73 65 70 61 72  tually, p->separ
4ac0: 61 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ator is used for
4ad0: 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 6f  .** the separato
4ae0: 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  r, which may or 
4af0: 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
4b00: 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75  ma.  p->nullvalu
4b10: 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c  e is.** the null
4b20: 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67 73   value.  Strings
4b30: 20 61 72 65 20 71 75 6f 74 65 64 20 69 66 20 6e   are quoted if n
4b40: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 73  ecessary.  The s
4b50: 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f  eparator.** is o
4b60: 6e 6c 79 20 69 73 73 75 65 64 20 69 66 20 62 53  nly issued if bS
4b70: 65 70 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ep is true..*/.s
4b80: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
4b90: 74 5f 63 73 76 28 53 68 65 6c 6c 53 74 61 74 65  t_csv(ShellState
4ba0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4bb0: 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20  *z, int bSep){. 
4bc0: 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e   FILE *out = p->
4bd0: 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  out;.  if( z==0 
4be0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
4bf0: 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 76  ut,"%s",p->nullv
4c00: 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  alue);.  }else{.
4c10: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
4c20: 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e  nt nSep = strlen
4c30: 33 30 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  30(p->separator)
4c40: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
4c50: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
4c60: 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74   if( needCsvQuot
4c70: 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[((unsigned cha
4c80: 72 2a 29 7a 29 5b 69 5d 5d 20 0a 20 20 20 20 20  r*)z)[i]] .     
4c90: 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d      || (z[i]==p-
4ca0: 3e 73 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26  >separator[0] &&
4cb0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
4cc0: 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d  nSep==1 || memcm
4cd0: 70 28 7a 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f  p(z, p->separato
4ce0: 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b  r, nSep)==0)) ){
4cf0: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a  .        i = 0;.
4d00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4d10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4d20: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
4d30: 20 20 20 70 75 74 63 28 27 22 27 2c 20 6f 75 74     putc('"', out
4d40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
4d50: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
4d60: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
4d70: 27 22 27 20 29 20 70 75 74 63 28 27 22 27 2c 20  '"' ) putc('"', 
4d80: 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 75  out);.        pu
4d90: 74 63 28 7a 5b 69 5d 2c 20 6f 75 74 29 3b 0a 20  tc(z[i], out);. 
4da0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
4db0: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('"', out);.   
4dc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
4dd0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
4de0: 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   z);.    }.  }. 
4df0: 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20   if( bSep ){.   
4e00: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
4e10: 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61 72 61   "%s", p->separa
4e20: 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  tor);.  }.}..#if
4e30: 64 65 66 20 53 49 47 49 4e 54 0a 2f 2a 0a 2a 2a  def SIGINT./*.**
4e40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
4e50: 6e 73 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ns when the user
4e60: 20 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a   presses Ctrl-C.
4e70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
4e80: 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72  nterrupt_handler
4e90: 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20  (int NotUsed){. 
4ea0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4eb0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65  R(NotUsed);.  se
4ec0: 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20  enInterrupt++;. 
4ed0: 20 69 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75   if( seenInterru
4ee0: 70 74 3e 32 20 29 20 65 78 69 74 28 31 29 3b 0a  pt>2 ) exit(1);.
4ef0: 20 20 69 66 28 20 64 62 20 29 20 73 71 6c 69 74    if( db ) sqlit
4f00: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
4f10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4f20: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
4f30: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
4f40: 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a  hat the shell.**
4f50: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
4f60: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
4f70: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
4f80: 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c  ic int shell_cal
4f90: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
4fa0: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
4fb0: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
4fc0: 2a 61 7a 43 6f 6c 2c 20 69 6e 74 20 2a 61 69 54  *azCol, int *aiT
4fd0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ype){.  int i;. 
4fe0: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
4ff0: 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41   (ShellState*)pA
5000: 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  rg;..  switch( p
5010: 2d 3e 6d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  ->mode ){.    ca
5020: 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a  se MODE_Line: {.
5030: 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b        int w = 5;
5040: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
5050: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
5060: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
5070: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
5080: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
5090: 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  en30(azCol[i] ? 
50a0: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
50b0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
50c0: 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20  w ) w = len;.   
50d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
50e0: 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 66 70 72 69  ->cnt++>0 ) fpri
50f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
5100: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5110: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
5120: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
5130: 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 5c  ->out,"%*s = %s\
5140: 6e 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  n", w, azCol[i],
5150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5160: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
5170: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61  g[i] : p->nullva
5180: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
5190: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
51a0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45  .    case MODE_E
51b0: 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73 65  xplain:.    case
51c0: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a   MODE_Column: {.
51d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
51e0: 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ++==0 ){.       
51f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
5200: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5210: 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20 20    int w, n;.    
5220: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
5230: 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74  ySize(p->colWidt
5240: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
5250: 20 20 77 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74    w = p->colWidt
5260: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  h[i];.          
5270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5280: 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20     w = 0;.      
5290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
52a0: 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20  if( w==0 ){.    
52b0: 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c          w = strl
52c0: 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  en30(azCol[i] ? 
52d0: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
52f0: 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20  w<10 ) w = 10;. 
5300: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73             n = s
5310: 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 20 26 26  trlen30(azArg &&
5320: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
5330: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 76 61  g[i] : p->nullva
5340: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lue);.          
5350: 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d 20    if( w<n ) w = 
5360: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
5370: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
5380: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75  rraySize(p->actu
5390: 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  alWidth) ){.    
53a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75 61          p->actua
53b0: 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20  lWidth[i] = w;. 
53c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
53d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77       if( p->show
53e0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
53f0: 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29 7b        if( w<0 ){
5400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
5410: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5420: 2a 2e 2a 73 25 73 22 2c 2d 77 2c 2d 77 2c 61 7a  *.*s%s",-w,-w,az
5430: 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72 67 2d  Col[i], i==nArg-
5440: 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22 29 3b  1 ? "\n": "  ");
5450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
5460: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
5470: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5480: 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c  ,"%-*.*s%s",w,w,
5490: 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41 72  azCol[i], i==nAr
54a0: 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20 22  g-1 ? "\n": "  "
54b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
54c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
54d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
54e0: 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  f( p->showHeader
54f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
5500: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
5510: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
5520: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
5530: 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53      if( i<ArrayS
5540: 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64  ize(p->actualWid
5550: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
5560: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74        w = p->act
5570: 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  ualWidth[i];.   
5580: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
5590: 77 3c 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20  w<0 ) w = -w;.  
55a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
55b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
55c0: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
55d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
55e0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
55f0: 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c  ,"%-*.*s%s",w,w,
5600: 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5620: 2d 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20 20 20  ----".          
5630: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d           "------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5670: 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20  ----",.         
5680: 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41             i==nA
5690: 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22 20 20  rg-1 ? "\n": "  
56a0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
56b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
56c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
56d0: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
56e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
56f0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
5700: 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20     int w;.      
5710: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
5720: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
5730: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
5740: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
5750: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  th[i];.        }
5760: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5770: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
5780: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
5790: 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
57a0: 6c 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d  lain && azArg[i]
57b0: 20 26 26 20 73 74 72 6c 65 6e 33 30 28 61 7a 41   && strlen30(azA
57c0: 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20  rg[i])>w ){.    
57d0: 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e        w = strlen
57e0: 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  30(azArg[i]);.  
57f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5800: 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61  if( i==1 && p->a
5810: 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70 53  iIndent && p->pS
5820: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
5830: 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c   if( p->iIndent<
5840: 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20  p->nIndent ){.  
5850: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
5860: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73 22  f(p->out, "%*.s"
5870: 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70 2d  , p->aiIndent[p-
5880: 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b 0a  >iIndent], "");.
5890: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
58a0: 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e 74        p->iIndent
58b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
58c0: 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29 7b        if( w<0 ){
58d0: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
58e0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 2e 2a 73  tf(p->out,"%*.*s
58f0: 25 73 22 2c 2d 77 2c 2d 77 2c 0a 20 20 20 20 20  %s",-w,-w,.     
5900: 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69           azArg[i
5910: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
5920: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 20 69 3d 3d  ->nullvalue, i==
5930: 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22 3a 20 22  nArg-1 ? "\n": "
5940: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65    ");.        }e
5950: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
5960: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
5970: 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20  -*.*s%s",w,w,.  
5980: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
5990: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
59a0: 3a 20 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 20  : p->nullvalue, 
59b0: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 22 5c 6e 22  i==nArg-1 ? "\n"
59c0: 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20  : "  ");.       
59d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
59e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
59f0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69    case MODE_Semi
5a00: 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  :.    case MODE_
5a10: 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  List: {.      if
5a20: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
5a30: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
5a40: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
5a50: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
5a60: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
5a70: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22  tf(p->out,"%s%s"
5a80: 2c 61 7a 43 6f 6c 5b 69 5d 2c 20 69 3d 3d 6e 41  ,azCol[i], i==nA
5a90: 72 67 2d 31 20 3f 20 22 5c 6e 22 20 3a 20 70 2d  rg-1 ? "\n" : p-
5aa0: 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  >separator);.   
5ab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5ac0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
5ad0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
5ae0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
5af0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5b00: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
5b10: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
5b20: 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75  z==0 ) z = p->nu
5b30: 6c 6c 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  llvalue;.       
5b40: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
5b50: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
5b60: 20 20 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20     if( i<nArg-1 
5b70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
5b80: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
5b90: 22 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  ", p->separator)
5ba0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
5bb0: 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
5bc0: 45 5f 53 65 6d 69 20 29 7b 0a 20 20 20 20 20 20  E_Semi ){.      
5bd0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
5be0: 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut, ";\n");.    
5bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5c00: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
5c10: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
5c20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5c30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c40: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48  .    case MODE_H
5c50: 74 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  tml: {.      if(
5c60: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
5c70: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
5c80: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
5c90: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
5ca0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
5cb0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
5cc0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
5cd0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29  f(p->out,"<TH>")
5ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
5cf0: 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70  ut_html_string(p
5d00: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
5d10: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
5d20: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48  ntf(p->out,"</TH
5d30: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  >\n");.        }
5d40: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
5d50: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e  (p->out,"</TR>\n
5d60: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
5d70: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
5d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 70   break;.      fp
5d90: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
5da0: 52 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  R>");.      for(
5db0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
5dc0: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
5dd0: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22  tf(p->out,"<TD>"
5de0: 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  );.        outpu
5df0: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d  t_html_string(p-
5e00: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
5e10: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
5e20: 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullvalue);.     
5e30: 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
5e40: 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20  t,"</TD>\n");.  
5e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
5e60: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
5e70: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  >\n");.      bre
5e80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5e90: 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20  se MODE_Tcl: {. 
5ea0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
5eb0: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
5ec0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
5ed0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
5ee0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5ef0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
5f00: 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69  g(p->out,azCol[i
5f10: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
5f20: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ");.          if
5f30: 28 69 3c 6e 41 72 67 2d 31 29 20 66 70 72 69 6e  (i<nArg-1) fprin
5f40: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
5f50: 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 29 3b 0a   p->separator);.
5f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5f70: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
5f80: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ,"\n");.      }.
5f90: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
5fa0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
5fb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
5fc0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
5fd0: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
5fe0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
5ff0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
6000: 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 3b 0a 20 20  ->nullvalue);.  
6010: 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d        if(i<nArg-
6020: 31 29 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75  1) fprintf(p->ou
6030: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 73 65 70 61  t, "%s", p->sepa
6040: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
6050: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d        fprintf(p-
6060: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
6070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6080: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76     case MODE_Csv
6090: 3a 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  : {.#if defined(
60a0: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
60b0: 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20  d(_WIN32).      
60c0: 66 66 6c 75 73 68 28 70 2d 3e 6f 75 74 29 3b 0a  fflush(p->out);.
60d0: 20 20 20 20 20 20 5f 73 65 74 6d 6f 64 65 28 5f        _setmode(_
60e0: 66 69 6c 65 6e 6f 28 70 2d 3e 6f 75 74 29 2c 20  fileno(p->out), 
60f0: 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a 23 65 6e 64  _O_BINARY);.#end
6100: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  if.      if( p->
6110: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
6120: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
6130: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6140: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
6150: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76        output_csv
6160: 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61  (p, azCol[i] ? a
6170: 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c  zCol[i] : "", i<
6180: 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20  nArg-1);.       
6190: 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   }.        fprin
61a0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 70  tf(p->out,"%s",p
61b0: 2d 3e 6e 65 77 6c 69 6e 65 29 3b 0a 20 20 20 20  ->newline);.    
61c0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
61d0: 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Arg>0 ){.       
61e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
61f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6200: 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20    output_csv(p, 
6210: 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67  azArg[i], i<nArg
6220: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  -1);.        }. 
6230: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
6240: 2d 3e 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 65  ->out,"%s",p->ne
6250: 77 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20 7d 0a  wline);.      }.
6260: 23 69 66 20 64 65 66 69 6e 65 64 28 57 49 4e 33  #if defined(WIN3
6270: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57  2) || defined(_W
6280: 49 4e 33 32 29 0a 20 20 20 20 20 20 66 66 6c 75  IN32).      fflu
6290: 73 68 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  sh(p->out);.    
62a0: 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65    _setmode(_file
62b0: 6e 6f 28 70 2d 3e 6f 75 74 29 2c 20 5f 4f 5f 54  no(p->out), _O_T
62c0: 45 58 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  EXT);.#endif.   
62d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
62e0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e      case MODE_In
62f0: 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 70 2d  sert: {.      p-
6300: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66  >cnt++;.      if
6310: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
6320: 61 6b 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  ak;.      fprint
6330: 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54  f(p->out,"INSERT
6340: 20 49 4e 54 4f 20 25 73 20 56 41 4c 55 45 53 28   INTO %s VALUES(
6350: 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29  ",p->zDestTable)
6360: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
6370: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
6380: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65         char *zSe
6390: 70 20 3d 20 69 3e 30 20 3f 20 22 2c 22 3a 20 22  p = i>0 ? ",": "
63a0: 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ";.        if( (
63b0: 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20  azArg[i]==0) || 
63c0: 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70  (aiType && aiTyp
63d0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  e[i]==SQLITE_NUL
63e0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
63f0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
6400: 25 73 4e 55 4c 4c 22 2c 7a 53 65 70 29 3b 0a 20  %sNULL",zSep);. 
6410: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
6420: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
6430: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58  e[i]==SQLITE_TEX
6440: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  T ){.          i
6450: 66 28 20 7a 53 65 70 5b 30 5d 20 29 20 66 70 72  f( zSep[0] ) fpr
6460: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
6470: 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20 20 20  ,zSep);.        
6480: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
6490: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
64a0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
64b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
64c0: 70 65 20 26 26 20 28 61 69 54 79 70 65 5b 69 5d  pe && (aiType[i]
64d0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
64e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
6500: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
6510: 54 45 5f 46 4c 4f 41 54 29 20 29 7b 0a 20 20 20  TE_FLOAT) ){.   
6520: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70         fprintf(p
6530: 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 7a 53 65  ->out,"%s%s",zSe
6540: 70 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  p, azArg[i]);.  
6550: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6560: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
6570: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  [i]==SQLITE_BLOB
6580: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
6590: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
65a0: 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71  void *pBlob = sq
65b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
65c0: 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  b(p->pStmt, i);.
65d0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42            int nB
65e0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
65f0: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53  lumn_bytes(p->pS
6600: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
6610: 20 20 20 69 66 28 20 7a 53 65 70 5b 30 5d 20 29     if( zSep[0] )
6620: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
6630: 22 25 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20  "%s",zSep);.    
6640: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
6650: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
6660: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
6670: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
6680: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
6690: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
66a0: 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
66b0: 2c 22 25 73 25 73 22 2c 7a 53 65 70 2c 20 61 7a  ,"%s%s",zSep, az
66c0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
66d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
66e0: 20 20 69 66 28 20 7a 53 65 70 5b 30 5d 20 29 20    if( zSep[0] ) 
66f0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  fprintf(p->out,"
6700: 25 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20  %s",zSep);.     
6710: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
6720: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
6730: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
6740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6750: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
6760: 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20  out,");\n");.   
6770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
67a0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
67b0: 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 53  utine that the S
67c0: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a  QLite library.**
67d0: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
67e0: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
67f0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
6800: 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28  ic int callback(
6810: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
6820: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
6830: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  rg, char **azCol
6840: 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65  ){.  /* since we
6850: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65   don't have type
6860: 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20   info, call the 
6870: 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77  shell_callback w
6880: 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
6890: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65   */.  return she
68a0: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67  ll_callback(pArg
68b0: 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61  , nArg, azArg, a
68c0: 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a  zCol, NULL);.}..
68d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
68e0: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
68f0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65  field of the She
6900: 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74 75 72  llState structur
6910: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  e to.** the name
6920: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69   of the table gi
6930: 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79  ven.  Escape any
6940: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
6950: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s in the.** tabl
6960: 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e name..*/.stati
6970: 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65  c void set_table
6980: 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65  _name(ShellState
6990: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
69a0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
69b0: 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51  , n;.  int needQ
69c0: 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  uote;.  char *z;
69d0: 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74  ..  if( p->zDest
69e0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65  Table ){.    fre
69f0: 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29  e(p->zDestTable)
6a00: 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61  ;.    p->zDestTa
6a10: 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ble = 0;.  }.  i
6a20: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6a30: 74 75 72 6e 3b 0a 20 20 6e 65 65 64 51 75 6f 74  turn;.  needQuot
6a40: 65 20 3d 20 21 69 73 61 6c 70 68 61 28 28 75 6e  e = !isalpha((un
6a50: 73 69 67 6e 65 64 20 63 68 61 72 29 2a 7a 4e 61  signed char)*zNa
6a60: 6d 65 29 20 26 26 20 2a 7a 4e 61 6d 65 21 3d 27  me) && *zName!='
6a70: 5f 27 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  _';.  for(i=n=0;
6a80: 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 2c 20   zName[i]; i++, 
6a90: 6e 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  n++){.    if( !i
6aa0: 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64  salnum((unsigned
6ab0: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20   char)zName[i]) 
6ac0: 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  && zName[i]!='_'
6ad0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 51 75   ){.      needQu
6ae0: 6f 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  ote = 1;.      i
6af0: 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c 27  f( zName[i]=='\'
6b00: 27 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ' ) n++;.    }. 
6b10: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
6b20: 74 65 20 29 20 6e 20 2b 3d 20 32 3b 0a 20 20 7a  te ) n += 2;.  z
6b30: 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65   = p->zDestTable
6b40: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29   = malloc( n+1 )
6b50: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  ;.  if( z==0 ){.
6b60: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
6b70: 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  rr,"Error: out o
6b80: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
6b90: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
6ba0: 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 65   n = 0;.  if( ne
6bb0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d  edQuote ) z[n++]
6bc0: 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 69   = '\'';.  for(i
6bd0: 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
6be0: 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d  +){.    z[n++] =
6bf0: 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69   zName[i];.    i
6c00: 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 27 5c 27  f( zName[i]=='\'
6c10: 27 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 27 5c 27  ' ) z[n++] = '\'
6c20: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
6c30: 64 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20  dQuote ) z[n++] 
6c40: 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 6e 5d 20 3d  = '\'';.  z[n] =
6c50: 20 30 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73   0;.}../* zIn is
6c60: 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
6c70: 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d  r to a NULL-term
6c80: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
6c90: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
6ca0: 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  .** from malloc(
6cb0: 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69  ), or a NULL poi
6cc0: 6e 74 65 72 2e 20 54 68 65 20 73 74 72 69 6e 67  nter. The string
6cd0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
6ce0: 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64  Append is.** add
6cf0: 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74  ed to zIn, and t
6d00: 68 65 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e  he result return
6d10: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ed in memory obt
6d20: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
6d30: 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20  c()..** zIn, if 
6d40: 69 74 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c  it was not NULL,
6d50: 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a   is freed..**.**
6d60: 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72   If the third ar
6d70: 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69  gument, quote, i
6d80: 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e  s not '\0', then
6d90: 20 69 74 20 69 73 20 75 73 65 64 20 61 73 20 61   it is used as a
6da0: 20 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61   .** quote chara
6db0: 63 74 65 72 20 66 6f 72 20 7a 41 70 70 65 6e 64  cter for zAppend
6dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
6dd0: 20 2a 61 70 70 65 6e 64 54 65 78 74 28 63 68 61   *appendText(cha
6de0: 72 20 2a 7a 49 6e 2c 20 63 68 61 72 20 63 6f 6e  r *zIn, char con
6df0: 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61  st *zAppend, cha
6e00: 72 20 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20  r quote){.  int 
6e10: 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  len;.  int i;.  
6e20: 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74  int nAppend = st
6e30: 72 6c 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b  rlen30(zAppend);
6e40: 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 28 7a 49  .  int nIn = (zI
6e50: 6e 3f 73 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3a  n?strlen30(zIn):
6e60: 30 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70  0);..  len = nAp
6e70: 70 65 6e 64 2b 6e 49 6e 2b 31 3b 0a 20 20 69 66  pend+nIn+1;.  if
6e80: 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 6c  ( quote ){.    l
6e90: 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f 72  en += 2;.    for
6ea0: 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b  (i=0; i<nAppend;
6eb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
6ec0: 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f   zAppend[i]==quo
6ed0: 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20  te ) len++;.    
6ee0: 7d 0a 20 20 7d 0a 0a 20 20 7a 49 6e 20 3d 20 28  }.  }..  zIn = (
6ef0: 63 68 61 72 20 2a 29 72 65 61 6c 6c 6f 63 28 7a  char *)realloc(z
6f00: 49 6e 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  In, len);.  if( 
6f10: 21 7a 49 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  !zIn ){.    retu
6f20: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
6f30: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
6f40: 61 72 20 2a 7a 43 73 72 20 3d 20 26 7a 49 6e 5b  ar *zCsr = &zIn[
6f50: 6e 49 6e 5d 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  nIn];.    *zCsr+
6f60: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
6f70: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
6f80: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
6f90: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
6fa0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
6fb0: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
6fc0: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
6fd0: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
6fe0: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
6ff0: 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 5c 30     *zCsr++ = '\0
7000: 27 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ';.    assert( (
7010: 7a 43 73 72 2d 7a 49 6e 29 3d 3d 6c 65 6e 20 29  zCsr-zIn)==len )
7020: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
7030: 65 6d 63 70 79 28 26 7a 49 6e 5b 6e 49 6e 5d 2c  emcpy(&zIn[nIn],
7040: 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e   zAppend, nAppen
7050: 64 29 3b 0a 20 20 20 20 7a 49 6e 5b 6c 65 6e 2d  d);.    zIn[len-
7060: 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a  1] = '\0';.  }..
7070: 20 20 72 65 74 75 72 6e 20 7a 49 6e 3b 0a 7d 0a    return zIn;.}.
7080: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
7090: 61 20 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e  a query statemen
70a0: 74 20 74 68 61 74 20 77 69 6c 6c 20 67 65 6e 65  t that will gene
70b0: 72 61 74 65 20 53 51 4c 20 6f 75 74 70 75 74 2e  rate SQL output.
70c0: 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72    Print.** the r
70d0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63  esult columns, c
70e0: 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 2c 20  omma-separated, 
70f0: 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64 20 74 68  on a line and th
7100: 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69  en add a.** semi
7110: 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72  colon terminator
7120: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
7130: 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20  hat line..**.** 
7140: 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
7150: 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e   columns is 1 an
7160: 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f  d that column co
7170: 6e 74 61 69 6e 73 20 74 65 78 74 20 22 2d 2d 22  ntains text "--"
7180: 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74  .** then write t
7190: 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20  he semicolon on 
71a0: 61 20 73 65 70 61 72 61 74 65 20 6c 69 6e 65 2e  a separate line.
71b0: 20 20 54 68 61 74 20 77 61 79 2c 20 69 66 20 61    That way, if a
71c0: 20 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e   .** "--" commen
71d0: 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
71e0: 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61 74 65  end of the state
71f0: 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65 6e  ment, the commen
7200: 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73 75  t.** won't consu
7210: 6d 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e  me the semicolon
7220: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a   terminator..*/.
7230: 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74  static int run_t
7240: 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
7250: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
7260: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51  ,           /* Q
7270: 75 65 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  uery context */.
7280: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
7290: 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20 53 45  elect,     /* SE
72a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
72b0: 6f 20 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e  o extract conten
72c0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
72d0: 72 20 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 20  r *zFirstRow    
72e0: 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f 72 65 20  /* Print before 
72f0: 66 69 72 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f  first row, if no
7300: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  t NULL */.){.  s
7310: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65  qlite3_stmt *pSe
7320: 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lect;.  int rc;.
7330: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20    int nResult;. 
7340: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
7350: 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d 20  char *z;.  rc = 
7360: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
7370: 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63  v2(p->db, zSelec
7380: 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c  t, -1, &pSelect,
7390: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
73a0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65  QLITE_OK || !pSe
73b0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 66 70 72 69  lect ){.    fpri
73c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
73d0: 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25  ** ERROR: (%d) %
73e0: 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c  s *****/\n", rc,
73f0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
7400: 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28  p->db));.    if(
7410: 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49   (rc&0xff)!=SQLI
7420: 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e  TE_CORRUPT ) p->
7430: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
7440: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20  rn rc;.  }.  rc 
7450: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
7460: 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75  Select);.  nResu
7470: 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  lt = sqlite3_col
7480: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63  umn_count(pSelec
7490: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  t);.  while( rc=
74a0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
74b0: 20 20 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77     if( zFirstRow
74c0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
74d0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
74e0: 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20  zFirstRow);.    
74f0: 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b    zFirstRow = 0;
7500: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28  .    }.    z = (
7510: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
7520: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
7530: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
7540: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
7550: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66   "%s", z);.    f
7560: 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c  or(i=1; i<nResul
7570: 74 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  t; i++){ .      
7580: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
7590: 22 2c 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ",%s", sqlite3_c
75a0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
75b0: 63 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20  ct, i));.    }. 
75c0: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
75d0: 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65 28  = "";.    while(
75e0: 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21 3d   z[0] && (z[0]!=
75f0: 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27  '-' || z[1]!='-'
7600: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28  ) ) z++;.    if(
7610: 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 66   z[0] ){.      f
7620: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
7630: 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c  \n;\n");.    }el
7640: 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  se{.      fprint
7650: 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29  f(p->out, ";\n")
7660: 3b 0a 20 20 20 20 7d 20 20 20 20 0a 20 20 20 20  ;.    }    .    
7670: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
7680: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  p(pSelect);.  }.
7690: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
76a0: 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74 29  inalize(pSelect)
76b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
76c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 70 72  TE_OK ){.    fpr
76d0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
76e0: 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20  *** ERROR: (%d) 
76f0: 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63  %s *****/\n", rc
7700: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
7710: 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66  (p->db));.    if
7720: 28 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c  ( (rc&0xff)!=SQL
7730: 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d  ITE_CORRUPT ) p-
7740: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nErr++;.  }.  r
7750: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7760: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
7770: 65 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63  e and save off c
7780: 75 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72  urrent error str
7790: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
77a0: 68 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73  har *save_err_ms
77b0: 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  g(.  sqlite3 *db
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
77d0: 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
77e0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
77f0: 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33  rMsg = 1+strlen3
7800: 30 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  0(sqlite3_errmsg
7810: 28 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a  (db));.  char *z
7820: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
7830: 5f 6d 61 6c 6c 6f 63 28 6e 45 72 72 4d 73 67 29  _malloc(nErrMsg)
7840: 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20  ;.  if( zErrMsg 
7850: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  ){.    memcpy(zE
7860: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65  rrMsg, sqlite3_e
7870: 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d  rrmsg(db), nErrM
7880: 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
7890: 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 2f 2a  n zErrMsg;.}../*
78a0: 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f  .** Display memo
78b0: 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  ry stats..*/.sta
78c0: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 5f  tic int display_
78d0: 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33  stats(.  sqlite3
78e0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
78f0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7900: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53   to query */.  S
7910: 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
7920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7930: 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
7940: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ate */.  int bRe
7950: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
7960: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7970: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20  reset the stats 
7980: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72  */.){.  int iCur
7990: 3b 0a 20 20 69 6e 74 20 69 48 69 77 74 72 3b 0a  ;.  int iHiwtr;.
79a0: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
79b0: 41 72 67 2d 3e 6f 75 74 20 29 7b 0a 20 20 20 20  Arg->out ){.    
79c0: 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
79d0: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
79e0: 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49  ite3_status(SQLI
79f0: 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
7a00: 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
7a10: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
7a20: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
7a30: 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 55  ->out, "Memory U
7a40: 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  sed:            
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
7a60: 28 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c 6e  (max %d) bytes\n
7a70: 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29  ", iCur, iHiwtr)
7a80: 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
7a90: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
7aa0: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
7ab0: 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
7ac0: 43 5f 43 4f 55 4e 54 2c 20 26 69 43 75 72 2c 20  C_COUNT, &iCur, 
7ad0: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
7ae0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41  ;.    fprintf(pA
7af0: 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72  rg->out, "Number
7b00: 20 6f 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20   of Outstanding 
7b10: 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 20 20 20 25  Allocations:   %
7b20: 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 20 69  d (max %d)\n", i
7b30: 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  Cur, iHiwtr);.  
7b40: 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c    if( pArg->shel
7b50: 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50 61  lFlgs & SHFLG_Pa
7b60: 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20 20  gecache ){.     
7b70: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
7b80: 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
7b90: 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45  e3_status(SQLITE
7ba0: 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
7bb0: 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  E_USED, &iCur, &
7bc0: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
7bd0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 70  .      fprintf(p
7be0: 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65  Arg->out, "Numbe
7bf0: 72 20 6f 66 20 50 63 61 63 68 65 20 50 61 67 65  r of Pcache Page
7c00: 73 20 55 73 65 64 3a 20 20 20 20 20 20 20 20 20  s Used:         
7c10: 25 64 20 28 6d 61 78 20 25 64 29 20 70 61 67 65  %d (max %d) page
7c20: 73 5c 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77  s\n", iCur, iHiw
7c30: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  tr);.    }.    i
7c40: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
7c50: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  1;.    sqlite3_s
7c60: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
7c70: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
7c80: 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26  ERFLOW, &iCur, &
7c90: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
7ca0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72  .    fprintf(pAr
7cb0: 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20  g->out, "Number 
7cc0: 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c  of Pcache Overfl
7cd0: 6f 77 20 42 79 74 65 73 3a 20 20 20 20 20 25 64  ow Bytes:     %d
7ce0: 20 28 6d 61 78 20 25 64 29 20 62 79 74 65 73 5c   (max %d) bytes\
7cf0: 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  n", iCur, iHiwtr
7d00: 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d  );.    if( pArg-
7d10: 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46  >shellFlgs & SHF
7d20: 4c 47 5f 53 63 72 61 74 63 68 20 29 7b 0a 20 20  LG_Scratch ){.  
7d30: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
7d40: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  r = -1;.      sq
7d50: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
7d60: 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54  ITE_STATUS_SCRAT
7d70: 43 48 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  CH_USED, &iCur, 
7d80: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
7d90: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
7da0: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62  pArg->out, "Numb
7db0: 65 72 20 6f 66 20 53 63 72 61 74 63 68 20 41 6c  er of Scratch Al
7dc0: 6c 6f 63 61 74 69 6f 6e 73 20 55 73 65 64 3a 20  locations Used: 
7dd0: 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c   %d (max %d)\n",
7de0: 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
7df0: 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72      }.    iHiwtr
7e00: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
7e10: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
7e20: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53  (SQLITE_STATUS_S
7e30: 43 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57 2c  CRATCH_OVERFLOW,
7e40: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
7e50: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70   bReset);.    fp
7e60: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
7e70: 20 22 4e 75 6d 62 65 72 20 6f 66 20 53 63 72 61   "Number of Scra
7e80: 74 63 68 20 4f 76 65 72 66 6c 6f 77 20 42 79 74  tch Overflow Byt
7e90: 65 73 3a 20 20 20 20 25 64 20 28 6d 61 78 20 25  es:    %d (max %
7ea0: 64 29 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75  d) bytes\n", iCu
7eb0: 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20  r, iHiwtr);.    
7ec0: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
7ed0: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
7ee0: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
7ef0: 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45  ATUS_MALLOC_SIZE
7f00: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
7f10: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 66  , bReset);.    f
7f20: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
7f30: 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63  , "Largest Alloc
7f40: 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20 20 20  ation:          
7f50: 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
7f60: 5c 6e 22 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  \n", iHiwtr);.  
7f70: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
7f80: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
7f90: 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f  3_status(SQLITE_
7fa0: 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
7fb0: 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20 26 69  _SIZE, &iCur, &i
7fc0: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
7fd0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
7fe0: 2d 3e 6f 75 74 2c 20 22 4c 61 72 67 65 73 74 20  ->out, "Largest 
7ff0: 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f  Pcache Allocatio
8000: 6e 3a 20 20 20 20 20 20 20 20 20 20 20 25 64 20  n:           %d 
8010: 62 79 74 65 73 5c 6e 22 2c 20 69 48 69 77 74 72  bytes\n", iHiwtr
8020: 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
8030: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
8040: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51  qlite3_status(SQ
8050: 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41  LITE_STATUS_SCRA
8060: 54 43 48 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c  TCH_SIZE, &iCur,
8070: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
8080: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
8090: 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 61 72 67 65  Arg->out, "Large
80a0: 73 74 20 53 63 72 61 74 63 68 20 41 6c 6c 6f 63  st Scratch Alloc
80b0: 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20 20 20  ation:          
80c0: 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 48 69  %d bytes\n", iHi
80d0: 77 74 72 29 3b 0a 23 69 66 64 65 66 20 59 59 54  wtr);.#ifdef YYT
80e0: 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54  RACKMAXSTACKDEPT
80f0: 48 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  H.    iHiwtr = i
8100: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
8110: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
8120: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45  ITE_STATUS_PARSE
8130: 52 5f 53 54 41 43 4b 2c 20 26 69 43 75 72 2c 20  R_STACK, &iCur, 
8140: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
8150: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41  ;.    fprintf(pA
8160: 72 67 2d 3e 6f 75 74 2c 20 22 44 65 65 70 65 73  rg->out, "Deepes
8170: 74 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a 20  t Parser Stack: 
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
8190: 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 20 69  d (max %d)\n", i
81a0: 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 23 65  Cur, iHiwtr);.#e
81b0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
81c0: 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75  pArg && pArg->ou
81d0: 74 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20 69  t && db ){.    i
81e0: 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c  f( pArg->shellFl
81f0: 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  gs & SHFLG_Looka
8200: 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48  side ){.      iH
8210: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
8220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8230: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
8240: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
8250: 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 20 26 69  OKASIDE_USED, &i
8260: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
8270: 65 73 65 74 29 3b 0a 20 20 20 20 20 20 66 70 72  eset);.      fpr
8280: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
8290: 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73  "Lookaside Slots
82a0: 20 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 20   Used:          
82b0: 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64        %d (max %d
82c0: 29 5c 6e 22 2c 20 69 43 75 72 2c 20 69 48 69 77  )\n", iCur, iHiw
82d0: 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
82e0: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
82f0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
8300: 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 20  _LOOKASIDE_HIT, 
8310: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
8320: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 66  bReset);.      f
8330: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
8340: 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f  , "Successful lo
8350: 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74 73  okaside attempts
8360: 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69  :       %d\n", i
8370: 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
8380: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8390: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
83a0: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
83b0: 53 53 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20  SS_SIZE, &iCur, 
83c0: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
83d0: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
83e0: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b  pArg->out, "Look
83f0: 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64  aside failures d
8400: 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20  ue to size:     
8410: 20 25 64 5c 6e 22 2c 20 69 48 69 77 74 72 29 3b   %d\n", iHiwtr);
8420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
8430: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
8440: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
8450: 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c  KASIDE_MISS_FULL
8460: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
8470: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
8480: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
8490: 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66  ut, "Lookaside f
84a0: 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20 4f  ailures due to O
84b0: 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  OM:       %d\n",
84c0: 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a   iHiwtr);.    }.
84d0: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
84e0: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
84f0: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
8500: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
8510: 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69  S_CACHE_USED, &i
8520: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
8530: 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e  eset);.    fprin
8540: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
8550: 61 67 65 72 20 48 65 61 70 20 55 73 61 67 65 3a  ager Heap Usage:
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
8580: 20 69 43 75 72 29 3b 20 20 20 20 69 48 69 77 74   iCur);    iHiwt
8590: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
85a0: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
85b0: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
85c0: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48  DBSTATUS_CACHE_H
85d0: 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  IT, &iCur, &iHiw
85e0: 74 72 2c 20 31 29 3b 0a 20 20 20 20 66 70 72 69  tr, 1);.    fpri
85f0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
8600: 50 61 67 65 20 63 61 63 68 65 20 68 69 74 73 3a  Page cache hits:
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
8630: 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
8640: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
8650: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
8660: 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
8670: 41 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c  ATUS_CACHE_MISS,
8680: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
8690: 20 31 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   1);.    fprintf
86a0: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
86b0: 65 20 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20  e cache misses: 
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 20    %d\n", iCur); 
86e0: 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
86f0: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
8700: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
8710: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
8720: 55 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c 20  US_CACHE_WRITE, 
8730: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
8740: 31 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  1);.    fprintf(
8750: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
8760: 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20   cache writes:  
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8780: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 20 0a   %d\n", iCur); .
8790: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
87a0: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
87b0: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
87c0: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
87d0: 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26  S_SCHEMA_USED, &
87e0: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
87f0: 52 65 73 65 74 29 3b 0a 20 20 20 20 66 70 72 69  Reset);.    fpri
8800: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
8810: 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67  Schema Heap Usag
8820: 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
8830: 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22       %d bytes\n"
8840: 2c 20 69 43 75 72 29 3b 20 0a 20 20 20 20 69 48  , iCur); .    iH
8850: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
8860: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
8870: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
8880: 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54  TE_DBSTATUS_STMT
8890: 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
88a0: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
88b0: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
88c0: 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e  ->out, "Statemen
88d0: 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65  t Heap/Lookaside
88e0: 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20   Usage:      %d 
88f0: 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72 29 3b  bytes\n", iCur);
8900: 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72   .  }..  if( pAr
8910: 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20 26  g && pArg->out &
8920: 26 20 64 62 20 26 26 20 70 41 72 67 2d 3e 70 53  & db && pArg->pS
8930: 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72 20  tmt ){.    iCur 
8940: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
8950: 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
8960: 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
8970: 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
8980: 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  EP, bReset);.   
8990: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
89a0: 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53 74  ut, "Fullscan St
89b0: 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  eps:            
89c0: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
89d0: 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
89e0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
89f0: 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
8a00: 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
8a10: 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65 73  TATUS_SORT, bRes
8a20: 65 74 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  et);.    fprintf
8a30: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72  (pArg->out, "Sor
8a40: 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20  t Operations:   
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
8a70: 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
8a80: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
8a90: 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
8aa0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
8ab0: 54 4f 49 4e 44 45 58 2c 20 62 52 65 73 65 74 29  TOINDEX, bReset)
8ac0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 41  ;.    fprintf(pA
8ad0: 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69 6e  rg->out, "Autoin
8ae0: 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20 20  dex Inserts:    
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
8b00: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
8b10: 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
8b20: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
8b30: 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
8b40: 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
8b50: 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  EP, bReset);.   
8b60: 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f   fprintf(pArg->o
8b70: 75 74 2c 20 22 56 69 72 74 75 61 6c 20 4d 61 63  ut, "Virtual Mac
8b80: 68 69 6e 65 20 53 74 65 70 73 3a 20 20 20 20 20  hine Steps:     
8b90: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
8ba0: 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 72   iCur);.  }..  r
8bb0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8bc0: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 7a 41 72  * Parameter azAr
8bd0: 72 61 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ray points to a 
8be0: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20  zero-terminated 
8bf0: 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73  array of strings
8c00: 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73  . zStr.** points
8c10: 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c   to a single nul
8c20: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
8c30: 6e 67 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ng. Return non-z
8c40: 65 72 6f 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69  ero if zStr.** i
8c50: 73 20 65 71 75 61 6c 2c 20 61 63 63 6f 72 64 69  s equal, accordi
8c60: 6e 67 20 74 6f 20 73 74 72 63 6d 70 28 29 2c 20  ng to strcmp(), 
8c70: 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 20 73 74  to any of the st
8c80: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 72 72  rings in the arr
8c90: 61 79 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ay..** Otherwise
8ca0: 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a  , return zero..*
8cb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
8cc0: 5f 69 6e 5f 61 72 72 61 79 28 63 6f 6e 73 74 20  _in_array(const 
8cd0: 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73  char *zStr, cons
8ce0: 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 72 61 79  t char **azArray
8cf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
8d00: 72 28 69 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69  r(i=0; azArray[i
8d10: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
8d20: 20 30 3d 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c   0==strcmp(zStr,
8d30: 20 61 7a 41 72 72 61 79 5b 69 5d 29 20 29 20 72   azArray[i]) ) r
8d40: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
8d50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8d60: 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 73 74  * If compiled st
8d70: 61 74 65 6d 65 6e 74 20 70 53 71 6c 20 61 70 70  atement pSql app
8d80: 65 61 72 73 20 74 6f 20 62 65 20 61 6e 20 45 58  ears to be an EX
8d90: 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c  PLAIN statement,
8da0: 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64   allocate.** and
8db0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 53 68   populate the Sh
8dc0: 65 6c 6c 53 74 61 74 65 2e 61 69 49 6e 64 65 6e  ellState.aiInden
8dd0: 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74  t[] array with t
8de0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
8df0: 73 70 61 63 65 73 20 65 61 63 68 20 6f 70 63 6f  spaces each opco
8e00: 64 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64  de should be ind
8e10: 65 6e 74 65 64 20 62 65 66 6f 72 65 20 69 74 20  ented before it 
8e20: 69 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2a 0a 2a  is output. .**.*
8e30: 2a 20 54 68 65 20 69 6e 64 65 6e 74 69 6e 67 20  * The indenting 
8e40: 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  rules are:.**.**
8e50: 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20       * For each 
8e60: 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20  "Next", "Prev", 
8e70: 22 56 4e 65 78 74 22 20 6f 72 20 22 56 50 72 65  "VNext" or "VPre
8e80: 76 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  v" instruction, 
8e90: 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  indent.**       
8ea0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68 61 74  all opcodes that
8eb0: 20 6f 63 63 75 72 20 62 65 74 77 65 65 6e 20 74   occur between t
8ec0: 68 65 20 70 32 20 6a 75 6d 70 20 64 65 73 74 69  he p2 jump desti
8ed0: 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6f  nation and the o
8ee0: 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20 20 69  pcode.**       i
8ef0: 74 73 65 6c 66 20 62 79 20 32 20 73 70 61 63 65  tself by 2 space
8f00: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46  s..**.**     * F
8f10: 6f 72 20 65 61 63 68 20 22 47 6f 74 6f 22 2c 20  or each "Goto", 
8f20: 69 66 20 74 68 65 20 6a 75 6d 70 20 64 65 73 74  if the jump dest
8f30: 69 6e 61 74 69 6f 6e 20 69 73 20 65 61 72 6c 69  ination is earli
8f40: 65 72 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61  er in the progra
8f50: 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 65  m.**       and e
8f60: 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a  nds on one of:.*
8f70: 2a 20 20 20 20 20 20 20 20 20 20 59 69 65 6c 64  *          Yield
8f80: 20 20 53 65 65 6b 47 74 20 20 53 65 65 6b 4c 74    SeekGt  SeekLt
8f90: 20 20 52 6f 77 53 65 74 52 65 61 64 20 20 52 65    RowSetRead  Re
8fa0: 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20 6f 72  wind.**       or
8fb0: 20 69 66 20 74 68 65 20 50 31 20 70 61 72 61 6d   if the P1 param
8fc0: 65 74 65 72 20 69 73 20 6f 6e 65 20 69 6e 73 74  eter is one inst
8fd0: 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20  ead of zero,.** 
8fe0: 20 20 20 20 20 20 74 68 65 6e 20 69 6e 64 65 6e        then inden
8ff0: 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 62 65  t all opcodes be
9000: 74 77 65 65 6e 20 74 68 65 20 65 61 72 6c 69 65  tween the earlie
9010: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  r instruction.**
9020: 20 20 20 20 20 20 20 61 6e 64 20 22 47 6f 74 6f         and "Goto
9030: 22 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a  " by 2 spaces..*
9040: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
9050: 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61  plain_data_prepa
9060: 72 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  re(ShellState *p
9070: 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  , sqlite3_stmt *
9080: 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74 20 63  pSql){.  const c
9090: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
90a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
90b0: 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
90c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
90d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20 20 20  onst char *z;   
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
90f0: 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63 6b 20  * Used to check 
9100: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  if this is an EX
9110: 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a  PLAIN */.  int *
9120: 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20 20 20  abYield = 0;    
9130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9140: 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e 20 4f  ue if op is an O
9150: 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  P_Yield */.  int
9160: 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20   nAlloc = 0;    
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9180: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
9190: 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c  f p->aiIndent[],
91a0: 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e   abYield */.  in
91b0: 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20 20 20  t iOp;          
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91d0: 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72 61 74   Index of operat
91e0: 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e 64 65  ion in p->aiInde
91f0: 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74  nt[] */..  const
9200: 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b 5d 20   char *azNext[] 
9210: 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50 72 65  = { "Next", "Pre
9220: 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22 56 4e  v", "VPrev", "VN
9230: 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e 65 78  ext", "SorterNex
9240: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
9260: 4e 65 78 74 49 66 4f 70 65 6e 22 2c 20 22 50 72  NextIfOpen", "Pr
9270: 65 76 49 66 4f 70 65 6e 22 2c 20 30 20 7d 3b 0a  evIfOpen", 0 };.
9280: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
9290: 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65  Yield[] = { "Yie
92a0: 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22  ld", "SeekLT", "
92b0: 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53 65 74  SeekGT", "RowSet
92c0: 52 65 61 64 22 2c 20 22 52 65 77 69 6e 64 22 2c  Read", "Rewind",
92d0: 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68   0 };.  const ch
92e0: 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b  ar *azGoto[] = {
92f0: 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20   "Goto", 0 };.. 
9300: 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72   /* Try to figur
9310: 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69 73  e out if this is
9320: 20 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41   really an EXPLA
9330: 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66  IN statement. If
9340: 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f   this.  ** canno
9350: 74 20 62 65 20 76 65 72 69 66 69 65 64 2c 20 72  t be verified, r
9360: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f  eturn early.  */
9370: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
9380: 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69  3_sql(pSql);.  i
9390: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
93a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71  urn;.  for(z=zSq
93b0: 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a  l; *z==' ' || *z
93c0: 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\t' || *z=='\
93d0: 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c  n' || *z=='\f' |
93e0: 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29  | *z=='\r'; z++)
93f0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
9400: 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70  strnicmp(z, "exp
9410: 6c 61 69 6e 22 2c 20 37 29 20 29 20 72 65 74 75  lain", 7) ) retu
9420: 72 6e 3b 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30  rn;..  for(iOp=0
9430: 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ; SQLITE_ROW==sq
9440: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29  lite3_step(pSql)
9450: 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ; iOp++){.    in
9460: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64  t i;.    int iAd
9470: 64 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  dr = sqlite3_col
9480: 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29  umn_int(pSql, 0)
9490: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
94a0: 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63   *zOp = (const c
94b0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
94c0: 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31  umn_text(pSql, 1
94d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70  );..    /* Set p
94e0: 32 20 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c  2 to the P2 fiel
94f0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
9500: 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61   opcode. Then, a
9510: 73 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20  ssuming that.   
9520: 20 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73   ** p2 is an ins
9530: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73  truction address
9540: 2c 20 73 65 74 20 76 61 72 69 61 62 6c 65 20 70  , set variable p
9550: 32 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78  2op to the index
9560: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   of that.    ** 
9570: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  instruction in t
9580: 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72  he aiIndent[] ar
9590: 72 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70  ray. p2 and p2op
95a0: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
95b0: 74 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  t if.    ** the 
95c0: 63 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74  current instruct
95d0: 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
95e0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e   sub-program gen
95f0: 65 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20  erated by an.   
9600: 20 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20   ** SQL trigger 
9610: 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  or foreign key. 
9620: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d   */.    int p2 =
9630: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9640: 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20  int(pSql, 3);.  
9650: 20 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32    int p2op = (p2
9660: 20 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b   + (iOp-iAddr));
9670: 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68  ..    /* Grow th
9680: 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72  e p->aiIndent ar
9690: 72 61 79 20 61 73 20 72 65 71 75 69 72 65 64 20  ray as required 
96a0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d  */.    if( iOp>=
96b0: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
96c0: 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20  nAlloc += 100;. 
96d0: 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74       p->aiIndent
96e0: 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
96f0: 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 61 69 49 6e  _realloc(p->aiIn
9700: 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  dent, nAlloc*siz
9710: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  eof(int));.     
9720: 20 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a   abYield = (int*
9730: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
9740: 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63  (abYield, nAlloc
9750: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
9760: 20 20 20 7d 0a 20 20 20 20 61 62 59 69 65 6c 64     }.    abYield
9770: 5b 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61  [iOp] = str_in_a
9780: 72 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c  rray(zOp, azYiel
9790: 64 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64  d);.    p->aiInd
97a0: 65 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20  ent[iOp] = 0;.  
97b0: 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69    p->nIndent = i
97c0: 4f 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 73  Op+1;..    if( s
97d0: 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c  tr_in_array(zOp,
97e0: 20 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20 20   azNext) ){.    
97f0: 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c    for(i=p2op; i<
9800: 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49  iOp; i++) p->aiI
9810: 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20  ndent[i] += 2;. 
9820: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
9830: 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
9840: 7a 47 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c 70  zGoto) && p2op<p
9850: 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20 26  ->nIndent.     &
9860: 26 20 28 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d  & (abYield[p2op]
9870: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   || sqlite3_colu
9880: 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29 29  mn_int(pSql, 2))
9890: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f  .    ){.      fo
98a0: 72 28 69 3d 70 32 6f 70 2b 31 3b 20 69 3c 69 4f  r(i=p2op+1; i<iO
98b0: 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64  p; i++) p->aiInd
98c0: 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20  ent[i] += 2;.   
98d0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e   }.  }..  p->iIn
98e0: 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  dent = 0;.  sqli
98f0: 74 65 33 5f 66 72 65 65 28 61 62 59 69 65 6c 64  te3_free(abYield
9900: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
9910: 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  et(pSql);.}../*.
9920: 2a 2a 20 46 72 65 65 20 74 68 65 20 61 72 72 61  ** Free the arra
9930: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 65  y allocated by e
9940: 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70  xplain_data_prep
9950: 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  are()..*/.static
9960: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61   void explain_da
9970: 74 61 5f 64 65 6c 65 74 65 28 53 68 65 6c 6c 53  ta_delete(ShellS
9980: 74 61 74 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  tate *p){.  sqli
9990: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e  te3_free(p->aiIn
99a0: 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e  dent);.  p->aiIn
99b0: 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  dent = 0;.  p->n
99c0: 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  Indent = 0;.  p-
99d0: 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a  >iIndent = 0;.}.
99e0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
99f0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 65   statement or se
9a00: 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 2e  t of statements.
9a10: 20 20 50 72 69 6e 74 20 0a 2a 2a 20 61 6e 79 20    Print .** any 
9a20: 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75  result rows/colu
9a30: 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  mns depending on
9a40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64   the current mod
9a50: 65 20 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68  e .** set via th
9a60: 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
9a70: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
9a80: 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20  is very similar 
9a90: 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c  to SQLite's buil
9aa0: 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65  t-in sqlite3_exe
9ab0: 63 28 29 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  c() .** function
9ac0: 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73   except it takes
9ad0: 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66   a slightly diff
9ae0: 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 0a  erent callback .
9af0: 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20  ** and callback 
9b00: 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  data argument..*
9b10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
9b20: 6c 6c 5f 65 78 65 63 28 0a 20 20 73 71 6c 69 74  ll_exec(.  sqlit
9b30: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
9b60: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
9b70: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
9ba0: 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a  o be evaluated *
9bb0: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
9bc0: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
9bd0: 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74  har**,char**,int
9be0: 2a 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  *),   /* Callbac
9bf0: 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f            /* (no
9c30: 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  t the same as sq
9c40: 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20  lite3_exec) */. 
9c50: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
9c60: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
9c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9c80: 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
9c90: 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
9ca0: 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
9cd0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
9ce0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
9cf0: 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  t *pStmt = NULL;
9d00: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
9d10: 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f  t to execute. */
9d20: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9d30: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
9d40: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
9d50: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a  e */.  int rc2;.
9d60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
9d70: 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20  eftover;        
9d80: 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70    /* Tail of unp
9d90: 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a  rocessed SQL */.
9da0: 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  .  if( pzErrMsg 
9db0: 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
9dc0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20   = NULL;.  }..  
9dd0: 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26  while( zSql[0] &
9de0: 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20  & (SQLITE_OK == 
9df0: 72 63 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rc) ){.    rc = 
9e00: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
9e10: 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
9e20: 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f   &pStmt, &zLefto
9e30: 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ver);.    if( SQ
9e40: 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b  LITE_OK != rc ){
9e50: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45 72 72  .      if( pzErr
9e60: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
9e70: 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
9e80: 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
9e90: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9ea0: 20 20 20 20 20 20 69 66 28 20 21 70 53 74 6d 74        if( !pStmt
9eb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74   ){.        /* t
9ec0: 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20  his happens for 
9ed0: 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69  a comment or whi
9ee0: 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  te-space */.    
9ef0: 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
9f00: 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68  over;.        wh
9f10: 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 71  ile( IsSpace(zSq
9f20: 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a  l[0]) ) zSql++;.
9f30: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9f40: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
9f50: 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65   /* save off the
9f60: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 6d 65   prepared statme
9f70: 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65  nt handle and re
9f80: 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f  set row count */
9f90: 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
9fa0: 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d  ){.        pArg-
9fb0: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
9fc0: 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e          pArg->cn
9fd0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  t = 0;.      }..
9fe0: 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68        /* echo th
9ff0: 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
a000: 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20  if echo on */.  
a010: 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
a020: 70 41 72 67 2d 3e 65 63 68 6f 4f 6e 20 29 7b 0a  pArg->echoOn ){.
a030: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a040: 61 72 20 2a 7a 53 74 6d 74 53 71 6c 20 3d 20 73  ar *zStmtSql = s
a050: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
a060: 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
a070: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25  tf(pArg->out, "%
a080: 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f  s\n", zStmtSql ?
a090: 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c   zStmtSql : zSql
a0a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
a0b0: 20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45 58    /* Show the EX
a0c0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
a0d0: 20 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a   if .eqp is on *
a0e0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
a0f0: 20 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45 51   && pArg->autoEQ
a100: 50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  P ){.        sql
a110: 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c  ite3_stmt *pExpl
a120: 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ain;.        cha
a130: 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65  r *zEQP = sqlite
a140: 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
a150: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73  IN QUERY PLAN %s
a160: 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
a170: 53 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 20 20  Stmt));.        
a180: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
a190: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
a1a0: 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
a1b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
a1c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a1d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
a1e0: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
a1f0: 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54  pExplain)==SQLIT
a200: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
a210: 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72       fprintf(pAr
a220: 67 2d 3e 6f 75 74 2c 22 2d 2d 45 51 50 2d 2d 20  g->out,"--EQP-- 
a230: 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  %d,", sqlite3_co
a240: 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
a250: 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20  n, 0));.        
a260: 20 20 20 20 66 70 72 69 6e 74 66 28 70 41 72 67      fprintf(pArg
a270: 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c  ->out,"%d,", sql
a280: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
a290: 70 45 78 70 6c 61 69 6e 2c 20 31 29 29 3b 0a 20  pExplain, 1));. 
a2a0: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
a2b0: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64  tf(pArg->out,"%d
a2c0: 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,", sqlite3_colu
a2d0: 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
a2e0: 20 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   2));.          
a2f0: 20 20 66 70 72 69 6e 74 66 28 70 41 72 67 2d 3e    fprintf(pArg->
a300: 6f 75 74 2c 22 25 73 5c 6e 22 2c 20 73 71 6c 69  out,"%s\n", sqli
a310: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
a320: 70 45 78 70 6c 61 69 6e 2c 20 33 29 29 3b 0a 20  pExplain, 3));. 
a330: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a340: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
a350: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
a360: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20  xplain);.       
a370: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
a380: 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  QP);.      }..  
a390: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68      /* If the sh
a3a0: 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ell is currently
a3b0: 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d   in ".explain" m
a3c0: 6f 64 65 2c 20 67 61 74 68 65 72 20 74 68 65 20  ode, gather the 
a3d0: 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 64  extra.      ** d
a3e0: 61 74 61 20 72 65 71 75 69 72 65 64 20 74 6f 20  ata required to 
a3f0: 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f 20 74  add indents to t
a400: 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20 20  he output.*/.   
a410: 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
a420: 41 72 67 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  Arg->mode==MODE_
a430: 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
a440: 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
a450: 70 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 53  prepare(pArg, pS
a460: 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  tmt);.      }.. 
a470: 20 20 20 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20       /* perform 
a480: 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20  the first step. 
a490: 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20   this will tell 
a4a0: 75 73 20 69 66 20 77 65 0a 20 20 20 20 20 20 2a  us if we.      *
a4b0: 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c 74 20  * have a result 
a4c0: 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20 68  set or not and h
a4d0: 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e 0a 20  ow wide it is.. 
a4e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
a4f0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
a500: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 2f 2a  pStmt);.      /*
a510: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65   if we have a re
a520: 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20  sult set... */. 
a530: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
a540: 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20  ROW == rc ){.   
a550: 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68 61       /* if we ha
a560: 76 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e  ve a callback...
a570: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
a580: 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  xCallback ){.   
a590: 20 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61         /* alloca
a5a0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c  te space for col
a5b0: 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65   name ptr, value
a5c0: 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a   ptr, and type *
a5d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
a5e0: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
a5f0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
a600: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 76 6f  t);.          vo
a610: 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69  id *pData = sqli
a620: 74 65 33 5f 6d 61 6c 6c 6f 63 28 33 2a 6e 43 6f  te3_malloc(3*nCo
a630: 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63  l*sizeof(const c
a640: 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20  har*) + 1);.    
a650: 20 20 20 20 20 20 69 66 28 20 21 70 44 61 74 61        if( !pData
a660: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a670: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
a680: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  M;.          }el
a690: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
a6a0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20  char **azCols = 
a6b0: 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b 20  (char **)pData; 
a6c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66       /* Names of
a6d0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
a6e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
a6f0: 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26  har **azVals = &
a700: 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20  azCols[nCol];   
a710: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a      /* Results *
a720: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
a730: 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e  t *aiTypes = (in
a740: 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c  t *)&azVals[nCol
a750: 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70  ]; /* Result typ
a760: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
a770: 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20    int i, x;.    
a780: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 73          assert(s
a790: 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69  izeof(int) <= si
a7a0: 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 20 0a  zeof(char *)); .
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
a7c0: 61 76 65 20 6f 66 66 20 70 74 72 73 20 74 6f 20  ave off ptrs to 
a7d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
a7f0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
a800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a810: 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68   azCols[i] = (ch
a820: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
a830: 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  umn_name(pStmt, 
a840: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
a850: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f  }.            do
a860: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a870: 2f 2a 20 65 78 74 72 61 63 74 20 74 68 65 20 64  /* extract the d
a880: 61 74 61 20 61 6e 64 20 64 61 74 61 20 74 79 70  ata and data typ
a890: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
a8a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a8b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
a8c0: 20 20 20 20 20 20 20 20 20 20 20 61 69 54 79 70             aiTyp
a8d0: 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69  es[i] = x = sqli
a8e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
a8f0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
a900: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78             if( x
a910: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26  ==SQLITE_BLOB &&
a920: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6d   pArg && pArg->m
a930: 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74  ode==MODE_Insert
a940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a950: 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
a960: 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
a970: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
a990: 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72  zVals[i] = (char
a9a0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
a9b0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b  _text(pStmt, i);
a9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a9d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
a9e0: 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69     if( !azVals[i
a9f0: 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d  ] && (aiTypes[i]
aa00: 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  !=SQLITE_NULL) )
aa10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
aa20: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
aa30: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
aa40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20           break; 
aa50: 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20  /* from for */. 
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
aa70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
aa80: 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aaa0: 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79 70   if data and typ
aab0: 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75 63  es extracted suc
aac0: 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a  cessfully... */.
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
aae0: 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20  ( SQLITE_ROW == 
aaf0: 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  rc ){ .         
ab00: 20 20 20 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74         /* call t
ab10: 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c  he supplied call
ab20: 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 72 65  back with the re
ab30: 73 75 6c 74 20 72 6f 77 20 64 61 74 61 20 2a 2f  sult row data */
ab40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ab50: 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 28 70   if( xCallback(p
ab60: 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c  Arg, nCol, azVal
ab70: 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79 70  s, azCols, aiTyp
ab80: 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  es) ){.         
ab90: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
aba0: 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20  LITE_ABORT;.    
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
abc0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
abd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
abe0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
ac00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
ac10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 77  .            } w
ac20: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
ac30: 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20   == rc );.      
ac40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ac50: 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20  ee(pData);.     
ac60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ac70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ac80: 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  do{.            
ac90: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
aca0: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
acb0: 20 20 20 20 7d 20 77 68 69 6c 65 28 20 72 63 20      } while( rc 
acc0: 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b  == SQLITE_ROW );
acd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ace0: 20 7d 0a 0a 20 20 20 20 20 20 65 78 70 6c 61 69   }..      explai
acf0: 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
ad00: 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70  rg);..      /* p
ad10: 72 69 6e 74 20 75 73 61 67 65 20 73 74 61 74 73  rint usage stats
ad20: 20 69 66 20 73 74 61 74 73 20 6f 6e 20 2a 2f 0a   if stats on */.
ad30: 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
ad40: 26 20 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20  & pArg->statsOn 
ad50: 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70 6c  ){.        displ
ad60: 61 79 5f 73 74 61 74 73 28 64 62 2c 20 70 41 72  ay_stats(db, pAr
ad70: 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  g, 0);.      }..
ad80: 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a        /* Finaliz
ad90: 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
ada0: 6a 75 73 74 20 65 78 65 63 75 74 65 64 2e 20 49  just executed. I
adb0: 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 73 61  f this fails, sa
adc0: 76 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  ve a .      ** c
add0: 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72  opy of the error
ade0: 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65 72 77   message. Otherw
adf0: 69 73 65 2c 20 73 65 74 20 7a 53 71 6c 20 74 6f  ise, set zSql to
ae00: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20   point to the.  
ae10: 20 20 20 20 2a 2a 20 6e 65 78 74 20 73 74 61 74      ** next stat
ae20: 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
ae30: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d  . */.      rc2 =
ae40: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
ae50: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
ae60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e  if( rc!=SQLITE_N
ae70: 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72 63 32 3b  OMEM ) rc = rc2;
ae80: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
ae90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
aea0: 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
aeb0: 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68  over;.        wh
aec0: 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 71  ile( IsSpace(zSq
aed0: 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a  l[0]) ) zSql++;.
aee0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
aef0: 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
af00: 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
af10: 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29  save_err_msg(db)
af20: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
af30: 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65 64 20   /* clear saved 
af40: 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  stmt handle */. 
af50: 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b       if( pArg ){
af60: 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70  .        pArg->p
af70: 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Stmt = NULL;.   
af80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f     }.    }.  } /
af90: 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 0a  * end while */..
afa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
afb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
afc0: 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62   different callb
afd0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ack routine used
afe0: 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65   for dumping the
aff0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61   database..** Ea
b000: 63 68 20 72 6f 77 20 72 65 63 65 69 76 65 64 20  ch row received 
b010: 62 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b  by this callback
b020: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74   consists of a t
b030: 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68  able name,.** th
b040: 65 20 74 61 62 6c 65 20 74 79 70 65 20 28 22 69  e table type ("i
b050: 6e 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22  ndex" or "table"
b060: 29 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65  ) and SQL to cre
b070: 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ate the table..*
b080: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
b090: 68 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74  hould print text
b0a0: 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72   sufficient to r
b0b0: 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c  ecreate the tabl
b0c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b0d0: 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76   dump_callback(v
b0e0: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e  oid *pArg, int n
b0f0: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72  Arg, char **azAr
b100: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29  g, char **azCol)
b110: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  {.  int rc;.  co
b120: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
b130: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b140: 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zType;.  const c
b150: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e  har *zSql;.  con
b160: 73 74 20 63 68 61 72 20 2a 7a 50 72 65 70 53 74  st char *zPrepSt
b170: 6d 74 20 3d 20 30 3b 0a 20 20 53 68 65 6c 6c 53  mt = 0;.  ShellS
b180: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
b190: 53 74 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20  State *)pArg;.. 
b1a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
b1b0: 52 28 61 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20  R(azCol);.  if( 
b1c0: 6e 41 72 67 21 3d 33 20 29 20 72 65 74 75 72 6e  nArg!=3 ) return
b1d0: 20 31 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61   1;.  zTable = a
b1e0: 7a 41 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65  zArg[0];.  zType
b1f0: 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a   = azArg[1];.  z
b200: 53 71 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  Sql = azArg[2];.
b210: 20 20 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28    .  if( strcmp(
b220: 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
b230: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
b240: 0a 20 20 20 20 7a 50 72 65 70 53 74 6d 74 20 3d  .    zPrepStmt =
b250: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71   "DELETE FROM sq
b260: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e  lite_sequence;\n
b270: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  ";.  }else if( s
b280: 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
b290: 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20 7a  sqlite_stat?", z
b2a0: 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Table)==0 ){.   
b2b0: 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
b2c0: 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
b2d0: 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
b2e0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
b2f0: 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74  p(zTable, "sqlit
b300: 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  e_", 7)==0 ){.  
b310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
b320: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
b330: 7a 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49  zSql, "CREATE VI
b340: 52 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30  RTUAL TABLE", 20
b350: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
b360: 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20   *zIns;.    if( 
b370: 21 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65  !p->writableSche
b380: 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  ma ){.      fpri
b390: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41  ntf(p->out, "PRA
b3a0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
b3b0: 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20  ema=ON;\n");.   
b3c0: 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63     p->writableSc
b3d0: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  hema = 1;.    }.
b3e0: 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c 69 74      zIns = sqlit
b3f0: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
b400: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
b410: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28 74 79  sqlite_master(ty
b420: 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
b430: 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29 22 0a  ,rootpage,sql)".
b440: 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 27         "VALUES('
b450: 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25 71 27  table','%q','%q'
b460: 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20 20 20  ,0,'%q');",.    
b470: 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61 62 6c     zTable, zTabl
b480: 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 66 70  e, zSql);.    fp
b490: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
b4a0: 73 5c 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20  s\n", zIns);.   
b4b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
b4c0: 6e 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ns);.    return 
b4d0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
b4e0: 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
b4f0: 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  "%s;\n", zSql);.
b500: 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63 6d    }..  if( strcm
b510: 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22  p(zType, "table"
b520: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b530: 74 65 33 5f 73 74 6d 74 20 2a 70 54 61 62 6c 65  te3_stmt *pTable
b540: 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 63 68  Info = 0;.    ch
b550: 61 72 20 2a 7a 53 65 6c 65 63 74 20 3d 20 30 3b  ar *zSelect = 0;
b560: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
b570: 65 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 63  eInfo = 0;.    c
b580: 68 61 72 20 2a 7a 54 6d 70 20 3d 20 30 3b 0a 20  har *zTmp = 0;. 
b590: 20 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b     int nRow = 0;
b5a0: 0a 20 20 20 0a 20 20 20 20 7a 54 61 62 6c 65 49  .   .    zTableI
b5b0: 6e 66 6f 20 3d 20 61 70 70 65 6e 64 54 65 78 74  nfo = appendText
b5c0: 28 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 22 50 52  (zTableInfo, "PR
b5d0: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
b5e0: 22 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c  ", 0);.    zTabl
b5f0: 65 49 6e 66 6f 20 3d 20 61 70 70 65 6e 64 54 65  eInfo = appendTe
b600: 78 74 28 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 7a  xt(zTableInfo, z
b610: 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a 20 20 20  Table, '"');.   
b620: 20 7a 54 61 62 6c 65 49 6e 66 6f 20 3d 20 61 70   zTableInfo = ap
b630: 70 65 6e 64 54 65 78 74 28 7a 54 61 62 6c 65 49  pendText(zTableI
b640: 6e 66 6f 2c 20 22 29 3b 22 2c 20 30 29 3b 0a 0a  nfo, ");", 0);..
b650: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b660: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
b670: 62 2c 20 7a 54 61 62 6c 65 49 6e 66 6f 2c 20 2d  b, zTableInfo, -
b680: 31 2c 20 26 70 54 61 62 6c 65 49 6e 66 6f 2c 20  1, &pTableInfo, 
b690: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 61  0);.    free(zTa
b6a0: 62 6c 65 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  bleInfo);.    if
b6b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b6c0: 7c 7c 20 21 70 54 61 62 6c 65 49 6e 66 6f 20 29  || !pTableInfo )
b6d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
b6e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 65  ;.    }..    zSe
b6f0: 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78  lect = appendTex
b700: 74 28 7a 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  t(zSelect, "SELE
b710: 43 54 20 27 49 4e 53 45 52 54 20 49 4e 54 4f 20  CT 'INSERT INTO 
b720: 27 20 7c 7c 20 22 2c 20 30 29 3b 0a 20 20 20 20  ' || ", 0);.    
b730: 2f 2a 20 41 6c 77 61 79 73 20 71 75 6f 74 65 20  /* Always quote 
b740: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20  the table name, 
b750: 65 76 65 6e 20 69 66 20 69 74 20 61 70 70 65 61  even if it appea
b760: 72 73 20 74 6f 20 62 65 20 70 75 72 65 20 61 73  rs to be pure as
b770: 63 69 69 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63  cii,.    ** in c
b780: 61 73 65 20 69 74 20 69 73 20 61 20 6b 65 79 77  ase it is a keyw
b790: 6f 72 64 2e 20 45 78 3a 20 20 49 4e 53 45 52 54  ord. Ex:  INSERT
b7a0: 20 49 4e 54 4f 20 22 74 61 62 6c 65 22 20 2e 2e   INTO "table" ..
b7b0: 2e 20 2a 2f 0a 20 20 20 20 7a 54 6d 70 20 3d 20  . */.    zTmp = 
b7c0: 61 70 70 65 6e 64 54 65 78 74 28 7a 54 6d 70 2c  appendText(zTmp,
b7d0: 20 7a 54 61 62 6c 65 2c 20 27 22 27 29 3b 0a 20   zTable, '"');. 
b7e0: 20 20 20 69 66 28 20 7a 54 6d 70 20 29 7b 0a 20     if( zTmp ){. 
b7f0: 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20 61       zSelect = a
b800: 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65 63  ppendText(zSelec
b810: 74 2c 20 7a 54 6d 70 2c 20 27 5c 27 27 29 3b 0a  t, zTmp, '\'');.
b820: 20 20 20 20 20 20 66 72 65 65 28 7a 54 6d 70 29        free(zTmp)
b830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 65 6c  ;.    }.    zSel
b840: 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74  ect = appendText
b850: 28 7a 53 65 6c 65 63 74 2c 20 22 20 7c 7c 20 27  (zSelect, " || '
b860: 20 56 41 4c 55 45 53 28 27 20 7c 7c 20 22 2c 20   VALUES(' || ", 
b870: 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
b880: 69 74 65 33 5f 73 74 65 70 28 70 54 61 62 6c 65  ite3_step(pTable
b890: 49 6e 66 6f 29 3b 0a 20 20 20 20 77 68 69 6c 65  Info);.    while
b8a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
b8b0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
b8c0: 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63  char *zText = (c
b8d0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
b8e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
b8f0: 70 54 61 62 6c 65 49 6e 66 6f 2c 20 31 29 3b 0a  pTableInfo, 1);.
b900: 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20        zSelect = 
b910: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
b920: 63 74 2c 20 22 71 75 6f 74 65 28 22 2c 20 30 29  ct, "quote(", 0)
b930: 3b 0a 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20  ;.      zSelect 
b940: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65  = appendText(zSe
b950: 6c 65 63 74 2c 20 7a 54 65 78 74 2c 20 27 22 27  lect, zText, '"'
b960: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
b970: 6c 69 74 65 33 5f 73 74 65 70 28 70 54 61 62 6c  lite3_step(pTabl
b980: 65 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  eInfo);.      if
b990: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
b9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 6c   ){.        zSel
b9b0: 65 63 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74  ect = appendText
b9c0: 28 7a 53 65 6c 65 63 74 2c 20 22 29 2c 20 22 2c  (zSelect, "), ",
b9d0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
b9e0: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 6c 65 63  {.        zSelec
b9f0: 74 20 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a  t = appendText(z
ba00: 53 65 6c 65 63 74 2c 20 22 29 20 22 2c 20 30 29  Select, ") ", 0)
ba10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ba20: 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRow++;.    }.  
ba30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
ba40: 69 6e 61 6c 69 7a 65 28 70 54 61 62 6c 65 49 6e  inalize(pTableIn
ba50: 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fo);.    if( rc!
ba60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 52  =SQLITE_OK || nR
ba70: 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ow==0 ){.      f
ba80: 72 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a 20 20  ree(zSelect);.  
ba90: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
baa0: 20 20 7d 0a 20 20 20 20 7a 53 65 6c 65 63 74 20    }.    zSelect 
bab0: 3d 20 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65  = appendText(zSe
bac0: 6c 65 63 74 2c 20 22 7c 7c 20 27 29 27 20 46 52  lect, "|| ')' FR
bad0: 4f 4d 20 20 22 2c 20 30 29 3b 0a 20 20 20 20 7a  OM  ", 0);.    z
bae0: 53 65 6c 65 63 74 20 3d 20 61 70 70 65 6e 64 54  Select = appendT
baf0: 65 78 74 28 7a 53 65 6c 65 63 74 2c 20 7a 54 61  ext(zSelect, zTa
bb00: 62 6c 65 2c 20 27 22 27 29 3b 0a 0a 20 20 20 20  ble, '"');..    
bb10: 72 63 20 3d 20 72 75 6e 5f 74 61 62 6c 65 5f 64  rc = run_table_d
bb20: 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 7a 53 65  ump_query(p, zSe
bb30: 6c 65 63 74 2c 20 7a 50 72 65 70 53 74 6d 74 29  lect, zPrepStmt)
bb40: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
bb50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a  LITE_CORRUPT ){.
bb60: 20 20 20 20 20 20 7a 53 65 6c 65 63 74 20 3d 20        zSelect = 
bb70: 61 70 70 65 6e 64 54 65 78 74 28 7a 53 65 6c 65  appendText(zSele
bb80: 63 74 2c 20 22 20 4f 52 44 45 52 20 42 59 20 72  ct, " ORDER BY r
bb90: 6f 77 69 64 20 44 45 53 43 22 2c 20 30 29 3b 0a  owid DESC", 0);.
bba0: 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f        run_table_
bbb0: 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 7a 53  dump_query(p, zS
bbc0: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 7d  elect, 0);.    }
bbd0: 0a 20 20 20 20 66 72 65 65 28 7a 53 65 6c 65 63  .    free(zSelec
bbe0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
bbf0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
bc00: 20 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64 75   zQuery.  Use du
bc10: 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 73  mp_callback() as
bc20: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
bc30: 75 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a  utine so that.**
bc40: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
bc50: 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20 6f   the query are o
bc60: 75 74 70 75 74 20 61 73 20 53 51 4c 20 73 74 61  utput as SQL sta
bc70: 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  tements..**.** I
bc80: 66 20 77 65 20 67 65 74 20 61 20 53 51 4c 49 54  f we get a SQLIT
bc90: 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c  E_CORRUPT error,
bca0: 20 72 65 72 75 6e 20 74 68 65 20 71 75 65 72 79   rerun the query
bcb0: 20 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67   after appending
bcc0: 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f  .** "ORDER BY ro
bcd0: 77 69 64 20 44 45 53 43 22 20 74 6f 20 74 68 65  wid DESC" to the
bce0: 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   end..*/.static 
bcf0: 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64  int run_schema_d
bd00: 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65  ump_query(.  She
bd10: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 0a 20 20 63  llState *p, .  c
bd20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72  onst char *zQuer
bd30: 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  y.){.  int rc;. 
bd40: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
bd50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
bd60: 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65  exec(p->db, zQue
bd70: 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  ry, dump_callbac
bd80: 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20  k, p, &zErr);.  
bd90: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
bda0: 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68  ORRUPT ){.    ch
bdb0: 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74  ar *zQ2;.    int
bdc0: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28   len = strlen30(
bdd0: 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 66 70 72  zQuery);.    fpr
bde0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
bdf0: 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e  ***** CORRUPTION
be00: 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c   ERROR *******/\
be10: 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  n");.    if( zEr
be20: 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  r ){.      fprin
be30: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
be40: 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e  *** %s ******/\n
be50: 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ", zErr);.      
be60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
be70: 72 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d  r);.      zErr =
be80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51   0;.    }.    zQ
be90: 32 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b  2 = malloc( len+
bea0: 31 30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  100 );.    if( z
beb0: 51 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  Q2==0 ) return r
bec0: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  c;.    sqlite3_s
bed0: 6e 70 72 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c  nprintf(len+100,
bee0: 20 7a 51 32 2c 20 22 25 73 20 4f 52 44 45 52 20   zQ2, "%s ORDER 
bef0: 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
bf00: 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72 63 20  zQuery);.    rc 
bf10: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
bf20: 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f  ->db, zQ2, dump_
bf30: 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45  callback, p, &zE
bf40: 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rr);.    if( rc 
bf50: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
bf60: 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
bf70: 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a  * ERROR: %s ****
bf80: 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
bf90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bfa0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
bfb0: 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UPT;.    }.    s
bfc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
bfd0: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
bfe0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
bff0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
c000: 20 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61   of a help messa
c010: 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ge.*/.static cha
c020: 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 20 20 22 2e  r zHelp[] =.  ".
c030: 62 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45  backup ?DB? FILE
c040: 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20        Backup DB 
c050: 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c  (default \"main\
c060: 22 29 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20  ") to FILE\n".  
c070: 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20  ".bail on|off   
c080: 20 20 20 20 20 20 20 20 53 74 6f 70 20 61 66 74          Stop aft
c090: 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72  er hitting an er
c0a0: 72 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46  ror.  Default OF
c0b0: 46 5c 6e 22 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e  F\n".  ".clone N
c0c0: 45 57 44 42 20 20 20 20 20 20 20 20 20 20 20 43  EWDB           C
c0d0: 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e  lone data into N
c0e0: 45 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78  EWDB from the ex
c0f0: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 5c  isting database\
c100: 6e 22 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73  n".  ".databases
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
c120: 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65  t names and file
c130: 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  s of attached da
c140: 74 61 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64  tabases\n".  ".d
c150: 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
c160: 20 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61       Dump the da
c170: 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c  tabase in an SQL
c180: 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a   text format\n".
c190: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
c1b0: 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20  ABLE specified, 
c1c0: 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73  only dump tables
c1d0: 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22   matching\n".  "
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61           LIKE pa
c200: 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a  ttern TABLE.\n".
c210: 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20    ".echo on|off 
c220: 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63            Turn c
c230: 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f  ommand echo on o
c240: 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70  r off\n".  ".eqp
c250: 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
c260: 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73     Enable or dis
c270: 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45  able automatic E
c280: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
c290: 4e 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20  N\n".  ".exit   
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
c2b0: 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
c2c0: 5c 6e 22 0a 20 20 22 2e 65 78 70 6c 61 69 6e 20  \n".  ".explain 
c2d0: 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 54 75  ?on|off?      Tu
c2e0: 72 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73  rn output mode s
c2f0: 75 69 74 61 62 6c 65 20 66 6f 72 20 45 58 50 4c  uitable for EXPL
c300: 41 49 4e 20 6f 6e 20 6f 72 20 6f 66 66 2e 5c 6e  AIN on or off.\n
c310: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 69                Wi
c330: 74 68 20 6e 6f 20 61 72 67 73 2c 20 69 74 20 74  th no args, it t
c340: 75 72 6e 73 20 45 58 50 4c 41 49 4e 20 6f 6e 2e  urns EXPLAIN on.
c350: 5c 6e 22 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65  \n".  ".fullsche
c360: 6d 61 20 20 20 20 20 20 20 20 20 20 20 20 53 68  ma            Sh
c370: 6f 77 20 73 63 68 65 6d 61 20 61 6e 64 20 74 68  ow schema and th
c380: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c  e content of sql
c390: 69 74 65 5f 73 74 61 74 20 74 61 62 6c 65 73 5c  ite_stat tables\
c3a0: 6e 22 0a 20 20 22 2e 68 65 61 64 65 72 73 20 6f  n".  ".headers o
c3b0: 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54 75 72  n|off        Tur
c3c0: 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 68 65 61  n display of hea
c3d0: 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e  ders on or off\n
c3e0: 22 0a 20 20 22 2e 68 65 6c 70 20 20 20 20 20 20  ".  ".help      
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
c400: 20 74 68 69 73 20 6d 65 73 73 61 67 65 5c 6e 22   this message\n"
c410: 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45  .  ".import FILE
c420: 20 54 41 42 4c 45 20 20 20 20 20 49 6d 70 6f 72   TABLE     Impor
c430: 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c 45  t data from FILE
c440: 20 69 6e 74 6f 20 54 41 42 4c 45 5c 6e 22 0a 20   into TABLE\n". 
c450: 20 22 2e 69 6e 64 69 63 65 73 20 3f 54 41 42 4c   ".indices ?TABL
c460: 45 3f 20 20 20 20 20 20 20 53 68 6f 77 20 6e 61  E?       Show na
c470: 6d 65 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63  mes of all indic
c480: 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69    If TABLE speci
c4b0: 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20  fied, only show 
c4c0: 69 6e 64 69 63 65 73 20 66 6f 72 20 74 61 62 6c  indices for tabl
c4d0: 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45 20    matching LIKE 
c500: 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e  pattern TABLE.\n
c510: 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ".#ifdef SQLITE_
c520: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20  ENABLE_IOTRACE. 
c530: 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20   ".iotrace FILE 
c540: 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20           Enable 
c550: 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c  I/O diagnostic l
c560: 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 5c 6e  ogging to FILE\n
c570: 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ".#endif.#ifndef
c580: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
c590: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e  D_EXTENSION.  ".
c5a0: 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59  load FILE ?ENTRY
c5b0: 3f 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78  ?     Load an ex
c5c0: 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c  tension library\
c5d0: 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f  n".#endif.  ".lo
c5e0: 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  g FILE|off      
c5f0: 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67      Turn logging
c600: 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c   on or off.  FIL
c610: 45 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f  E can be stderr/
c620: 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f  stdout\n".  ".mo
c630: 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20  de MODE ?TABLE? 
c640: 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d      Set output m
c650: 6f 64 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69  ode where MODE i
c660: 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22  s one of:\n".  "
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 20 20 20 20 20 20 20 63 73 76 20 20 20 20           csv    
c690: 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65    Comma-separate
c6a0: 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20  d values\n".  " 
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6c0: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20          column  
c6d0: 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f   Left-aligned co
c6e0: 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69  lumns.  (See .wi
c6f0: 64 74 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20  dth)\n".  "     
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d      html     HTM
c720: 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e  L <table> code\n
c730: 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
c750: 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72  sert   SQL inser
c760: 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  t statements for
c770: 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20   TABLE\n".  "   
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c790: 20 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f        line     O
c7a0: 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e  ne value per lin
c7b0: 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  e\n".  "        
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73   list     Values
c7e0: 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 2e 73   delimited by .s
c7f0: 65 70 61 72 61 74 6f 72 20 73 74 72 69 6e 67 5c  eparator string\
c800: 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
c820: 61 62 73 20 20 20 20 20 54 61 62 2d 73 65 70 61  abs     Tab-sepa
c830: 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a  rated values\n".
c840: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
c850: 20 20 20 20 20 20 20 20 20 20 20 20 74 63 6c 20              tcl 
c860: 20 20 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c       TCL list el
c870: 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e 75  ements\n".  ".nu
c880: 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 20 20  llvalue STRING  
c890: 20 20 20 20 55 73 65 20 53 54 52 49 4e 47 20 69      Use STRING i
c8a0: 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20  n place of NULL 
c8b0: 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 6e  values\n".  ".on
c8c0: 63 65 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20  ce FILENAME     
c8d0: 20 20 20 20 4f 75 74 70 75 74 20 66 6f 72 20 74      Output for t
c8e0: 68 65 20 6e 65 78 74 20 53 51 4c 20 63 6f 6d 6d  he next SQL comm
c8f0: 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49 4c 45  and only to FILE
c900: 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 6f 70 65 6e  NAME\n".  ".open
c910: 20 3f 46 49 4c 45 4e 41 4d 45 3f 20 20 20 20 20   ?FILENAME?     
c920: 20 20 43 6c 6f 73 65 20 65 78 69 73 74 69 6e 67    Close existing
c930: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
c940: 6f 70 65 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  open FILENAME\n"
c950: 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c  .  ".output ?FIL
c960: 45 4e 41 4d 45 3f 20 20 20 20 20 53 65 6e 64 20  ENAME?     Send 
c970: 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 4e 41  output to FILENA
c980: 4d 45 20 6f 72 20 73 74 64 6f 75 74 5c 6e 22 0a  ME or stdout\n".
c990: 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e 47    ".print STRING
c9a0: 2e 2e 2e 20 20 20 20 20 20 20 50 72 69 6e 74 20  ...       Print 
c9b0: 6c 69 74 65 72 61 6c 20 53 54 52 49 4e 47 5c 6e  literal STRING\n
c9c0: 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49  ".  ".prompt MAI
c9d0: 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52 65 70 6c  N CONTINUE  Repl
c9e0: 61 63 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  ace the standard
c9f0: 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20 20 22 2e   prompts\n".  ".
ca00: 71 75 69 74 20 20 20 20 20 20 20 20 20 20 20 20  quit            
ca10: 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
ca20: 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 72  program\n".  ".r
ca30: 65 61 64 20 46 49 4c 45 4e 41 4d 45 20 20 20 20  ead FILENAME    
ca40: 20 20 20 20 20 45 78 65 63 75 74 65 20 53 51 4c       Execute SQL
ca50: 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a   in FILENAME\n".
ca60: 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f    ".restore ?DB?
ca70: 20 46 49 4c 45 20 20 20 20 20 52 65 73 74 6f 72   FILE     Restor
ca80: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20  e content of DB 
ca90: 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c  (default \"main\
caa0: 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c 6e 22 0a  ") from FILE\n".
cab0: 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20    ".save FILE   
cac0: 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
cad0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
cae0: 73 65 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a  se into FILE\n".
caf0: 20 20 22 2e 73 63 68 65 6d 61 20 3f 54 41 42 4c    ".schema ?TABL
cb00: 45 3f 20 20 20 20 20 20 20 20 53 68 6f 77 20 74  E?        Show t
cb10: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
cb20: 65 6e 74 73 5c 6e 22 0a 20 20 22 20 20 20 20 20  ents\n".  "     
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65      If TABLE spe
cb50: 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f  cified, only sho
cb60: 77 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e  w tables matchin
cb70: 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  g\n".  "        
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41   LIKE pattern TA
cba0: 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 73 65 70 61  BLE.\n".  ".sepa
cbb0: 72 61 74 6f 72 20 53 54 52 49 4e 47 20 3f 4e 4c  rator STRING ?NL
cbc0: 3f 20 43 68 61 6e 67 65 20 73 65 70 61 72 61 74  ? Change separat
cbd0: 6f 72 20 75 73 65 64 20 62 79 20 6f 75 74 70 75  or used by outpu
cbe0: 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70 6f  t mode and .impo
cbf0: 72 74 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  rt\n".  "       
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 20 20 4e 4c 20 69 73 20 74 68 65 20 65 6e 64 2d    NL is the end-
cc20: 6f 66 2d 6c 69 6e 65 20 6d 61 72 6b 20 66 6f 72  of-line mark for
cc30: 20 43 53 56 5c 6e 22 0a 20 20 22 2e 73 68 65 6c   CSV\n".  ".shel
cc40: 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20  l CMD ARGS...   
cc50: 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e    Run CMD ARGS..
cc60: 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68  . in a system sh
cc70: 65 6c 6c 5c 6e 22 0a 20 20 22 2e 73 68 6f 77 20  ell\n".  ".show 
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc90: 20 53 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e   Show the curren
cca0: 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72  t values for var
ccb0: 69 6f 75 73 20 73 65 74 74 69 6e 67 73 5c 6e 22  ious settings\n"
ccc0: 0a 20 20 22 2e 73 74 61 74 73 20 6f 6e 7c 6f 66  .  ".stats on|of
ccd0: 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  f          Turn 
cce0: 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66 5c  stats on or off\
ccf0: 6e 22 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d  n".  ".system CM
cd00: 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 52 75 6e  D ARGS...    Run
cd10: 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20   CMD ARGS... in 
cd20: 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c 6e  a system shell\n
cd30: 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54 41  ".  ".tables ?TA
cd40: 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69 73 74  BLE?        List
cd50: 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65 73   names of tables
cd60: 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69  If TABLE specifi
cd90: 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20 74 61  ed, only list ta
cda0: 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22  bles matching\n"
cdb0: 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b               LIK
cdd0: 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e  E pattern TABLE.
cde0: 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20  \n".  ".timeout 
cdf0: 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 54 72  MS            Tr
ce00: 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64  y opening locked
ce10: 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d   tables for MS m
ce20: 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20  illiseconds\n". 
ce30: 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20   ".timer on|off 
ce40: 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 53 51           Turn SQ
ce50: 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66  L timer on or of
ce60: 66 5c 6e 22 0a 20 20 22 2e 74 72 61 63 65 20 46  f\n".  ".trace F
ce70: 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 4f  ILE|off        O
ce80: 75 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73  utput each SQL s
ce90: 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69  tatement as it i
cea0: 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e 76 66 73  s run\n".  ".vfs
ceb0: 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20  name ?AUX?      
cec0: 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d     Print the nam
ced0: 65 20 6f 66 20 74 68 65 20 56 46 53 20 73 74 61  e of the VFS sta
cee0: 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64 74 68 20  ck\n".  ".width 
cef0: 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20  NUM1 NUM2 ...   
cf00: 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68  Set column width
cf10: 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22  s for \"column\"
cf20: 20 6d 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20   mode\n".  "    
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 20 20 4e 65 67 61 74 69 76 65 20 76 61       Negative va
cf50: 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69  lues right-justi
cf60: 66 79 5c 6e 22 0a 3b 0a 0a 2f 2a 20 46 6f 72 77  fy\n".;../* Forw
cf70: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
cf80: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
cf90: 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53  ess_input(ShellS
cfa0: 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69  tate *p, FILE *i
cfb0: 6e 29 3b 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  n);./*.** Implem
cfc0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
cfd0: 22 72 65 61 64 66 69 6c 65 28 58 29 22 20 53 51  "readfile(X)" SQ
cfe0: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  L function.  The
cff0: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 0a   entire content.
d000: 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6e  ** of the file n
d010: 61 6d 65 64 20 58 20 69 73 20 72 65 61 64 20 61  amed X is read a
d020: 6e 64 20 72 65 74 75 72 6e 65 64 20 61 73 20 61  nd returned as a
d030: 20 42 4c 4f 42 2e 20 20 4e 55 4c 4c 20 69 73 20   BLOB.  NULL is 
d040: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20 74  returned.** if t
d050: 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
d060: 20 65 78 69 73 74 20 6f 72 20 69 73 20 75 6e 72   exist or is unr
d070: 65 61 64 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  eadable..*/.stat
d080: 69 63 20 76 6f 69 64 20 72 65 61 64 66 69 6c 65  ic void readfile
d090: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
d0a0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
d0b0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
d0c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
d0d0: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
d0e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 46  char *zName;.  F
d0f0: 49 4c 45 20 2a 69 6e 3b 0a 20 20 6c 6f 6e 67 20  ILE *in;.  long 
d100: 6e 49 6e 3b 0a 20 20 76 6f 69 64 20 2a 70 42 75  nIn;.  void *pBu
d110: 66 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 28 63  f;..  zName = (c
d120: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
d130: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
d140: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 4e  gv[0]);.  if( zN
d150: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
d160: 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e  .  in = fopen(zN
d170: 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66  ame, "rb");.  if
d180: 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
d190: 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c  ;.  fseek(in, 0,
d1a0: 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49   SEEK_END);.  nI
d1b0: 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20  n = ftell(in);. 
d1c0: 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70   rewind(in);.  p
d1d0: 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Buf = sqlite3_ma
d1e0: 6c 6c 6f 63 28 20 6e 49 6e 20 29 3b 0a 20 20 69  lloc( nIn );.  i
d1f0: 66 28 20 70 42 75 66 20 26 26 20 31 3d 3d 66 72  f( pBuf && 1==fr
d200: 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31  ead(pBuf, nIn, 1
d210: 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 73 71 6c  , in) ){.    sql
d220: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
d230: 28 63 6f 6e 74 65 78 74 2c 20 70 42 75 66 2c 20  (context, pBuf, 
d240: 6e 49 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  nIn, sqlite3_fre
d250: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
d260: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
d270: 75 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  uf);.  }.  fclos
d280: 65 28 69 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(in);.}../*.** 
d290: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
d2a0: 66 20 74 68 65 20 22 77 72 69 74 65 66 69 6c 65  f the "writefile
d2b0: 28 58 2c 59 29 22 20 53 51 4c 20 66 75 6e 63 74  (X,Y)" SQL funct
d2c0: 69 6f 6e 2e 20 20 54 68 65 20 61 72 67 75 6d 65  ion.  The argume
d2d0: 6e 74 20 59 0a 2a 2a 20 69 73 20 77 72 69 74 74  nt Y.** is writt
d2e0: 65 6e 20 69 6e 74 6f 20 66 69 6c 65 20 58 2e 20  en into file X. 
d2f0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
d300: 79 74 65 73 20 77 72 69 74 74 65 6e 20 69 73 20  ytes written is 
d310: 72 65 74 75 72 6e 65 64 2e 20 20 4f 72 0a 2a 2a  returned.  Or.**
d320: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
d330: 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  d if something g
d340: 6f 65 73 20 77 72 6f 6e 67 2c 20 73 75 63 68 20  oes wrong, such 
d350: 61 73 20 62 65 69 6e 67 20 75 6e 61 62 6c 65 20  as being unable 
d360: 74 6f 20 6f 70 65 6e 0a 2a 2a 20 66 69 6c 65 20  to open.** file 
d370: 58 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a  X for writing..*
d380: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72  /.static void wr
d390: 69 74 65 66 69 6c 65 46 75 6e 63 28 0a 20 20 73  itefileFunc(.  s
d3a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
d3b0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
d3c0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
d3d0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
d3e0: 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 63 6f   FILE *out;.  co
d3f0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  nst char *z;.  s
d400: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 63 3b  qlite3_int64 rc;
d410: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d420: 46 69 6c 65 3b 0a 0a 20 20 7a 46 69 6c 65 20 3d  File;..  zFile =
d430: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
d440: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
d450: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
d460: 20 7a 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75   zFile==0 ) retu
d470: 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 70 65  rn;.  out = fope
d480: 6e 28 7a 46 69 6c 65 2c 20 22 77 62 22 29 3b 0a  n(zFile, "wb");.
d490: 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 20 72    if( out==0 ) r
d4a0: 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 28 63 6f  eturn;.  z = (co
d4b0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
d4c0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
d4d0: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  v[1]);.  if( z==
d4e0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  0 ){.    rc = 0;
d4f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d500: 20 3d 20 66 77 72 69 74 65 28 7a 2c 20 31 2c 20   = fwrite(z, 1, 
d510: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
d520: 74 65 73 28 61 72 67 76 5b 31 5d 29 2c 20 6f 75  tes(argv[1]), ou
d530: 74 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  t);.  }.  fclose
d540: 28 6f 75 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  (out);.  sqlite3
d550: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
d560: 6e 74 65 78 74 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  ntext, rc);.}../
d570: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
d580: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
d590: 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e  pen.  If it is n
d5a0: 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74  ot, then open it
d5b0: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74  .  If.** the dat
d5c0: 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f  abase fails to o
d5d0: 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72  pen, print an er
d5e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
d5f0: 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  exit..*/.static 
d600: 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65  void open_db(She
d610: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
d620: 6b 65 65 70 41 6c 69 76 65 29 7b 0a 20 20 69 66  keepAlive){.  if
d630: 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
d640: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61    sqlite3_initia
d650: 6c 69 7a 65 28 29 3b 0a 20 20 20 20 73 71 6c 69  lize();.    sqli
d660: 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46  te3_open(p->zDbF
d670: 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29  ilename, &p->db)
d680: 3b 0a 20 20 20 20 64 62 20 3d 20 70 2d 3e 64 62  ;.    db = p->db
d690: 3b 0a 20 20 20 20 69 66 28 20 64 62 20 26 26 20  ;.    if( db && 
d6a0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
d6b0: 64 62 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  db)==SQLITE_OK )
d6c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
d6d0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
d6e0: 64 62 2c 20 22 73 68 65 6c 6c 73 74 61 74 69 63  db, "shellstatic
d6f0: 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 0, SQLITE_UTF
d700: 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
d710: 73 68 65 6c 6c 73 74 61 74 69 63 46 75 6e 63 2c  shellstaticFunc,
d720: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
d730: 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c 20 53    if( db==0 || S
d740: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
d750: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 20 29 7b  3_errcode(db) ){
d760: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
d770: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e  tderr,"Error: un
d780: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
d790: 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73  abase \"%s\": %s
d7a0: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
d7b0: 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
d7c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
d7d0: 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  b));.      if( k
d7e0: 65 65 70 41 6c 69 76 65 20 29 20 72 65 74 75 72  eepAlive ) retur
d7f0: 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  n;.      exit(1)
d800: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
d810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
d820: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73  _EXTENSION.    s
d830: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
d840: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
d850: 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  db, 1);.#endif. 
d860: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
d870: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
d880: 72 65 61 64 66 69 6c 65 22 2c 20 31 2c 20 53 51  readfile", 1, SQ
d890: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 66 69            readfi
d8c0: 6c 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  leFunc, 0, 0);. 
d8d0: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
d8e0: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
d8f0: 77 72 69 74 65 66 69 6c 65 22 2c 20 32 2c 20 53  writefile", 2, S
d900: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65             write
d930: 66 69 6c 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b  fileFunc, 0, 0);
d940: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  .  }.}../*.** Do
d950: 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c   C-language styl
d960: 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a  e dequoting..**.
d970: 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e 20 74  **    \t    -> t
d980: 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d  ab.**    \n    -
d990: 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20  > newline.**    
d9a0: 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67  \r    -> carriag
d9b0: 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c  e return.**    \
d9c0: 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20  "    -> ".**    
d9d0: 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63  \NNN  -> ascii c
d9e0: 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20  haracter NNN in 
d9f0: 6f 63 74 61 6c 0a 2a 2a 20 20 20 20 5c 5c 20 20  octal.**    \\  
da00: 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68 0a 2a    -> backslash.*
da10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
da20: 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
da30: 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  s(char *z){.  in
da40: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
da50: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26  ;.  while( *z &&
da60: 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b   *z!='\\' ) z++;
da70: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63  .  for(i=j=0; (c
da80: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
da90: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , j++){.    if( 
daa0: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
dab0: 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20   c = z[++i];.   
dac0: 20 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b     if( c=='n' ){
dad0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e  .        c = '\n
dae0: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
daf0: 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20  f( c=='t' ){.   
db00: 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20       c = '\t';. 
db10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
db20: 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20  =='r' ){.       
db30: 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20   c = '\r';.     
db40: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
db50: 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  \' ){.        c 
db60: 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65  = '\\';.      }e
db70: 6c 73 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26  lse if( c>='0' &
db80: 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20  & c<='7' ){.    
db90: 20 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20      c -= '0';.  
dba0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
dbb0: 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c  >='0' && z[i+1]<
dbc0: 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
dbd0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
dbe0: 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b   c = (c<<3) + z[
dbf0: 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  i] - '0';.      
dc00: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d      if( z[i+1]>=
dc10: 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27  '0' && z[i+1]<='
dc20: 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7' ){.          
dc30: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
dc40: 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20     c = (c<<3) + 
dc50: 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  z[i] - '0';.    
dc60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dc70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
dc80: 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20      z[j] = c;.  
dc90: 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b  }.  if( j<i ) z[
dca0: 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  j] = 0;.}../*.**
dcb0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
dcc0: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
dcd0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
dce0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
dcf0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
dd00: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
dd10: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
dd20: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
dd30: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
dd40: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
dd50: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
dd60: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
dd70: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
dd80: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
dd90: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
dda0: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
ddb0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
ddc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
ddd0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
dde0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
ddf0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
de00: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  xes..*/.static s
de10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74  qlite3_int64 int
de20: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
de30: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
de40: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
de50: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
de60: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
de70: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
de80: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
de90: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
dea0: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
deb0: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
dec0: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
ded0: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
dee0: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
def0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
df00: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
df10: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
df20: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
df30: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
df40: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
df50: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
df60: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
df70: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
df80: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
df90: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
dfa0: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
dfb0: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
dfc0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
dfd0: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
dfe0: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
dff0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
e000: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
e010: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
e020: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
e030: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
e040: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
e050: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
e060: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
e070: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
e080: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
e090: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
e0a0: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
e0b0: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
e0c0: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
e0d0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
e0e0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
e0f0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75   i<ArraySize(aMu
e100: 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lt); i++){.    i
e110: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
e120: 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66  mp(aMult[i].zSuf
e130: 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b  fix, zArg)==0 ){
e140: 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c  .      v *= aMul
e150: 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20  t[i].iMult;.    
e160: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e170: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65   }.  return isNe
e180: 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a  g? -v : v;.}../*
e190: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41  .** Interpret zA
e1a0: 72 67 20 61 73 20 65 69 74 68 65 72 20 61 6e 20  rg as either an 
e1b0: 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62 6f 6f  integer or a boo
e1c0: 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 74  lean value.  Ret
e1d0: 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f  urn 1 or 0.** fo
e1e0: 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c 53 45  r TRUE and FALSE
e1f0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
e200: 74 65 67 65 72 20 76 61 6c 75 65 20 69 66 20 61  teger value if a
e210: 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
e220: 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61  tatic int boolea
e230: 6e 56 61 6c 75 65 28 63 68 61 72 20 2a 7a 41 72  nValue(char *zAr
e240: 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
e250: 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20  f( zArg[0]=='0' 
e260: 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20  && zArg[1]=='x' 
e270: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  ){.    for(i=2; 
e280: 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41  hexDigitValue(zA
e290: 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b  rg[i])>=0; i++){
e2a0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
e2b0: 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e  or(i=0; zArg[i]>
e2c0: 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c  ='0' && zArg[i]<
e2d0: 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  ='9'; i++){}.  }
e2e0: 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41  .  if( i>0 && zA
e2f0: 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72  rg[i]==0 ) retur
e300: 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56  n (int)(integerV
e310: 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78 66  alue(zArg) & 0xf
e320: 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20  fffffff);.  if( 
e330: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
e340: 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c  zArg, "on")==0 |
e350: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
e360: 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30  p(zArg,"yes")==0
e370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
e380: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
e390: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
e3a0: 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73  , "off")==0 || s
e3b0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
e3c0: 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a  Arg,"no")==0 ){.
e3d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
e3e0: 7d 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  }.  fprintf(stde
e3f0: 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20  rr, "ERROR: Not 
e400: 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  a boolean value:
e410: 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e   \"%s\". Assumin
e420: 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20  g \"no\".\n",.  
e430: 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20          zArg);. 
e440: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e450: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74  .** Close an out
e460: 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69  put file, assumi
e470: 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64  ng it is not std
e480: 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f  err or stdout.*/
e490: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
e4a0: 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46  put_file_close(F
e4b0: 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66  ILE *f){.  if( f
e4c0: 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26   && f!=stdout &&
e4d0: 20 66 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c   f!=stderr ) fcl
e4e0: 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ose(f);.}../*.**
e4f0: 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20   Try to open an 
e500: 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54  output file.   T
e510: 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74  he names "stdout
e520: 22 20 61 6e 64 20 22 73 74 64 65 72 72 22 20 61  " and "stderr" a
e530: 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64  re.** recognized
e540: 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68   and do the righ
e550: 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69  t thing.  NULL i
e560: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
e570: 65 20 6f 75 74 70 75 74 20 0a 2a 2a 20 66 69 6c  e output .** fil
e580: 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a  ename is "off"..
e590: 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  */.static FILE *
e5a0: 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
e5b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
e5c0: 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b 0a  le){.  FILE *f;.
e5d0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
e5e0: 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20  le,"stdout")==0 
e5f0: 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f 75  ){.    f = stdou
e600: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  t;.  }else if( s
e610: 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73 74  trcmp(zFile, "st
e620: 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  derr")==0 ){.   
e630: 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d   f = stderr;.  }
e640: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e650: 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30  zFile, "off")==0
e660: 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20   ){.    f = 0;. 
e670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d 20   }else{.    f = 
e680: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77 62  fopen(zFile, "wb
e690: 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d 30  ");.    if( f==0
e6a0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
e6b0: 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
e6c0: 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
e6d0: 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b  %s\"\n", zFile);
e6e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
e6f0: 75 72 6e 20 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn f;.}../*.** 
e700: 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61  A routine for ha
e710: 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72  ndling output fr
e720: 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  om sqlite3_trace
e730: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
e740: 69 64 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c  id sql_trace_cal
e750: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
e760: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
e770: 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 28 46  {.  FILE *f = (F
e780: 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20 69 66 28  ILE*)pArg;.  if(
e790: 20 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20   f ){.    int i 
e7a0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
e7b0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30  ;.    while( i>0
e7c0: 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 3b 27 20   && z[i-1]==';' 
e7d0: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 66 70  ){ i--; }.    fp
e7e0: 72 69 6e 74 66 28 66 2c 20 22 25 2e 2a 73 3b 5c  rintf(f, "%.*s;\
e7f0: 6e 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  n", i, z);.  }.}
e800: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70 20  ../*.** A no-op 
e810: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72 75 6e  routine that run
e820: 73 20 77 69 74 68 20 74 68 65 20 22 2e 62 72 65  s with the ".bre
e830: 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63 6f 6d  akpoint" doc-com
e840: 6d 61 6e 64 2e 20 20 54 68 69 73 20 69 73 0a 2a  mand.  This is.*
e850: 2a 20 61 20 75 73 65 66 75 6c 20 73 70 6f 74 20  * a useful spot 
e860: 74 6f 20 73 65 74 20 61 20 64 65 62 75 67 67 65  to set a debugge
e870: 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f  r breakpoint..*/
e880: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
e890: 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69  t_breakpoint(voi
e8a0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
e8b0: 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43   nCall = 0;.  nC
e8c0: 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  all++;.}../*.** 
e8d0: 41 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20 74  An object used t
e8e0: 6f 20 72 65 61 64 20 61 20 43 53 56 20 66 69 6c  o read a CSV fil
e8f0: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
e900: 75 63 74 20 43 53 56 52 65 61 64 65 72 20 43 53  uct CSVReader CS
e910: 56 52 65 61 64 65 72 3b 0a 73 74 72 75 63 74 20  VReader;.struct 
e920: 43 53 56 52 65 61 64 65 72 20 7b 0a 20 20 63 6f  CSVReader {.  co
e930: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
e940: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
e950: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
e960: 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
e970: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
e980: 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74   CSV text from t
e990: 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d  his input stream
e9a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
e9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
e9c0: 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f  umulated text fo
e9d0: 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  r a field */.  i
e9e0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
e9f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ea00: 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20  bytes in z */.  
ea10: 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20  int nAlloc;     
ea20: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
ea30: 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a  ocated for z[] *
ea40: 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20  /.  int nLine;  
ea50: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
ea60: 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  nt line number *
ea70: 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20  /.  int cTerm;  
ea80: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61          /* Chara
ea90: 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e  cter that termin
eaa0: 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65  ated the most re
eab0: 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20  cent field */.  
eac0: 69 6e 74 20 63 53 65 70 61 72 61 74 6f 72 3b 20  int cSeparator; 
ead0: 20 20 20 20 2f 2a 20 54 68 65 20 73 65 70 61 72      /* The separ
eae0: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
eaf0: 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29 20 2a   (Usually ",") *
eb00: 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  /.};../* Append 
eb10: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
eb20: 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76   z[] */.static v
eb30: 6f 69 64 20 63 73 76 5f 61 70 70 65 6e 64 5f 63  oid csv_append_c
eb40: 68 61 72 28 43 53 56 52 65 61 64 65 72 20 2a 70  har(CSVReader *p
eb50: 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20  , int c){.  if( 
eb60: 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f  p->n+1>=p->nAllo
eb70: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  c ){.    p->nAll
eb80: 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20  oc += p->nAlloc 
eb90: 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20  + 100;.    p->z 
eba0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
ebb0: 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f  c(p->z, p->nAllo
ebc0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  c);.    if( p->z
ebd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
ebe0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75  intf(stderr, "ou
ebf0: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
ec00: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
ec10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 7a      }.  }.  p->z
ec20: 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72  [p->n++] = (char
ec30: 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  )c;.}../* Read a
ec40: 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
ec50: 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70   CSV text.  Comp
ec60: 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34  atible with rfc4
ec70: 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64  180 and extended
ec80: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74  .** with the opt
ec90: 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20  ion of having a 
eca0: 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20  separator other 
ecb0: 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20  than ","..**.** 
ecc0: 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
ecd0: 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
ece0: 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
ecf0: 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
ed00: 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
ed10: 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
ed20: 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
ed30: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
ed40: 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  ()..**   +  Use 
ed50: 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 73  p->cSep as the s
ed60: 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
ed70: 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a  efault is ","..*
ed80: 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63  *   +  Keep trac
ed90: 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75  k of the line nu
eda0: 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65  mber in p->nLine
edb0: 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
edc0: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
edd0: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68  at terminates th
ede0: 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54  e field in p->cT
edf0: 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20  erm.  Store.**  
ee00: 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f      EOF on end-o
ee10: 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20  f-file..**   +  
ee20: 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72  Report syntax er
ee30: 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a  rors on stderr.*
ee40: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
ee50: 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
ee60: 64 28 43 53 56 52 65 61 64 65 72 20 2a 70 29 7b  d(CSVReader *p){
ee70: 0a 20 20 69 6e 74 20 63 2c 20 70 63 2c 20 70 70  .  int c, pc, pp
ee80: 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
ee90: 70 2d 3e 63 53 65 70 61 72 61 74 6f 72 3b 0a 20  p->cSeparator;. 
eea0: 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d   p->n = 0;.  c =
eeb0: 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
eec0: 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73   if( c==EOF || s
eed0: 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a  eenInterrupt ){.
eee0: 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45      p->cTerm = E
eef0: 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  OF;.    return 0
ef00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27  ;.  }.  if( c=='
ef10: 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 74  "' ){.    int st
ef20: 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69  artLine = p->nLi
ef30: 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f  ne;.    int cQuo
ef40: 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d  te = c;.    pc =
ef50: 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68   ppc = 0;.    wh
ef60: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
ef70: 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
ef80: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
ef90: 5c 6e 27 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b  \n' ) p->nLine++
efa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63  ;.      if( c==c
efb0: 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Quote ){.       
efc0: 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
efd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  ){.          pc 
efe0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 0;.          c
eff0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
f000: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f010: 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26   if( (c==cSep &&
f020: 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
f030: 20 20 20 20 7c 7c 20 28 63 3d 3d 27 5c 6e 27 20      || (c=='\n' 
f040: 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
f050: 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 27 5c 6e        || (c=='\n
f060: 27 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26  ' && pc=='\r' &&
f070: 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20   ppc==cQuote).  
f080: 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20       || (c==EOF 
f090: 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
f0a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
f0b0: 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69  do{ p->n--; }whi
f0c0: 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d  le( p->z[p->n]!=
f0d0: 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20  cQuote );.      
f0e0: 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
f0f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f110: 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63   pc==cQuote && c
f120: 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  !='\r' ){.      
f130: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
f140: 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61  , "%s:%d: unesca
f150: 70 65 64 20 25 63 20 63 68 61 72 61 63 74 65 72  ped %c character
f160: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
f170: 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70       p->zFile, p
f180: 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29  ->nLine, cQuote)
f190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f1a0: 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20  if( c==EOF ){.  
f1b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
f1c0: 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e  derr, "%s:%d: un
f1d0: 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71 75  terminated %c-qu
f1e0: 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20  oted field\n",. 
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f200: 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69  ->zFile, startLi
f210: 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20  ne, cQuote);.   
f220: 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20       p->cTerm = 
f230: 45 4f 46 3b 0a 20 20 20 20 20 20 20 20 62 72 65  EOF;.        bre
f240: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
f250: 20 20 63 73 76 5f 61 70 70 65 6e 64 5f 63 68 61    csv_append_cha
f260: 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70  r(p, c);.      p
f270: 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70  pc = pc;.      p
f280: 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = c;.    }.  }
f290: 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
f2a0: 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53   c!=EOF && c!=cS
f2b0: 65 70 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 7b  ep && c!='\n' ){
f2c0: 0a 20 20 20 20 20 20 63 73 76 5f 61 70 70 65 6e  .      csv_appen
f2d0: 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
f2e0: 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
f2f0: 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >in);.    }.    
f300: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
f310: 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b       p->nLine++;
f320: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e  .      if( p->n>
f330: 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31  0 && p->z[p->n-1
f340: 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d  ]=='\r' ) p->n--
f350: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63  ;.    }.    p->c
f360: 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  Term = c;.  }.  
f370: 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b  if( p->z ) p->z[
f380: 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74  p->n] = 0;.  ret
f390: 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a  urn p->z;.}../*.
f3a0: 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66  ** Try to transf
f3b0: 65 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  er data for tabl
f3c0: 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e  e zTable.  If an
f3d0: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77   error is seen w
f3e0: 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66  hile.** moving f
f3f0: 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67  orward, try to g
f400: 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68  o backwards.  Th
f410: 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65  e backwards move
f420: 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f  ment won't.** wo
f430: 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  rk for WITHOUT R
f440: 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  OWID tables..*/.
f450: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
f460: 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68  oCloneData(.  Sh
f470: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73  ellState *p,.  s
f480: 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20  qlite3 *newDb,. 
f490: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
f4a0: 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ble.){.  sqlite3
f4b0: 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20  _stmt *pQuery = 
f4c0: 30 3b 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  0; .  sqlite3_st
f4d0: 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b  mt *pInsert = 0;
f4e0: 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
f4f0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e  = 0;.  char *zIn
f500: 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sert = 0;.  int 
f510: 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  rc;.  int i, j, 
f520: 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20  n;.  int nTable 
f530: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  = (int)strlen(zT
f540: 61 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d  able);.  int k =
f550: 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   0;.  int cnt = 
f560: 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73  0;.  const int s
f570: 70 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b  pinRate = 10000;
f580: 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c  ..  zQuery = sql
f590: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
f5a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77  LECT * FROM \"%w
f5b0: 5c 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  \"", zTable);.  
f5c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
f5d0: 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
f5e0: 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
f5f0: 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ry, 0);.  if( rc
f600: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
f610: 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
f620: 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d: %s on [%s]\n"
f630: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
f640: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
f650: 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
f660: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
f670: 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
f680: 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67    zQuery);.    g
f690: 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65  oto end_data_xfe
f6a0: 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c  r;.  }.  n = sql
f6b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
f6c0: 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e  t(pQuery);.  zIn
f6d0: 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  sert = sqlite3_m
f6e0: 61 6c 6c 6f 63 28 32 30 30 20 2b 20 6e 54 61 62  alloc(200 + nTab
f6f0: 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28  le + n*3);.  if(
f700: 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20   zInsert==0 ){. 
f710: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
f720: 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
f730: 79 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  y\n");.    goto 
f740: 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20  end_data_xfer;. 
f750: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
f760: 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65  rintf(200+nTable
f770: 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20  ,zInsert,.      
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e               "IN
f790: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
f7a0: 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45  NTO \"%s\" VALUE
f7b0: 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  S(?", zTable);. 
f7c0: 20 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   i = (int)strlen
f7d0: 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72  (zInsert);.  for
f7e0: 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b  (j=1; j<n; j++){
f7f0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73  .    memcpy(zIns
f800: 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b  ert+i, ",?", 2);
f810: 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d  .    i += 2;.  }
f820: 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72  .  memcpy(zInser
f830: 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20  t+i, ");", 3);. 
f840: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
f850: 65 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20  epare_v2(newDb, 
f860: 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49  zInsert, -1, &pI
f870: 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28  nsert, 0);.  if(
f880: 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e   rc ){.    fprin
f890: 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
f8a0: 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
f8b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
f8c0: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
f8d0: 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29  d_errcode(newDb)
f8e0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
f8f0: 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20  (newDb),.       
f900: 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
f910: 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
f920: 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  xfer;.  }.  for(
f930: 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a  k=0; k<2; k++){.
f940: 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
f950: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
f960: 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
f970: 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  OW ){.      for(
f980: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
f990: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
f9a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
f9b0: 79 70 65 28 70 51 75 65 72 79 2c 20 69 29 20 29  ype(pQuery, i) )
f9c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
f9d0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f9f0: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49  te3_bind_null(pI
fa00: 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20  nsert, i+1);.   
fa10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
fa20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
fa30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
fa40: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
fa50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fa60: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73  _bind_int64(pIns
fa70: 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
fa80: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
fa90: 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
faa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fab0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fac0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
fad0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
fae0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
faf0: 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72 74  d_double(pInsert
fb00: 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
fb10: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75  olumn_double(pQu
fb20: 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  ery,i));.       
fb30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fb40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fb50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
fb60: 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  XT: {.          
fb70: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
fb80: 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  ext(pInsert, i+1
fb90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
fbb0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
fbc0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
fbd0: 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbf0: 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49          -1, SQLI
fc00: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
fc10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fc20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
fc30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
fc40: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20  _BLOB: {.       
fc50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
fc60: 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20  d_blob(pInsert, 
fc70: 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
fc80: 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c  umn_blob(pQuery,
fc90: 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcc0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
fcd0: 79 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c 0a  ytes(pQuery,i),.
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
fd10: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
fd20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fd30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
fd40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
fd50: 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  End for */.     
fd60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
fd70: 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ep(pInsert);.   
fd80: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
fd90: 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
fda0: 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53 51  TE_ROW && rc!=SQ
fdb0: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
fdc0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
fdd0: 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20  err, "Error %d: 
fde0: 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
fdf0: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
fe00: 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20  newDb),.        
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e  sqlite3_errmsg(n
fe30: 65 77 44 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ewDb));.      }.
fe40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
fe50: 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  set(pInsert);.  
fe60: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
fe70: 20 69 66 28 20 28 63 6e 74 25 73 70 69 6e 52 61   if( (cnt%spinRa
fe80: 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)==0 ){.      
fe90: 20 20 70 72 69 6e 74 66 28 22 25 63 5c 62 22 2c    printf("%c\b",
fea0: 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70   "|/-\\"[(cnt/sp
feb0: 69 6e 52 61 74 65 29 25 34 5d 29 3b 0a 20 20 20  inRate)%4]);.   
fec0: 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f       fflush(stdo
fed0: 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ut);.      }.   
fee0: 20 7d 20 2f 2a 20 45 6e 64 20 77 68 69 6c 65 20   } /* End while 
fef0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
ff00: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 62 72 65  QLITE_DONE ) bre
ff10: 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ak;.    sqlite3_
ff20: 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
ff30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
ff40: 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  ee(zQuery);.    
ff50: 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  zQuery = sqlite3
ff60: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
ff70: 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4f   * FROM \"%w\" O
ff80: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
ff90: 53 43 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20  SC;",.          
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20     zTable);.    
ffc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
ffd0: 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
ffe0: 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
fff0: 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ry, 0);.    if( 
10000 72 63 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  rc ){.      fpri
10010 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
10020 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65  ning: cannot ste
10030 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72  p \"%s\" backwar
10040 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ds", zTable);.  
10050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10060 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28  .  } /* End for(
10070 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f  k=0...) */..end_
10080 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  data_xfer:.  sql
10090 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
100a0 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
100b0 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
100c0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
100d0 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71  ee(zQuery);.  sq
100e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65  lite3_free(zInse
100f0 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  rt);.}.../*.** T
10100 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61  ry to transfer a
10110 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73  ll rows of the s
10120 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68  chema that match
10130 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a   zWhere.  For.**
10140 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b   each row, invok
10150 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20  e xForEach() on 
10160 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e  the object defin
10170 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a  ed by that row..
10180 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
10190 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
101a0 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  ile moving forwa
101b0 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a  rd through the.*
101c0 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
101d0 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e  table, try again
101e0 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64   moving backward
101f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10200 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65  d tryToCloneSche
10210 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ma(.  ShellState
10220 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
10230 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
10240 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76  har *zWhere,.  v
10250 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28  oid (*xForEach)(
10260 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69  ShellState*,sqli
10270 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  te3*,const char*
10280 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ).){.  sqlite3_s
10290 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
102a0 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
102b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
102c0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
102d0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
102e0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
102f0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
10300 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
10310 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
10320 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
10330 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
10340 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
10350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10360 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
10370 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29  ERE %s", zWhere)
10380 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10390 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
103a0 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
103b0 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
103c0 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69  ( rc ){.    fpri
103d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
103e0 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b  or: (%d) %s on [
103f0 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
10400 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10410 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
10420 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c  code(p->db), sql
10430 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
10440 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
10450 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
10460 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63  .    goto end_sc
10470 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  hema_xfer;.  }. 
10480 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
10490 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
104a0 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
104b0 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
104c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
104d0 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  xt(pQuery, 0);. 
104e0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
104f0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
10500 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72  uery, 1);.    pr
10510 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a  intf("%s... ", z
10520 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74  Name); fflush(st
10530 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  dout);.    sqlit
10540 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28  e3_exec(newDb, (
10550 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c  const char*)zSql
10560 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67  , 0, 0, &zErrMsg
10570 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d  );.    if( zErrM
10580 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  sg ){.      fpri
10590 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
105a0 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73  or: %s\nSQL: [%s
105b0 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a  ]\n", zErrMsg, z
105c0 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
105d0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
105e0 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67  );.      zErrMsg
105f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
10600 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a  if( xForEach ){.
10610 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70        xForEach(p
10620 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  , newDb, (const 
10630 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20  char*)zName);.  
10640 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22    }.    printf("
10650 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  done\n");.  }.  
10660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  if( rc!=SQLITE_D
10670 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ONE ){.    sqlit
10680 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
10690 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
106a0 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
106b0 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69     zQuery = sqli
106c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
106d0 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52  ECT name, sql FR
106e0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
106f0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10710 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20   WHERE %s ORDER 
10720 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
10730 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63 20  zWhere);.    rc 
10740 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
10750 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
10760 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
10770 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
10780 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
10790 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
107a0 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d   (%d) %s on [%s]
107b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
107c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
107d0 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
107e0 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69  ode(p->db), sqli
107f0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
10800 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
10810 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29           zQuery)
10820 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
10830 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20  _schema_xfer;.  
10840 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28    }.    while( (
10850 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
10860 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49  p(pQuery))==SQLI
10870 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
10880 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  zName = sqlite3_
10890 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
108a0 72 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53  ry, 0);.      zS
108b0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ql = sqlite3_col
108c0 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
108d0 20 31 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74   1);.      print
108e0 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d  f("%s... ", zNam
108f0 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75  e); fflush(stdou
10900 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10910 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63  3_exec(newDb, (c
10920 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c  onst char*)zSql,
10930 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29   0, 0, &zErrMsg)
10940 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72  ;.      if( zErr
10950 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Msg ){.        f
10960 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
10970 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
10980 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
10990 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
109a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
109b0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
109c0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
109d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
109e0 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
109f0 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
10a00 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
10a10 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  r*)zName);.     
10a20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
10a30 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d  "done\n");.    }
10a40 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f  .  }.end_schema_
10a50 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
10a60 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
10a70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
10a80 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a  (zQuery);.}../*.
10a90 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
10aa0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
10ab0 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79  d "zNewDb".  Try
10ac0 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d   to recover as m
10ad0 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  uch information.
10ae0 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f  ** as possible o
10af0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ut of the main d
10b00 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d  atabase (which m
10b10 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29  ight be corrupt)
10b20 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a   and write it.**
10b30 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f   into zNewDb..*/
10b40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
10b50 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61  ToClone(ShellSta
10b60 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
10b70 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e  r *zNewDb){.  in
10b80 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
10b90 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66  *newDb = 0;.  if
10ba0 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c  ( access(zNewDb,
10bb0 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  0)==0 ){.    fpr
10bc0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46 69  intf(stderr, "Fi
10bd0 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  le \"%s\" alread
10be0 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e  y exists.\n", zN
10bf0 65 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72  ewDb);.    retur
10c00 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  n;.  }.  rc = sq
10c10 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44  lite3_open(zNewD
10c20 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66  b, &newDb);.  if
10c30 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69  ( rc ){.    fpri
10c40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e  ntf(stderr, "Can
10c50 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70 75  not create outpu
10c60 74 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e  t database: %s\n
10c70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ",.            s
10c80 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65  qlite3_errmsg(ne
10c90 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  wDb));.  }else{.
10ca0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
10cb0 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
10cc0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
10cd0 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ON;", 0, 0, 0);.
10ce0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
10cf0 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20 45  (newDb, "BEGIN E
10d00 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20 30  XCLUSIVE;", 0, 0
10d10 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f 43  , 0);.    tryToC
10d20 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65  loneSchema(p, ne
10d30 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62 6c  wDb, "type='tabl
10d40 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44  e'", tryToCloneD
10d50 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f 43  ata);.    tryToC
10d60 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65  loneSchema(p, ne
10d70 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61 62  wDb, "type!='tab
10d80 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73 71  le'", 0);.    sq
10d90 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
10da0 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20  , "COMMIT;", 0, 
10db0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
10dc0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
10dd0 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
10de0 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c  schema=OFF;", 0,
10df0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71   0, 0);.  }.  sq
10e00 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65 77 44  lite3_close(newD
10e10 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  b);.}../*.** Cha
10e20 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  nge the output f
10e30 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f  ile back to stdo
10e40 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ut.*/.static voi
10e50 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 53  d output_reset(S
10e60 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
10e70 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b   if( p->outfile[
10e80 30 5d 3d 3d 27 7c 27 20 29 7b 0a 20 20 20 20 70  0]=='|' ){.    p
10e90 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 20  close(p->out);. 
10ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70   }else{.    outp
10eb0 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
10ec0 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >out);.  }.  p->
10ed0 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a  outfile[0] = 0;.
10ee0 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
10ef0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  t;.}../*.** If a
10f00 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67  n input line beg
10f10 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65  ins with "." the
10f20 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  n invoke this ro
10f30 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63  utine to.** proc
10f40 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a  ess that line..*
10f50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e  *.** Return 1 on
10f60 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69   error, 2 to exi
10f70 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69  t, and 0 otherwi
10f80 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
10f90 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e  t do_meta_comman
10fa0 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53  d(char *zLine, S
10fb0 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
10fc0 20 69 6e 74 20 69 20 3d 20 31 3b 0a 20 20 69 6e   int i = 1;.  in
10fd0 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e  t nArg = 0;.  in
10fe0 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63  t n, c;.  int rc
10ff0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a   = 0;.  char *az
11000 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 2f 2a 20 50  Arg[50];..  /* P
11010 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c  arse the input l
11020 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e  ine into tokens.
11030 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a  .  */.  while( z
11040 4c 69 6e 65 5b 69 5d 20 26 26 20 6e 41 72 67 3c  Line[i] && nArg<
11050 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29  ArraySize(azArg)
11060 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49   ){.    while( I
11070 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29  sSpace(zLine[i])
11080 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ i++; }.    i
11090 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 30 20 29  f( zLine[i]==0 )
110a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
110b0 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 27 27 20 7c  zLine[i]=='\'' |
110c0 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 22 27 20  | zLine[i]=='"' 
110d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c  ){.      int del
110e0 69 6d 20 3d 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 3b  im = zLine[i++];
110f0 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
11100 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 69 5d  g++] = &zLine[i]
11110 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
11120 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65  Line[i] && zLine
11130 5b 69 5d 21 3d 64 65 6c 69 6d 20 29 7b 20 0a 20  [i]!=delim ){ . 
11140 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
11150 5b 69 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c  [i]=='\\' && del
11160 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65  im=='"' && zLine
11170 5b 69 2b 31 5d 21 3d 30 20 29 20 69 2b 2b 3b 0a  [i+1]!=0 ) i++;.
11180 20 20 20 20 20 20 20 20 69 2b 2b 3b 20 0a 20 20          i++; .  
11190 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
111a0 7a 4c 69 6e 65 5b 69 5d 3d 3d 64 65 6c 69 6d 20  zLine[i]==delim 
111b0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  ){.        zLine
111c0 5b 69 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [i++] = 0;.     
111d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
111e0 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76  im=='"' ) resolv
111f0 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
11200 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
11210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
11220 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
11230 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20 20  zLine[i];.      
11240 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 69 5d 20  while( zLine[i] 
11250 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e  && !IsSpace(zLin
11260 65 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  e[i]) ){ i++; }.
11270 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
11280 69 5d 20 29 20 7a 4c 69 6e 65 5b 69 2b 2b 5d 20  i] ) zLine[i++] 
11290 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c  = 0;.      resol
112a0 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
112b0 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
112c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
112d0 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74  rocess the input
112e0 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   line..  */.  if
112f0 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75  ( nArg==0 ) retu
11300 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65  rn 0; /* no toke
11310 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
11320 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    n = strlen30(a
11330 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20  zArg[0]);.  c = 
11340 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 69  azArg[0][0];.  i
11350 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e  f( (c=='b' && n>
11360 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
11370 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22  Arg[0], "backup"
11380 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28  , n)==0).   || (
11390 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20 26  c=='s' && n>=3 &
113a0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
113b0 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d  0], "save", n)==
113c0 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  0).  ){.    cons
113d0 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c  t char *zDestFil
113e0 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  e = 0;.    const
113f0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a   char *zDb = 0;.
11400 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65      sqlite3 *pDe
11410 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  st;.    sqlite3_
11420 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
11430 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
11440 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b  for(j=1; j<nArg;
11450 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   j++){.      con
11460 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41  st char *z = azA
11470 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rg[j];.      if(
11480 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
11490 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30        while( z[0
114a0 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
114b0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 74 69        /* No opti
114c0 6f 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 61  ons to process a
114d0 74 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20  t this time */. 
114e0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
114f0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
11500 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
11510 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67  on: %s\n", azArg
11520 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [j]);.          
11530 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
11540 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
11550 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30  if( zDestFile==0
11560 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73   ){.        zDes
11570 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d  tFile = azArg[j]
11580 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11590 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zDb==0 ){.    
115a0 20 20 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46      zDb = zDestF
115b0 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65  ile;.        zDe
115c0 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a  stFile = azArg[j
115d0 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
115e0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
115f0 73 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e  stderr, "too man
11600 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e  y arguments to .
11610 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20  backup\n");.    
11620 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11630 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11640 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30  if( zDestFile==0
11650 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
11660 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73 73 69  f(stderr, "missi
11670 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75  ng FILENAME argu
11680 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c  ment on .backup\
11690 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
116a0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
116b0 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20  f( zDb==0 ) zDb 
116c0 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63  = "main";.    rc
116d0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
116e0 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
116f0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
11700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11710 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
11720 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
11730 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
11740 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20  , zDestFile);.  
11750 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
11760 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
11770 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
11780 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
11790 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d  );.    pBackup =
117a0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
117b0 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69  init(pDest, "mai
117c0 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b  n", p->db, zDb);
117d0 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70  .    if( pBackup
117e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
117f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
11800 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
11810 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
11820 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
11830 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
11840 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
11850 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
11860 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f    (rc = sqlite3_
11870 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
11880 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
11890 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c  E_OK ){}.    sql
118a0 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
118b0 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
118c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
118d0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
118e0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
118f0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
11900 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
11910 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
11920 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
11930 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
11940 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
11950 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65  ose(pDest);.  }e
11960 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
11970 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
11980 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
11990 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  bail", n)==0 ){.
119a0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
119b0 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e  ){.      bail_on
119c0 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e  _error = boolean
119d0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
119e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
119f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
11a00 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20  , "Usage: .bail 
11a10 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
11a20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
11a30 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68    }else..  /* Th
11a40 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22  e undocumented "
11a50 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d  .breakpoint" com
11a60 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20 63 61  mand causes a ca
11a70 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a  ll to the no-op.
11a80 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d    ** routine nam
11a90 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  ed test_breakpoi
11aa0 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nt()..  */.  if(
11ab0 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
11ac0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
11ad0 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74  [0], "breakpoint
11ae0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
11af0 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28  test_breakpoint(
11b00 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
11b10 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e  ( c=='c' && strn
11b20 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63  cmp(azArg[0], "c
11b30 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lone", n)==0 ){.
11b40 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
11b50 29 7b 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c  ){.      tryToCl
11b60 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29  one(p, azArg[1])
11b70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11b80 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
11b90 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e  r, "Usage: .clon
11ba0 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a  e FILENAME\n");.
11bb0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
11bc0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
11bd0 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31  f( c=='d' && n>1
11be0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
11bf0 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73  g[0], "databases
11c00 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
11c10 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b  ShellState data;
11c20 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
11c30 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e  sg = 0;.    open
11c40 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d  _db(p, 0);.    m
11c50 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
11c60 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
11c70 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
11c80 65 72 20 3d 20 31 3b 0a 20 20 20 20 64 61 74 61  er = 1;.    data
11c90 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c  .mode = MODE_Col
11ca0 75 6d 6e 3b 0a 20 20 20 20 64 61 74 61 2e 63 6f  umn;.    data.co
11cb0 6c 57 69 64 74 68 5b 30 5d 20 3d 20 33 3b 0a 20  lWidth[0] = 3;. 
11cc0 20 20 20 64 61 74 61 2e 63 6f 6c 57 69 64 74 68     data.colWidth
11cd0 5b 31 5d 20 3d 20 31 35 3b 0a 20 20 20 20 64 61  [1] = 15;.    da
11ce0 74 61 2e 63 6f 6c 57 69 64 74 68 5b 32 5d 20 3d  ta.colWidth[2] =
11cf0 20 35 38 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e   58;.    data.cn
11d00 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
11d10 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
11d20 50 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f  PRAGMA database_
11d30 6c 69 73 74 3b 20 22 2c 20 63 61 6c 6c 62 61 63  list; ", callbac
11d40 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
11d50 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  sg);.    if( zEr
11d60 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70  rMsg ){.      fp
11d70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
11d80 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
11d90 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
11da0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
11db0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
11dc0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
11dd0 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
11de0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
11df0 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20  , "dump", n)==0 
11e00 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
11e10 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 57 68 65  , 0);.    /* Whe
11e20 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 61  n playing back a
11e30 20 22 64 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e   "dump", the con
11e40 74 65 6e 74 20 6d 69 67 68 74 20 61 70 70 65 61  tent might appea
11e50 72 20 69 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20  r in an order.  
11e60 20 20 2a 2a 20 77 68 69 63 68 20 63 61 75 73 65    ** which cause
11e70 73 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  s immediate fore
11e80 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
11e90 6e 74 73 20 74 6f 20 62 65 20 76 69 6f 6c 61 74  nts to be violat
11ea0 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69  ed..    ** So di
11eb0 73 61 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65  sable foreign-ke
11ec0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66  y constraint enf
11ed0 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70 72 65 76  orcement to prev
11ee0 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f  ent problems. */
11ef0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31  .    if( nArg!=1
11f00 20 26 26 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20   && nArg!=2 ){. 
11f10 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
11f20 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75  err, "Usage: .du
11f30 6d 70 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e  mp ?LIKE-PATTERN
11f40 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ?\n");.      rc 
11f50 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
11f60 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
11f70 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  t;.    }.    fpr
11f80 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
11f90 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
11fa0 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20  s=OFF;\n");.    
11fb0 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
11fc0 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49  "BEGIN TRANSACTI
11fd0 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e  ON;\n");.    p->
11fe0 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
11ff0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
12000 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56  exec(p->db, "SAV
12010 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41  EPOINT dump; PRA
12020 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
12030 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30  ema=ON", 0, 0, 0
12040 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d  );.    p->nErr =
12050 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   0;.    if( nArg
12060 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 75 6e  ==1 ){.      run
12070 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
12080 72 79 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22  ry(p, .        "
12090 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
120a0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
120b0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
120c0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
120d0 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
120e0 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  =='table' AND na
120f0 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me!='sqlite_sequ
12100 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a  ence'".      );.
12110 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
12120 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 0a  _dump_query(p, .
12130 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
12140 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
12150 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
12160 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
12170 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74  ERE name=='sqlit
12180 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20  e_sequence'".   
12190 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f     );.      run_
121a0 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
121b0 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  (p,.        "SEL
121c0 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
121d0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
121e0 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
121f0 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70  NOT NULL AND typ
12200 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74  e IN ('index','t
12210 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22  rigger','view')"
12220 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
12230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
12240 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
12250 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
12260 7b 0a 20 20 20 20 20 20 20 20 7a 53 68 65 6c 6c  {.        zShell
12270 53 74 61 74 69 63 20 3d 20 61 7a 41 72 67 5b 69  Static = azArg[i
12280 5d 3b 0a 20 20 20 20 20 20 20 20 72 75 6e 5f 73  ];.        run_s
12290 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
122a0 28 70 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  (p,.          "S
122b0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
122c0 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
122d0 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
122e0 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f       "WHERE tbl_
122f0 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73  name LIKE shells
12300 74 61 74 69 63 28 29 20 41 4e 44 20 74 79 70 65  tatic() AND type
12310 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20 20 20 20  =='table'".     
12320 20 20 20 20 20 22 20 20 41 4e 44 20 73 71 6c 20       "  AND sql 
12330 4e 4f 54 20 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  NOT NULL");.    
12340 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75      run_table_du
12350 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20  mp_query(p,.    
12360 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
12370 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
12380 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20  ster ".         
12390 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20   "WHERE sql NOT 
123a0 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20  NULL".          
123b0 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  "  AND type IN (
123c0 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
123d0 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20  ','view')".     
123e0 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f       "  AND tbl_
123f0 6e 61 6d 65 20 4c 49 4b 45 20 73 68 65 6c 6c 73  name LIKE shells
12400 74 61 74 69 63 28 29 22 2c 20 30 0a 20 20 20 20  tatic()", 0.    
12410 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7a      );.        z
12420 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 30 3b  ShellStatic = 0;
12430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12440 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62     if( p->writab
12450 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
12460 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
12470 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
12480 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e  le_schema=OFF;\n
12490 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69  ");.      p->wri
124a0 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b  tableSchema = 0;
124b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
124c0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
124d0 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
124e0 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c  schema=OFF;", 0,
124f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12500 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
12510 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c  "RELEASE dump;",
12520 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66   0, 0, 0);.    f
12530 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70  printf(p->out, p
12540 2d 3e 6e 45 72 72 20 3f 20 22 52 4f 4c 4c 42 41  ->nErr ? "ROLLBA
12550 43 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20 65 72  CK; -- due to er
12560 72 6f 72 73 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49  rors\n" : "COMMI
12570 54 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a  T;\n");.  }else.
12580 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
12590 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
125a0 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30  ], "echo", n)==0
125b0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
125c0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==2 ){.      p->
125d0 65 63 68 6f 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e  echoOn = boolean
125e0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
125f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12600 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
12610 2c 20 22 55 73 61 67 65 3a 20 2e 65 63 68 6f 20  , "Usage: .echo 
12620 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
12630 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
12640 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
12650 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
12660 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70 22  (azArg[0], "eqp"
12670 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
12680 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
12690 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
126a0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
126b0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
126c0 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  se{.      fprint
126d0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
126e0 3a 20 2e 65 71 70 20 6f 6e 7c 6f 66 66 5c 6e 22  : .eqp on|off\n"
126f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
12700 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73  .    }   .  }els
12710 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  e..  if( c=='e' 
12720 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
12730 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d  [0], "exit", n)=
12740 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
12750 72 67 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69  rg>1 && (rc = (i
12760 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
12770 61 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20  azArg[1]))!=0 ) 
12780 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63  exit(rc);.    rc
12790 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 2;.  }else.. 
127a0 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
127b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
127c0 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d   "explain", n)==
127d0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c  0 ){.    int val
127e0 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 62 6f 6f   = nArg>=2 ? boo
127f0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
12800 31 5d 29 20 3a 20 31 3b 0a 20 20 20 20 69 66 28  1]) : 1;.    if(
12810 76 61 6c 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20  val == 1) {.    
12820 20 20 69 66 28 21 70 2d 3e 6e 6f 72 6d 61 6c 4d    if(!p->normalM
12830 6f 64 65 2e 76 61 6c 69 64 29 20 7b 0a 20 20 20  ode.valid) {.   
12840 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f       p->normalMo
12850 64 65 2e 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20  de.valid = 1;.  
12860 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d        p->normalM
12870 6f 64 65 2e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  ode.mode = p->mo
12880 64 65 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  de;.        p->n
12890 6f 72 6d 61 6c 4d 6f 64 65 2e 73 68 6f 77 48 65  ormalMode.showHe
128a0 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  ader = p->showHe
128b0 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65  ader;.        me
128c0 6d 63 70 79 28 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f  mcpy(p->normalMo
128d0 64 65 2e 63 6f 6c 57 69 64 74 68 2c 70 2d 3e 63  de.colWidth,p->c
128e0 6f 6c 57 69 64 74 68 2c 73 69 7a 65 6f 66 28 70  olWidth,sizeof(p
128f0 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a 20 20  ->colWidth));.  
12900 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 57      }.      /* W
12910 65 20 63 6f 75 6c 64 20 70 75 74 20 74 68 69 73  e could put this
12920 20 63 6f 64 65 20 75 6e 64 65 72 20 74 68 65 20   code under the 
12930 21 70 2d 3e 65 78 70 6c 61 69 6e 56 61 6c 69 64  !p->explainValid
12940 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  .      ** condit
12950 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74 20 64  ion so that it d
12960 6f 65 73 20 6e 6f 74 20 65 78 65 63 75 74 65 20  oes not execute 
12970 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
12980 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  y in.      ** ex
12990 70 6c 61 69 6e 20 6d 6f 64 65 2e 20 48 6f 77 65  plain mode. Howe
129a0 76 65 72 2c 20 61 6c 77 61 79 73 20 65 78 65 63  ver, always exec
129b0 75 74 69 6e 67 20 69 74 20 61 6c 6c 6f 77 73 20  uting it allows 
129c0 75 73 20 61 6e 20 65 61 73 79 0a 20 20 20 20 20  us an easy.     
129d0 20 2a 2a 20 77 61 73 20 74 6f 20 72 65 73 65 74   ** was to reset
129e0 20 74 6f 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65   to explain mode
129f0 20 69 6e 20 63 61 73 65 20 74 68 65 20 75 73 65   in case the use
12a00 72 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20  r previously.   
12a10 20 20 20 2a 2a 20 64 69 64 20 61 6e 20 2e 65 78     ** did an .ex
12a20 70 6c 61 69 6e 20 66 6f 6c 6c 6f 77 65 64 20 62  plain followed b
12a30 79 20 61 20 2e 77 69 64 74 68 2c 20 2e 6d 6f 64  y a .width, .mod
12a40 65 20 6f 72 20 2e 68 65 61 64 65 72 0a 20 20 20  e or .header.   
12a50 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20     ** command.. 
12a60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
12a70 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  >mode = MODE_Exp
12a80 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 73  lain;.      p->s
12a90 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b 0a 20  howHeader = 1;. 
12aa0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 63       memset(p->c
12ab0 6f 6c 57 69 64 74 68 2c 30 2c 73 69 7a 65 6f 66  olWidth,0,sizeof
12ac0 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 29 3b 0a  (p->colWidth));.
12ad0 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74        p->colWidt
12ae0 68 5b 30 5d 20 3d 20 34 3b 20 20 20 20 20 20 20  h[0] = 4;       
12af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
12b00 64 72 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63  dr */.      p->c
12b10 6f 6c 57 69 64 74 68 5b 31 5d 20 3d 20 31 33 3b  olWidth[1] = 13;
12b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b30 20 2f 2a 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* opcode */.  
12b40 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
12b50 32 5d 20 3d 20 34 3b 20 20 20 20 20 20 20 20 20  2] = 4;         
12b60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
12b70 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69  /.      p->colWi
12b80 64 74 68 5b 33 5d 20 3d 20 34 3b 20 20 20 20 20  dth[3] = 4;     
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ba0 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 63  P2 */.      p->c
12bb0 6f 6c 57 69 64 74 68 5b 34 5d 20 3d 20 34 3b 20  olWidth[4] = 4; 
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bd0 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20   /* P3 */.      
12be0 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 35 5d 20 3d  p->colWidth[5] =
12bf0 20 31 33 3b 20 20 20 20 20 20 20 20 20 20 20 20   13;            
12c00 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20       /* P4 */.  
12c10 20 20 20 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b      p->colWidth[
12c20 36 5d 20 3d 20 32 3b 20 20 20 20 20 20 20 20 20  6] = 2;         
12c30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 2a           /* P5 *
12c40 2f 0a 20 20 20 20 20 20 70 2d 3e 63 6f 6c 57 69  /.      p->colWi
12c50 64 74 68 5b 37 5d 20 3d 20 31 33 3b 20 20 20 20  dth[7] = 13;    
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c70 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
12c80 7d 65 6c 73 65 20 69 66 20 28 70 2d 3e 6e 6f 72  }else if (p->nor
12c90 6d 61 6c 4d 6f 64 65 2e 76 61 6c 69 64 29 20 7b  malMode.valid) {
12ca0 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c  .      p->normal
12cb0 4d 6f 64 65 2e 76 61 6c 69 64 20 3d 20 30 3b 0a  Mode.valid = 0;.
12cc0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
12cd0 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 2e 6d 6f  p->normalMode.mo
12ce0 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f  de;.      p->sho
12cf0 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 6e 6f 72  wHeader = p->nor
12d00 6d 61 6c 4d 6f 64 65 2e 73 68 6f 77 48 65 61 64  malMode.showHead
12d10 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  er;.      memcpy
12d20 28 70 2d 3e 63 6f 6c 57 69 64 74 68 2c 70 2d 3e  (p->colWidth,p->
12d30 6e 6f 72 6d 61 6c 4d 6f 64 65 2e 63 6f 6c 57 69  normalMode.colWi
12d40 64 74 68 2c 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  dth,sizeof(p->co
12d50 6c 57 69 64 74 68 29 29 3b 0a 20 20 20 20 7d 0a  lWidth));.    }.
12d60 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
12d70 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63 6d 70  =='f' && strncmp
12d80 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c  (azArg[0], "full
12d90 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29  schema", n)==0 )
12da0 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  {.    ShellState
12db0 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
12dc0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
12dd0 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20 3d 20    int doStats = 
12de0 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  0;.    if( nArg!
12df0 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =1 ){.      fpri
12e00 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
12e10 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61 5c  ge: .fullschema\
12e20 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
12e30 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
12e40 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
12e50 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
12e60 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
12e70 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
12e80 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
12e90 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
12ea0 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
12eb0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69  mode = MODE_Semi
12ec0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12ed0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
12ee0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
12ef0 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22  l FROM".       "
12f00 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71    (SELECT sql sq
12f10 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74 62  l, type type, tb
12f20 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c  l_name tbl_name,
12f30 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69   name name, rowi
12f40 64 20 78 22 0a 20 20 20 20 20 20 20 22 20 20 20  d x".       "   
12f50 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61    FROM sqlite_ma
12f60 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a  ster UNION ALL".
12f70 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43         "   SELEC
12f80 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c  T sql, type, tbl
12f90 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77  _name, name, row
12fa0 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  id FROM sqlite_t
12fb0 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20  emp_master) ".  
12fc0 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
12fd0 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c  !='meta' AND sql
12fe0 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d   NOTNULL AND nam
12ff0 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
13000 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22  te_%' ".       "
13010 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c  ORDER BY rowid",
13020 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b  .       callback
13030 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
13040 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  g.    );.    if(
13050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13060 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
13070 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
13080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13090 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
130a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
130b0 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   "SELECT rowid F
130c0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
130d0 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
130e0 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47    " WHERE name G
130f0 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74  LOB 'sqlite_stat
13100 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20  [134]'",.       
13110 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74          -1, &pSt
13120 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f  mt, 0);.      do
13130 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f  Stats = sqlite3_
13140 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
13150 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73  ITE_ROW;.      s
13160 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13170 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
13180 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30    if( doStats==0
13190 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
131a0 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f  f(p->out, "/* No
131b0 20 53 54 41 54 20 74 61 62 6c 65 73 20 61 76 61   STAT tables ava
131c0 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20  ilable */\n");. 
131d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
131e0 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
131f0 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
13200 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20  master;\n");.   
13210 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
13220 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27  p->db, "SELECT '
13230 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
13240 61 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20  aster'",.       
13250 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c              call
13260 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
13270 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61  rrMsg);.      da
13280 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  ta.mode = MODE_I
13290 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61 74  nsert;.      dat
132a0 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
132b0 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a 20  sqlite_stat1";. 
132c0 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
132d0 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  p->db, "SELECT *
132e0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
132f0 74 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t1",.           
13300 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c        shell_call
13310 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72  back, &data,&zEr
13320 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
13330 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
13340 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20  sqlite_stat3";. 
13350 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
13360 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  p->db, "SELECT *
13370 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
13380 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t3",.           
13390 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c        shell_call
133a0 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72  back, &data,&zEr
133b0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
133c0 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
133d0 73 71 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a 20  sqlite_stat4";. 
133e0 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
133f0 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  p->db, "SELECT *
13400 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
13410 74 34 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t4",.           
13420 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c        shell_call
13430 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
13440 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 66 70  rrMsg);.      fp
13450 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41  rintf(p->out, "A
13460 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
13470 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  ster;\n");.    }
13480 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
13490 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  c=='h' && strncm
134a0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61  p(azArg[0], "hea
134b0 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ders", n)==0 ){.
134c0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
134d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77  ){.      p->show
134e0 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e  Header = boolean
134f0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
13500 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13510 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
13520 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61 64 65  , "Usage: .heade
13530 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  rs on|off\n");. 
13540 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
13550 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
13560 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e  ( c=='h' && strn
13570 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68  cmp(azArg[0], "h
13580 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  elp", n)==0 ){. 
13590 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
135a0 74 2c 20 22 25 73 22 2c 20 7a 48 65 6c 70 29 3b  t, "%s", zHelp);
135b0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
135c0 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
135d0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70  p(azArg[0], "imp
135e0 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ort", n)==0 ){. 
135f0 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13610 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
13620 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
13630 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
13640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13650 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
13660 20 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65 6e   to extra conten
13670 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71  t from */.    sq
13680 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
13690 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73  t = NULL; /* A s
136a0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
136b0 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
136c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
136d0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
136e0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
136f0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
13720 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
13730 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
13740 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
13750 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13760 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
13770 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20  int needCommit; 
13780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13790 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72  rue to COMMIT or
137a0 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64   ROLLBACK at end
137b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
137c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
137d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
137e0 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 73 65 70   bytes in p->sep
137f0 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20  arator[] */.    
13800 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
13810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13820 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
13830 2a 2f 0a 20 20 20 20 43 53 56 52 65 61 64 65 72  */.    CSVReader
13840 20 73 43 73 76 3b 20 20 20 20 20 20 20 20 20 20   sCsv;          
13850 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e     /* Reader con
13860 74 65 78 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  text */.    int 
13870 28 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a  (*xCloser)(FILE*
13880 29 3b 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65  );      /* Proce
13890 64 75 72 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  dure to close th
138a0 33 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  3 connection */.
138b0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33  .    if( nArg!=3
138c0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
138d0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
138e0 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54  : .import FILE T
138f0 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ABLE\n");.      
13900 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
13910 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
13920 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b    zFile = azArg[
13930 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d  1];.    zTable =
13940 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73   azArg[2];.    s
13950 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30  eenInterrupt = 0
13960 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43  ;.    memset(&sC
13970 73 76 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43  sv, 0, sizeof(sC
13980 73 76 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64  sv));.    open_d
13990 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65  b(p, 0);.    nSe
139a0 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e  p = strlen30(p->
139b0 73 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  separator);.    
139c0 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
139d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
139e0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e  err, "Error: non
139f0 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20  -null separator 
13a00 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70  required for imp
13a10 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
13a20 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
13a30 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b     if( nSep>1 ){
13a40 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
13a50 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
13a60 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 73  ulti-character s
13a70 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c  eparators not al
13a80 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20 20 20  lowed".         
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66               " f
13aa0 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
13ab0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
13ac0 20 20 20 7d 0a 20 20 20 20 73 43 73 76 2e 7a 46     }.    sCsv.zF
13ad0 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20  ile = zFile;.   
13ae0 20 73 43 73 76 2e 6e 4c 69 6e 65 20 3d 20 31 3b   sCsv.nLine = 1;
13af0 0a 20 20 20 20 69 66 28 20 73 43 73 76 2e 7a 46  .    if( sCsv.zF
13b00 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 20  ile[0]=='|' ){. 
13b10 20 20 20 20 20 73 43 73 76 2e 69 6e 20 3d 20 70       sCsv.in = p
13b20 6f 70 65 6e 28 73 43 73 76 2e 7a 46 69 6c 65 2b  open(sCsv.zFile+
13b30 31 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73  1, "r");.      s
13b40 43 73 76 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69  Csv.zFile = "<pi
13b50 70 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f  pe>";.      xClo
13b60 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 20 20  ser = pclose;.  
13b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
13b80 43 73 76 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73  Csv.in = fopen(s
13b90 43 73 76 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29  Csv.zFile, "rb")
13ba0 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20  ;.      xCloser 
13bb0 3d 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a  = fclose;.    }.
13bc0 20 20 20 20 69 66 28 20 73 43 73 76 2e 69 6e 3d      if( sCsv.in=
13bd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
13be0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
13bf0 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
13c00 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
13c10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13c20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 73  1;.    }.    sCs
13c30 76 2e 63 53 65 70 61 72 61 74 6f 72 20 3d 20 70  v.cSeparator = p
13c40 2d 3e 73 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a  ->separator[0];.
13c50 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
13c60 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
13c70 43 54 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a  CT * FROM %s", z
13c80 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
13c90 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
13ca0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
13cb0 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
13cc0 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
13cd0 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69    xCloser(sCsv.i
13ce0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
13cf0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42   1;.    }.    nB
13d00 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  yte = strlen30(z
13d10 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Sql);.    rc = s
13d20 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
13d30 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
13d40 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
13d50 20 20 20 63 73 76 5f 61 70 70 65 6e 64 5f 63 68     csv_append_ch
13d60 61 72 28 26 73 43 73 76 2c 20 30 29 3b 20 20 20  ar(&sCsv, 0);   
13d70 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 73 43   /* To ensure sC
13d80 73 76 2e 7a 20 69 73 20 61 6c 6c 6f 63 61 74 65  sv.z is allocate
13d90 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 20  d */.    if( rc 
13da0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  && sqlite3_strgl
13db0 6f 62 28 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  ob("no such tabl
13dc0 65 3a 20 2a 22 2c 20 73 71 6c 69 74 65 33 5f 65  e: *", sqlite3_e
13dd0 72 72 6d 73 67 28 64 62 29 29 3d 3d 30 20 29 7b  rrmsg(db))==0 ){
13de0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72  .      char *zCr
13df0 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
13e00 70 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 54  printf("CREATE T
13e10 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c 65  ABLE %s", zTable
13e20 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 53  );.      char cS
13e30 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20 20 20  ep = '(';.      
13e40 77 68 69 6c 65 28 20 63 73 76 5f 72 65 61 64 5f  while( csv_read_
13e50 6f 6e 65 5f 66 69 65 6c 64 28 26 73 43 73 76 29  one_field(&sCsv)
13e60 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65   ){.        zCre
13e70 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
13e80 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c  rintf("%z%c\n  \
13e90 22 25 73 5c 22 20 54 45 58 54 22 2c 20 7a 43 72  "%s\" TEXT", zCr
13ea0 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43 73 76  eate, cSep, sCsv
13eb0 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65  .z);.        cSe
13ec0 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  p = ',';.       
13ed0 20 69 66 28 20 73 43 73 76 2e 63 54 65 72 6d 21   if( sCsv.cTerm!
13ee0 3d 73 43 73 76 2e 63 53 65 70 61 72 61 74 6f 72  =sCsv.cSeparator
13ef0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
13f00 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53 65 70  }.      if( cSep
13f10 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
13f20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
13f30 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20  reate);.        
13f40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 73  sqlite3_free(sCs
13f50 76 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43  v.z);.        xC
13f60 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29 3b 0a  loser(sCsv.in);.
13f70 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
13f80 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70 74  stderr,"%s: empt
13f90 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 73 76 2e  y file\n", sCsv.
13fa0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
13fb0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
13fc0 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65 20  }.      zCreate 
13fd0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
13fe0 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61  f("%z\n)", zCrea
13ff0 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  te);.      rc = 
14000 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
14010 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20  db, zCreate, 0, 
14020 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
14030 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74  ite3_free(zCreat
14040 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
14050 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
14060 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 52 45  ntf(stderr, "CRE
14070 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e  ATE TABLE %s(...
14080 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c  ) failed: %s\n",
14090 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20   zTable,.       
140a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
140b0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
140c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
140d0 65 65 28 73 43 73 76 2e 7a 29 3b 0a 20 20 20 20  ee(sCsv.z);.    
140e0 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 73 76      xCloser(sCsv
140f0 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  .in);.        re
14100 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
14110 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14120 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
14130 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
14140 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
14150 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14160 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
14170 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 20   rc ){.      if 
14180 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33 5f  (pStmt) sqlite3_
14190 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
141a0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
141b0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
141c0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
141d0 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
141e0 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29  xCloser(sCsv.in)
141f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
14200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
14210 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
14220 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
14230 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
14240 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
14250 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
14260 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65  if( nCol==0 ) re
14270 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f  turn 0; /* no co
14280 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20  lumns, no error 
14290 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  */.    zSql = sq
142a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
142b0 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f  yte*2 + 20 + nCo
142c0 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  l*2 );.    if( z
142d0 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
142e0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
142f0 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d  "Error: out of m
14300 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  emory\n");.     
14310 20 78 43 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e   xCloser(sCsv.in
14320 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14330 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
14340 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
14350 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49  yte+20, zSql, "I
14360 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c  NSERT INTO \"%w\
14370 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
14380 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
14390 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
143a0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
143b0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
143c0 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
143d0 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
143e0 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
143f0 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
14400 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
14410 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
14420 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
14430 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
14440 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
14450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
14460 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
14470 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
14480 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
14490 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
144a0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
144b0 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c    if (pStmt) sql
144c0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
144d0 74 6d 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  tmt);.      xClo
144e0 73 65 72 28 73 43 73 76 2e 69 6e 29 3b 0a 20 20  ser(sCsv.in);.  
144f0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
14500 20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d    }.    needComm
14510 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  it = sqlite3_get
14520 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 3b  _autocommit(db);
14530 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d  .    if( needCom
14540 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78  mit ) sqlite3_ex
14550 65 63 28 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  ec(db, "BEGIN", 
14560 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f  0, 0, 0);.    do
14570 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72  {.      int star
14580 74 4c 69 6e 65 20 3d 20 73 43 73 76 2e 6e 4c 69  tLine = sCsv.nLi
14590 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
145a0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
145b0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
145c0 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f   = csv_read_one_
145d0 66 69 65 6c 64 28 26 73 43 73 76 29 3b 0a 20 20  field(&sCsv);.  
145e0 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 26        if( z==0 &
145f0 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  & i==0 ) break;.
14600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14610 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
14620 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c   i+1, z, -1, SQL
14630 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
14640 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
14650 6f 6c 2d 31 20 26 26 20 73 43 73 76 2e 63 54 65  ol-1 && sCsv.cTe
14660 72 6d 21 3d 73 43 73 76 2e 63 53 65 70 61 72 61  rm!=sCsv.cSepara
14670 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tor ){.         
14680 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14690 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65   "%s:%d: expecte
146a0 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74  d %d columns but
146b0 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20   found %d - ".  
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146d0 20 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67          "filling
146e0 20 74 68 65 20 72 65 73 74 20 77 69 74 68 20 4e   the rest with N
146f0 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ULL\n",.        
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 73 43 73 76 2e 7a 46 69 6c 65 2c 20 73 74    sCsv.zFile, st
14720 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69  artLine, nCol, i
14730 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
14740 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  ++;.          wh
14750 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b 20  ile( i<=nCol ){ 
14760 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
14770 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b  l(pStmt, i); i++
14780 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
14790 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
147a0 73 43 73 76 2e 63 54 65 72 6d 3d 3d 73 43 73 76  sCsv.cTerm==sCsv
147b0 2e 63 53 65 70 61 72 61 74 6f 72 20 29 7b 0a 20  .cSeparator ){. 
147c0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
147d0 20 20 20 20 20 63 73 76 5f 72 65 61 64 5f 6f 6e       csv_read_on
147e0 65 5f 66 69 65 6c 64 28 26 73 43 73 76 29 3b 0a  e_field(&sCsv);.
147f0 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
14800 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 73         }while( s
14810 43 73 76 2e 63 54 65 72 6d 3d 3d 73 43 73 76 2e  Csv.cTerm==sCsv.
14820 63 53 65 70 61 72 61 74 6f 72 20 29 3b 0a 20 20  cSeparator );.  
14830 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
14840 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78  derr, "%s:%d: ex
14850 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
14860 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d  s but found %d -
14870 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
14880 20 20 20 20 20 20 20 20 20 20 20 22 65 78 74 72             "extr
14890 61 73 20 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20  as ignored\n",. 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 20 20 73 43 73 76 2e 7a 46 69 6c         sCsv.zFil
148c0 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43  e, startLine, nC
148d0 6f 6c 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  ol, i);.      }.
148e0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f        if( i>=nCo
148f0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
14900 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
14910 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
14920 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
14930 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mt);.        if(
14940 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14950 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
14960 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
14970 25 64 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65  %d: INSERT faile
14980 64 3a 20 25 73 5c 6e 22 2c 20 73 43 73 76 2e 7a  d: %s\n", sCsv.z
14990 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
149a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
149b0 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
149c0 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  g(db));.        
149d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
149e0 68 69 6c 65 28 20 73 43 73 76 2e 63 54 65 72 6d  hile( sCsv.cTerm
149f0 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43  !=EOF );..    xC
14a00 6c 6f 73 65 72 28 73 43 73 76 2e 69 6e 29 3b 0a  loser(sCsv.in);.
14a10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14a20 28 73 43 73 76 2e 7a 29 3b 0a 20 20 20 20 73 71  (sCsv.z);.    sq
14a30 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
14a40 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
14a50 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69  eedCommit ) sqli
14a60 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 43 4f  te3_exec(db, "CO
14a70 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MMIT", 0, 0, 0);
14a80 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
14a90 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
14aa0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64  p(azArg[0], "ind
14ab0 69 63 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ices", n)==0 ){.
14ac0 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64      ShellState d
14ad0 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
14ae0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
14af0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
14b00 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c     memcpy(&data,
14b10 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29   p, sizeof(data)
14b20 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77  );.    data.show
14b30 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
14b40 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
14b50 5f 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 6e  _List;.    if( n
14b60 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
14b70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
14b80 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  c(p->db,.       
14b90 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
14ba0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
14bb0 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
14bc0 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41  E type='index' A
14bd0 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45  ND name NOT LIKE
14be0 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a 20 20   'sqlite_%' ".  
14bf0 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c        "UNION ALL
14c00 20 22 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45   ".        "SELE
14c10 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
14c20 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
14c30 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
14c40 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 22 0a   type='index' ".
14c50 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
14c60 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20 63 61  Y 1",.        ca
14c70 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
14c80 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b  zErrMsg.      );
14c90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
14ca0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
14cb0 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d 20 61  zShellStatic = a
14cc0 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 72  zArg[1];.      r
14cd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
14ce0 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
14cf0 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
14d00 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
14d10 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
14d20 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e   type='index' AN
14d30 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
14d40 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20 22 0a  shellstatic() ".
14d50 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41          "UNION A
14d60 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 22 53 45  LL ".        "SE
14d70 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
14d80 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
14d90 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
14da0 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
14db0 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  AND tbl_name LIK
14dc0 45 20 73 68 65 6c 6c 73 74 61 74 69 63 28 29 20  E shellstatic() 
14dd0 22 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ".        "ORDER
14de0 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20   BY 1",.        
14df0 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
14e00 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 20 20   &zErrMsg.      
14e10 29 3b 0a 20 20 20 20 20 20 7a 53 68 65 6c 6c 53  );.      zShellS
14e20 74 61 74 69 63 20 3d 20 30 3b 0a 20 20 20 20 7d  tatic = 0;.    }
14e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
14e40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
14e50 67 65 3a 20 2e 69 6e 64 69 63 65 73 20 3f 4c 49  ge: .indices ?LI
14e60 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b  KE-PATTERN?\n");
14e70 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
14e80 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
14e90 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
14ea0 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d   }.    if( zErrM
14eb0 73 67 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  sg ){.      fpri
14ec0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
14ed0 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
14ee0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
14ef0 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
14f00 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
14f10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20     }else if( rc 
14f20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  != SQLITE_OK ){.
14f30 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
14f40 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65  derr,"Error: que
14f50 72 79 69 6e 67 20 73 71 6c 69 74 65 5f 6d 61 73  rying sqlite_mas
14f60 74 65 72 20 61 6e 64 20 73 71 6c 69 74 65 5f 74  ter and sqlite_t
14f70 65 6d 70 5f 6d 61 73 74 65 72 5c 6e 22 29 3b 0a  emp_master\n");.
14f80 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
14f90 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
14fa0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14fb0 45 5f 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20  E_IOTRACE.  if( 
14fc0 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
14fd0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74  p(azArg[0], "iot
14fe0 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  race", n)==0 ){.
14ff0 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
15000 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  (*sqlite3IoTrace
15010 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e  )(const char*, .
15020 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74  ..);.    if( iot
15030 72 61 63 65 20 26 26 20 69 6f 74 72 61 63 65 21  race && iotrace!
15040 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65  =stdout ) fclose
15050 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69  (iotrace);.    i
15060 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  otrace = 0;.    
15070 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
15080 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
15090 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ce = 0;.    }els
150a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
150b0 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29  rg[1], "-")==0 )
150c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
150d0 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65  oTrace = iotrace
150e0 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f  Printf;.      io
150f0 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a  trace = stdout;.
15100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15110 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e   iotrace = fopen
15120 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b  (azArg[1], "w");
15130 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74 72 61  .      if( iotra
15140 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ce==0 ){.       
15150 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
15160 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
15170 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
15180 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
15190 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
151a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
151b0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 1;.      }el
151c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
151d0 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74  te3IoTrace = iot
151e0 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20  racePrintf;.    
151f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
15200 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  e.#endif..#ifnde
15210 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
15220 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69  AD_EXTENSION.  i
15230 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72  f( c=='l' && str
15240 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
15250 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  load", n)==0 ){.
15260 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15270 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20  zFile, *zProc;. 
15280 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
15290 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
152a0 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 66 70  rg<2 ){.      fp
152b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
152c0 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45  sage: .load FILE
152d0 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22   ?ENTRYPOINT?\n"
152e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
152f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
15300 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
15310 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d     }.    zFile =
15320 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a   azArg[1];.    z
15330 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f  Proc = nArg>=3 ?
15340 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20   azArg[2] : 0;. 
15350 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
15360 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
15370 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
15380 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20  n(p->db, zFile, 
15390 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29  zProc, &zErrMsg)
153a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
153b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
153c0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
153d0 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
153e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
153f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
15400 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20  rMsg);.      rc 
15410 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
15420 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
15430 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63   c=='l' && strnc
15440 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f  mp(azArg[0], "lo
15450 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  g", n)==0 ){.   
15460 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
15470 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
15480 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c  derr, "Usage: .l
15490 6f 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b  og FILENAME\n");
154a0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
154b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
154c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
154d0 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  e = azArg[1];.  
154e0 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f      output_file_
154f0 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a  close(p->pLog);.
15500 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20        p->pLog = 
15510 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
15520 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (zFile);.    }. 
15530 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
15540 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='m' && strncmp(
15550 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22  azArg[0], "mode"
15560 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
15570 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65  onst char *zMode
15580 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
15590 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20  rg[1] : "";.    
155a0 69 6e 74 20 6e 32 20 3d 20 28 69 6e 74 29 73 74  int n2 = (int)st
155b0 72 6c 65 6e 28 7a 4d 6f 64 65 29 3b 0a 20 20 20  rlen(zMode);.   
155c0 20 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64 65 5b   int c2 = zMode[
155d0 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 32 3d 3d  0];.    if( c2==
155e0 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73  'l' && n2>2 && s
155f0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
15600 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29  "lines",n2)==0 )
15610 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
15620 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20  = MODE_Line;.   
15630 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
15640 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
15650 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22  Arg[1],"columns"
15660 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
15670 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
15680 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 65 6c 73  Column;.    }els
15690 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26  e if( c2=='l' &&
156a0 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70   n2>2 && strncmp
156b0 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22  (azArg[1],"list"
156c0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
156d0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
156e0 4c 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  List;.    }else 
156f0 69 66 28 20 63 32 3d 3d 27 68 27 20 26 26 20 73  if( c2=='h' && s
15700 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
15710 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b  "html",n2)==0 ){
15720 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
15730 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20   MODE_Html;.    
15740 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74  }else if( c2=='t
15750 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
15760 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d  rg[1],"tcl",n2)=
15770 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
15780 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a  ode = MODE_Tcl;.
15790 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
157a0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
157b0 3e 73 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  >separator), p->
157c0 73 65 70 61 72 61 74 6f 72 2c 20 22 20 22 29 3b  separator, " ");
157d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
157e0 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d  2=='c' && strncm
157f0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22  p(azArg[1],"csv"
15800 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
15810 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
15820 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Csv;.      sqlit
15830 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
15840 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  of(p->separator)
15850 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20  , p->separator, 
15860 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
15870 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
15880 65 6f 66 28 70 2d 3e 6e 65 77 6c 69 6e 65 29 2c  eof(p->newline),
15890 20 70 2d 3e 6e 65 77 6c 69 6e 65 2c 20 22 5c 72   p->newline, "\r
158a0 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  \n");.    }else 
158b0 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73  if( c2=='t' && s
158c0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
158d0 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  "tabs",n2)==0 ){
158e0 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
158f0 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
15900 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
15910 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 73 65 70  tf(sizeof(p->sep
15920 61 72 61 74 6f 72 29 2c 20 70 2d 3e 73 65 70 61  arator), p->sepa
15930 72 61 74 6f 72 2c 20 22 5c 74 22 29 3b 0a 20 20  rator, "\t");.  
15940 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
15950 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
15960 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22  zArg[1],"insert"
15970 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
15980 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
15990 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65  Insert;.      se
159a0 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20  t_table_name(p, 
159b0 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b  nArg>=3 ? azArg[
159c0 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20  2] : "table");. 
159d0 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20     }else {.     
159e0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
159f0 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f  "Error: mode sho
15a00 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22  uld be one of: "
15a10 0a 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  .         "colum
15a20 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65 72  n csv html inser
15a30 74 20 6c 69 6e 65 20 6c 69 73 74 20 74 61 62 73  t line list tabs
15a40 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20   tcl\n");.      
15a50 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
15a60 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
15a70 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'n' && strncmp(a
15a80 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61  zArg[0], "nullva
15a90 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  lue", n)==0 ){. 
15aa0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
15ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
15ac0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
15ad0 70 2d 3e 6e 75 6c 6c 76 61 6c 75 65 29 2c 20 70  p->nullvalue), p
15ae0 2d 3e 6e 75 6c 6c 76 61 6c 75 65 2c 0a 20 20 20  ->nullvalue,.   
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74      "%.*s", (int
15b10 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75  )ArraySize(p->nu
15b20 6c 6c 76 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72  llvalue)-1, azAr
15b30 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
15b40 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
15b50 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
15b60 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e  .nullvalue STRIN
15b70 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  G\n");.      rc 
15b80 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
15b90 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27  se..  if( c=='o'
15ba0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
15bb0 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e 29  g[0], "open", n)
15bc0 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29 7b 0a 20  ==0 && n>=2 ){. 
15bd0 20 20 20 73 71 6c 69 74 65 33 20 2a 73 61 76 65     sqlite3 *save
15be0 64 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  dDb = p->db;.   
15bf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
15c00 76 65 64 46 69 6c 65 6e 61 6d 65 20 3d 20 70 2d  vedFilename = p-
15c10 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  >zDbFilename;.  
15c20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65    char *zNewFile
15c30 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  name = 0;.    p-
15c40 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  >db = 0;.    if(
15c50 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20   nArg>=2 ){.    
15c60 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
15c70 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20   = zNewFilename 
15c80 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15c90 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d  f("%s", azArg[1]
15ca0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  );.    }.    ope
15cb0 6e 5f 64 62 28 70 2c 20 31 29 3b 0a 20 20 20 20  n_db(p, 1);.    
15cc0 69 66 28 20 70 2d 3e 64 62 21 3d 30 20 29 7b 0a  if( p->db!=0 ){.
15cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
15ce0 6f 73 65 28 73 61 76 65 64 44 62 29 3b 0a 20 20  ose(savedDb);.  
15cf0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15d00 28 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65  (p->zFreeOnClose
15d10 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 46 72 65  );.      p->zFre
15d20 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46  eOnClose = zNewF
15d30 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7d 65 6c  ilename;.    }el
15d40 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
15d50 33 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e  3_free(zNewFilen
15d60 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ame);.      p->d
15d70 62 20 3d 20 73 61 76 65 64 44 62 3b 0a 20 20 20  b = savedDb;.   
15d80 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
15d90 65 20 3d 20 7a 53 61 76 65 64 46 69 6c 65 6e 61  e = zSavedFilena
15da0 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  me;.    }.  }els
15db0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 0a  e..  if( c=='o'.
15dc0 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61     && (strncmp(a
15dd0 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74  zArg[0], "output
15de0 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e  ", n)==0 || strn
15df0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
15e00 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29  nce", n)==0).  )
15e10 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
15e20 20 2a 7a 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d   *zFile = nArg>=
15e30 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
15e40 73 74 64 6f 75 74 22 3b 0a 20 20 20 20 69 66 28  stdout";.    if(
15e50 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20   nArg>2 ){.     
15e60 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
15e70 20 22 55 73 61 67 65 3a 20 2e 25 73 20 46 49 4c   "Usage: .%s FIL
15e80 45 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  E\n", azArg[0]);
15e90 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
15ea0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
15eb0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
15ec0 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26   }.    if( n>1 &
15ed0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
15ee0 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d  0], "once", n)==
15ef0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
15f00 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  Arg<2 ){.       
15f10 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
15f20 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 46   "Usage: .once F
15f30 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ILE\n");.       
15f40 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
15f50 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
15f60 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
15f70 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75  .      p->outCou
15f80 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  nt = 2;.    }els
15f90 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43  e{.      p->outC
15fa0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ount = 0;.    }.
15fb0 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
15fc0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  (p);.    if( zFi
15fd0 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 20 20  le[0]=='|' ){.  
15fe0 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70      p->out = pop
15ff0 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77  en(zFile + 1, "w
16000 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
16010 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
16020 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16030 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  r,"Error: cannot
16040 20 6f 70 65 6e 20 70 69 70 65 20 5c 22 25 73 5c   open pipe \"%s\
16050 22 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29  "\n", zFile + 1)
16060 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74  ;.        p->out
16070 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20   = stdout;.     
16080 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
16090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
160a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
160b0 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69  (sizeof(p->outfi
160c0 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c  le), p->outfile,
160d0 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20   "%s", zFile);. 
160e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
160f0 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d  {.      p->out =
16100 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65   output_file_ope
16110 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  n(zFile);.      
16120 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b  if( p->out==0 ){
16130 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
16140 63 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66 22 29  cmp(zFile,"off")
16150 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
16160 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
16170 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77  "Error: cannot w
16180 72 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e  rite to \"%s\"\n
16190 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
161a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
161b0 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  out = stdout;.  
161c0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
161d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
161e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
161f0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
16200 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74  outfile), p->out
16210 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  file, "%s", zFil
16220 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16230 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
16240 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20   c=='p' && n>=3 
16250 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
16260 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29  [0], "print", n)
16270 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
16280 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
16290 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
162a0 20 20 20 69 66 28 20 69 3e 31 20 29 20 66 70 72     if( i>1 ) fpr
162b0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22  intf(p->out, " "
162c0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
162d0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61  (p->out, "%s", a
162e0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[i]);.    }.
162f0 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
16300 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c  ut, "\n");.  }el
16310 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27  se..  if( c=='p'
16320 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
16330 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20  g[0], "prompt", 
16340 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
16350 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20   nArg >= 2) {.  
16360 20 20 20 20 73 74 72 6e 63 70 79 28 6d 61 69 6e      strncpy(main
16370 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c  Prompt,azArg[1],
16380 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 6d  (int)ArraySize(m
16390 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20  ainPrompt)-1);. 
163a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
163b0 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20 20  g >= 3) {.      
163c0 73 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65  strncpy(continue
163d0 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c  Prompt,azArg[2],
163e0 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 63  (int)ArraySize(c
163f0 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31  ontinuePrompt)-1
16400 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
16410 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71 27 20 26  ..  if( c=='q' &
16420 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
16430 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d  0], "quit", n)==
16440 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b  0 ){.    rc = 2;
16450 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
16460 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26  c=='r' && n>=3 &
16470 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
16480 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d  0], "read", n)==
16490 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61  0 ){.    FILE *a
164a0 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  lt;.    if( nArg
164b0 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 66 70 72  !=2 ){.      fpr
164c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
164d0 61 67 65 3a 20 2e 72 65 61 64 20 46 49 4c 45 5c  age: .read FILE\
164e0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
164f0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
16500 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
16510 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 74 20 3d  .    }.    alt =
16520 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c   fopen(azArg[1],
16530 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
16540 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  alt==0 ){.      
16550 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
16560 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
16570 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  en \"%s\"\n", az
16580 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[1]);.      r
16590 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
165a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  {.      rc = pro
165b0 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c  cess_input(p, al
165c0 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65  t);.      fclose
165d0 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (alt);.    }.  }
165e0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
165f0 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  r' && n>=3 && st
16600 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
16610 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30  "restore", n)==0
16620 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
16630 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
16640 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
16650 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
16660 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
16670 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
16680 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
16690 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
166a0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
166b0 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a     zSrcFile = az
166c0 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44  Arg[1];.      zD
166d0 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
166e0 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
166f0 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46  3 ){.      zSrcF
16700 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  ile = azArg[2];.
16710 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72        zDb = azAr
16720 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  g[1];.    }else{
16730 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
16740 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
16750 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c  restore ?DB? FIL
16760 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
16770 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
16780 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
16790 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
167a0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
167b0 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b  SrcFile, &pSrc);
167c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
167d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
167e0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
167f0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
16800 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
16810 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  SrcFile);.      
16820 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
16830 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
16840 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  n 1;.    }.    o
16850 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
16860 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
16870 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
16880 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72 63  p->db, zDb, pSrc
16890 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69  , "main");.    i
168a0 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
168b0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
168c0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
168d0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
168e0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
168f0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
16900 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
16910 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
16920 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
16930 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
16940 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
16950 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
16960 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51         || rc==SQ
16970 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20 20  LITE_BUSY  ){.  
16980 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16990 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
169a0 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b     if( nTimeout+
169b0 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a  + >= 3 ) break;.
169c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
169d0 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20  sleep(100);.    
169e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
169f0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
16a00 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
16a10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16a20 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
16a30 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
16a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16a50 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
16a60 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  TE_LOCKED ){.   
16a70 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
16a80 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63  r, "Error: sourc
16a90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 62 75  e database is bu
16aa0 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  sy\n");.      rc
16ab0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
16ac0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
16ad0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
16ae0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
16af0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
16b00 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
16b10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
16b20 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c  ose(pSrc);.  }el
16b30 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
16b40 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
16b50 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20  g[0], "schema", 
16b60 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  n)==0 ){.    She
16b70 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20  llState data;.  
16b80 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
16b90 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
16ba0 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63  (p, 0);.    memc
16bb0 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
16bc0 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
16bd0 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
16be0 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 6d 6f  = 0;.    data.mo
16bf0 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a  de = MODE_Semi;.
16c00 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
16c10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
16c20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
16c30 7a 41 72 67 5b 31 5d 5b 69 5d 3b 20 69 2b 2b 29  zArg[1][i]; i++)
16c40 20 61 7a 41 72 67 5b 31 5d 5b 69 5d 20 3d 20 54   azArg[1][i] = T
16c50 6f 4c 6f 77 65 72 28 61 7a 41 72 67 5b 31 5d 5b  oLower(azArg[1][
16c60 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  i]);.      if( s
16c70 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
16c80 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d  sqlite_master")=
16c90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
16ca0 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c  ar *new_argv[2],
16cb0 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20   *new_colv[2];. 
16cc0 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b         new_argv[
16cd0 30 5d 20 3d 20 22 43 52 45 41 54 45 20 54 41 42  0] = "CREATE TAB
16ce0 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  LE sqlite_master
16cf0 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20   (\n".          
16d00 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74              "  t
16d10 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ype text,\n".   
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d30 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c     "  name text,
16d40 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
16d50 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62 6c            "  tbl
16d60 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20  _name text,\n". 
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d80 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65       "  rootpage
16d90 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20   integer,\n".   
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16db0 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e     "  sql text\n
16dc0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
16dd0 20 20 20 20 20 20 20 20 22 29 22 3b 0a 20 20 20          ")";.   
16de0 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d       new_argv[1]
16df0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65   = 0;.        ne
16e00 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c  w_colv[0] = "sql
16e10 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63  ";.        new_c
16e20 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  olv[1] = 0;.    
16e30 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61      callback(&da
16e40 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c  ta, 1, new_argv,
16e50 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20   new_colv);.    
16e60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16e70 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  OK;.      }else 
16e80 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
16e90 5b 31 5d 2c 22 73 71 6c 69 74 65 5f 74 65 6d 70  [1],"sqlite_temp
16ea0 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a  _master")==0 ){.
16eb0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65          char *ne
16ec0 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f  w_argv[2], *new_
16ed0 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  colv[2];.       
16ee0 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 22   new_argv[0] = "
16ef0 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
16f00 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  E sqlite_temp_ma
16f10 73 74 65 72 20 28 5c 6e 22 0a 20 20 20 20 20 20  ster (\n".      
16f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f30 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22  "  type text,\n"
16f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16f50 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74         "  name t
16f60 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
16f80 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c   tbl_name text,\
16f90 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
16fa0 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74           "  root
16fb0 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22  page integer,\n"
16fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fd0 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74 65         "  sql te
16fe0 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  xt\n".          
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22 3b              ")";
17000 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67  .        new_arg
17010 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
17020 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20    new_colv[0] = 
17030 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e  "sql";.        n
17040 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a  ew_colv[1] = 0;.
17050 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
17060 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61  (&data, 1, new_a
17070 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a  rgv, new_colv);.
17080 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17090 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
170a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 53 68  lse{.        zSh
170b0 65 6c 6c 53 74 61 74 69 63 20 3d 20 61 7a 41 72  ellStatic = azAr
170c0 67 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 72 63  g[1];.        rc
170d0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
170e0 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
170f0 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
17100 4d 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  M ".          " 
17110 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c   (SELECT sql sql
17120 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c  , type type, tbl
17130 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20  _name tbl_name, 
17140 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64  name name, rowid
17150 20 78 22 0a 20 20 20 20 20 20 20 20 20 20 22 20   x".          " 
17160 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f      FROM sqlite_
17170 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c  master UNION ALL
17180 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ".          "   
17190 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65  SELECT sql, type
171a0 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  , tbl_name, name
171b0 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c  , rowid FROM sql
171c0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29  ite_temp_master)
171d0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 57 48   ".          "WH
171e0 45 52 45 20 6c 6f 77 65 72 28 74 62 6c 5f 6e 61  ERE lower(tbl_na
171f0 6d 65 29 20 4c 49 4b 45 20 73 68 65 6c 6c 73 74  me) LIKE shellst
17200 61 74 69 63 28 29 22 0a 20 20 20 20 20 20 20 20  atic()".        
17210 20 20 22 20 20 41 4e 44 20 74 79 70 65 21 3d 27    "  AND type!='
17220 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f  meta' AND sql NO
17230 54 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 20 20  TNULL ".        
17240 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69    "ORDER BY rowi
17250 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 61  d",.          ca
17260 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
17270 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
17280 20 20 7a 53 68 65 6c 6c 53 74 61 74 69 63 20 3d    zShellStatic =
17290 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
172a0 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
172b0 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
172c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
172d0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 22 53 45  db,.         "SE
172e0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 22 0a  LECT sql FROM ".
172f0 20 20 20 20 20 20 20 20 20 22 20 20 28 53 45 4c           "  (SEL
17300 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70  ECT sql sql, typ
17310 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  e type, tbl_name
17320 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20   tbl_name, name 
17330 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20  name, rowid x". 
17340 20 20 20 20 20 20 20 20 22 20 20 20 20 20 46 52          "     FR
17350 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
17360 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20   UNION ALL".    
17370 20 20 20 20 20 22 20 20 20 53 45 4c 45 43 54 20       "   SELECT 
17380 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e  sql, type, tbl_n
17390 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64  ame, name, rowid
173a0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
173b0 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20  p_master) ".    
173c0 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
173d0 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c  !='meta' AND sql
173e0 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d   NOTNULL AND nam
173f0 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
17400 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20 20  te_%' ".        
17410 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
17420 22 2c 0a 20 20 20 20 20 20 20 20 20 63 61 6c 6c  ",.         call
17430 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
17440 72 72 4d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20  rrMsg.      );. 
17450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17460 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
17470 22 55 73 61 67 65 3a 20 2e 73 63 68 65 6d 61 20  "Usage: .schema 
17480 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
17490 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
174a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
174b0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
174c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45      }.    if( zE
174d0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66  rrMsg ){.      f
174e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
174f0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
17500 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
17510 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
17520 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  g);.      rc = 1
17530 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
17540 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc != SQLITE_OK 
17550 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
17560 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
17570 71 75 65 72 79 69 6e 67 20 73 63 68 65 6d 61 20  querying schema 
17580 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b  information\n");
17590 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
175a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
175b0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rc = 0;.    }.  
175c0 7d 65 6c 73 65 0a 0a 0a 23 69 66 20 64 65 66 69  }else...#if defi
175d0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
175e0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
175f0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
17600 54 54 52 41 43 45 29 0a 20 20 69 66 28 20 63 3d  TTRACE).  if( c=
17610 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20 26 26  ='s' && n==11 &&
17620 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
17630 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63 65 22  ], "selecttrace"
17640 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  , n)==0 ){.    e
17650 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
17660 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 20 20  3SelectTrace;.  
17670 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54    sqlite3SelectT
17680 72 61 63 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  race = nArg>=2 ?
17690 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
176a0 41 72 67 5b 31 5d 29 20 3a 20 30 78 66 66 3b 0a  Arg[1]) : 0xff;.
176b0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
176c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
176d0 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64 6f 63 75  EBUG.  /* Undocu
176e0 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20  mented commands 
176f0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 74 65 73  for internal tes
17700 74 69 6e 67 2e 20 20 53 75 62 6a 65 63 74 20 74  ting.  Subject t
17710 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 69  o change.  ** wi
17720 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e 20 2a 2f  thout notice. */
17730 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
17740 20 6e 3e 3d 31 30 20 26 26 20 73 74 72 6e 63 6d   n>=10 && strncm
17750 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c  p(azArg[0], "sel
17760 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d 30 20 29  ftest-", 9)==0 )
17770 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
17780 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 62  p(azArg[0]+9, "b
17790 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29 3d 3d 30  oolean", n-9)==0
177a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   ){.      int i,
177b0 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
177c0 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
177d0 0a 20 20 20 20 20 20 20 20 76 20 3d 20 62 6f 6f  .        v = boo
177e0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
177f0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  i]);.        fpr
17800 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
17810 3a 20 25 64 20 30 78 25 78 5c 6e 22 2c 20 61 7a  : %d 0x%x\n", az
17820 41 72 67 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a 20  Arg[i], v, v);. 
17830 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17840 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
17850 72 67 5b 30 5d 2b 39 2c 20 22 69 6e 74 65 67 65  rg[0]+9, "intege
17860 72 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20  r", n-9)==0 ){. 
17870 20 20 20 20 20 69 6e 74 20 69 3b 20 73 71 6c 69       int i; sqli
17880 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 20  te3_int64 v;.   
17890 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
178a0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
178b0 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
178c0 3b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 69 6e  ;.        v = in
178d0 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
178e0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
178f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
17900 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66  izeof(zBuf),zBuf
17910 2c 22 25 73 3a 20 25 6c 6c 64 20 30 78 25 6c 6c  ,"%s: %lld 0x%ll
17920 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 76  x\n", azArg[i],v
17930 2c 76 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  ,v);.        fpr
17940 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
17950 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ", zBuf);.      
17960 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
17970 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
17980 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
17990 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61 72  azArg[0], "separ
179a0 61 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ator", n)==0 ){.
179b0 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 7c      if( nArg<2 |
179c0 7c 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20  | nArg>3 ){.    
179d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
179e0 2c 20 22 55 73 61 67 65 3a 20 2e 73 65 70 61 72  , "Usage: .separ
179f0 61 74 6f 72 20 53 45 50 41 52 41 54 4f 52 20 3f  ator SEPARATOR ?
17a00 4e 45 57 4c 49 4e 45 3f 5c 6e 22 29 3b 0a 20 20  NEWLINE?\n");.  
17a10 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
17a20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  }.    if( nArg>=
17a30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
17a40 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
17a50 6f 66 28 70 2d 3e 73 65 70 61 72 61 74 6f 72 29  of(p->separator)
17a60 2c 20 70 2d 3e 73 65 70 61 72 61 74 6f 72 2c 20  , p->separator, 
17a70 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
17a80 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33  .    if( nArg>=3
17a90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17aa0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
17ab0 66 28 70 2d 3e 6e 65 77 6c 69 6e 65 29 2c 20 70  f(p->newline), p
17ac0 2d 3e 6e 65 77 6c 69 6e 65 2c 20 61 7a 41 72 67  ->newline, azArg
17ad0 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  [2]);.    }.  }e
17ae0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
17af0 27 0a 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70  '.   && (strncmp
17b00 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 65 6c  (azArg[0], "shel
17b10 6c 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20 73 74 72  l", n)==0 || str
17b20 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73  ncmp(azArg[0],"s
17b30 79 73 74 65 6d 22 2c 6e 29 3d 3d 30 29 0a 20 20  ystem",n)==0).  
17b40 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6d  ){.    char *zCm
17b50 64 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 78 3b  d;.    int i, x;
17b60 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
17b70 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
17b80 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
17b90 20 2e 73 79 73 74 65 6d 20 43 4f 4d 4d 41 4e 44   .system COMMAND
17ba0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
17bb0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
17bc0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
17bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6d 64  ;.    }.    zCmd
17be0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17bf0 74 66 28 73 74 72 63 68 72 28 61 7a 41 72 67 5b  tf(strchr(azArg[
17c00 31 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 73 22 3a  1],' ')==0?"%s":
17c10 22 5c 22 25 73 5c 22 22 2c 20 61 7a 41 72 67 5b  "\"%s\"", azArg[
17c20 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32  1]);.    for(i=2
17c30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
17c40 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c        zCmd = sql
17c50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 73 74 72  ite3_mprintf(str
17c60 63 68 72 28 61 7a 41 72 67 5b 69 5d 2c 27 20 27  chr(azArg[i],' '
17c70 29 3d 3d 30 3f 22 25 7a 20 25 73 22 3a 22 25 7a  )==0?"%z %s":"%z
17c80 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 20 20 20 20 7a 43 6d 64 2c 20 61 7a 41         zCmd, azA
17cb0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[i]);.    }.  
17cc0 20 20 78 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d    x = system(zCm
17cd0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
17ce0 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20  free(zCmd);.    
17cf0 69 66 28 20 78 20 29 20 66 70 72 69 6e 74 66 28  if( x ) fprintf(
17d00 73 74 64 65 72 72 2c 20 22 53 79 73 74 65 6d 20  stderr, "System 
17d10 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
17d20 25 64 5c 6e 22 2c 20 78 29 3b 0a 20 20 7d 65 6c  %d\n", x);.  }el
17d30 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
17d40 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
17d50 67 5b 30 5d 2c 20 22 73 68 6f 77 22 2c 20 6e 29  g[0], "show", n)
17d60 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
17d70 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ;.    if( nArg!=
17d80 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
17d90 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
17da0 65 3a 20 2e 73 68 6f 77 5c 6e 22 29 3b 0a 20 20  e: .show\n");.  
17db0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
17dc0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
17dd0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
17de0 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
17df0 75 74 2c 22 25 39 2e 39 73 3a 20 25 73 5c 6e 22  ut,"%9.9s: %s\n"
17e00 2c 22 65 63 68 6f 22 2c 20 70 2d 3e 65 63 68 6f  ,"echo", p->echo
17e10 4f 6e 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66  On ? "on" : "off
17e20 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
17e30 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25  p->out,"%9.9s: %
17e40 73 5c 6e 22 2c 22 65 71 70 22 2c 20 70 2d 3e 61  s\n","eqp", p->a
17e50 75 74 6f 45 51 50 20 3f 20 22 6f 6e 22 20 3a 20  utoEQP ? "on" : 
17e60 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69  "off");.    fpri
17e70 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39  ntf(p->out,"%9.9
17e80 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61 69  s: %s\n","explai
17e90 6e 22 2c 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  n", p->normalMod
17ea0 65 2e 76 61 6c 69 64 20 3f 20 22 6f 6e 22 20 3a  e.valid ? "on" :
17eb0 22 6f 66 66 22 29 3b 0a 20 20 20 20 66 70 72 69  "off");.    fpri
17ec0 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39  ntf(p->out,"%9.9
17ed0 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72  s: %s\n","header
17ee0 73 22 2c 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  s", p->showHeade
17ef0 72 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22  r ? "on" : "off"
17f00 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  );.    fprintf(p
17f10 2d 3e 6f 75 74 2c 22 25 39 2e 39 73 3a 20 25 73  ->out,"%9.9s: %s
17f20 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65  \n","mode", mode
17f30 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b  Descr[p->mode]);
17f40 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
17f50 6f 75 74 2c 22 25 39 2e 39 73 3a 20 22 2c 20 22  out,"%9.9s: ", "
17f60 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a 20 20 20  nullvalue");.   
17f70 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
17f80 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 75  ng(p->out, p->nu
17f90 6c 6c 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llvalue);.      
17fa0 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
17fb0 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  "\n");.    fprin
17fc0 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e 39 73  tf(p->out,"%9.9s
17fd0 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22  : %s\n","output"
17fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ,.            st
17ff0 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c  rlen30(p->outfil
18000 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20  e) ? p->outfile 
18010 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20 20 20  : "stdout");.   
18020 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
18030 22 25 39 2e 39 73 3a 20 22 2c 20 22 73 65 70 61  "%9.9s: ", "sepa
18040 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f  rator");.      o
18050 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70  utput_c_string(p
18060 2d 3e 6f 75 74 2c 20 70 2d 3e 73 65 70 61 72 61  ->out, p->separa
18070 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 70 72 69  tor);.      fpri
18080 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 20 22 29 3b  ntf(p->out," ");
18090 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f  .      output_c_
180a0 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70  string(p->out, p
180b0 2d 3e 6e 65 77 6c 69 6e 65 29 3b 0a 20 20 20 20  ->newline);.    
180c0 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74    fprintf(p->out
180d0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 66 70 72  , "\n");.    fpr
180e0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 39 2e  intf(p->out,"%9.
180f0 39 73 3a 20 25 73 5c 6e 22 2c 22 73 74 61 74 73  9s: %s\n","stats
18100 22 2c 20 70 2d 3e 73 74 61 74 73 4f 6e 20 3f 20  ", p->statsOn ? 
18110 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20  "on" : "off");. 
18120 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
18130 74 2c 22 25 39 2e 39 73 3a 20 22 2c 22 77 69 64  t,"%9.9s: ","wid
18140 74 68 22 29 3b 0a 20 20 20 20 66 6f 72 20 28 69  th");.    for (i
18150 3d 30 3b 69 3c 28 69 6e 74 29 41 72 72 61 79 53  =0;i<(int)ArrayS
18160 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29  ize(p->colWidth)
18170 20 26 26 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b   && p->colWidth[
18180 69 5d 20 21 3d 20 30 3b 69 2b 2b 29 20 7b 0a 20  i] != 0;i++) {. 
18190 20 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e       fprintf(p->
181a0 6f 75 74 2c 22 25 64 20 22 2c 70 2d 3e 63 6f 6c  out,"%d ",p->col
181b0 57 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d  Width[i]);.    }
181c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e  .    fprintf(p->
181d0 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c  out,"\n");.  }el
181e0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
181f0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
18200 67 5b 30 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e  g[0], "stats", n
18210 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
18220 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
18230 20 70 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 62 6f   p->statsOn = bo
18240 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
18250 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
18260 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
18270 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
18280 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29  stats on|off\n")
18290 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
182a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
182b0 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e   if( c=='t' && n
182c0 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
182d0 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73 22  Arg[0], "tables"
182e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
182f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
18300 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61  mt;.    char **a
18310 7a 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74  zResult;.    int
18320 20 6e 52 6f 77 2c 20 6e 41 6c 6c 6f 63 3b 0a 20   nRow, nAlloc;. 
18330 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
18340 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  0;.    int ii;. 
18350 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
18360 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18370 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
18380 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 64 61 74  >db, "PRAGMA dat
18390 61 62 61 73 65 5f 6c 69 73 74 22 2c 20 2d 31 2c  abase_list", -1,
183a0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
183b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
183c0 20 72 63 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20   rc;.    zSql = 
183d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
183e0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
183f0 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
18400 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
18410 20 20 22 20 57 48 45 52 45 20 74 79 70 65 20 49    " WHERE type I
18420 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77  N ('table','view
18430 27 29 22 0a 20 20 20 20 20 20 20 20 22 20 20 20  ')".        "   
18440 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
18450 45 20 27 73 71 6c 69 74 65 5f 25 25 27 22 0a 20  E 'sqlite_%%'". 
18460 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e         "   AND n
18470 61 6d 65 20 4c 49 4b 45 20 3f 31 22 29 3b 0a 20  ame LIKE ?1");. 
18480 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
18490 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
184a0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
184b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
184c0 44 62 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  DbName = (const 
184d0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
184e0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
184f0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   1);.      if( z
18500 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 74 72  DbName==0 || str
18510 63 6d 70 28 7a 44 62 4e 61 6d 65 2c 22 6d 61 69  cmp(zDbName,"mai
18520 6e 22 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  n")==0 ) continu
18530 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  e;.      if( str
18540 63 6d 70 28 7a 44 62 4e 61 6d 65 2c 22 74 65 6d  cmp(zDbName,"tem
18550 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
18560 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
18570 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
18580 20 20 20 20 20 20 20 20 20 20 20 22 25 7a 20 55             "%z U
18590 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
185a0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
185b0 45 43 54 20 27 74 65 6d 70 2e 27 20 7c 7c 20 6e  ECT 'temp.' || n
185c0 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
185d0 74 65 6d 70 5f 6d 61 73 74 65 72 22 0a 20 20 20  temp_master".   
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
185f0 57 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27  WHERE type IN ('
18600 74 61 62 6c 65 27 2c 27 76 69 65 77 27 29 22 0a  table','view')".
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18620 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f   "   AND name NO
18630 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25  T LIKE 'sqlite_%
18640 25 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %'".            
18650 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d       "   AND nam
18660 65 20 4c 49 4b 45 20 3f 31 22 2c 20 7a 53 71 6c  e LIKE ?1", zSql
18670 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18680 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
18690 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186b0 20 22 25 7a 20 55 4e 49 4f 4e 20 41 4c 4c 20 22   "%z UNION ALL "
186c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
186d0 20 20 22 53 45 4c 45 43 54 20 27 25 71 2e 27 20    "SELECT '%q.' 
186e0 7c 7c 20 6e 61 6d 65 20 46 52 4f 4d 20 5c 22 25  || name FROM \"%
186f0 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  w\".sqlite_maste
18700 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
18710 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65      " WHERE type
18720 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69   IN ('table','vi
18730 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ew')".          
18740 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e         "   AND n
18750 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
18760 6c 69 74 65 5f 25 25 27 22 0a 20 20 20 20 20 20  lite_%%'".      
18770 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41             "   A
18780 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22  ND name LIKE ?1"
18790 2c 20 7a 53 71 6c 2c 20 7a 44 62 4e 61 6d 65 2c  , zSql, zDbName,
187a0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20   zDbName);.     
187b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
187c0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
187d0 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  tmt);.    zSql =
187e0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
187f0 28 22 25 7a 20 4f 52 44 45 52 20 42 59 20 31 22  ("%z ORDER BY 1"
18800 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  , zSql);.    rc 
18810 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
18820 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
18830 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
18840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
18850 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
18860 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
18870 3b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 6e 41 6c  ;.    nRow = nAl
18880 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 61 7a 52  loc = 0;.    azR
18890 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 69  esult = 0;.    i
188a0 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20  f( nArg>1 ){.   
188b0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
188c0 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 61  text(pStmt, 1, a
188d0 7a 41 72 67 5b 31 5d 2c 20 2d 31 2c 20 53 51 4c  zArg[1], -1, SQL
188e0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
188f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18900 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
18910 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 22 25 22  xt(pStmt, 1, "%"
18920 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
18930 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TIC);.    }.    
18940 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
18950 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
18960 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
18970 69 66 28 20 6e 52 6f 77 3e 3d 6e 41 6c 6c 6f 63  if( nRow>=nAlloc
18980 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
18990 20 2a 2a 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20   **azNew;.      
189a0 20 20 69 6e 74 20 6e 20 3d 20 6e 41 6c 6c 6f 63    int n = nAlloc
189b0 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  *2 + 10;.       
189c0 20 61 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   azNew = sqlite3
189d0 5f 72 65 61 6c 6c 6f 63 28 61 7a 52 65 73 75 6c  _realloc(azResul
189e0 74 2c 20 73 69 7a 65 6f 66 28 61 7a 52 65 73 75  t, sizeof(azResu
189f0 6c 74 5b 30 5d 29 2a 6e 29 3b 0a 20 20 20 20 20  lt[0])*n);.     
18a00 20 20 20 69 66 28 20 61 7a 4e 65 77 3d 3d 30 20     if( azNew==0 
18a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
18a20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
18a30 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
18a40 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ry\n");.        
18a50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18a60 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f   }.        nAllo
18a70 63 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 61  c = n;.        a
18a80 7a 52 65 73 75 6c 74 20 3d 20 61 7a 4e 65 77 3b  zResult = azNew;
18a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
18aa0 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20 3d 20  zResult[nRow] = 
18ab0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
18ac0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  "%s", sqlite3_co
18ad0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
18ae0 20 30 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20   0));.      if( 
18af0 61 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20 29  azResult[nRow] )
18b00 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nRow++;.    }. 
18b10 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
18b20 69 7a 65 28 70 53 74 6d 74 29 3b 20 20 20 20 20  ize(pStmt);     
18b30 20 20 20 0a 20 20 20 20 69 66 28 20 6e 52 6f 77     .    if( nRow
18b40 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
18b50 6c 65 6e 2c 20 6d 61 78 6c 65 6e 20 3d 20 30 3b  len, maxlen = 0;
18b60 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
18b70 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 69 6e  .      int nPrin
18b80 74 43 6f 6c 2c 20 6e 50 72 69 6e 74 52 6f 77 3b  tCol, nPrintRow;
18b90 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
18ba0 69 3c 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRow; i++){.  
18bb0 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c        len = strl
18bc0 65 6e 33 30 28 61 7a 52 65 73 75 6c 74 5b 69 5d  en30(azResult[i]
18bd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
18be0 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c  en>maxlen ) maxl
18bf0 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  en = len;.      
18c00 7d 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 43 6f  }.      nPrintCo
18c10 6c 20 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32  l = 80/(maxlen+2
18c20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72  );.      if( nPr
18c30 69 6e 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e  intCol<1 ) nPrin
18c40 74 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  tCol = 1;.      
18c50 6e 50 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f  nPrintRow = (nRo
18c60 77 20 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20  w + nPrintCol - 
18c70 31 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20  1)/nPrintCol;.  
18c80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18c90 50 72 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a  PrintRow; i++){.
18ca0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b          for(j=i;
18cb0 20 6a 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69   j<nRow; j+=nPri
18cc0 6e 74 52 6f 77 29 7b 0a 20 20 20 20 20 20 20 20  ntRow){.        
18cd0 20 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c    char *zSp = j<
18ce0 6e 50 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a  nPrintRow ? "" :
18cf0 20 22 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20   "  ";.         
18d00 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
18d10 20 22 25 73 25 2d 2a 73 22 2c 20 7a 53 70 2c 20   "%s%-*s", zSp, 
18d20 6d 61 78 6c 65 6e 2c 20 61 7a 52 65 73 75 6c 74  maxlen, azResult
18d30 5b 6a 5d 20 3f 20 61 7a 52 65 73 75 6c 74 5b 6a  [j] ? azResult[j
18d40 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
18d50 20 7d 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   }.        fprin
18d60 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
18d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18d80 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
18d90 3c 6e 52 6f 77 3b 20 69 69 2b 2b 29 20 73 71 6c  <nRow; ii++) sql
18da0 69 74 65 33 5f 66 72 65 65 28 61 7a 52 65 73 75  ite3_free(azResu
18db0 6c 74 5b 69 69 5d 29 3b 0a 20 20 20 20 73 71 6c  lt[ii]);.    sql
18dc0 69 74 65 33 5f 66 72 65 65 28 61 7a 52 65 73 75  ite3_free(azResu
18dd0 6c 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  lt);.  }else..  
18de0 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e  if( c=='t' && n>
18df0 3d 38 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =8 && strncmp(az
18e00 41 72 67 5b 30 5d 2c 20 22 74 65 73 74 63 74 72  Arg[0], "testctr
18e10 6c 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 41 72  l", n)==0 && nAr
18e20 67 3e 3d 32 20 29 7b 0a 20 20 20 20 73 74 61 74  g>=2 ){.    stat
18e30 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
18e40 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  {.       const c
18e50 68 61 72 20 2a 7a 43 74 72 6c 4e 61 6d 65 3b 20  har *zCtrlName; 
18e60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
18e70 65 73 74 2d 63 6f 6e 74 72 6f 6c 20 6f 70 74 69  est-control opti
18e80 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74  on */.       int
18e90 20 63 74 72 6c 43 6f 64 65 3b 20 20 20 20 20 20   ctrlCode;      
18ea0 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
18eb0 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20 6f   code for that o
18ec0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 20 61  ption */.    } a
18ed0 43 74 72 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Ctrl[] = {.     
18ee0 20 7b 20 22 70 72 6e 67 5f 73 61 76 65 22 2c 20   { "prng_save", 
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18f00 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
18f10 5f 53 41 56 45 20 20 20 20 20 20 20 20 20 20 20  _SAVE           
18f20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70     },.      { "p
18f30 72 6e 67 5f 72 65 73 74 6f 72 65 22 2c 20 20 20  rng_restore",   
18f40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
18f50 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
18f60 4f 52 45 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ORE           },
18f70 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72  .      { "prng_r
18f80 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  eset",          
18f90 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
18fa0 4c 5f 50 52 4e 47 5f 52 45 53 45 54 20 20 20 20  L_PRNG_RESET    
18fb0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
18fc0 20 20 7b 20 22 62 69 74 76 65 63 5f 74 65 73 74    { "bitvec_test
18fd0 22 2c 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ",           SQL
18fe0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54  ITE_TESTCTRL_BIT
18ff0 56 45 43 5f 54 45 53 54 20 20 20 20 20 20 20 20  VEC_TEST        
19000 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
19010 66 61 75 6c 74 5f 69 6e 73 74 61 6c 6c 22 2c 20  fault_install", 
19020 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
19030 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e  ESTCTRL_FAULT_IN
19040 53 54 41 4c 4c 20 20 20 20 20 20 20 20 20 20 7d  STALL          }
19050 2c 0a 20 20 20 20 20 20 7b 20 22 62 65 6e 69 67  ,.      { "benig
19060 6e 5f 6d 61 6c 6c 6f 63 5f 68 6f 6f 6b 73 22 2c  n_malloc_hooks",
19070 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
19080 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
19090 5f 48 4f 4f 4b 53 20 20 20 20 7d 2c 0a 20 20 20  _HOOKS    },.   
190a0 20 20 20 7b 20 22 70 65 6e 64 69 6e 67 5f 62 79     { "pending_by
190b0 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  te",          SQ
190c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
190d0 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
190e0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
190f0 22 61 73 73 65 72 74 22 2c 20 20 20 20 20 20 20  "assert",       
19100 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19110 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19130 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 6c 77 61  },.      { "alwa
19140 79 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ys",            
19150 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
19160 54 52 4c 5f 41 4c 57 41 59 53 20 20 20 20 20 20  TRL_ALWAYS      
19170 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
19180 20 20 20 20 7b 20 22 72 65 73 65 72 76 65 22 2c      { "reserve",
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
191a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
191b0 45 53 45 52 56 45 20 20 20 20 20 20 20 20 20 20  ESERVE          
191c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
191d0 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 22   "optimizations"
191e0 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
191f0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
19200 5a 41 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20  ZATIONS         
19210 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 69 73 6b   },.      { "isk
19220 65 79 77 6f 72 64 22 2c 20 20 20 20 20 20 20 20  eyword",        
19230 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
19240 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 20 20  CTRL_ISKEYWORD  
19250 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
19260 20 20 20 20 20 7b 20 22 73 63 72 61 74 63 68 6d       { "scratchm
19270 61 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  alloc",         
19280 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19290 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 20 20 20  SCRATCHMALLOC   
192a0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
192b0 7b 20 22 62 79 74 65 6f 72 64 65 72 22 2c 20 20  { "byteorder",  
192c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
192d0 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
192e0 52 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  RDER            
192f0 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
19300 69 6e 74 20 74 65 73 74 63 74 72 6c 20 3d 20 2d  int testctrl = -
19310 31 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  1;.    int rc = 
19320 30 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  0;.    int i, n;
19330 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
19340 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 63 6f 6e 76  0);..    /* conv
19350 65 72 74 20 74 65 73 74 63 74 72 6c 20 74 65 78  ert testctrl tex
19360 74 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75  t option to valu
19370 65 2e 20 61 6c 6c 6f 77 20 61 6e 79 20 75 6e 69  e. allow any uni
19380 71 75 65 20 70 72 65 66 69 78 0a 20 20 20 20 2a  que prefix.    *
19390 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20  * of the option 
193a0 6e 61 6d 65 2c 20 6f 72 20 61 20 6e 75 6d 65 72  name, or a numer
193b0 69 63 61 6c 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  ical value. */. 
193c0 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
193d0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66  azArg[1]);.    f
193e0 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28  or(i=0; i<(int)(
193f0 73 69 7a 65 6f 66 28 61 43 74 72 6c 29 2f 73 69  sizeof(aCtrl)/si
19400 7a 65 6f 66 28 61 43 74 72 6c 5b 30 5d 29 29 3b  zeof(aCtrl[0]));
19410 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
19420 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
19430 5d 2c 20 61 43 74 72 6c 5b 69 5d 2e 7a 43 74 72  ], aCtrl[i].zCtr
19440 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lName, n)==0 ){.
19450 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
19460 63 74 72 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  ctrl<0 ){.      
19470 20 20 20 20 74 65 73 74 63 74 72 6c 20 3d 20 61      testctrl = a
19480 43 74 72 6c 5b 69 5d 2e 63 74 72 6c 43 6f 64 65  Ctrl[i].ctrlCode
19490 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
194a0 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
194b0 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69  tf(stderr, "ambi
194c0 67 75 6f 75 73 20 6f 70 74 69 6f 6e 20 6e 61 6d  guous option nam
194d0 65 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  e: \"%s\"\n", az
194e0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
194f0 20 20 20 74 65 73 74 63 74 72 6c 20 3d 20 2d 31     testctrl = -1
19500 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
19510 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
19520 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
19530 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20 29 20  f( testctrl<0 ) 
19540 74 65 73 74 63 74 72 6c 20 3d 20 28 69 6e 74 29  testctrl = (int)
19550 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
19560 72 67 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[1]);.    if( 
19570 28 74 65 73 74 63 74 72 6c 3c 53 51 4c 49 54 45  (testctrl<SQLITE
19580 5f 54 45 53 54 43 54 52 4c 5f 46 49 52 53 54 29  _TESTCTRL_FIRST)
19590 20 7c 7c 20 28 74 65 73 74 63 74 72 6c 3e 53 51   || (testctrl>SQ
195a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 41  LITE_TESTCTRL_LA
195b0 53 54 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ST) ){.      fpr
195c0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
195d0 6f 72 3a 20 69 6e 76 61 6c 69 64 20 74 65 73 74  or: invalid test
195e0 63 74 72 6c 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  ctrl option: %s\
195f0 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
19600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19610 73 77 69 74 63 68 28 74 65 73 74 63 74 72 6c 29  switch(testctrl)
19620 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  {..        /* sq
19630 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
19640 6f 6c 28 69 6e 74 2c 20 64 62 2c 20 69 6e 74 29  ol(int, db, int)
19650 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65   */.        case
19660 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19670 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a  _OPTIMIZATIONS:.
19680 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
19690 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
196a0 45 52 56 45 3a 20 20 20 20 20 20 20 20 20 20 20  ERVE:           
196b0 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28    .          if(
196c0 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20   nArg==3 ){.    
196d0 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20          int opt 
196e0 3d 20 28 69 6e 74 29 73 74 72 74 6f 6c 28 61 7a  = (int)strtol(az
196f0 41 72 67 5b 32 5d 2c 20 30 2c 20 30 29 3b 20 20  Arg[2], 0, 0);  
19700 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
19710 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
19720 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
19730 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c 20 6f 70  tctrl, p->db, op
19740 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
19750 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  fprintf(p->out, 
19760 22 25 64 20 28 30 78 25 30 38 78 29 5c 6e 22 2c  "%d (0x%08x)\n",
19770 20 72 63 2c 20 72 63 29 3b 0a 20 20 20 20 20 20   rc, rc);.      
19780 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
19790 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
197a0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
197b0 74 65 73 74 63 74 72 6c 20 25 73 20 74 61 6b 65  testctrl %s take
197c0 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 20 6f  s a single int o
197d0 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20 20 20 20 20  ption\n",.      
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
197f0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
19800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
19810 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f  reak;..        /
19820 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
19830 6f 6e 74 72 6f 6c 28 69 6e 74 29 20 2a 2f 0a 20  ontrol(int) */. 
19840 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
19850 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
19860 5f 53 41 56 45 3a 0a 20 20 20 20 20 20 20 20 63  _SAVE:.        c
19870 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
19880 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
19890 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
198a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
198b0 52 4e 47 5f 52 45 53 45 54 3a 0a 20 20 20 20 20  RNG_RESET:.     
198c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
198d0 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45  ESTCTRL_BYTEORDE
198e0 52 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  R:.          if(
198f0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
19900 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19910 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
19920 6c 28 74 65 73 74 63 74 72 6c 29 3b 0a 20 20 20  l(testctrl);.   
19930 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
19940 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 28 30 78  (p->out, "%d (0x
19950 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c 20 72 63  %08x)\n", rc, rc
19960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  );.          } e
19970 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
19980 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
19990 2c 22 45 72 72 6f 72 3a 20 74 65 73 74 63 74 72  ,"Error: testctr
199a0 6c 20 25 73 20 74 61 6b 65 73 20 6e 6f 20 6f 70  l %s takes no op
199b0 74 69 6f 6e 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  tions\n", azArg[
199c0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  1]);.          }
199d0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
199e0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ;..        /* sq
199f0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
19a00 6f 6c 28 69 6e 74 2c 20 75 69 6e 74 29 20 2a 2f  ol(int, uint) */
19a10 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
19a20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
19a30 4e 44 49 4e 47 5f 42 59 54 45 3a 20 20 20 20 20  NDING_BYTE:     
19a40 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66     .          if
19a50 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20  ( nArg==3 ){.   
19a60 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65           unsigne
19a70 64 20 69 6e 74 20 6f 70 74 20 3d 20 28 75 6e 73  d int opt = (uns
19a80 69 67 6e 65 64 20 69 6e 74 29 69 6e 74 65 67 65  igned int)intege
19a90 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29  rValue(azArg[2])
19aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
19ab0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
19ac0 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c  control(testctrl
19ad0 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20  , opt);.        
19ae0 20 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f      fprintf(p->o
19af0 75 74 2c 20 22 25 64 20 28 30 78 25 30 38 78 29  ut, "%d (0x%08x)
19b00 5c 6e 22 2c 20 72 63 2c 20 72 63 29 3b 0a 20 20  \n", rc, rc);.  
19b10 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
19b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
19b30 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
19b40 6f 72 3a 20 74 65 73 74 63 74 72 6c 20 25 73 20  or: testctrl %s 
19b50 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 75  takes a single u
19b60 6e 73 69 67 6e 65 64 22 0a 20 20 20 20 20 20 20  nsigned".       
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 20 20 20 22 20 69 6e 74 20 6f 70 74 69 6f 6e      " int option
19b90 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
19ba0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19bb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19bc0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
19bd0 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
19be0 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 69 6e 74  control(int, int
19bf0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73  ) */.        cas
19c00 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
19c10 4c 5f 41 53 53 45 52 54 3a 20 20 20 20 20 20 20  L_ASSERT:       
19c20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
19c30 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
19c40 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 20 20 20  CTRL_ALWAYS:    
19c50 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
19c60 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33       if( nArg==3
19c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19c80 69 6e 74 20 6f 70 74 20 3d 20 62 6f 6f 6c 65 61  int opt = boolea
19c90 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29  nValue(azArg[2])
19ca0 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  ;        .      
19cb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19cc0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
19cd0 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a  testctrl, opt);.
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
19cf0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20  ntf(p->out, "%d 
19d00 28 30 78 25 30 38 78 29 5c 6e 22 2c 20 72 63 2c  (0x%08x)\n", rc,
19d10 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
19d20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
19d30 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
19d40 65 72 72 2c 22 45 72 72 6f 72 3a 20 74 65 73 74  err,"Error: test
19d50 63 74 72 6c 20 25 73 20 74 61 6b 65 73 20 61 20  ctrl %s takes a 
19d60 73 69 6e 67 6c 65 20 69 6e 74 20 6f 70 74 69 6f  single int optio
19d70 6e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  n\n",.          
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20    azArg[1]);.   
19da0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19db0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
19dc0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
19dd0 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20  st_control(int, 
19de0 63 68 61 72 20 2a 29 20 2a 2f 0a 23 69 66 64 65  char *) */.#ifde
19df0 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
19e00 52 44 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  RD.        case 
19e10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19e20 49 53 4b 45 59 57 4f 52 44 3a 20 20 20 20 20 20  ISKEYWORD:      
19e30 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
19e40 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
19e50 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
19e60 20 63 68 61 72 20 2a 6f 70 74 20 3d 20 61 7a 41   char *opt = azA
19e70 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 0a 20  rg[2];        . 
19e80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
19e90 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19ea0 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f  trol(testctrl, o
19eb0 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pt);.           
19ec0 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c   fprintf(p->out,
19ed0 20 22 25 64 20 28 30 78 25 30 38 78 29 5c 6e 22   "%d (0x%08x)\n"
19ee0 2c 20 72 63 2c 20 72 63 29 3b 0a 20 20 20 20 20  , rc, rc);.     
19ef0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
19f00 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
19f10 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
19f20 20 74 65 73 74 63 74 72 6c 20 25 73 20 74 61 6b   testctrl %s tak
19f30 65 73 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72  es a single char
19f40 20 2a 20 6f 70 74 69 6f 6e 5c 6e 22 2c 0a 20 20   * option\n",.  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
19f70 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  1]);.          }
19f80 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
19f90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
19fa0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
19fb0 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
19fc0 53 54 3a 20 20 20 20 20 20 20 20 20 0a 20 20 20  ST:         .   
19fd0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
19fe0 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f  _TESTCTRL_FAULT_
19ff0 49 4e 53 54 41 4c 4c 3a 20 20 20 20 20 20 20 0a  INSTALL:       .
1a000 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1a010 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
1a020 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
1a030 3a 20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  : .        case 
1a040 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a050 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 20  SCRATCHMALLOC:  
1a060 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 64 65       .        de
1a070 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
1a080 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1a090 22 45 72 72 6f 72 3a 20 43 4c 49 20 73 75 70 70  "Error: CLI supp
1a0a0 6f 72 74 20 66 6f 72 20 74 65 73 74 63 74 72 6c  ort for testctrl
1a0b0 20 25 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e   %s not implemen
1a0c0 74 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ted\n",.        
1a0d0 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
1a0e0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  1]);.          b
1a0f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a100 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
1a110 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 34  f( c=='t' && n>4
1a120 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
1a130 67 5b 30 5d 2c 20 22 74 69 6d 65 6f 75 74 22 2c  g[0], "timeout",
1a140 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
1a150 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
1a160 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
1a170 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 6e 41 72  meout(p->db, nAr
1a180 67 3e 3d 32 20 3f 20 28 69 6e 74 29 69 6e 74 65  g>=2 ? (int)inte
1a190 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  gerValue(azArg[1
1a1a0 5d 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ]) : 0);.  }else
1a1b0 0a 20 20 20 20 0a 20 20 69 66 28 20 63 3d 3d 27  .    .  if( c=='
1a1c0 74 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74  t' && n>=5 && st
1a1d0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
1a1e0 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 29  "timer", n)==0 )
1a1f0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
1a200 32 20 29 7b 0a 20 20 20 20 20 20 65 6e 61 62 6c  2 ){.      enabl
1a210 65 54 69 6d 65 72 20 3d 20 62 6f 6f 6c 65 61 6e  eTimer = boolean
1a220 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
1a230 0a 20 20 20 20 20 20 69 66 28 20 65 6e 61 62 6c  .      if( enabl
1a240 65 54 69 6d 65 72 20 26 26 20 21 48 41 53 5f 54  eTimer && !HAS_T
1a250 49 4d 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  IMER ){.        
1a260 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
1a270 22 45 72 72 6f 72 3a 20 74 69 6d 65 72 20 6e 6f  "Error: timer no
1a280 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  t available on t
1a290 68 69 73 20 73 79 73 74 65 6d 2e 5c 6e 22 29 3b  his system.\n");
1a2a0 0a 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 54  .        enableT
1a2b0 69 6d 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  imer = 0;.      
1a2c0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1a2d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1a2e0 72 2c 20 22 55 73 61 67 65 3a 20 2e 74 69 6d 65  r, "Usage: .time
1a2f0 72 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  r on|off\n");.  
1a300 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
1a310 7d 0a 20 20 7d 65 6c 73 65 0a 20 20 0a 20 20 69  }.  }else.  .  i
1a320 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73 74 72  f( c=='t' && str
1a330 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
1a340 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  trace", n)==0 ){
1a350 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
1a360 30 29 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66  0);.    output_f
1a370 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 74 72 61  ile_close(p->tra
1a380 63 65 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20  ceOut);.    if( 
1a390 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
1a3a0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1a3b0 20 22 55 73 61 67 65 3a 20 2e 74 72 61 63 65 20   "Usage: .trace 
1a3c0 46 49 4c 45 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  FILE|off\n");.  
1a3d0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
1a3e0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
1a3f0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
1a400 20 20 20 20 70 2d 3e 74 72 61 63 65 4f 75 74 20      p->traceOut 
1a410 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70  = output_file_op
1a420 65 6e 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69  en(azArg[1]);.#i
1a430 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1a440 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
1a450 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a460 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1a470 4f 49 4e 54 29 0a 20 20 20 20 69 66 28 20 70 2d  OINT).    if( p-
1a480 3e 74 72 61 63 65 4f 75 74 3d 3d 30 20 29 7b 0a  >traceOut==0 ){.
1a490 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
1a4a0 61 63 65 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  ace(p->db, 0, 0)
1a4b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a4c0 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
1a4d0 28 70 2d 3e 64 62 2c 20 73 71 6c 5f 74 72 61 63  (p->db, sql_trac
1a4e0 65 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 74  e_callback, p->t
1a4f0 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  raceOut);.    }.
1a500 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 0a 0a  #endif.  }else..
1a510 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
1a520 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
1a530 20 69 66 28 20 63 3d 3d 27 75 27 20 26 26 20 73   if( c=='u' && s
1a540 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
1a550 20 22 75 73 65 72 22 2c 20 6e 29 3d 3d 30 20 29   "user", n)==0 )
1a560 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32  {.    if( nArg<2
1a570 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1a580 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
1a590 3a 20 2e 75 73 65 72 20 53 55 42 43 4f 4d 4d 41  : .user SUBCOMMA
1a5a0 4e 44 20 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 20 20  ND ...\n");.    
1a5b0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
1a5c0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
1a5d0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
1a5e0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
1a5f0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1a600 61 7a 41 72 67 5b 31 5d 2c 22 6c 6f 67 69 6e 22  azArg[1],"login"
1a610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
1a620 28 20 6e 41 72 67 21 3d 34 20 29 7b 0a 20 20 20  ( nArg!=4 ){.   
1a630 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1a640 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73  err, "Usage: .us
1a650 65 72 20 6c 6f 67 69 6e 20 55 53 45 52 20 50 41  er login USER PA
1a660 53 53 57 4f 52 44 5c 6e 22 29 3b 0a 20 20 20 20  SSWORD\n");.    
1a670 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
1a680 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
1a690 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
1a6a0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
1a6b0 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68  qlite3_user_auth
1a6c0 65 6e 74 69 63 61 74 65 28 70 2d 3e 64 62 2c 20  enticate(p->db, 
1a6d0 61 7a 41 72 67 5b 32 5d 2c 20 61 7a 41 72 67 5b  azArg[2], azArg[
1a6e0 33 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  3],.            
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 20 20 20 28 69 6e 74 29 73 74 72          (int)str
1a710 6c 65 6e 28 61 7a 41 72 67 5b 33 5d 29 29 3b 0a  len(azArg[3]));.
1a720 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1a730 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1a740 73 74 64 65 72 72 2c 20 22 41 75 74 68 65 6e 74  stderr, "Authent
1a750 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 66  ication failed f
1a760 6f 72 20 75 73 65 72 20 25 73 5c 6e 22 2c 20 61  or user %s\n", a
1a770 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20  zArg[2]);.      
1a780 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
1a790 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1a7a0 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
1a7b0 22 61 64 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "add")==0 ){.   
1a7c0 20 20 20 69 66 28 20 6e 41 72 67 21 3d 35 20 29     if( nArg!=5 )
1a7d0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1a7e0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
1a7f0 3a 20 2e 75 73 65 72 20 61 64 64 20 55 53 45 52  : .user add USER
1a800 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49   PASSWORD ISADMI
1a810 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  N\n");.        r
1a820 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
1a830 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
1a840 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
1a850 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a860 33 5f 75 73 65 72 5f 61 64 64 28 70 2d 3e 64 62  3_user_add(p->db
1a870 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20  , azArg[2],.    
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 33 5d          azArg[3]
1a8a0 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a  , (int)strlen(az
1a8b0 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20  Arg[3]),.       
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 20 20 20 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75       booleanValu
1a8e0 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20  e(azArg[4]));.  
1a8f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1a900 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1a910 64 65 72 72 2c 20 22 55 73 65 72 2d 41 64 64 20  derr, "User-Add 
1a920 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72  failed: %d\n", r
1a930 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c);.        rc =
1a940 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1a950 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1a960 28 61 7a 41 72 67 5b 31 5d 2c 22 65 64 69 74 22  (azArg[1],"edit"
1a970 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
1a980 28 20 6e 41 72 67 21 3d 35 20 29 7b 0a 20 20 20  ( nArg!=5 ){.   
1a990 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1a9a0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73  err, "Usage: .us
1a9b0 65 72 20 65 64 69 74 20 55 53 45 52 20 50 41 53  er edit USER PAS
1a9c0 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 5c 6e 22  SWORD ISADMIN\n"
1a9d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1a9e0 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
1a9f0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
1aa00 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1aa10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   rc = sqlite3_us
1aa20 65 72 5f 63 68 61 6e 67 65 28 70 2d 3e 64 62 2c  er_change(p->db,
1aa30 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20   azArg[2],.     
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 33           azArg[3
1aa60 5d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61  ], (int)strlen(a
1aa70 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20  zArg[3]),.      
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 56          booleanV
1aaa0 61 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b  alue(azArg[4]));
1aab0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
1aac0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1aad0 28 73 74 64 65 72 72 2c 20 22 55 73 65 72 2d 45  (stderr, "User-E
1aae0 64 69 74 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e  dit failed: %d\n
1aaf0 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  ", rc);.        
1ab00 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
1ab10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1ab20 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 64  rcmp(azArg[1],"d
1ab30 65 6c 65 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  elete")==0 ){.  
1ab40 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20      if( nArg!=3 
1ab50 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1ab60 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
1ab70 65 3a 20 2e 75 73 65 72 20 64 65 6c 65 74 65 20  e: .user delete 
1ab80 55 53 45 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20  USER\n");.      
1ab90 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
1aba0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
1abb0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
1abc0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
1abd0 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65  ite3_user_delete
1abe0 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d  (p->db, azArg[2]
1abf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1ac00 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1ac10 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 72  tf(stderr, "User
1ac20 2d 44 65 6c 65 74 65 20 66 61 69 6c 65 64 3a 20  -Delete failed: 
1ac30 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
1ac40 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
1ac50 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1ac60 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1ac70 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73  err, "Usage: .us
1ac80 65 72 20 6c 6f 67 69 6e 7c 61 64 64 7c 65 64 69  er login|add|edi
1ac90 74 7c 64 65 6c 65 74 65 20 2e 2e 2e 5c 6e 22 29  t|delete ...\n")
1aca0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
1acb0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
1acc0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
1acd0 20 20 7d 20 20 20 20 0a 20 20 7d 65 6c 73 65 0a    }    .  }else.
1ace0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1acf0 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
1ad00 54 49 4f 4e 20 2a 2f 0a 0a 20 20 69 66 28 20 63  TION */..  if( c
1ad10 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d 70  =='v' && strncmp
1ad20 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 65 72 73  (azArg[0], "vers
1ad30 69 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ion", n)==0 ){. 
1ad40 20 20 20 66 70 72 69 6e 74 66 28 70 2d 3e 6f 75     fprintf(p->ou
1ad50 74 2c 20 22 53 51 4c 69 74 65 20 25 73 20 25 73  t, "SQLite %s %s
1ad60 5c 6e 22 20 2f 2a 65 78 74 72 61 2d 76 65 72 73  \n" /*extra-vers
1ad70 69 6f 6e 2d 69 6e 66 6f 2a 2f 2c 0a 20 20 20 20  ion-info*/,.    
1ad80 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 62 76      sqlite3_libv
1ad90 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65  ersion(), sqlite
1ada0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
1adb0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
1adc0 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='v' && strncmp(
1add0 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66 73 6e 61  azArg[0], "vfsna
1ade0 6d 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  me", n)==0 ){.  
1adf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1ae00 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d 3d 32 20  bName = nArg==2 
1ae10 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61  ? azArg[1] : "ma
1ae20 69 6e 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  in";.    char *z
1ae30 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  VfsName = 0;.   
1ae40 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20   if( p->db ){.  
1ae50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1ae60 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20  _control(p->db, 
1ae70 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  zDbName, SQLITE_
1ae80 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 20 26  FCNTL_VFSNAME, &
1ae90 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zVfsName);.     
1aea0 20 69 66 28 20 7a 56 66 73 4e 61 6d 65 20 29 7b   if( zVfsName ){
1aeb0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1aec0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
1aed0 20 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20   zVfsName);.    
1aee0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1aef0 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20  (zVfsName);.    
1af00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1af10 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e..#if defined(S
1af20 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
1af30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1af40 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
1af50 29 0a 20 20 69 66 28 20 63 3d 3d 27 77 27 20 26  ).  if( c=='w' &
1af60 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
1af70 30 5d 2c 20 22 77 68 65 72 65 74 72 61 63 65 22  0], "wheretrace"
1af80 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  , n)==0 ){.    e
1af90 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1afa0 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 20  3WhereTrace;.   
1afb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
1afc0 63 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 62  ce = nArg>=2 ? b
1afd0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
1afe0 67 5b 31 5d 29 20 3a 20 30 78 66 66 3b 0a 20 20  g[1]) : 0xff;.  
1aff0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
1b000 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74  if( c=='w' && st
1b010 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
1b020 22 77 69 64 74 68 22 2c 20 6e 29 3d 3d 30 20 29  "width", n)==0 )
1b030 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
1b040 20 61 73 73 65 72 74 28 20 6e 41 72 67 3c 3d 41   assert( nArg<=A
1b050 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20  rraySize(azArg) 
1b060 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  );.    for(j=1; 
1b070 6a 3c 6e 41 72 67 20 26 26 20 6a 3c 41 72 72 61  j<nArg && j<Arra
1b080 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74  ySize(p->colWidt
1b090 68 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  h); j++){.      
1b0a0 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d  p->colWidth[j-1]
1b0b0 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56   = (int)integerV
1b0c0 61 6c 75 65 28 61 7a 41 72 67 5b 6a 5d 29 3b 0a  alue(azArg[j]);.
1b0d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
1b0e0 20 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73   {.    fprintf(s
1b0f0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 75  tderr, "Error: u
1b100 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 6f  nknown command o
1b110 72 20 69 6e 76 61 6c 69 64 20 61 72 67 75 6d 65  r invalid argume
1b120 6e 74 73 3a 20 22 0a 20 20 20 20 20 20 22 20 5c  nts: ".      " \
1b130 22 25 73 5c 22 2e 20 45 6e 74 65 72 20 5c 22 2e  "%s\". Enter \".
1b140 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c  help\" for help\
1b150 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
1b160 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 0a     rc = 1;.  }..
1b170 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
1b180 74 3a 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 43  t:.  if( p->outC
1b190 6f 75 6e 74 20 29 7b 0a 20 20 20 20 70 2d 3e 6f  ount ){.    p->o
1b1a0 75 74 43 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 69  utCount--;.    i
1b1b0 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 3d 3d  f( p->outCount==
1b1c0 30 20 29 20 6f 75 74 70 75 74 5f 72 65 73 65 74  0 ) output_reset
1b1d0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1b1e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b1f0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
1b200 73 65 6d 69 63 6f 6c 6f 6e 20 6f 63 63 75 72 73  semicolon occurs
1b210 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65   anywhere in the
1b220 20 66 69 72 73 74 20 4e 20 63 68 61 72 61 63 74   first N charact
1b230 65 72 73 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  ers.** of string
1b240 20 7a 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   z[]..*/.static 
1b250 69 6e 74 20 6c 69 6e 65 5f 63 6f 6e 74 61 69 6e  int line_contain
1b260 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63 6f 6e 73  s_semicolon(cons
1b270 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 4e  t char *z, int N
1b280 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1b290 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29  r(i=0; i<N; i++)
1b2a0 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3b 27  {  if( z[i]==';'
1b2b0 20 29 20 72 65 74 75 72 6e 20 31 3b 20 7d 0a 20   ) return 1; }. 
1b2c0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1b2d0 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
1b2e0 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e 73 69 73  if a line consis
1b2f0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 77  ts entirely of w
1b300 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  hitespace..*/.st
1b310 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c 5f 77 68  atic int _all_wh
1b320 69 74 65 73 70 61 63 65 28 63 6f 6e 73 74 20 63  itespace(const c
1b330 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f 72 28 3b  har *z){.  for(;
1b340 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69   *z; z++){.    i
1b350 66 28 20 49 73 53 70 61 63 65 28 7a 5b 30 5d 29  f( IsSpace(z[0])
1b360 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b370 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26 26 20   if( *z=='/' && 
1b380 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20  z[1]=='*' ){.   
1b390 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20     z += 2;.     
1b3a0 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 28 2a   while( *z && (*
1b3b0 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31 5d 21 3d  z!='*' || z[1]!=
1b3c0 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  '/') ){ z++; }. 
1b3d0 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30 20 29       if( *z==0 )
1b3e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1b3f0 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74   z++;.      cont
1b400 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1b410 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26 26 20 7a  if( *z=='-' && z
1b420 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [1]=='-' ){.    
1b430 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    z += 2;.      
1b440 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21  while( *z && *z!
1b450 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  ='\n' ){ z++; }.
1b460 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 30 20        if( *z==0 
1b470 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
1b480 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b490 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
1b4a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1b4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b4c0 54 52 55 45 20 69 66 20 74 68 65 20 6c 69 6e 65  TRUE if the line
1b4d0 20 74 79 70 65 64 20 69 6e 20 69 73 20 61 6e 20   typed in is an 
1b4e0 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74 65 72 6d  SQL command term
1b4f0 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a 2a 2a 20  inator other.** 
1b500 74 68 61 6e 20 61 20 73 65 6d 69 2d 63 6f 6c 6f  than a semi-colo
1b510 6e 2e 20 20 54 68 65 20 53 51 4c 20 53 65 72 76  n.  The SQL Serv
1b520 65 72 20 73 74 79 6c 65 20 22 67 6f 22 20 63 6f  er style "go" co
1b530 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65 72 73 74  mmand is underst
1b540 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20 74 68 65  ood.** as is the
1b550 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a 2a 2f 0a   Oracle "/"..*/.
1b560 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 65 5f  static int line_
1b570 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69  is_command_termi
1b580 6e 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  nator(const char
1b590 20 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77 68 69 6c   *zLine){.  whil
1b5a0 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65  e( IsSpace(zLine
1b5b0 5b 30 5d 29 20 29 7b 20 7a 4c 69 6e 65 2b 2b 3b  [0]) ){ zLine++;
1b5c0 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b   };.  if( zLine[
1b5d0 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61 6c 6c 5f  0]=='/' && _all_
1b5e0 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c 69 6e  whitespace(&zLin
1b5f0 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  e[1]) ){.    ret
1b600 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72 61 63 6c  urn 1;  /* Oracl
1b610 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 54  e */.  }.  if( T
1b620 6f 4c 6f 77 65 72 28 7a 4c 69 6e 65 5b 30 5d 29  oLower(zLine[0])
1b630 3d 3d 27 67 27 20 26 26 20 54 6f 4c 6f 77 65 72  =='g' && ToLower
1b640 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27 6f 27 0a  (zLine[1])=='o'.
1b650 20 20 20 20 20 20 20 20 20 26 26 20 5f 61 6c 6c           && _all
1b660 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a 4c 69  _whitespace(&zLi
1b670 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20 20 72 65  ne[2]) ){.    re
1b680 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53 51 4c 20  turn 1;  /* SQL 
1b690 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d 0a 20 20  Server */.  }.  
1b6a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1b6b0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1b6c0 66 20 7a 53 71 6c 20 69 73 20 61 20 63 6f 6d 70  f zSql is a comp
1b6d0 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
1b6e0 6e 74 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  nt.  Return fals
1b6f0 65 20 69 66 20 69 74 0a 2a 2a 20 65 6e 64 73 20  e if it.** ends 
1b700 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
1b710 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   a string litera
1b720 6c 20 6f 72 20 43 2d 73 74 79 6c 65 20 63 6f 6d  l or C-style com
1b730 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1b740 69 6e 74 20 6c 69 6e 65 5f 69 73 5f 63 6f 6d 70  int line_is_comp
1b750 6c 65 74 65 28 63 68 61 72 20 2a 7a 53 71 6c 2c  lete(char *zSql,
1b760 20 69 6e 74 20 6e 53 71 6c 29 7b 0a 20 20 69 6e   int nSql){.  in
1b770 74 20 72 63 3b 0a 20 20 69 66 28 20 7a 53 71 6c  t rc;.  if( zSql
1b780 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1b790 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20 3d 20 27    zSql[nSql] = '
1b7a0 3b 27 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b  ;';.  zSql[nSql+
1b7b0 31 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  1] = 0;.  rc = s
1b7c0 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28  qlite3_complete(
1b7d0 7a 53 71 6c 29 3b 0a 20 20 7a 53 71 6c 5b 6e 53  zSql);.  zSql[nS
1b7e0 71 6c 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ql] = 0;.  retur
1b7f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b800 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a  ead input from *
1b810 69 6e 20 61 6e 64 20 70 72 6f 63 65 73 73 20 69  in and process i
1b820 74 2e 20 20 49 66 20 2a 69 6e 3d 3d 30 20 74 68  t.  If *in==0 th
1b830 65 6e 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 69  en input.** is i
1b840 6e 74 65 72 61 63 74 69 76 65 20 2d 20 74 68 65  nteractive - the
1b850 20 75 73 65 72 20 69 73 20 74 79 70 69 6e 67 20   user is typing 
1b860 69 74 20 69 74 2e 20 20 4f 74 68 65 72 77 69 73  it it.  Otherwis
1b870 65 2c 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 63  e, input.** is c
1b880 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 66 69 6c  oming from a fil
1b890 65 20 6f 72 20 64 65 76 69 63 65 2e 20 20 41 20  e or device.  A 
1b8a0 70 72 6f 6d 70 74 20 69 73 20 69 73 73 75 65 64  prompt is issued
1b8b0 20 61 6e 64 20 68 69 73 74 6f 72 79 0a 2a 2a 20   and history.** 
1b8c0 69 73 20 73 61 76 65 64 20 6f 6e 6c 79 20 69 66  is saved only if
1b8d0 20 69 6e 70 75 74 20 69 73 20 69 6e 74 65 72 61   input is intera
1b8e0 63 74 69 76 65 2e 20 20 41 6e 20 69 6e 74 65 72  ctive.  An inter
1b8f0 72 75 70 74 20 73 69 67 6e 61 6c 20 77 69 6c 6c  rupt signal will
1b900 0a 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 72  .** cause this r
1b910 6f 75 74 69 6e 65 20 74 6f 20 65 78 69 74 20 69  outine to exit i
1b920 6d 6d 65 64 69 61 74 65 6c 79 2c 20 75 6e 6c 65  mmediately, unle
1b930 73 73 20 69 6e 70 75 74 20 69 73 20 69 6e 74 65  ss input is inte
1b940 72 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 52  ractive..**.** R
1b950 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1b960 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73   of errors..*/.s
1b970 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73  tatic int proces
1b980 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53 74 61  s_input(ShellSta
1b990 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29  te *p, FILE *in)
1b9a0 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 20  {.  char *zLine 
1b9b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1b9c0 20 41 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20   A single input 
1b9d0 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  line */.  char *
1b9e0 7a 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  zSql = 0;       
1b9f0 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74      /* Accumulat
1ba00 65 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 20  ed SQL text */. 
1ba10 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20   int nLine;     
1ba20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
1ba30 6e 67 74 68 20 6f 66 20 63 75 72 72 65 6e 74 20  ngth of current 
1ba40 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  line */.  int nS
1ba50 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ql = 0;         
1ba60 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1ba70 7a 53 71 6c 5b 5d 20 75 73 65 64 20 2a 2f 0a 20  zSql[] used */. 
1ba80 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
1ba90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
1baa0 6c 6f 63 61 74 65 64 20 7a 53 71 6c 5b 5d 20 73  located zSql[] s
1bab0 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  pace */.  int nS
1bac0 71 6c 50 72 69 6f 72 20 3d 20 30 3b 20 20 20 20  qlPrior = 0;    
1bad0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1bae0 7a 53 71 6c 5b 5d 20 75 73 65 64 20 62 79 20 70  zSql[] used by p
1baf0 72 69 6f 72 20 6c 69 6e 65 20 2a 2f 0a 20 20 63  rior line */.  c
1bb00 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20  har *zErrMsg;   
1bb10 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
1bb20 72 20 6d 65 73 73 61 67 65 20 72 65 74 75 72 6e  r message return
1bb30 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ed */.  int rc; 
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
1bb60 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6e 74 20  */.  int errCnt 
1bb70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1bb80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
1bb90 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  rs seen */.  int
1bba0 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20   lineno = 0;    
1bbb0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1bbc0 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  t line number */
1bbd0 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65  .  int startline
1bbe0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1bbf0 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
1bc00 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e 74  start of current
1bc10 20 69 6e 70 75 74 20 2a 2f 0a 0a 20 20 77 68 69   input */..  whi
1bc20 6c 65 28 20 65 72 72 43 6e 74 3d 3d 30 20 7c 7c  le( errCnt==0 ||
1bc30 20 21 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20   !bail_on_error 
1bc40 7c 7c 20 28 69 6e 3d 3d 30 20 26 26 20 73 74 64  || (in==0 && std
1bc50 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
1bc60 65 29 20 29 7b 0a 20 20 20 20 66 66 6c 75 73 68  e) ){.    fflush
1bc70 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 7a 4c  (p->out);.    zL
1bc80 69 6e 65 20 3d 20 6f 6e 65 5f 69 6e 70 75 74 5f  ine = one_input_
1bc90 6c 69 6e 65 28 69 6e 2c 20 7a 4c 69 6e 65 2c 20  line(in, zLine, 
1bca0 6e 53 71 6c 3e 30 29 3b 0a 20 20 20 20 69 66 28  nSql>0);.    if(
1bcb0 20 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20   zLine==0 ){.   
1bcc0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70     /* End of inp
1bcd0 75 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ut */.      if( 
1bce0 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
1bcf0 74 69 76 65 20 29 20 70 72 69 6e 74 66 28 22 5c  tive ) printf("\
1bd00 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
1bd10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bd20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b  seenInterrupt ){
1bd30 0a 20 20 20 20 20 20 69 66 28 20 69 6e 21 3d 30  .      if( in!=0
1bd40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1bd50 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
1bd60 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 69 6e  0;.    }.    lin
1bd70 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6e  eno++;.    if( n
1bd80 53 71 6c 3d 3d 30 20 26 26 20 5f 61 6c 6c 5f 77  Sql==0 && _all_w
1bd90 68 69 74 65 73 70 61 63 65 28 7a 4c 69 6e 65 29  hitespace(zLine)
1bda0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
1bdb0 3e 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66  >echoOn ) printf
1bdc0 28 22 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b  ("%s\n", zLine);
1bdd0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1bde0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
1bdf0 4c 69 6e 65 20 26 26 20 7a 4c 69 6e 65 5b 30 5d  Line && zLine[0]
1be00 3d 3d 27 2e 27 20 26 26 20 6e 53 71 6c 3d 3d 30  =='.' && nSql==0
1be10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
1be20 3e 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74 66  >echoOn ) printf
1be30 28 22 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b  ("%s\n", zLine);
1be40 0a 20 20 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d  .      rc = do_m
1be50 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e  eta_command(zLin
1be60 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28  e, p);.      if(
1be70 20 72 63 3d 3d 32 20 29 7b 20 2f 2a 20 65 78 69   rc==2 ){ /* exi
1be80 74 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  t requested */. 
1be90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1bea0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1beb0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 43   ){.        errC
1bec0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
1bed0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1bee0 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 69 6e 65    }.    if( line
1bef0 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d  _is_command_term
1bf00 69 6e 61 74 6f 72 28 7a 4c 69 6e 65 29 20 26 26  inator(zLine) &&
1bf10 20 6c 69 6e 65 5f 69 73 5f 63 6f 6d 70 6c 65 74   line_is_complet
1bf20 65 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 29 7b  e(zSql, nSql) ){
1bf30 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c  .      memcpy(zL
1bf40 69 6e 65 2c 22 3b 22 2c 32 29 3b 0a 20 20 20 20  ine,";",2);.    
1bf50 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20 73 74  }.    nLine = st
1bf60 72 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20  rlen30(zLine);. 
1bf70 20 20 20 69 66 28 20 6e 53 71 6c 2b 6e 4c 69 6e     if( nSql+nLin
1bf80 65 2b 32 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20  e+2>=nAlloc ){. 
1bf90 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 53       nAlloc = nS
1bfa0 71 6c 2b 6e 4c 69 6e 65 2b 31 30 30 3b 0a 20 20  ql+nLine+100;.  
1bfb0 20 20 20 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c      zSql = reall
1bfc0 6f 63 28 7a 53 71 6c 2c 20 6e 41 6c 6c 6f 63 29  oc(zSql, nAlloc)
1bfd0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c  ;.      if( zSql
1bfe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
1bff0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1c000 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
1c010 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
1c020 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
1c030 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 71   }.    }.    nSq
1c040 6c 50 72 69 6f 72 20 3d 20 6e 53 71 6c 3b 0a 20  lPrior = nSql;. 
1c050 20 20 20 69 66 28 20 6e 53 71 6c 3d 3d 30 20 29     if( nSql==0 )
1c060 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1c070 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4c       for(i=0; zL
1c080 69 6e 65 5b 69 5d 20 26 26 20 49 73 53 70 61 63  ine[i] && IsSpac
1c090 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b  e(zLine[i]); i++
1c0a0 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
1c0b0 28 20 6e 41 6c 6c 6f 63 3e 30 20 26 26 20 7a 53  ( nAlloc>0 && zS
1c0c0 71 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d  ql!=0 );.      m
1c0d0 65 6d 63 70 79 28 7a 53 71 6c 2c 20 7a 4c 69 6e  emcpy(zSql, zLin
1c0e0 65 2b 69 2c 20 6e 4c 69 6e 65 2b 31 2d 69 29 3b  e+i, nLine+1-i);
1c0f0 0a 20 20 20 20 20 20 73 74 61 72 74 6c 69 6e 65  .      startline
1c100 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20   = lineno;.     
1c110 20 6e 53 71 6c 20 3d 20 6e 4c 69 6e 65 2d 69 3b   nSql = nLine-i;
1c120 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c130 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b 2b 5d 20 3d    zSql[nSql++] =
1c140 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 6d 65 6d   '\n';.      mem
1c150 63 70 79 28 7a 53 71 6c 2b 6e 53 71 6c 2c 20 7a  cpy(zSql+nSql, z
1c160 4c 69 6e 65 2c 20 6e 4c 69 6e 65 2b 31 29 3b 0a  Line, nLine+1);.
1c170 20 20 20 20 20 20 6e 53 71 6c 20 2b 3d 20 6e 4c        nSql += nL
1c180 69 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ine;.    }.    i
1c190 66 28 20 6e 53 71 6c 20 26 26 20 6c 69 6e 65 5f  f( nSql && line_
1c1a0 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63 6f 6c  contains_semicol
1c1b0 6f 6e 28 26 7a 53 71 6c 5b 6e 53 71 6c 50 72 69  on(&zSql[nSqlPri
1c1c0 6f 72 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c 50 72  or], nSql-nSqlPr
1c1d0 69 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  ior).           
1c1e0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
1c1f0 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29 20 29  complete(zSql) )
1c200 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 20 3d  {.      p->cnt =
1c210 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64   0;.      open_d
1c220 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 42  b(p, 0);.      B
1c230 45 47 49 4e 5f 54 49 4d 45 52 3b 0a 20 20 20 20  EGIN_TIMER;.    
1c240 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65    rc = shell_exe
1c250 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73  c(p->db, zSql, s
1c260 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  hell_callback, p
1c270 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
1c280 20 20 20 45 4e 44 5f 54 49 4d 45 52 3b 0a 20 20     END_TIMER;.  
1c290 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45      if( rc || zE
1c2a0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
1c2b0 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b 31 30   char zPrefix[10
1c2c0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
1c2d0 69 6e 21 3d 30 20 7c 7c 20 21 73 74 64 69 6e 5f  in!=0 || !stdin_
1c2e0 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29  is_interactive )
1c2f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1c300 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1c310 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50  eof(zPrefix), zP
1c320 72 65 66 69 78 2c 20 0a 20 20 20 20 20 20 20 20  refix, .        
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c340 20 20 20 22 45 72 72 6f 72 3a 20 6e 65 61 72 20     "Error: near 
1c350 6c 69 6e 65 20 25 64 3a 22 2c 20 73 74 61 72 74  line %d:", start
1c360 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  line);.        }
1c370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c380 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1c390 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29  (sizeof(zPrefix)
1c3a0 2c 20 7a 50 72 65 66 69 78 2c 20 22 45 72 72 6f  , zPrefix, "Erro
1c3b0 72 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  r:");.        }.
1c3c0 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72          if( zErr
1c3d0 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Msg!=0 ){.      
1c3e0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1c3f0 72 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a  rr, "%s %s\n", z
1c400 50 72 65 66 69 78 2c 20 7a 45 72 72 4d 73 67 29  Prefix, zErrMsg)
1c410 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1c420 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
1c430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72  );.          zEr
1c440 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
1c450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c460 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1c470 72 2c 20 22 25 73 20 25 73 5c 6e 22 2c 20 7a 50  r, "%s %s\n", zP
1c480 72 65 66 69 78 2c 20 73 71 6c 69 74 65 33 5f 65  refix, sqlite3_e
1c490 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
1c4a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c4b0 20 65 72 72 43 6e 74 2b 2b 3b 0a 20 20 20 20 20   errCnt++;.     
1c4c0 20 7d 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20   }.      nSql = 
1c4d0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
1c4e0 6f 75 74 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  outCount ){.    
1c4f0 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
1c500 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
1c510 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  outCount = 0;.  
1c520 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1c530 69 66 28 20 6e 53 71 6c 20 26 26 20 5f 61 6c 6c  if( nSql && _all
1c540 5f 77 68 69 74 65 73 70 61 63 65 28 7a 53 71 6c  _whitespace(zSql
1c550 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
1c560 2d 3e 65 63 68 6f 4f 6e 20 29 20 70 72 69 6e 74  ->echoOn ) print
1c570 66 28 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  f("%s\n", zSql);
1c580 0a 20 20 20 20 20 20 6e 53 71 6c 20 3d 20 30 3b  .      nSql = 0;
1c590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1c5a0 20 6e 53 71 6c 20 29 7b 0a 20 20 20 20 69 66 28   nSql ){.    if(
1c5b0 20 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70 61 63   !_all_whitespac
1c5c0 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20 20 20  e(zSql) ){.     
1c5d0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1c5e0 20 22 45 72 72 6f 72 3a 20 69 6e 63 6f 6d 70 6c   "Error: incompl
1c5f0 65 74 65 20 53 51 4c 3a 20 25 73 5c 6e 22 2c 20  ete SQL: %s\n", 
1c600 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 65 72 72  zSql);.      err
1c610 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Cnt++;.    }.   
1c620 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d   free(zSql);.  }
1c630 0a 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a  .  free(zLine);.
1c640 20 20 72 65 74 75 72 6e 20 65 72 72 43 6e 74 3e    return errCnt>
1c650 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1c660 72 6e 20 61 20 70 61 74 68 6e 61 6d 65 20 77 68  rn a pathname wh
1c670 69 63 68 20 69 73 20 74 68 65 20 75 73 65 72 27  ich is the user'
1c680 73 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79  s home directory
1c690 2e 20 20 41 0a 2a 2a 20 30 20 72 65 74 75 72 6e  .  A.** 0 return
1c6a0 20 69 6e 64 69 63 61 74 65 73 20 61 6e 20 65 72   indicates an er
1c6b0 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ror of some kind
1c6c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1c6d0 20 2a 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28   *find_home_dir(
1c6e0 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
1c6f0 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d  char *home_dir =
1c700 20 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 68 6f 6d   NULL;.  if( hom
1c710 65 5f 64 69 72 20 29 20 72 65 74 75 72 6e 20 68  e_dir ) return h
1c720 6f 6d 65 5f 64 69 72 3b 0a 0a 23 69 66 20 21 64  ome_dir;..#if !d
1c730 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26  efined(_WIN32) &
1c740 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e 33 32  & !defined(WIN32
1c750 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
1c760 49 4e 33 32 5f 57 43 45 29 20 26 26 20 21 64 65  IN32_WCE) && !de
1c770 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26  fined(__RTP__) &
1c780 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f  & !defined(_WRS_
1c790 4b 45 52 4e 45 4c 29 0a 20 20 7b 0a 20 20 20 20  KERNEL).  {.    
1c7a0 73 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 70  struct passwd *p
1c7b0 77 65 6e 74 3b 0a 20 20 20 20 75 69 64 5f 74 20  went;.    uid_t 
1c7c0 75 69 64 20 3d 20 67 65 74 75 69 64 28 29 3b 0a  uid = getuid();.
1c7d0 20 20 20 20 69 66 28 20 28 70 77 65 6e 74 3d 67      if( (pwent=g
1c7e0 65 74 70 77 75 69 64 28 75 69 64 29 29 20 21 3d  etpwuid(uid)) !=
1c7f0 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 68   NULL) {.      h
1c800 6f 6d 65 5f 64 69 72 20 3d 20 70 77 65 6e 74 2d  ome_dir = pwent-
1c810 3e 70 77 5f 64 69 72 3b 0a 20 20 20 20 7d 0a 20  >pw_dir;.    }. 
1c820 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64   }.#endif..#if d
1c830 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
1c840 45 29 0a 20 20 2f 2a 20 57 69 6e 64 6f 77 73 20  E).  /* Windows 
1c850 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69  CE (arm-wince-mi
1c860 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65  ngw32ce-gcc) doe
1c870 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 67 65  s not provide ge
1c880 74 65 6e 76 28 29 0a 20 20 20 2a 2f 0a 20 20 68  tenv().   */.  h
1c890 6f 6d 65 5f 64 69 72 20 3d 20 22 2f 22 3b 0a 23  ome_dir = "/";.#
1c8a0 65 6c 73 65 0a 0a 23 69 66 20 64 65 66 69 6e 65  else..#if define
1c8b0 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
1c8c0 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 69 66  ined(WIN32).  if
1c8d0 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b 0a 20   (!home_dir) {. 
1c8e0 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 67 65     home_dir = ge
1c8f0 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c  tenv("USERPROFIL
1c900 45 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  E");.  }.#endif.
1c910 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72  .  if (!home_dir
1c920 29 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72  ) {.    home_dir
1c930 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 22   = getenv("HOME"
1c940 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65 66 69  );.  }..#if defi
1c950 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
1c960 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20  efined(WIN32).  
1c970 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29 20 7b  if (!home_dir) {
1c980 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 72 69 76  .    char *zDriv
1c990 65 2c 20 2a 7a 50 61 74 68 3b 0a 20 20 20 20 69  e, *zPath;.    i
1c9a0 6e 74 20 6e 3b 0a 20 20 20 20 7a 44 72 69 76 65  nt n;.    zDrive
1c9b0 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 44   = getenv("HOMED
1c9c0 52 49 56 45 22 29 3b 0a 20 20 20 20 7a 50 61 74  RIVE");.    zPat
1c9d0 68 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45  h = getenv("HOME
1c9e0 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20  PATH");.    if( 
1c9f0 7a 44 72 69 76 65 20 26 26 20 7a 50 61 74 68 20  zDrive && zPath 
1ca00 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72  ){.      n = str
1ca10 6c 65 6e 33 30 28 7a 44 72 69 76 65 29 20 2b 20  len30(zDrive) + 
1ca20 73 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20  strlen30(zPath) 
1ca30 2b 20 31 3b 0a 20 20 20 20 20 20 68 6f 6d 65 5f  + 1;.      home_
1ca40 64 69 72 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20  dir = malloc( n 
1ca50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 6d  );.      if( hom
1ca60 65 5f 64 69 72 3d 3d 30 20 29 20 72 65 74 75 72  e_dir==0 ) retur
1ca70 6e 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n 0;.      sqlit
1ca80 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 68  e3_snprintf(n, h
1ca90 6f 6d 65 5f 64 69 72 2c 20 22 25 73 25 73 22 2c  ome_dir, "%s%s",
1caa0 20 7a 44 72 69 76 65 2c 20 7a 50 61 74 68 29 3b   zDrive, zPath);
1cab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 6f  .      return ho
1cac0 6d 65 5f 64 69 72 3b 0a 20 20 20 20 7d 0a 20 20  me_dir;.    }.  
1cad0 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 22 63 3a    home_dir = "c:
1cae0 5c 5c 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  \\";.  }.#endif.
1caf0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 5f 57 49 4e  .#endif /* !_WIN
1cb00 33 32 5f 57 43 45 20 2a 2f 0a 0a 20 20 69 66 28  32_WCE */..  if(
1cb10 20 68 6f 6d 65 5f 64 69 72 20 29 7b 0a 20 20 20   home_dir ){.   
1cb20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
1cb30 30 28 68 6f 6d 65 5f 64 69 72 29 20 2b 20 31 3b  0(home_dir) + 1;
1cb40 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 6d  .    char *z = m
1cb50 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20  alloc( n );.    
1cb60 69 66 28 20 7a 20 29 20 6d 65 6d 63 70 79 28 7a  if( z ) memcpy(z
1cb70 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 6e 29 3b 0a  , home_dir, n);.
1cb80 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 7a      home_dir = z
1cb90 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1cba0 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a 0a 2f 2a 0a  home_dir;.}../*.
1cbb0 2a 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72  ** Read input fr
1cbc0 6f 6d 20 74 68 65 20 66 69 6c 65 20 67 69 76 65  om the file give
1cbd0 6e 20 62 79 20 73 71 6c 69 74 65 72 63 5f 6f 76  n by sqliterc_ov
1cbe0 65 72 72 69 64 65 2e 20 20 4f 72 20 69 66 20 74  erride.  Or if t
1cbf0 68 61 74 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  hat.** parameter
1cc00 20 69 73 20 4e 55 4c 4c 2c 20 74 61 6b 65 20 69   is NULL, take i
1cc10 6e 70 75 74 20 66 72 6f 6d 20 7e 2f 2e 73 71 6c  nput from ~/.sql
1cc20 69 74 65 72 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75  iterc.**.** Retu
1cc30 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1cc40 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61  f errors..*/.sta
1cc50 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f  tic int process_
1cc60 73 71 6c 69 74 65 72 63 28 0a 20 20 53 68 65 6c  sqliterc(.  Shel
1cc70 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20  lState *p,      
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1cc90 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74  onfiguration dat
1cca0 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  a */.  const cha
1ccb0 72 20 2a 73 71 6c 69 74 65 72 63 5f 6f 76 65 72  r *sqliterc_over
1ccc0 72 69 64 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ride   /* Name o
1ccd0 66 20 63 6f 6e 66 69 67 20 66 69 6c 65 2e 20 4e  f config file. N
1cce0 55 4c 4c 20 74 6f 20 75 73 65 20 64 65 66 61 75  ULL to use defau
1ccf0 6c 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  lt */.){.  char 
1cd00 2a 68 6f 6d 65 5f 64 69 72 20 3d 20 4e 55 4c 4c  *home_dir = NULL
1cd10 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1cd20 73 71 6c 69 74 65 72 63 20 3d 20 73 71 6c 69 74  sqliterc = sqlit
1cd30 65 72 63 5f 6f 76 65 72 72 69 64 65 3b 0a 20 20  erc_override;.  
1cd40 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a  char *zBuf = 0;.
1cd50 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 4e 55 4c    FILE *in = NUL
1cd60 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  L;.  int rc = 0;
1cd70 0a 0a 20 20 69 66 20 28 73 71 6c 69 74 65 72 63  ..  if (sqliterc
1cd80 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   == NULL) {.    
1cd90 68 6f 6d 65 5f 64 69 72 20 3d 20 66 69 6e 64 5f  home_dir = find_
1cda0 68 6f 6d 65 5f 64 69 72 28 29 3b 0a 20 20 20 20  home_dir();.    
1cdb0 69 66 28 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20  if( home_dir==0 
1cdc0 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
1cdd0 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66  __RTP__) && !def
1cde0 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
1cdf0 29 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ).      fprintf(
1ce00 73 74 64 65 72 72 2c 22 25 73 3a 20 45 72 72 6f  stderr,"%s: Erro
1ce10 72 3a 20 63 61 6e 6e 6f 74 20 6c 6f 63 61 74 65  r: cannot locate
1ce20 20 79 6f 75 72 20 68 6f 6d 65 20 64 69 72 65 63   your home direc
1ce30 74 6f 72 79 5c 6e 22 2c 20 41 72 67 76 30 29 3b  tory\n", Argv0);
1ce40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
1ce50 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1ce60 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61    sqlite3_initia
1ce70 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7a 42 75 66  lize();.    zBuf
1ce80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1ce90 74 66 28 22 25 73 2f 2e 73 71 6c 69 74 65 72 63  tf("%s/.sqliterc
1cea0 22 2c 68 6f 6d 65 5f 64 69 72 29 3b 0a 20 20 20  ",home_dir);.   
1ceb0 20 73 71 6c 69 74 65 72 63 20 3d 20 7a 42 75 66   sqliterc = zBuf
1cec0 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70  ;.  }.  in = fop
1ced0 65 6e 28 73 71 6c 69 74 65 72 63 2c 22 72 62 22  en(sqliterc,"rb"
1cee0 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20  );.  if( in ){. 
1cef0 20 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73 5f     if( stdin_is_
1cf00 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a 20  interactive ){. 
1cf10 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
1cf20 65 72 72 2c 22 2d 2d 20 4c 6f 61 64 69 6e 67 20  err,"-- Loading 
1cf30 72 65 73 6f 75 72 63 65 73 20 66 72 6f 6d 20 25  resources from %
1cf40 73 5c 6e 22 2c 73 71 6c 69 74 65 72 63 29 3b 0a  s\n",sqliterc);.
1cf50 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
1cf60 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 69  rocess_input(p,i
1cf70 6e 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  n);.    fclose(i
1cf80 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  n);.  }.  sqlite
1cf90 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
1cfa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1cfb0 0a 2a 2a 20 53 68 6f 77 20 61 76 61 69 6c 61 62  .** Show availab
1cfc0 6c 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  le command line 
1cfd0 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69  options.*/.stati
1cfe0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4f 70  c const char zOp
1cff0 74 69 6f 6e 73 5b 5d 20 3d 20 0a 20 20 22 20 20  tions[] = .  "  
1d000 20 2d 62 61 69 6c 20 20 20 20 20 20 20 20 20 20   -bail          
1d010 20 20 20 20 20 20 73 74 6f 70 20 61 66 74 65 72        stop after
1d020 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
1d030 72 5c 6e 22 0a 20 20 22 20 20 20 2d 62 61 74 63  r\n".  "   -batc
1d040 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
1d050 66 6f 72 63 65 20 62 61 74 63 68 20 49 2f 4f 5c  force batch I/O\
1d060 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c 75 6d 6e  n".  "   -column
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
1d080 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
1d090 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a 20 20 22   'column'\n".  "
1d0a0 20 20 20 2d 63 6d 64 20 43 4f 4d 4d 41 4e 44 20     -cmd COMMAND 
1d0b0 20 20 20 20 20 20 20 20 72 75 6e 20 5c 22 43 4f          run \"CO
1d0c0 4d 4d 41 4e 44 5c 22 20 62 65 66 6f 72 65 20 72  MMAND\" before r
1d0d0 65 61 64 69 6e 67 20 73 74 64 69 6e 5c 6e 22 0a  eading stdin\n".
1d0e0 20 20 22 20 20 20 2d 63 73 76 20 20 20 20 20 20    "   -csv      
1d0f0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
1d100 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 63  utput mode to 'c
1d110 73 76 27 5c 6e 22 0a 20 20 22 20 20 20 2d 65 63  sv'\n".  "   -ec
1d120 68 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ho              
1d130 20 20 70 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 73    print commands
1d140 20 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6f   before executio
1d150 6e 5c 6e 22 0a 20 20 22 20 20 20 2d 69 6e 69 74  n\n".  "   -init
1d160 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20   FILENAME       
1d170 72 65 61 64 2f 70 72 6f 63 65 73 73 20 6e 61 6d  read/process nam
1d180 65 64 20 66 69 6c 65 5c 6e 22 0a 20 20 22 20 20  ed file\n".  "  
1d190 20 2d 5b 6e 6f 5d 68 65 61 64 65 72 20 20 20 20   -[no]header    
1d1a0 20 20 20 20 20 20 74 75 72 6e 20 68 65 61 64 65        turn heade
1d1b0 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  rs on or off\n".
1d1c0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1d1d0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
1d1e0 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
1d1f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
1d200 59 53 35 29 0a 20 20 22 20 20 20 2d 68 65 61 70  YS5).  "   -heap
1d210 20 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 20   SIZE           
1d220 53 69 7a 65 20 6f 66 20 68 65 61 70 20 66 6f 72  Size of heap for
1d230 20 6d 65 6d 73 79 73 33 20 6f 72 20 6d 65 6d 73   memsys3 or mems
1d240 79 73 35 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  ys5\n".#endif.  
1d250 22 20 20 20 2d 68 65 6c 70 20 20 20 20 20 20 20  "   -help       
1d260 20 20 20 20 20 20 20 20 20 73 68 6f 77 20 74 68           show th
1d270 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20  is message\n".  
1d280 22 20 20 20 2d 68 74 6d 6c 20 20 20 20 20 20 20  "   -html       
1d290 20 20 20 20 20 20 20 20 20 73 65 74 20 6f 75 74           set out
1d2a0 70 75 74 20 6d 6f 64 65 20 74 6f 20 48 54 4d 4c  put mode to HTML
1d2b0 5c 6e 22 0a 20 20 22 20 20 20 2d 69 6e 74 65 72  \n".  "   -inter
1d2c0 61 63 74 69 76 65 20 20 20 20 20 20 20 20 20 66  active         f
1d2d0 6f 72 63 65 20 69 6e 74 65 72 61 63 74 69 76 65  orce interactive
1d2e0 20 49 2f 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 6c   I/O\n".  "   -l
1d2f0 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
1d300 20 20 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f     set output mo
1d310 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c 6e 22 0a  de to 'line'\n".
1d320 20 20 22 20 20 20 2d 6c 69 73 74 20 20 20 20 20    "   -list     
1d330 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6f             set o
1d340 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 27 6c  utput mode to 'l
1d350 69 73 74 27 5c 6e 22 0a 20 20 22 20 20 20 2d 6c  ist'\n".  "   -l
1d360 6f 6f 6b 61 73 69 64 65 20 53 49 5a 45 20 4e 20  ookaside SIZE N 
1d370 20 20 20 75 73 65 20 4e 20 65 6e 74 72 69 65 73     use N entries
1d380 20 6f 66 20 53 5a 20 62 79 74 65 73 20 66 6f 72   of SZ bytes for
1d390 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
1d3a0 79 5c 6e 22 0a 20 20 22 20 20 20 2d 6d 6d 61 70  y\n".  "   -mmap
1d3b0 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   N              
1d3c0 64 65 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a  default mmap siz
1d3d0 65 20 73 65 74 20 74 6f 20 4e 5c 6e 22 0a 23 69  e set to N\n".#i
1d3e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1d3f0 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 22  LE_MULTIPLEX.  "
1d400 20 20 20 2d 6d 75 6c 74 69 70 6c 65 78 20 20 20     -multiplex   
1d410 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 20 74          enable t
1d420 68 65 20 6d 75 6c 74 69 70 6c 65 78 6f 72 20 56  he multiplexor V
1d430 46 53 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22  FS\n".#endif.  "
1d440 20 20 20 2d 6e 65 77 6c 69 6e 65 20 53 45 50 20     -newline SEP 
1d450 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 77 6c          set newl
1d460 69 6e 65 20 63 68 61 72 61 63 74 65 72 28 73 29  ine character(s)
1d470 20 66 6f 72 20 43 53 56 5c 6e 22 0a 20 20 22 20   for CSV\n".  " 
1d480 20 20 2d 6e 75 6c 6c 76 61 6c 75 65 20 54 45 58    -nullvalue TEX
1d490 54 20 20 20 20 20 20 73 65 74 20 74 65 78 74 20  T      set text 
1d4a0 73 74 72 69 6e 67 20 66 6f 72 20 4e 55 4c 4c 20  string for NULL 
1d4b0 76 61 6c 75 65 73 2e 20 44 65 66 61 75 6c 74 20  values. Default 
1d4c0 27 27 5c 6e 22 0a 20 20 22 20 20 20 2d 70 61 67  ''\n".  "   -pag
1d4d0 65 63 61 63 68 65 20 53 49 5a 45 20 4e 20 20 20  ecache SIZE N   
1d4e0 20 75 73 65 20 4e 20 73 6c 6f 74 73 20 6f 66 20   use N slots of 
1d4f0 53 5a 20 62 79 74 65 73 20 65 61 63 68 20 66 6f  SZ bytes each fo
1d500 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d  r page cache mem
1d510 6f 72 79 5c 6e 22 0a 20 20 22 20 20 20 2d 73 63  ory\n".  "   -sc
1d520 72 61 74 63 68 20 53 49 5a 45 20 4e 20 20 20 20  ratch SIZE N    
1d530 20 20 75 73 65 20 4e 20 73 6c 6f 74 73 20 6f 66    use N slots of
1d540 20 53 5a 20 62 79 74 65 73 20 65 61 63 68 20 66   SZ bytes each f
1d550 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  or scratch memor
1d560 79 5c 6e 22 0a 20 20 22 20 20 20 2d 73 65 70 61  y\n".  "   -sepa
1d570 72 61 74 6f 72 20 53 45 50 20 20 20 20 20 20 20  rator SEP       
1d580 73 65 74 20 6f 75 74 70 75 74 20 66 69 65 6c 64  set output field
1d590 20 73 65 70 61 72 61 74 6f 72 2e 20 44 65 66 61   separator. Defa
1d5a0 75 6c 74 3a 20 27 7c 27 5c 6e 22 0a 20 20 22 20  ult: '|'\n".  " 
1d5b0 20 20 2d 73 74 61 74 73 20 20 20 20 20 20 20 20    -stats        
1d5c0 20 20 20 20 20 20 20 70 72 69 6e 74 20 6d 65 6d         print mem
1d5d0 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65  ory stats before
1d5e0 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 5c 6e   each finalize\n
1d5f0 22 0a 20 20 22 20 20 20 2d 76 65 72 73 69 6f 6e  ".  "   -version
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f               sho
1d610 77 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  w SQLite version
1d620 5c 6e 22 0a 20 20 22 20 20 20 2d 76 66 73 20 4e  \n".  "   -vfs N
1d630 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 75  AME            u
1d640 73 65 20 4e 41 4d 45 20 61 73 20 74 68 65 20 64  se NAME as the d
1d650 65 66 61 75 6c 74 20 56 46 53 5c 6e 22 0a 23 69  efault VFS\n".#i
1d660 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1d670 4c 45 5f 56 46 53 54 52 41 43 45 0a 20 20 22 20  LE_VFSTRACE.  " 
1d680 20 20 2d 76 66 73 74 72 61 63 65 20 20 20 20 20    -vfstrace     
1d690 20 20 20 20 20 20 20 65 6e 61 62 6c 65 20 74 72         enable tr
1d6a0 61 63 69 6e 67 20 6f 66 20 61 6c 6c 20 56 46 53  acing of all VFS
1d6b0 20 63 61 6c 6c 73 5c 6e 22 0a 23 65 6e 64 69 66   calls\n".#endif
1d6c0 0a 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .;.static void u
1d6d0 73 61 67 65 28 69 6e 74 20 73 68 6f 77 44 65 74  sage(int showDet
1d6e0 61 69 6c 29 7b 0a 20 20 66 70 72 69 6e 74 66 28  ail){.  fprintf(
1d6f0 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55  stderr,.      "U
1d700 73 61 67 65 3a 20 25 73 20 5b 4f 50 54 49 4f 4e  sage: %s [OPTION
1d710 53 5d 20 46 49 4c 45 4e 41 4d 45 20 5b 53 51 4c  S] FILENAME [SQL
1d720 5d 5c 6e 22 20 20 0a 20 20 20 20 20 20 22 46 49  ]\n"  .      "FI
1d730 4c 45 4e 41 4d 45 20 69 73 20 74 68 65 20 6e 61  LENAME is the na
1d740 6d 65 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20  me of an SQLite 
1d750 64 61 74 61 62 61 73 65 2e 20 41 20 6e 65 77 20  database. A new 
1d760 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
1d770 74 65 64 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  ted\n".      "if
1d780 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1d790 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  ot previously ex
1d7a0 69 73 74 2e 5c 6e 22 2c 20 41 72 67 76 30 29 3b  ist.\n", Argv0);
1d7b0 0a 20 20 69 66 28 20 73 68 6f 77 44 65 74 61 69  .  if( showDetai
1d7c0 6c 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  l ){.    fprintf
1d7d0 28 73 74 64 65 72 72 2c 20 22 4f 50 54 49 4f 4e  (stderr, "OPTION
1d7e0 53 20 69 6e 63 6c 75 64 65 3a 5c 6e 25 73 22 2c  S include:\n%s",
1d7f0 20 7a 4f 70 74 69 6f 6e 73 29 3b 0a 20 20 7d 65   zOptions);.  }e
1d800 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
1d810 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 74 68  (stderr, "Use th
1d820 65 20 2d 68 65 6c 70 20 6f 70 74 69 6f 6e 20 66  e -help option f
1d830 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1d840 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20  formation\n");. 
1d850 20 7d 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a   }.  exit(1);.}.
1d860 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1d870 65 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f  e the state info
1d880 72 6d 61 74 69 6f 6e 20 69 6e 20 64 61 74 61 0a  rmation in data.
1d890 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1d8a0 61 69 6e 5f 69 6e 69 74 28 53 68 65 6c 6c 53 74  ain_init(ShellSt
1d8b0 61 74 65 20 2a 64 61 74 61 29 20 7b 0a 20 20 6d  ate *data) {.  m
1d8c0 65 6d 73 65 74 28 64 61 74 61 2c 20 30 2c 20 73  emset(data, 0, s
1d8d0 69 7a 65 6f 66 28 2a 64 61 74 61 29 29 3b 0a 20  izeof(*data));. 
1d8e0 20 64 61 74 61 2d 3e 6d 6f 64 65 20 3d 20 4d 4f   data->mode = MO
1d8f0 44 45 5f 4c 69 73 74 3b 0a 20 20 6d 65 6d 63 70  DE_List;.  memcp
1d900 79 28 64 61 74 61 2d 3e 73 65 70 61 72 61 74 6f  y(data->separato
1d910 72 2c 22 7c 22 2c 20 32 29 3b 0a 20 20 6d 65 6d  r,"|", 2);.  mem
1d920 63 70 79 28 64 61 74 61 2d 3e 6e 65 77 6c 69 6e  cpy(data->newlin
1d930 65 2c 22 5c 72 5c 6e 22 2c 20 33 29 3b 0a 20 20  e,"\r\n", 3);.  
1d940 64 61 74 61 2d 3e 73 68 6f 77 48 65 61 64 65 72  data->showHeader
1d950 20 3d 20 30 3b 0a 20 20 64 61 74 61 2d 3e 73 68   = 0;.  data->sh
1d960 65 6c 6c 46 6c 67 73 20 3d 20 53 48 46 4c 47 5f  ellFlgs = SHFLG_
1d970 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 73 71 6c  Lookaside;.  sql
1d980 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
1d990 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 20 31  TE_CONFIG_URI, 1
1d9a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  );.  sqlite3_con
1d9b0 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
1d9c0 47 5f 4c 4f 47 2c 20 73 68 65 6c 6c 4c 6f 67 2c  G_LOG, shellLog,
1d9d0 20 64 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65   data);.  sqlite
1d9e0 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
1d9f0 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45  CONFIG_MULTITHRE
1da00 41 44 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  AD);.  sqlite3_s
1da10 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 6d  nprintf(sizeof(m
1da20 61 69 6e 50 72 6f 6d 70 74 29 2c 20 6d 61 69 6e  ainPrompt), main
1da30 50 72 6f 6d 70 74 2c 22 73 71 6c 69 74 65 3e 20  Prompt,"sqlite> 
1da40 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ");.  sqlite3_sn
1da50 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 63 6f  printf(sizeof(co
1da60 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2c 20 63  ntinuePrompt), c
1da70 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 22 20  ontinuePrompt," 
1da80 20 20 2e 2e 2e 3e 20 22 29 3b 0a 7d 0a 0a 2f 2a    ...> ");.}../*
1da90 0a 2a 2a 20 4f 75 74 70 75 74 20 74 65 78 74 20  .** Output text 
1daa0 74 6f 20 74 68 65 20 63 6f 6e 73 6f 6c 65 20 69  to the console i
1dab0 6e 20 61 20 66 6f 6e 74 20 74 68 61 74 20 61 74  n a font that at
1dac0 74 72 61 63 74 73 20 65 78 74 72 61 20 61 74 74  tracts extra att
1dad0 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65  ention..*/.#ifde
1dae0 66 20 5f 57 49 4e 33 32 0a 73 74 61 74 69 63 20  f _WIN32.static 
1daf0 76 6f 69 64 20 70 72 69 6e 74 42 6f 6c 64 28 63  void printBold(c
1db00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
1db10 29 7b 0a 20 20 48 41 4e 44 4c 45 20 6f 75 74 20  ){.  HANDLE out 
1db20 3d 20 47 65 74 53 74 64 48 61 6e 64 6c 65 28 53  = GetStdHandle(S
1db30 54 44 5f 4f 55 54 50 55 54 5f 48 41 4e 44 4c 45  TD_OUTPUT_HANDLE
1db40 29 3b 0a 20 20 43 4f 4e 53 4f 4c 45 5f 53 43 52  );.  CONSOLE_SCR
1db50 45 45 4e 5f 42 55 46 46 45 52 5f 49 4e 46 4f 20  EEN_BUFFER_INFO 
1db60 64 65 66 61 75 6c 74 53 63 72 65 65 6e 49 6e 66  defaultScreenInf
1db70 6f 3b 0a 20 20 47 65 74 43 6f 6e 73 6f 6c 65 53  o;.  GetConsoleS
1db80 63 72 65 65 6e 42 75 66 66 65 72 49 6e 66 6f 28  creenBufferInfo(
1db90 6f 75 74 2c 20 26 64 65 66 61 75 6c 74 53 63 72  out, &defaultScr
1dba0 65 65 6e 49 6e 66 6f 29 3b 0a 20 20 53 65 74 43  eenInfo);.  SetC
1dbb0 6f 6e 73 6f 6c 65 54 65 78 74 41 74 74 72 69 62  onsoleTextAttrib
1dbc0 75 74 65 28 6f 75 74 2c 0a 20 20 20 20 20 20 20  ute(out,.       
1dbd0 20 20 46 4f 52 45 47 52 4f 55 4e 44 5f 52 45 44    FOREGROUND_RED
1dbe0 7c 46 4f 52 45 47 52 4f 55 4e 44 5f 49 4e 54 45  |FOREGROUND_INTE
1dbf0 4e 53 49 54 59 0a 20 20 29 3b 0a 20 20 70 72 69  NSITY.  );.  pri
1dc00 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78 74 29  ntf("%s", zText)
1dc10 3b 0a 20 20 53 65 74 43 6f 6e 73 6f 6c 65 54 65  ;.  SetConsoleTe
1dc20 78 74 41 74 74 72 69 62 75 74 65 28 6f 75 74 2c  xtAttribute(out,
1dc30 20 64 65 66 61 75 6c 74 53 63 72 65 65 6e 49 6e   defaultScreenIn
1dc40 66 6f 2e 77 41 74 74 72 69 62 75 74 65 73 29 3b  fo.wAttributes);
1dc50 0a 7d 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  .}.#else.static 
1dc60 76 6f 69 64 20 70 72 69 6e 74 42 6f 6c 64 28 63  void printBold(c
1dc70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
1dc80 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 5c 30 33  ){.  printf("\03
1dc90 33 5b 31 6d 25 73 5c 30 33 33 5b 30 6d 22 2c 20  3[1m%s\033[0m", 
1dca0 7a 54 65 78 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  zText);.}.#endif
1dcb0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20  ../*.** Get the 
1dcc0 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 20 2d  argument to an -
1dcd0 2d 6f 70 74 69 6f 6e 2e 20 20 54 68 72 6f 77 20  -option.  Throw 
1dce0 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 64 69 65  an error and die
1dcf0 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74 0a   if no argument.
1dd00 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
1dd10 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1dd20 2a 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f  *cmdline_option_
1dd30 76 61 6c 75 65 28 69 6e 74 20 61 72 67 63 2c 20  value(int argc, 
1dd40 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 69 6e 74  char **argv, int
1dd50 20 69 29 7b 0a 20 20 69 66 28 20 69 3d 3d 61 72   i){.  if( i==ar
1dd60 67 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  gc ){.    fprint
1dd70 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20 45  f(stderr, "%s: E
1dd80 72 72 6f 72 3a 20 6d 69 73 73 69 6e 67 20 61 72  rror: missing ar
1dd90 67 75 6d 65 6e 74 20 74 6f 20 25 73 5c 6e 22 2c  gument to %s\n",
1dda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67  .            arg
1ddb0 76 5b 30 5d 2c 20 61 72 67 76 5b 61 72 67 63 2d  v[0], argv[argc-
1ddc0 31 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  1]);.    exit(1)
1ddd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
1dde0 72 67 76 5b 69 5d 3b 0a 7d 0a 0a 69 6e 74 20 6d  rgv[i];.}..int m
1ddf0 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
1de00 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68  ar **argv){.  ch
1de10 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
1de20 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61  .  ShellState da
1de30 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta;.  const char
1de40 20 2a 7a 49 6e 69 74 46 69 6c 65 20 3d 20 30 3b   *zInitFile = 0;
1de50 0a 20 20 63 68 61 72 20 2a 7a 46 69 72 73 74 43  .  char *zFirstC
1de60 6d 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  md = 0;.  int i;
1de70 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
1de80 20 69 6e 74 20 77 61 72 6e 49 6e 6d 65 6d 6f 72   int warnInmemor
1de90 79 44 62 20 3d 20 30 3b 0a 0a 23 69 66 20 55 53  yDb = 0;..#if US
1dea0 45 5f 53 59 53 54 45 4d 5f 53 51 4c 49 54 45 2b  E_SYSTEM_SQLITE+
1deb0 30 21 3d 31 0a 20 20 69 66 28 20 73 74 72 63 6d  0!=1.  if( strcm
1dec0 70 28 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  p(sqlite3_source
1ded0 69 64 28 29 2c 53 51 4c 49 54 45 5f 53 4f 55 52  id(),SQLITE_SOUR
1dee0 43 45 5f 49 44 29 21 3d 30 20 29 7b 0a 20 20 20  CE_ID)!=0 ){.   
1def0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1df00 20 22 53 51 4c 69 74 65 20 68 65 61 64 65 72 20   "SQLite header 
1df10 61 6e 64 20 73 6f 75 72 63 65 20 76 65 72 73 69  and source versi
1df20 6f 6e 20 6d 69 73 6d 61 74 63 68 5c 6e 25 73 5c  on mismatch\n%s\
1df30 6e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  n%s\n",.        
1df40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 75 72      sqlite3_sour
1df50 63 65 69 64 28 29 2c 20 53 51 4c 49 54 45 5f 53  ceid(), SQLITE_S
1df60 4f 55 52 43 45 5f 49 44 29 3b 0a 20 20 20 20 65  OURCE_ID);.    e
1df70 78 69 74 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64  xit(1);.  }.#end
1df80 69 66 0a 20 20 41 72 67 76 30 20 3d 20 61 72 67  if.  Argv0 = arg
1df90 76 5b 30 5d 3b 0a 20 20 6d 61 69 6e 5f 69 6e 69  v[0];.  main_ini
1dfa0 74 28 26 64 61 74 61 29 3b 0a 20 20 73 74 64 69  t(&data);.  stdi
1dfb0 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65  n_is_interactive
1dfc0 20 3d 20 69 73 61 74 74 79 28 30 29 3b 0a 0a 20   = isatty(0);.. 
1dfd0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
1dfe0 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 73 69   have a valid si
1dff0 67 6e 61 6c 20 68 61 6e 64 6c 65 72 20 65 61 72  gnal handler ear
1e000 6c 79 2c 20 62 65 66 6f 72 65 20 61 6e 79 74 68  ly, before anyth
1e010 69 6e 67 0a 20 20 2a 2a 20 65 6c 73 65 20 69 73  ing.  ** else is
1e020 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 23 69 66 64   done..  */.#ifd
1e030 65 66 20 53 49 47 49 4e 54 0a 20 20 73 69 67 6e  ef SIGINT.  sign
1e040 61 6c 28 53 49 47 49 4e 54 2c 20 69 6e 74 65 72  al(SIGINT, inter
1e050 72 75 70 74 5f 68 61 6e 64 6c 65 72 29 3b 0a 23  rupt_handler);.#
1e060 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 61  endif..  /* Do a
1e070 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20 74  n initial pass t
1e080 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6d 6d 61  hrough the comma
1e090 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
1e0a0 20 74 6f 20 6c 6f 63 61 74 65 0a 20 20 2a 2a 20   to locate.  ** 
1e0b0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1e0c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
1e0d0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
1e0e0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69  nitialization fi
1e0f0 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a  le,.  ** the siz
1e100 65 20 6f 66 20 74 68 65 20 61 6c 74 65 72 6e 61  e of the alterna
1e110 74 69 76 65 20 6d 61 6c 6c 6f 63 20 68 65 61 70  tive malloc heap
1e120 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 66  ,.  ** and the f
1e130 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  irst command to 
1e140 65 78 65 63 75 74 65 2e 0a 20 20 2a 2f 0a 20 20  execute..  */.  
1e150 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b  for(i=1; i<argc;
1e160 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
1e170 2a 7a 3b 0a 20 20 20 20 7a 20 3d 20 61 72 67 76  *z;.    z = argv
1e180 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [i];.    if( z[0
1e190 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
1e1a0 69 66 28 20 64 61 74 61 2e 7a 44 62 46 69 6c 65  if( data.zDbFile
1e1b0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
1e1c0 20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e     data.zDbFilen
1e1d0 61 6d 65 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20  ame = z;.       
1e1e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e1f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69   }.      if( zFi
1e200 72 73 74 43 6d 64 3d 3d 30 20 29 7b 0a 20 20 20  rstCmd==0 ){.   
1e210 20 20 20 20 20 7a 46 69 72 73 74 43 6d 64 20 3d       zFirstCmd =
1e220 20 7a 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   z;.        cont
1e230 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
1e240 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1e250 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 74  rr,"%s: Error: t
1e260 6f 6f 20 6d 61 6e 79 20 6f 70 74 69 6f 6e 73 3a  oo many options:
1e270 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 41 72 67 76   \"%s\"\n", Argv
1e280 30 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  0, argv[i]);.   
1e290 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1e2a0 72 2c 22 55 73 65 20 2d 68 65 6c 70 20 66 6f 72  r,"Use -help for
1e2b0 20 61 20 6c 69 73 74 20 6f 66 20 6f 70 74 69 6f   a list of optio
1e2c0 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ns.\n");.      r
1e2d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1e2e0 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27     if( z[1]=='-'
1e2f0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
1e300 73 74 72 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72  strcmp(z,"-separ
1e310 61 74 6f 72 22 29 3d 3d 30 0a 20 20 20 20 20 7c  ator")==0.     |
1e320 7c 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 75 6c  | strcmp(z,"-nul
1e330 6c 76 61 6c 75 65 22 29 3d 3d 30 0a 20 20 20 20  lvalue")==0.    
1e340 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6e   || strcmp(z,"-n
1e350 65 77 6c 69 6e 65 22 29 3d 3d 30 0a 20 20 20 20  ewline")==0.    
1e360 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63   || strcmp(z,"-c
1e370 6d 64 22 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  md")==0.    ){. 
1e380 20 20 20 20 20 28 76 6f 69 64 29 63 6d 64 6c 69       (void)cmdli
1e390 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
1e3a0 61 72 67 63 2c 20 61 72 67 76 2c 20 2b 2b 69 29  argc, argv, ++i)
1e3b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e3c0 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22  strcmp(z,"-init"
1e3d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 49  )==0 ){.      zI
1e3e0 6e 69 74 46 69 6c 65 20 3d 20 63 6d 64 6c 69 6e  nitFile = cmdlin
1e3f0 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
1e400 72 67 63 2c 20 61 72 67 76 2c 20 2b 2b 69 29 3b  rgc, argv, ++i);
1e410 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1e420 74 72 63 6d 70 28 7a 2c 22 2d 62 61 74 63 68 22  trcmp(z,"-batch"
1e430 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
1e440 20 4e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   Need to check f
1e450 6f 72 20 62 61 74 63 68 20 6d 6f 64 65 20 68 65  or batch mode he
1e460 72 65 20 74 6f 20 73 6f 20 77 65 20 63 61 6e 20  re to so we can 
1e470 61 76 6f 69 64 20 70 72 69 6e 74 69 6e 67 0a 20  avoid printing. 
1e480 20 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74       ** informat
1e490 69 6f 6e 61 6c 20 6d 65 73 73 61 67 65 73 20 28  ional messages (
1e4a0 6c 69 6b 65 20 66 72 6f 6d 20 70 72 6f 63 65 73  like from proces
1e4b0 73 5f 73 71 6c 69 74 65 72 63 29 20 62 65 66 6f  s_sqliterc) befo
1e4c0 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  re .      ** we 
1e4d0 64 6f 20 74 68 65 20 61 63 74 75 61 6c 20 70 72  do the actual pr
1e4e0 6f 63 65 73 73 69 6e 67 20 6f 66 20 61 72 67 75  ocessing of argu
1e4f0 6d 65 6e 74 73 20 6c 61 74 65 72 20 69 6e 20 61  ments later in a
1e500 20 73 65 63 6f 6e 64 20 70 61 73 73 2e 0a 20 20   second pass..  
1e510 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 64      */.      std
1e520 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
1e530 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
1e540 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1e550 68 65 61 70 22 29 3d 3d 30 20 29 7b 0a 23 69 66  heap")==0 ){.#if
1e560 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1e570 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
1e580 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1e590 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
1e5a0 29 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ).      const ch
1e5b0 61 72 20 2a 7a 53 69 7a 65 3b 0a 20 20 20 20 20  ar *zSize;.     
1e5c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
1e5d0 7a 48 65 61 70 3b 0a 0a 20 20 20 20 20 20 7a 53  zHeap;..      zS
1e5e0 69 7a 65 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f 70  ize = cmdline_op
1e5f0 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c  tion_value(argc,
1e600 20 61 72 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20   argv, ++i);.   
1e610 20 20 20 73 7a 48 65 61 70 20 3d 20 69 6e 74 65     szHeap = inte
1e620 67 65 72 56 61 6c 75 65 28 7a 53 69 7a 65 29 3b  gerValue(zSize);
1e630 0a 20 20 20 20 20 20 69 66 28 20 73 7a 48 65 61  .      if( szHea
1e640 70 3e 30 78 37 66 66 66 30 30 30 30 20 29 20 73  p>0x7fff0000 ) s
1e650 7a 48 65 61 70 20 3d 20 30 78 37 66 66 66 30 30  zHeap = 0x7fff00
1e660 30 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  00;.      sqlite
1e670 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
1e680 43 4f 4e 46 49 47 5f 48 45 41 50 2c 20 6d 61 6c  CONFIG_HEAP, mal
1e690 6c 6f 63 28 28 69 6e 74 29 73 7a 48 65 61 70 29  loc((int)szHeap)
1e6a0 2c 20 28 69 6e 74 29 73 7a 48 65 61 70 2c 20 36  , (int)szHeap, 6
1e6b0 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  4);.#endif.    }
1e6c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1e6d0 7a 2c 22 2d 73 63 72 61 74 63 68 22 29 3d 3d 30  z,"-scratch")==0
1e6e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 2c   ){.      int n,
1e6f0 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
1e700 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
1e710 65 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e  e(cmdline_option
1e720 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76  _value(argc,argv
1e730 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66  ,++i));.      if
1e740 28 20 73 7a 3e 34 30 30 30 30 30 20 29 20 73 7a  ( sz>400000 ) sz
1e750 20 3d 20 34 30 30 30 30 30 3b 0a 20 20 20 20 20   = 400000;.     
1e760 20 69 66 28 20 73 7a 3c 32 35 30 30 20 29 20 73   if( sz<2500 ) s
1e770 7a 20 3d 20 32 35 30 30 3b 0a 20 20 20 20 20 20  z = 2500;.      
1e780 6e 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  n = (int)integer
1e790 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65 5f 6f 70  Value(cmdline_op
1e7a0 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c  tion_value(argc,
1e7b0 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20  argv,++i));.    
1e7c0 20 20 69 66 28 20 6e 3e 31 30 20 29 20 6e 20 3d    if( n>10 ) n =
1e7d0 20 31 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   10;.      if( n
1e7e0 3c 31 20 29 20 6e 20 3d 20 31 3b 0a 20 20 20 20  <1 ) n = 1;.    
1e7f0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
1e800 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53  (SQLITE_CONFIG_S
1e810 43 52 41 54 43 48 2c 20 6d 61 6c 6c 6f 63 28 6e  CRATCH, malloc(n
1e820 2a 73 7a 2b 31 29 2c 20 73 7a 2c 20 6e 29 3b 0a  *sz+1), sz, n);.
1e830 20 20 20 20 20 20 64 61 74 61 2e 73 68 65 6c 6c        data.shell
1e840 46 6c 67 73 20 7c 3d 20 53 48 46 4c 47 5f 53 63  Flgs |= SHFLG_Sc
1e850 72 61 74 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65  ratch;.    }else
1e860 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1e870 70 61 67 65 63 61 63 68 65 22 29 3d 3d 30 20 29  pagecache")==0 )
1e880 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 2c 20 73  {.      int n, s
1e890 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 28 69  z;.      sz = (i
1e8a0 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
1e8b0 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
1e8c0 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b  alue(argc,argv,+
1e8d0 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +i));.      if( 
1e8e0 73 7a 3e 37 30 30 30 30 20 29 20 73 7a 20 3d 20  sz>70000 ) sz = 
1e8f0 37 30 30 30 30 3b 0a 20 20 20 20 20 20 69 66 28  70000;.      if(
1e900 20 73 7a 3c 38 30 30 20 29 20 73 7a 20 3d 20 38   sz<800 ) sz = 8
1e910 30 30 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69  00;.      n = (i
1e920 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
1e930 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
1e940 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76 2c 2b  alue(argc,argv,+
1e950 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +i));.      if( 
1e960 6e 3c 31 30 20 29 20 6e 20 3d 20 31 30 3b 0a 20  n<10 ) n = 10;. 
1e970 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e       sqlite3_con
1e980 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
1e990 47 5f 50 41 47 45 43 41 43 48 45 2c 20 6d 61 6c  G_PAGECACHE, mal
1e9a0 6c 6f 63 28 6e 2a 73 7a 2b 31 29 2c 20 73 7a 2c  loc(n*sz+1), sz,
1e9b0 20 6e 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e   n);.      data.
1e9c0 73 68 65 6c 6c 46 6c 67 73 20 7c 3d 20 53 48 46  shellFlgs |= SHF
1e9d0 4c 47 5f 50 61 67 65 63 61 63 68 65 3b 0a 20 20  LG_Pagecache;.  
1e9e0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1e9f0 6d 70 28 7a 2c 22 2d 6c 6f 6f 6b 61 73 69 64 65  mp(z,"-lookaside
1ea00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
1ea10 6e 74 20 6e 2c 20 73 7a 3b 0a 20 20 20 20 20 20  nt n, sz;.      
1ea20 73 7a 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  sz = (int)intege
1ea30 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65 5f 6f  rValue(cmdline_o
1ea40 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63  ption_value(argc
1ea50 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20  ,argv,++i));.   
1ea60 20 20 20 69 66 28 20 73 7a 3c 30 20 29 20 73 7a     if( sz<0 ) sz
1ea70 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 20 3d 20   = 0;.      n = 
1ea80 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
1ea90 65 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e  e(cmdline_option
1eaa0 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76  _value(argc,argv
1eab0 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66  ,++i));.      if
1eac0 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20  ( n<0 ) n = 0;. 
1ead0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e       sqlite3_con
1eae0 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
1eaf0 47 5f 4c 4f 4f 4b 41 53 49 44 45 2c 20 73 7a 2c  G_LOOKASIDE, sz,
1eb00 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73   n);.      if( s
1eb10 7a 2a 6e 3d 3d 30 20 29 20 64 61 74 61 2e 73 68  z*n==0 ) data.sh
1eb20 65 6c 6c 46 6c 67 73 20 26 3d 20 7e 53 48 46 4c  ellFlgs &= ~SHFL
1eb30 47 5f 4c 6f 6f 6b 61 73 69 64 65 3b 0a 23 69 66  G_Lookaside;.#if
1eb40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1eb50 45 5f 56 46 53 54 52 41 43 45 0a 20 20 20 20 7d  E_VFSTRACE.    }
1eb60 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1eb70 7a 2c 22 2d 76 66 73 74 72 61 63 65 22 29 3d 3d  z,"-vfstrace")==
1eb80 30 20 29 7b 0a 20 20 20 20 20 20 65 78 74 65 72  0 ){.      exter
1eb90 6e 20 69 6e 74 20 76 66 73 74 72 61 63 65 5f 72  n int vfstrace_r
1eba0 65 67 69 73 74 65 72 28 0a 20 20 20 20 20 20 20  egister(.       
1ebb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1ebc0 72 61 63 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  raceName,.      
1ebd0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1ebe0 4f 6c 64 56 66 73 4e 61 6d 65 2c 0a 20 20 20 20  OldVfsName,.    
1ebf0 20 20 20 20 20 69 6e 74 20 28 2a 78 4f 75 74 29       int (*xOut)
1ec00 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 76 6f 69  (const char*,voi
1ec10 64 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 76 6f  d*),.         vo
1ec20 69 64 20 2a 70 4f 75 74 41 72 67 2c 0a 20 20 20  id *pOutArg,.   
1ec30 20 20 20 20 20 20 69 6e 74 20 6d 61 6b 65 44 65        int makeDe
1ec40 66 61 75 6c 74 0a 20 20 20 20 20 20 29 3b 0a 20  fault.      );. 
1ec50 20 20 20 20 20 76 66 73 74 72 61 63 65 5f 72 65       vfstrace_re
1ec60 67 69 73 74 65 72 28 22 74 72 61 63 65 22 2c 30  gister("trace",0
1ec70 2c 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ,(int(*)(const c
1ec80 68 61 72 2a 2c 76 6f 69 64 2a 29 29 66 70 75 74  har*,void*))fput
1ec90 73 2c 73 74 64 65 72 72 2c 31 29 3b 0a 23 65 6e  s,stderr,1);.#en
1eca0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1ecb0 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 50 4c  E_ENABLE_MULTIPL
1ecc0 45 58 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  EX.    }else if(
1ecd0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 75 6c 74   strcmp(z,"-mult
1ece0 69 70 6c 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  iplex")==0 ){.  
1ecf0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
1ed00 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 5f  qlite3_multiple_
1ed10 69 6e 69 74 69 61 6c 69 7a 65 28 63 6f 6e 73 74  initialize(const
1ed20 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 20 20 20   char*,int);.   
1ed30 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69     sqlite3_multi
1ed40 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 28  plex_initialize(
1ed50 30 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 1);.#endif.  
1ed60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1ed70 6d 70 28 7a 2c 22 2d 6d 6d 61 70 22 29 3d 3d 30  mp(z,"-mmap")==0
1ed80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ed90 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20 69 6e 74  3_int64 sz = int
1eda0 65 67 65 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e  egerValue(cmdlin
1edb0 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
1edc0 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a  rgc,argv,++i));.
1edd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1ede0 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
1edf0 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 73 7a  IG_MMAP_SIZE, sz
1ee00 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , sz);.    }else
1ee10 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1ee20 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vfs")==0 ){.    
1ee30 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1ee40 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
1ee50 73 5f 66 69 6e 64 28 63 6d 64 6c 69 6e 65 5f 6f  s_find(cmdline_o
1ee60 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63  ption_value(argc
1ee70 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20  ,argv,++i));.   
1ee80 20 20 20 69 66 28 20 70 56 66 73 20 29 7b 0a 20     if( pVfs ){. 
1ee90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
1eea0 66 73 5f 72 65 67 69 73 74 65 72 28 70 56 66 73  fs_register(pVfs
1eeb0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
1eec0 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
1eed0 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20 73  tf(stderr, "no s
1eee0 75 63 68 20 56 46 53 3a 20 5c 22 25 73 5c 22 5c  uch VFS: \"%s\"\
1eef0 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  n", argv[i]);.  
1ef00 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
1ef10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ef20 0a 20 20 69 66 28 20 64 61 74 61 2e 7a 44 62 46  .  if( data.zDbF
1ef30 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ilename==0 ){.#i
1ef40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ef50 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 64  T_MEMORYDB.    d
1ef60 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20  ata.zDbFilename 
1ef70 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 20 20  = ":memory:";.  
1ef80 20 20 77 61 72 6e 49 6e 6d 65 6d 6f 72 79 44 62    warnInmemoryDb
1ef90 20 3d 20 61 72 67 63 3d 3d 31 3b 0a 23 65 6c 73   = argc==1;.#els
1efa0 65 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  e.    fprintf(st
1efb0 64 65 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a  derr,"%s: Error:
1efc0 20 6e 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   no database fil
1efd0 65 6e 61 6d 65 20 73 70 65 63 69 66 69 65 64 5c  ename specified\
1efe0 6e 22 2c 20 41 72 67 76 30 29 3b 0a 20 20 20 20  n", Argv0);.    
1eff0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
1f000 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
1f010 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52 4f 43  HELL_DBNAME_PROC
1f020 0a 20 20 20 20 7b 20 65 78 74 65 72 6e 20 76 6f  .    { extern vo
1f030 69 64 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f  id SQLITE_SHELL_
1f040 44 42 4e 41 4d 45 5f 50 52 4f 43 28 63 6f 6e 73  DBNAME_PROC(cons
1f050 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20  t char**);.     
1f060 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 44 42   SQLITE_SHELL_DB
1f070 4e 41 4d 45 5f 50 52 4f 43 28 26 64 61 74 61 2e  NAME_PROC(&data.
1f080 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  zDbFilename);.  
1f090 20 20 20 20 77 61 72 6e 49 6e 6d 65 6d 6f 72 79      warnInmemory
1f0a0 44 62 20 3d 20 30 3b 20 7d 0a 23 65 6e 64 69 66  Db = 0; }.#endif
1f0b0 0a 20 20 7d 0a 20 20 64 61 74 61 2e 6f 75 74 20  .  }.  data.out 
1f0c0 3d 20 73 74 64 6f 75 74 3b 0a 0a 20 20 2f 2a 20  = stdout;..  /* 
1f0d0 47 6f 20 61 68 65 61 64 20 61 6e 64 20 6f 70 65  Go ahead and ope
1f0e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1f0f0 69 6c 65 20 69 66 20 69 74 20 61 6c 72 65 61 64  ile if it alread
1f100 79 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68  y exists.  If th
1f110 65 0a 20 20 2a 2a 20 66 69 6c 65 20 64 6f 65 73  e.  ** file does
1f120 20 6e 6f 74 20 65 78 69 73 74 2c 20 64 65 6c 61   not exist, dela
1f130 79 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20 20 54  y opening it.  T
1f140 68 69 73 20 70 72 65 76 65 6e 74 73 20 65 6d 70  his prevents emp
1f150 74 79 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ty database.  **
1f160 20 66 69 6c 65 73 20 66 72 6f 6d 20 62 65 69 6e   files from bein
1f170 67 20 63 72 65 61 74 65 64 20 69 66 20 61 20 75  g created if a u
1f180 73 65 72 20 6d 69 73 74 79 70 65 73 20 74 68 65  ser mistypes the
1f190 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61   database name a
1f1a0 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20  rgument.  ** to 
1f1b0 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6d 6d 61  the sqlite comma
1f1c0 6e 64 2d 6c 69 6e 65 20 74 6f 6f 6c 2e 0a 20 20  nd-line tool..  
1f1d0 2a 2f 0a 20 20 69 66 28 20 61 63 63 65 73 73 28  */.  if( access(
1f1e0 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65  data.zDbFilename
1f1f0 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , 0)==0 ){.    o
1f200 70 65 6e 5f 64 62 28 26 64 61 74 61 2c 20 30 29  pen_db(&data, 0)
1f210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  ;.  }..  /* Proc
1f220 65 73 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ess the initiali
1f230 7a 61 74 69 6f 6e 20 66 69 6c 65 20 69 66 20 74  zation file if t
1f240 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
1f250 20 6e 6f 20 2d 69 6e 69 74 20 6f 70 74 69 6f 6e   no -init option
1f260 0a 20 20 2a 2a 20 69 73 20 67 69 76 65 6e 20 6f  .  ** is given o
1f270 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
1f280 6e 65 2c 20 6c 6f 6f 6b 20 66 6f 72 20 61 20 66  ne, look for a f
1f290 69 6c 65 20 6e 61 6d 65 64 20 7e 2f 2e 73 71 6c  ile named ~/.sql
1f2a0 69 74 65 72 63 20 61 6e 64 0a 20 20 2a 2a 20 74  iterc and.  ** t
1f2b0 72 79 20 74 6f 20 70 72 6f 63 65 73 73 20 69 74  ry to process it
1f2c0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 72  ..  */.  rc = pr
1f2d0 6f 63 65 73 73 5f 73 71 6c 69 74 65 72 63 28 26  ocess_sqliterc(&
1f2e0 64 61 74 61 2c 7a 49 6e 69 74 46 69 6c 65 29 3b  data,zInitFile);
1f2f0 0a 20 20 69 66 28 20 72 63 3e 30 20 29 7b 0a 20  .  if( rc>0 ){. 
1f300 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f310 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 73  }..  /* Make a s
1f320 65 63 6f 6e 64 20 70 61 73 73 20 74 68 72 6f 75  econd pass throu
1f330 67 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  gh the command-l
1f340 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ine argument and
1f350 20 73 65 74 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e   set.  ** option
1f360 73 2e 20 20 54 68 69 73 20 73 65 63 6f 6e 64 20  s.  This second 
1f370 70 61 73 73 20 69 73 20 64 65 6c 61 79 65 64 20  pass is delayed 
1f380 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20  until after the 
1f390 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
1f3a0 20 2a 2a 20 66 69 6c 65 20 69 73 20 70 72 6f 63   ** file is proc
1f3b0 65 73 73 65 64 20 73 6f 20 74 68 61 74 20 74 68  essed so that th
1f3c0 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61  e command-line a
1f3d0 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 6f 76  rguments will ov
1f3e0 65 72 72 69 64 65 0a 20 20 2a 2a 20 73 65 74 74  erride.  ** sett
1f3f0 69 6e 67 73 20 69 6e 20 74 68 65 20 69 6e 69 74  ings in the init
1f400 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2e  ialization file.
1f410 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  .  */.  for(i=1;
1f420 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
1f430 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67     char *z = arg
1f440 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b  v[i];.    if( z[
1f450 30 5d 21 3d 27 2d 27 20 29 20 63 6f 6e 74 69 6e  0]!='-' ) contin
1f460 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d  ue;.    if( z[1]
1f470 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  =='-' ){ z++; }.
1f480 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
1f490 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a  ,"-init")==0 ){.
1f4a0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
1f4b0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1f4c0 7a 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20 29 7b  z,"-html")==0 ){
1f4d0 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
1f4e0 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
1f4f0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1f500 6d 70 28 7a 2c 22 2d 6c 69 73 74 22 29 3d 3d 30  mp(z,"-list")==0
1f510 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d   ){.      data.m
1f520 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
1f530 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1f540 74 72 63 6d 70 28 7a 2c 22 2d 6c 69 6e 65 22 29  trcmp(z,"-line")
1f550 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
1f560 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  a.mode = MODE_Li
1f570 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ne;.    }else if
1f580 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 63 6f 6c  ( strcmp(z,"-col
1f590 75 6d 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  umn")==0 ){.    
1f5a0 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f    data.mode = MO
1f5b0 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  DE_Column;.    }
1f5c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1f5d0 7a 2c 22 2d 63 73 76 22 29 3d 3d 30 20 29 7b 0a  z,"-csv")==0 ){.
1f5e0 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20        data.mode 
1f5f0 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20  = MODE_Csv;.    
1f600 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2e 73 65    memcpy(data.se
1f610 70 61 72 61 74 6f 72 2c 22 2c 22 2c 32 29 3b 0a  parator,",",2);.
1f620 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1f630 72 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61 74  rcmp(z,"-separat
1f640 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
1f650 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1f660 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 73 65  f(sizeof(data.se
1f670 70 61 72 61 74 6f 72 29 2c 20 64 61 74 61 2e 73  parator), data.s
1f680 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20  eparator,.      
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 20 22 25 73 22 2c 63 6d 64 6c 69 6e 65 5f 6f 70   "%s",cmdline_op
1f6b0 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c  tion_value(argc,
1f6c0 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20  argv,++i));.    
1f6d0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1f6e0 28 7a 2c 22 2d 6e 65 77 6c 69 6e 65 22 29 3d 3d  (z,"-newline")==
1f6f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1f700 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1f710 6f 66 28 64 61 74 61 2e 6e 65 77 6c 69 6e 65 29  of(data.newline)
1f720 2c 20 64 61 74 61 2e 6e 65 77 6c 69 6e 65 2c 0a  , data.newline,.
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 20 20 20 20 20 20 22 25 73 22 2c 63 6d 64 6c         "%s",cmdl
1f750 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65  ine_option_value
1f760 28 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29  (argc,argv,++i))
1f770 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1f780 73 74 72 63 6d 70 28 7a 2c 22 2d 6e 75 6c 6c 76  strcmp(z,"-nullv
1f790 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  alue")==0 ){.   
1f7a0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1f7b0 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e  ntf(sizeof(data.
1f7c0 6e 75 6c 6c 76 61 6c 75 65 29 2c 20 64 61 74 61  nullvalue), data
1f7d0 2e 6e 75 6c 6c 76 61 6c 75 65 2c 0a 20 20 20 20  .nullvalue,.    
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 20 20 22 25 73 22 2c 63 6d 64 6c 69 6e 65 5f     "%s",cmdline_
1f800 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67  option_value(arg
1f810 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20  c,argv,++i));.  
1f820 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1f830 6d 70 28 7a 2c 22 2d 68 65 61 64 65 72 22 29 3d  mp(z,"-header")=
1f840 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
1f850 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b  .showHeader = 1;
1f860 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1f870 74 72 63 6d 70 28 7a 2c 22 2d 6e 6f 68 65 61 64  trcmp(z,"-nohead
1f880 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
1f890 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
1f8a0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1f8b0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 65  if( strcmp(z,"-e
1f8c0 63 68 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cho")==0 ){.    
1f8d0 20 20 64 61 74 61 2e 65 63 68 6f 4f 6e 20 3d 20    data.echoOn = 
1f8e0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1f8f0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 65 71 70 22   strcmp(z,"-eqp"
1f900 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61  )==0 ){.      da
1f910 74 61 2e 61 75 74 6f 45 51 50 20 3d 20 31 3b 0a  ta.autoEQP = 1;.
1f920 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1f930 72 63 6d 70 28 7a 2c 22 2d 73 74 61 74 73 22 29  rcmp(z,"-stats")
1f940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
1f950 61 2e 73 74 61 74 73 4f 6e 20 3d 20 31 3b 0a 20  a.statsOn = 1;. 
1f960 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1f970 63 6d 70 28 7a 2c 22 2d 62 61 69 6c 22 29 3d 3d  cmp(z,"-bail")==
1f980 30 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f  0 ){.      bail_
1f990 6f 6e 5f 65 72 72 6f 72 20 3d 20 31 3b 0a 20 20  on_error = 1;.  
1f9a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1f9b0 6d 70 28 7a 2c 22 2d 76 65 72 73 69 6f 6e 22 29  mp(z,"-version")
1f9c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69  ==0 ){.      pri
1f9d0 6e 74 66 28 22 25 73 20 25 73 5c 6e 22 2c 20 73  ntf("%s %s\n", s
1f9e0 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
1f9f0 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75  n(), sqlite3_sou
1fa00 72 63 65 69 64 28 29 29 3b 0a 20 20 20 20 20 20  rceid());.      
1fa10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
1fa20 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1fa30 2c 22 2d 69 6e 74 65 72 61 63 74 69 76 65 22 29  ,"-interactive")
1fa40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 64  ==0 ){.      std
1fa50 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76  in_is_interactiv
1fa60 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
1fa70 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
1fa80 62 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20  batch")==0 ){.  
1fa90 20 20 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74      stdin_is_int
1faa0 65 72 61 63 74 69 76 65 20 3d 20 30 3b 0a 20 20  eractive = 0;.  
1fab0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1fac0 6d 70 28 7a 2c 22 2d 68 65 61 70 22 29 3d 3d 30  mp(z,"-heap")==0
1fad0 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
1fae0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1faf0 63 6d 70 28 7a 2c 22 2d 73 63 72 61 74 63 68 22  cmp(z,"-scratch"
1fb00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
1fb10 3d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  =2;.    }else if
1fb20 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 70 61 67  ( strcmp(z,"-pag
1fb30 65 63 61 63 68 65 22 29 3d 3d 30 20 29 7b 0a 20  ecache")==0 ){. 
1fb40 20 20 20 20 20 69 2b 3d 32 3b 0a 20 20 20 20 7d       i+=2;.    }
1fb50 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1fb60 7a 2c 22 2d 6c 6f 6f 6b 61 73 69 64 65 22 29 3d  z,"-lookaside")=
1fb70 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 3d 32  =0 ){.      i+=2
1fb80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1fb90 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 6d 61 70 22  strcmp(z,"-mmap"
1fba0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
1fbb0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
1fbc0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 22   strcmp(z,"-vfs"
1fbd0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  )==0 ){.      i+
1fbe0 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
1fbf0 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52 41 43 45  _ENABLE_VFSTRACE
1fc00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1fc10 74 72 63 6d 70 28 7a 2c 22 2d 76 66 73 74 72 61  trcmp(z,"-vfstra
1fc20 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
1fc30 20 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 23 69 66   i++;.#endif.#if
1fc40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1fc50 45 5f 4d 55 4c 54 49 50 4c 45 58 0a 20 20 20 20  E_MULTIPLEX.    
1fc60 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1fc70 28 7a 2c 22 2d 6d 75 6c 74 69 70 6c 65 78 22 29  (z,"-multiplex")
1fc80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  ==0 ){.      i++
1fc90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1fca0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
1fcb0 22 2d 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20  "-help")==0 ){. 
1fcc0 20 20 20 20 20 75 73 61 67 65 28 31 29 3b 0a 20       usage(1);. 
1fcd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1fce0 63 6d 70 28 7a 2c 22 2d 63 6d 64 22 29 3d 3d 30  cmp(z,"-cmd")==0
1fcf0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d   ){.      if( i=
1fd00 3d 61 72 67 63 2d 31 20 29 20 62 72 65 61 6b 3b  =argc-1 ) break;
1fd10 0a 20 20 20 20 20 20 7a 20 3d 20 63 6d 64 6c 69  .      z = cmdli
1fd20 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
1fd30 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 3b 0a  argc,argv,++i);.
1fd40 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
1fd50 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  '.' ){.        r
1fd60 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  c = do_meta_comm
1fd70 61 6e 64 28 7a 2c 20 26 64 61 74 61 29 3b 0a 20  and(z, &data);. 
1fd80 20 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26         if( rc &&
1fd90 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29   bail_on_error )
1fda0 20 72 65 74 75 72 6e 20 72 63 3d 3d 32 20 3f 20   return rc==2 ? 
1fdb0 30 20 3a 20 72 63 3b 0a 20 20 20 20 20 20 7d 65  0 : rc;.      }e
1fdc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 70 65  lse{.        ope
1fdd0 6e 5f 64 62 28 26 64 61 74 61 2c 20 30 29 3b 0a  n_db(&data, 0);.
1fde0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65          rc = she
1fdf0 6c 6c 5f 65 78 65 63 28 64 61 74 61 2e 64 62 2c  ll_exec(data.db,
1fe00 20 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61   z, shell_callba
1fe10 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
1fe20 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Msg);.        if
1fe30 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a  ( zErrMsg!=0 ){.
1fe40 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
1fe50 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
1fe60 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
1fe70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1fe80 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 29 20  bail_on_error ) 
1fe90 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f 20 72  return rc!=0 ? r
1fea0 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c : 1;.        }
1feb0 65 6c 73 65 20 69 66 28 20 72 63 21 3d 30 20 29  else if( rc!=0 )
1fec0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
1fed0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
1fee0 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 6f  r: unable to pro
1fef0 63 65 73 73 20 53 51 4c 20 5c 22 25 73 5c 22 5c  cess SQL \"%s\"\
1ff00 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
1ff10 20 20 69 66 28 20 62 61 69 6c 5f 6f 6e 5f 65 72    if( bail_on_er
1ff20 72 6f 72 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ror ) return rc;
1ff30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ff40 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1ff50 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1ff60 72 72 2c 22 25 73 3a 20 45 72 72 6f 72 3a 20 75  rr,"%s: Error: u
1ff70 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
1ff80 73 5c 6e 22 2c 20 41 72 67 76 30 2c 20 7a 29 3b  s\n", Argv0, z);
1ff90 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
1ffa0 74 64 65 72 72 2c 22 55 73 65 20 2d 68 65 6c 70  tderr,"Use -help
1ffb0 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 6f   for a list of o
1ffc0 70 74 69 6f 6e 73 2e 5c 6e 22 29 3b 0a 20 20 20  ptions.\n");.   
1ffd0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1ffe0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 46   }.  }..  if( zF
1fff0 69 72 73 74 43 6d 64 20 29 7b 0a 20 20 20 20 2f  irstCmd ){.    /
20000 2a 20 52 75 6e 20 6a 75 73 74 20 74 68 65 20 63  * Run just the c
20010 6f 6d 6d 61 6e 64 20 74 68 61 74 20 66 6f 6c 6c  ommand that foll
20020 6f 77 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ows the database
20030 20 6e 61 6d 65 0a 20 20 20 20 2a 2f 0a 20 20 20   name.    */.   
20040 20 69 66 28 20 7a 46 69 72 73 74 43 6d 64 5b 30   if( zFirstCmd[0
20050 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
20060 72 63 20 3d 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d  rc = do_meta_com
20070 6d 61 6e 64 28 7a 46 69 72 73 74 43 6d 64 2c 20  mand(zFirstCmd, 
20080 26 64 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  &data);.      if
20090 28 20 72 63 3d 3d 32 20 29 20 72 63 20 3d 20 30  ( rc==2 ) rc = 0
200a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
200b0 20 20 20 6f 70 65 6e 5f 64 62 28 26 64 61 74 61     open_db(&data
200c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
200d0 20 73 68 65 6c 6c 5f 65 78 65 63 28 64 61 74 61   shell_exec(data
200e0 2e 64 62 2c 20 7a 46 69 72 73 74 43 6d 64 2c 20  .db, zFirstCmd, 
200f0 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
20100 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
20110 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72  ;.      if( zErr
20120 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Msg!=0 ){.      
20130 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
20140 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
20150 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
20160 20 20 72 65 74 75 72 6e 20 72 63 21 3d 30 20 3f    return rc!=0 ?
20170 20 72 63 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d   rc : 1;.      }
20180 65 6c 73 65 20 69 66 28 20 72 63 21 3d 30 20 29  else if( rc!=0 )
20190 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
201a0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
201b0 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63 65   unable to proce
201c0 73 73 20 53 51 4c 20 5c 22 25 73 5c 22 5c 6e 22  ss SQL \"%s\"\n"
201d0 2c 20 7a 46 69 72 73 74 43 6d 64 29 3b 0a 20 20  , zFirstCmd);.  
201e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
201f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
20210 75 6e 20 63 6f 6d 6d 61 6e 64 73 20 72 65 63 65  un commands rece
20220 69 76 65 64 20 66 72 6f 6d 20 73 74 61 6e 64 61  ived from standa
20230 72 64 20 69 6e 70 75 74 0a 20 20 20 20 2a 2f 0a  rd input.    */.
20240 20 20 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73      if( stdin_is
20250 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b 0a  _interactive ){.
20260 20 20 20 20 20 20 63 68 61 72 20 2a 7a 48 6f 6d        char *zHom
20270 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e;.      char *z
20280 48 69 73 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  History = 0;.   
20290 20 20 20 69 6e 74 20 6e 48 69 73 74 6f 72 79 3b     int nHistory;
202a0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 0a 20  .      printf(. 
202b0 20 20 20 20 20 20 20 22 53 51 4c 69 74 65 20 76         "SQLite v
202c0 65 72 73 69 6f 6e 20 25 73 20 25 2e 31 39 73 5c  ersion %s %.19s\
202d0 6e 22 20 2f 2a 65 78 74 72 61 2d 76 65 72 73 69  n" /*extra-versi
202e0 6f 6e 2d 69 6e 66 6f 2a 2f 0a 20 20 20 20 20 20  on-info*/.      
202f0 20 20 22 45 6e 74 65 72 20 5c 22 2e 68 65 6c 70    "Enter \".help
20300 5c 22 20 66 6f 72 20 75 73 61 67 65 20 68 69 6e  \" for usage hin
20310 74 73 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ts.\n",.        
20320 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
20330 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f  on(), sqlite3_so
20340 75 72 63 65 69 64 28 29 0a 20 20 20 20 20 20 29  urceid().      )
20350 3b 0a 20 20 20 20 20 20 69 66 28 20 77 61 72 6e  ;.      if( warn
20360 49 6e 6d 65 6d 6f 72 79 44 62 20 29 7b 0a 20 20  InmemoryDb ){.  
20370 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 43 6f        printf("Co
20380 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 22 29 3b  nnected to a ");
20390 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 42 6f  .        printBo
203a0 6c 64 28 22 74 72 61 6e 73 69 65 6e 74 20 69 6e  ld("transient in
203b0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
203c0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e  ");.        prin
203d0 74 66 28 22 2e 5c 6e 55 73 65 20 5c 22 2e 6f 70  tf(".\nUse \".op
203e0 65 6e 20 46 49 4c 45 4e 41 4d 45 5c 22 20 74 6f  en FILENAME\" to
203f0 20 72 65 6f 70 65 6e 20 6f 6e 20 61 20 22 0a 20   reopen on a ". 
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
20410 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
20420 73 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  se.\n");.      }
20430 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66  .      zHome = f
20440 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28 29 3b 0a  ind_home_dir();.
20450 20 20 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 20        if( zHome 
20460 29 7b 0a 20 20 20 20 20 20 20 20 6e 48 69 73 74  ){.        nHist
20470 6f 72 79 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ory = strlen30(z
20480 48 6f 6d 65 29 20 2b 20 32 30 3b 0a 20 20 20 20  Home) + 20;.    
20490 20 20 20 20 69 66 28 20 28 7a 48 69 73 74 6f 72      if( (zHistor
204a0 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 48 69 73 74  y = malloc(nHist
204b0 6f 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ory))!=0 ){.    
204c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
204d0 70 72 69 6e 74 66 28 6e 48 69 73 74 6f 72 79 2c  printf(nHistory,
204e0 20 7a 48 69 73 74 6f 72 79 2c 22 25 73 2f 2e 73   zHistory,"%s/.s
204f0 71 6c 69 74 65 5f 68 69 73 74 6f 72 79 22 2c 20  qlite_history", 
20500 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zHome);.        
20510 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 64 65  }.      }.#if de
20520 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c  fined(HAVE_READL
20530 49 4e 45 29 0a 20 20 20 20 20 20 69 66 28 20 7a  INE).      if( z
20540 48 69 73 74 6f 72 79 20 29 20 72 65 61 64 5f 68  History ) read_h
20550 69 73 74 6f 72 79 28 7a 48 69 73 74 6f 72 79 29  istory(zHistory)
20560 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
20570 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75  c = process_inpu
20580 74 28 26 64 61 74 61 2c 20 30 29 3b 0a 20 20 20  t(&data, 0);.   
20590 20 20 20 69 66 28 20 7a 48 69 73 74 6f 72 79 20     if( zHistory 
205a0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 69 66 6c  ){.        stifl
205b0 65 5f 68 69 73 74 6f 72 79 28 31 30 30 29 3b 0a  e_history(100);.
205c0 20 20 20 20 20 20 20 20 77 72 69 74 65 5f 68 69          write_hi
205d0 73 74 6f 72 79 28 7a 48 69 73 74 6f 72 79 29 3b  story(zHistory);
205e0 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 48  .        free(zH
205f0 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 7d  istory);.      }
20600 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20610 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69    rc = process_i
20620 6e 70 75 74 28 26 64 61 74 61 2c 20 73 74 64 69  nput(&data, stdi
20630 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
20640 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 26  set_table_name(&
20650 64 61 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20  data, 0);.  if( 
20660 64 61 74 61 2e 64 62 20 29 7b 0a 20 20 20 20 73  data.db ){.    s
20670 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 61 74  qlite3_close(dat
20680 61 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  a.db);.  }.  sql
20690 69 74 65 33 5f 66 72 65 65 28 64 61 74 61 2e 7a  ite3_free(data.z
206a0 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 20 0a 20  FreeOnClose); . 
206b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.